進(jìn)程
- 它是處于執(zhí)行期的程序丢烘,或者說“進(jìn)程=程序+執(zhí)行”。但是進(jìn)程并不僅局限于一段可執(zhí)行代碼(代碼段)唉匾,它還包括進(jìn)程所需要的其他資源孕讳,例如打開的文件匠楚、掛起的信號(hào)量巍膘、內(nèi)存管理、處理器狀態(tài)芋簿、一個(gè)或者多個(gè)執(zhí)行線程和數(shù)據(jù)段等峡懈。Linux內(nèi)核通常把進(jìn)程叫做是任務(wù)(task),因此進(jìn)程控制塊(processing contrl block, PCB)也被命名為struct task_struct与斤》究担——《奔跑吧Linux內(nèi)核 3.1章》
線程
- 線程機(jī)制是現(xiàn)代編程技術(shù)種常用的一種抽象概念荚恶。——《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》
- 線程最主要的目的就是更好的支持SMP以及減辛字А(進(jìn)程/線程)上下文切換開銷谒撼。
- 針對(duì)線程模型的兩大意義,分別開發(fā)出了核心級(jí)線程和用戶級(jí)線程兩種線程模型雾狈,分類的標(biāo)準(zhǔn)主要是線程的調(diào)度者在核內(nèi)還是在核外廓潜。前者更利于并發(fā)使用多處理器的資源,而后者則更多考慮的是上下文切換開銷善榛。在目前的商用系統(tǒng)中辩蛋,通常都將兩者結(jié)合起來使用,既提供核心線程以滿足smp系統(tǒng)的需要移盆,也支持用線程庫(kù)的方式在用戶態(tài)實(shí)現(xiàn)另一套線程機(jī)制悼院,此時(shí)一個(gè)核心線程同時(shí)成為多個(gè)用戶態(tài)線程的調(diào)度者。正如很多技術(shù)一樣咒循,"混合"通常都能帶來更高的效率据途,但同時(shí)也帶來更大的實(shí)現(xiàn)難度,出于"簡(jiǎn)單"的設(shè)計(jì)思路叙甸,Linux從一開始就沒有實(shí)現(xiàn)混合模型的計(jì)劃昨凡,但它在實(shí)現(xiàn)上采用了另一種思路的"混合"。
- 從Linux內(nèi)核的角度看蚁署,線程和進(jìn)程是一樣的便脊,同樣的數(shù)據(jù)結(jié)構(gòu),同樣的調(diào)度算法光戈。線程只是一種和其它進(jìn)程共享某些資源的進(jìn)程哪痰。線程機(jī)制是現(xiàn)代編程技術(shù)種常用的一種抽象概念【米保——《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》
- Windows和Solaris等系統(tǒng)晌杰,在內(nèi)核中提供了專門支持線程的機(jī)制。假如我們有一個(gè)包含4個(gè)線程的j進(jìn)程筷弦,在專門提供線程支持的系統(tǒng)中肋演,通常會(huì)一個(gè)包含四個(gè)不同線程的指針的進(jìn)程描述符。該描述符負(fù)責(zé)描述像地址空間烂琴、打開的文件這樣的共享資源爹殊,線程本身再去描述它獨(dú)占的資源。相反奸绷,Linux僅僅創(chuàng)建四個(gè)進(jìn)程并分配四個(gè)普通的tash_struct結(jié)構(gòu)梗夸。建立這四個(gè)進(jìn)程時(shí)指定他們的共享資源『抛恚——《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》
- 線程被稱為輕量級(jí)進(jìn)程反症,它是操作系統(tǒng)調(diào)度的最小單元辛块,通常一個(gè)進(jìn)程可以擁有多個(gè)線程。線程和進(jìn)程的區(qū)別在于進(jìn)程擁有獨(dú)立的資源空間铅碍,而線程則共享進(jìn)程的資源空間润绵。Linux內(nèi)核沒有對(duì)線程有特別的調(diào)度算法或定義特別的數(shù)據(jù)結(jié)構(gòu)來標(biāo)識(shí)線程,線程和進(jìn)程都使用相同的進(jìn)程PCB數(shù)據(jù)結(jié)構(gòu)胞谈。內(nèi)核里使用clone方法來創(chuàng)建線程授药,進(jìn)程用fork方法來創(chuàng)建。clone的工作方式和創(chuàng)建進(jìn)程的fork方法類似呜魄,但會(huì)確定哪些資源和父進(jìn)程共享悔叽,哪些資源為線程獨(dú)享【粜幔——《奔跑吧Linux內(nèi)核 3.1章》
- Linux線程的實(shí)現(xiàn)知名的有3個(gè)娇澎,分別是LinuxThreads,NPTL(Native Posix Thread Library)睹晒,NGPT(Next Generation Posix Threading)趟庄。最早是LinuxThreads,但在信號(hào)處理伪很、調(diào)度和進(jìn)程間同步原語(yǔ)方面都存在問題戚啥。后來POSIX標(biāo)準(zhǔn)提了一些要求,RedHat 公司牽頭研發(fā)了 NPTL(Native Posix Thread Library)锉试,IBM投資開發(fā)了 NGPT(Next Generation Posix Threading)猫十,二者都是圍繞完全兼容POSIX 1003.1c。大多數(shù)Linux系統(tǒng)選擇了NPTL呆盖,NGPT就被放棄了拖云。Linux2.6起,基本上使用了NPTL应又。
- Linux的線程實(shí)現(xiàn)是在核外進(jìn)行的宙项,核內(nèi)提供的是創(chuàng)建進(jìn)程的接口do_fork()。內(nèi)核提供了兩個(gè)系統(tǒng)調(diào)用__clone()和fork()株扛,最終都用不同的參數(shù)調(diào)用do_fork()核內(nèi)API尤筐。當(dāng)然,要想實(shí)現(xiàn)線程洞就,沒有核心對(duì)多進(jìn)程(其實(shí)是輕量級(jí)進(jìn)程)共享數(shù)據(jù)段的支持是不行的盆繁,因此,do_fork()提供了很多參數(shù)奖磁,包括CLONE_VM(共享內(nèi)存空間)改基、CLONE_FS(共享文件系統(tǒng)信息)繁疤、CLONE_FILES(共享文件描述符表)咖为、CLONE_SIGHAND(共享信號(hào)句柄表)和CLONE_PID(共享進(jìn)程ID秕狰,僅對(duì)核內(nèi)進(jìn)程,即0號(hào)進(jìn)程有效)躁染。當(dāng)使用fork系統(tǒng)調(diào)用時(shí)鸣哀,內(nèi)核調(diào)用do_fork()不使用任何共享屬性,進(jìn)程擁有獨(dú)立的運(yùn)行環(huán)境吞彤,而使用pthread_create()來創(chuàng)建線程時(shí),則最終設(shè)置了所有這些屬性來調(diào)用__clone()我衬,而這些參數(shù)又全部傳給核內(nèi)的do_fork(),從而創(chuàng)建的"進(jìn)程"擁有共享的運(yùn)行環(huán)境饰恕,只有棧是獨(dú)立的挠羔,由__clone()傳入。