版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、線程控制和線程資源保護(hù)第十五篇線程控制和線程資源保護(hù)1、引言1)從前面的課程我們知道,每個進(jìn)程都有自己的進(jìn)程空間(也稱為虛擬內(nèi)存空間),并且在內(nèi)核中每個進(jìn)程都有屬于自己的task_struct進(jìn)程表項(xiàng)來描述自己,這個表項(xiàng)中包含一個很重要的東西,那就是虛擬地址與實(shí)際物理地址的映射表。2)每個進(jìn)程的空間的范圍都是0到4G,而且都是自己私有的,進(jìn)程間的切換,會導(dǎo)致虛擬空間的切換,需要os+mmu起實(shí)現(xiàn),進(jìn)程切換會導(dǎo)致TLB更新新的映射表,而且cahce里面的內(nèi)容也會更新。除此外還需要對被切換進(jìn)程的狀態(tài)進(jìn)行保存,所以實(shí)際上進(jìn)程間實(shí)現(xiàn)切換的開銷(時間和空間)是非常大的,所以利用多進(jìn)程實(shí)現(xiàn)多任務(wù)是比較費(fèi)力
2、的事情,但是又必須需要進(jìn)程,因?yàn)樗枰鳛橘Y源分配的最小單元而存在。正是由于進(jìn)程的這些的缺點(diǎn),本篇我們正式引入線程的概念。2、線程(也稱為輕量級的進(jìn)程)2.1、線程基本特點(diǎn)a)線程依賴于進(jìn)程而存在,在一個進(jìn)程里面開出的多個線程共享同一進(jìn)程空間,這樣利用多線程實(shí)現(xiàn)多任務(wù)時,就能避免因?yàn)榇罅款l繁的進(jìn)程間切換而帶來的開銷。b)每個線程也同樣有一個task_truct結(jié)構(gòu)體來描述,但是共享同一進(jìn)程的所有線程共享入口地址c)進(jìn)程與線程都參與統(tǒng)一的內(nèi)核調(diào)度(切換)。d)線程的本質(zhì)就是指針函數(shù)。2.2、線程好處1)大大提高了進(jìn)程間的切換效率2)避免了不必要的TLB和cache刷新,節(jié)省了空間的消耗2.3、線
3、程的實(shí)現(xiàn)(線程控制函數(shù))1)不由內(nèi)核實(shí)現(xiàn),而是由第三方線程庫實(shí)現(xiàn)的,編譯時需要連接才行2)同一進(jìn)程內(nèi)的所有線程都會共享進(jìn)程的哪些資源呢?a)指令代碼b)靜態(tài)數(shù)據(jù)(主要是用于線程間通信用的全局變量)c)進(jìn)程打開的所有的文件描述符d)進(jìn)程的當(dāng)前工作目錄e)進(jìn)程的實(shí)際用戶ID和有效用戶IDf)實(shí)際組ID和有效組ID3)每個線程的私有資源有哪些?a)線程ID(TID)b)自己的PC(程序計(jì)數(shù)器值)和相關(guān)的狀態(tài)寄存器(存放該線程被切換時的狀態(tài))c)自己的局部變量(每個線程其實(shí)就是一個函數(shù)),每個線程都會從進(jìn)程棧中開出自己的線程棧(也可稱為線程函數(shù)棧)d)自己的錯誤號errnoe)自己的信號掩碼(屏蔽字,
4、起初是繼承進(jìn)程(主線程)的),和未決信號集(繼承于主線程,但是會被立即清空)f)有自己的執(zhí)行狀態(tài)4)線程實(shí)現(xiàn)過程a)創(chuàng)建線程,pthread_create函數(shù)b)控制線程,pthreadoin,pthread_detach,pthread_cancle,pthread_exit等函數(shù)5)線程的資源保護(hù)我們知道,對于進(jìn)程來說資源保護(hù)是天然的,因?yàn)樗鼈儞碛歇?dú)立虛擬內(nèi)存空間,互相不能互訪,這也導(dǎo)致相互通信也很不容易。但是對于同一進(jìn)程內(nèi)的多個線程來說,由于它們共享進(jìn)程的虛擬內(nèi)存地址,因此它們相互之間可以很容易地進(jìn)行資源的共享,但是資源間的保護(hù)卻成為了一個問題。線程資源保護(hù)機(jī)制有:a)無名信號量(進(jìn)程用
5、的是有名信號量或稱為系統(tǒng)V信號量)互斥同步b)線程間的互斥鎖互斥c)條件變量一種線程間的異步通信機(jī)制,類似于進(jìn)程間的信號通信6)注意,如果主線程先死,那么所有次線程都會跟著死調(diào),所以任何線程調(diào)了exit函數(shù)后整個進(jìn)程將會結(jié)束3、進(jìn)程與線程的異同+1程不同占心3.111+-ex5W1.kfor;1?1II.s數(shù)函載謂編a.才5.if=冽號疽忌住_需涓a間,二曰=程道號進(jìn)管宿也B為1_大_號(亠-FT護(hù)引保無中協(xié)中-I-t資鎖i麥要斥號件需互信寮1_?1匚-4LT.1!.內(nèi)管擁m.甲宀匚=-T-y.-.I.-程応P(guān)7利可I4J、相同占心里-備、使進(jìn)程電線程黔列(帖在內(nèi)核題角度)的關(guān)社實(shí)現(xiàn)多任詢到底
6、1還呈編呈要看mmu+od!M進(jìn)程間的切測毬程切換的時間需鮒概1000個指令勰:當(dāng)然還要參考叡程時信號的問題要曲蹲基卅創(chuàng)亙益牌講:多任務(wù)都是用線辭做,因?yàn)楦¢_I)所有線程共享信號處理方式,比如其中一個線程改變了信號處理方式后,大家都會共享這一改變后的信號處理方式。2)處理方式如果是捕獲的話,大家共享信號的捕獲函數(shù)3)剛開始各次線程會繼承主線程(進(jìn)程)的信號屏蔽字,每個線程擁有屬于自己的信號屏蔽字,每個線程可以通過自己的屏蔽字任意的打開和屏蔽與自己相關(guān)的某個信號。但是每個線程的未決信號集雖然會繼承主線程的,但即便主線程的未決信號集中有味覺信號,但是在次線程中的未決信號集會被全部清空4)發(fā)生的信
7、號會被發(fā)送給任意一個未屏蔽該信號的線程,如果所有線程都屏蔽了該信號,當(dāng)此信號發(fā)生時,該信號將會設(shè)置到當(dāng)前正在運(yùn)行線程的未決信號集之中,誰響應(yīng)了信號處理函數(shù),該線程將會被這個信號捕獲函數(shù)阻塞(換句話說該信號捕獲函數(shù)和這個線程是一條線的運(yùn)行的)5、線程創(chuàng)建和取消相關(guān)的函數(shù)a)線程創(chuàng)建函數(shù)intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg);b)線程等待函數(shù):阻塞等待線程結(jié)束,結(jié)束后由主回收線程的資源intpthread_join(pthread_tthre
8、ad,void*retval);c)線程分離函數(shù):分離后,資源在線程結(jié)束時自己釋放,不有主線程回收intpthreaddetach(pthreadtthread);這個函數(shù)和pthreadjoin二者只能有一個被用d)主動取消線程函數(shù)intpthread_cancel(pthread_tthread);取消是否是使能設(shè)置函數(shù):默認(rèn)情況是使能intpthread_setcancelstate(intstate,int*oldstate);PTHREAD_CANCEL_ENABLE使能(default)PTHREAD_CANCEL_DISABLE:不使能-與取消方式相關(guān)函數(shù)intpthread_s
9、etcanceltype(inttype,int*oldtype);獲取線程取消方式函數(shù)intpthreadsetcancelstate(intstate,int*oldstate);設(shè)置取消方式函數(shù)取消方式:必須運(yùn)行到取消點(diǎn)函數(shù)正常取消(調(diào)用時間長或回引起阻塞的函數(shù)都是取消點(diǎn)函數(shù),但是胡斥鎖除外)有些阻塞函數(shù)不是取消點(diǎn),導(dǎo)致線程長期阻塞而無法取利用PTHREAD_CANCEL_ASYNCHRONOUS宏設(shè)置為強(qiáng)制取消,風(fēng)險是被取消的函數(shù)返回狀態(tài)是未定義的,PTHREAD_CANCEL_DEFERRED默認(rèn)是按照取消點(diǎn)取消,這個不設(shè)置也可以因?yàn)闆]有取消點(diǎn)而無法取消,但又不想設(shè)置為強(qiáng)制取消voi
10、dpthread_testcancel(void),認(rèn)為設(shè)置一個可取消點(diǎn)e)線程主動退出函數(shù)1、return2、voidpthread_exit(void*retval);這兩個函數(shù)有區(qū)別,區(qū)別后面講f)線程退出處理函數(shù)的設(shè)置1、注冊線程退出處理函數(shù)(函數(shù)壓棧)voidpthread_cleanup_push(void(*routine)(void*),void*arg);2、線程退出處理函數(shù)彈棧(參數(shù)非0就彈棧),出棧順序與入棧順序相反voidpthread_cleanup_pop(intexecute);/3、需要了解的集中情況以上兩個函數(shù)必須配對使用線程被被別人調(diào)用pthread_can
11、cel函數(shù)取消(這種情況下返回值為-1),這時即便thread_cleanup_pop函數(shù)沒有得到調(diào)用,也將會彈棧線程主動調(diào)用pthread_exit函數(shù)退出,這時同樣是即便thread_cleanup_pop函數(shù)沒有得到調(diào)用,也會彈棧。但是return函數(shù)不會,這就是pthread_exit和return之間的區(qū)別主動的調(diào)用thread_cleanup_pop(!0),當(dāng)參數(shù)是非0時就會彈棧,一般線程return返回時,這個函數(shù)必須寫在return的前面,只有pop函數(shù)得到調(diào)用后才會彈棧g)獲取線程id(是個非負(fù)數(shù))的函數(shù),口的形式打印出來pthread_self(void);6、線程屬性設(shè)
12、置函數(shù)(非教學(xué)既定內(nèi)容,了解)1)線程屬性有哪些:a)綁定屬性:用戶線程和內(nèi)核服務(wù)線程是否綁定(default:非綁定),cpu時間片的調(diào)度是面向內(nèi)核線程實(shí)現(xiàn)的b)分離屬性:線程結(jié)束時,線程資源由誰回收,設(shè)置了分離,就由自己釋放,未設(shè)置分離,資源由等待線程(join函數(shù)等待)回收,(default:非分離),分離屬性也可由前面的pthread_detach函數(shù)來設(shè)置c)堆棧的地址和堆棧的大小:線程的堆棧其實(shí)就是函數(shù)的堆棧,是從進(jìn)程的堆棧中刮分出來的,默認(rèn)情況下,線程具體的堆棧地址由內(nèi)核決定,堆棧大小默認(rèn)1M,當(dāng)然我也可以認(rèn)為的更改它d)線程的優(yōu)先級:由于線程是與它的生父進(jìn)程(主線程)一樣統(tǒng)一地
13、參與內(nèi)核的調(diào)度器的調(diào)度,所以存在著調(diào)度優(yōu)先級的問題,默認(rèn)情況是他和生父進(jìn)程有著同樣的優(yōu)先級別e)般情況下,我們都采用默認(rèn)設(shè)置即可2)線程屬性設(shè)置函數(shù)a)線程屬性初始化函數(shù)intpthread_attr_init(pthread_attr_t*attr);b)線程屬性刪除函數(shù):刪除為屬性設(shè)置,恢復(fù)內(nèi)核原有默認(rèn)的屬性設(shè)置,防止永遠(yuǎn)的篡改了默認(rèn)的屬性設(shè)置intpthreadattrdestroy(pthreadattrt*attr);c)設(shè)置綁定函數(shù)intpthread_attr_setscope(pthread_attr_t*attr,intscope);/設(shè)置intpthreadattrgets
14、cope(pthreadattrt*attr,int*scope);獲取d)設(shè)置分離屬性intpthread_attr_setdetachstate(pthread_attr_t*attr,intdetachstate);/設(shè)置intpthreadattrgetdetachstate(pthreadattrt*attr,int*detachstate);獲取e)設(shè)置堆棧屬性/*設(shè)置*/intpthread_attr_setstack(pthread_attr_t*attr,void*stackaddr,size_tstacksize)/*獲取*/intpthread_attr_getstack
15、(pthread_attr_t*attr,void*stackaddr,size_t*stacksize)f)設(shè)置優(yōu)先級屬性/*設(shè)置*/intpthread_attr_setschedparam(pthread_attr_t*attr,conststructsched_param*param);/*獲取*/intpthread_attr_getschedparam(pthread_attr_t*attr,structsched_param*param);g)其它函數(shù)等:略7、設(shè)置互斥鎖相關(guān)的函數(shù)1)互斥鎖初始化函數(shù)intpthread_mutexnit(pthread_mutex_t*rest
16、rictmutex,constpthread_mutexattr_t*restrictattr);2)互斥鎖直接初始化,只能初始化,不能賦值,因?yàn)閜thread_mutex_t是結(jié)構(gòu)體類型pthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;3)互斥鎖銷毀函數(shù)intpthread_mutex_destroy(pthread_mutex_t*mutex);加鎖解鎖函數(shù)阻塞解鎖:intpthread_mutex_lock(pthread_mutex_t*mutex);非阻塞加鎖:intpthread_mutex_trylock(pthread_mutex_t
17、*mutex);解鎖:intpthread_mutex_unlock(pthread_mutex_t*mutex);互斥鎖屬性設(shè)置函數(shù)(非教學(xué)內(nèi)容,了解)互斥鎖屬性初始化和刪除/*屬性初始化*/intpthread_mutexattr_init(pthread_mutexattr_t*attr);/*互斥所屬性刪除:類似線程的屬性刪除*/intpthread_mutexattr_destroy(pthread_mutexattr_t*attr);互斥鎖類型設(shè)置和獲取互斥鎖類型分類:PTHREAD_MUTEX_DEFAULT:快速互斥鎖(或叫阻塞互斥鎖),默認(rèn)此種鎖,統(tǒng)一把鎖,不能多次加鎖,已經(jīng)
18、解開了的鎖也不能再次解鎖,這些都會出錯返回PTHREAD_MUTEX_ERRORCHECK:檢錯互斥鎖,快速互斥鎖的費(fèi)阻塞版本PTHREAD_MUTEX_RECURSIVE:遞歸互斥鎖,同一把鎖可多次枷鎖,每加一次鎖,鎖的連接計(jì)數(shù)加1,解鎖時的解鎖順序與加鎖順序相反,每解一次連接技術(shù)減1,加過多少次鎖,就必須接多少次intpthread_mutexattr_settype(pthread_mutexattr_t*attr,inttype);/設(shè)置intpthread_mutexattr_gettype(constpthread_mutexattr_t*restrictattr,int*rest
19、ricttype);/獲取其它還有大概十幾個函數(shù),這里省略7、設(shè)置線程信號量相關(guān)的函數(shù)1)初始化函數(shù)intsem_init(sem_t*sem,intpshared,unsignedintvalue);2)刪除函數(shù)intsem_destroy(sem_t*sem);P操作:等資源intsem_wait(sem_t*sem);阻塞等待資源intsem_trywait(sem_t*sem);非阻塞等待資源/*可設(shè)置超時,阻塞超過一定時間,超時不在阻塞*/intsem_timedwait(sem_t*sem,conststructtimespec*abs_timeout);v操作:釋放資源intse
20、m_post(sem_t*sem);信號量無屬性設(shè)置8、條件變量設(shè)置1)初始化和刪除函數(shù)/*初始化條件變量*/intpthread_cond_init(pthread_cond_t*restrictcond,constpthread_condattr_t*restrictattr);intpthread_cond_destroy(pthread_cond_t*cond)/刪除條件變量pthreadcondtcond=PTHREADCONDINITIALIZER;/直接變量初始化(不能賦值)2)條件變量發(fā)送信號函數(shù)/*喚醒全部因?yàn)樵摋l件變量而休眠的線程*/intpthread_cond_broadcast(pthread_cond_t*cond);/*喚醒其中一個因?yàn)樵摋l件變量而休眠的線程*/intpthrea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 詳細(xì)2024年度技術(shù)開發(fā)合作合同
- 2025年生物可降解塑料項(xiàng)目規(guī)劃申請報告
- 綜合化維護(hù)練習(xí)測試卷
- 2024 年度考試復(fù)習(xí)測試卷含答案
- 14 固體、液體和氣體 說課稿-2023-2024學(xué)年科學(xué)三年級上冊青島版
- 2025屆高考生物備考說課稿:第六章 遺傳的分子基礎(chǔ) 課時2 DNA分子的結(jié)構(gòu)、復(fù)制及基因的本質(zhì)
- 螺栓松動對輸電塔動力特性及抗風(fēng)能力影響研究
- 金昌2024年甘肅金昌市公安局招聘輔警49人歷年參考題庫(頻考版)含答案解析
- 酒泉2025年甘肅酒泉市教育系統(tǒng)引進(jìn)高層次教師人才214人歷年參考題庫(頻考版)含答案解析
- 遼寧2024年遼寧省公共文化服務(wù)中心招聘38人歷年參考題庫(頻考版)含答案解析
- 殘疾兒童(孤獨(dú)癥)康復(fù)服務(wù)機(jī)構(gòu)采購項(xiàng)目招標(biāo)文件
- 6123C-基樁鉆芯法檢測報告-模板
- 少先隊(duì)活動課《民族團(tuán)結(jié)一家親-同心共筑中國夢》課件
- 2023年江西南昌大學(xué)保衛(wèi)部(處)招聘考試真題
- 六年級語文下冊 期末復(fù)習(xí)非連續(xù)性文本閱讀專項(xiàng)訓(xùn)練(一)(含答案)(部編版)
- 展會活動防疫工作方案
- 肝性腦病的護(hù)理課件-
- 2024年銀行考試-支付清算系統(tǒng)參與者考試近5年真題附答案
- 2024年丟失物品索償協(xié)議書模板
- 建筑物拆除場地清理垃圾外運(yùn)施工方案
- 網(wǎng)絡(luò)信息安全知識考試參考題庫300題(含各題型)
評論
0/150
提交評論