<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • 論文:Linux進(jìn)程和線程的基礎(chǔ)與管理

    時(shí)間:2024-08-18 03:44:50 管理畢業(yè)論文 我要投稿
    • 相關(guān)推薦

    論文:Linux進(jìn)程和線程的基礎(chǔ)與管理

      一、進(jìn)程的基本概念

    論文:Linux進(jìn)程和線程的基礎(chǔ)與管理

      程序是為了完成某種任務(wù)而設(shè)計(jì)的軟件,比如vi是程序。什么是進(jìn)程呢? 進(jìn)程就是運(yùn)行中的程序。一個(gè)運(yùn)行著程序,可能有多個(gè)進(jìn)程。比如Web服務(wù)器是Apache服務(wù)器,當(dāng)管理員啟動(dòng)服務(wù)后,可能會(huì)有好多人來訪問,也就是說許多用戶同時(shí)請求httpd,Apache服務(wù)器將會(huì)創(chuàng)建多個(gè)httpd進(jìn)程來對其進(jìn)行服務(wù)。

      首先我們看看進(jìn)程的定義。進(jìn)程是一個(gè)具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次可以并發(fā)執(zhí)行的運(yùn)行活動(dòng),是處于活動(dòng)狀態(tài)的計(jì)算機(jī)程序。進(jìn)程作為構(gòu)成系統(tǒng)的基本細(xì)胞,不僅是系統(tǒng)內(nèi)部獨(dú)立運(yùn)行的實(shí)體,而且是獨(dú)立競爭資源的基本實(shí)體。了解進(jìn)程的本質(zhì),對于理解、描述和設(shè)計(jì)操作系統(tǒng)有著極為重要的意義。了解進(jìn)程的活動(dòng)、狀態(tài),也有利于編制復(fù)雜程序。

      二、進(jìn)程的屬性

      進(jìn)程的定義:一個(gè)進(jìn)程是一個(gè)程序的一次執(zhí)行的過程;程序是靜態(tài)的,它是一些保存在磁盤上的可執(zhí)行的代碼和數(shù)據(jù)集合;進(jìn)程是一個(gè)動(dòng)態(tài)的概念,它是Linux系統(tǒng)的基本的調(diào)度單位。

      一個(gè)進(jìn)程由如下元素組成:

      程序讀取的上下文,它表示程序讀取執(zhí)行的狀態(tài)。 程序當(dāng)前執(zhí)行的目錄。 程序服務(wù)的文件和目錄。 程序訪問的權(quán)限。 內(nèi)存和其他分配給進(jìn)程的系統(tǒng)資源。

      Linux進(jìn)程中最知名的屬性就是它的進(jìn)程號(Process Idenity Number,PID)和它的父進(jìn)程號(Parent Process ID,PPID)。PID、PPID都是非零正整數(shù)。一個(gè)PID唯一地標(biāo)識一個(gè)進(jìn)程。一個(gè)進(jìn)程創(chuàng)建新進(jìn)程稱為創(chuàng)建了子進(jìn)程(Child Process)。相反地,創(chuàng)建子進(jìn)程的進(jìn)程稱為父進(jìn)程。所有進(jìn)程追溯其祖先最終都會(huì)落到進(jìn)號為1的進(jìn)程身上,這個(gè)進(jìn)程叫做init進(jìn)程,是內(nèi)核自舉后第一個(gè)啟動(dòng)的進(jìn)程。init進(jìn)程扮演終結(jié)父進(jìn)程的角色。因?yàn)閕nit進(jìn)程永遠(yuǎn)不會(huì)終止,所以系統(tǒng)總是可以確信它的存在,并在必要的時(shí)候以它為參照。如果某個(gè)進(jìn)程它在衍生出來的全部子進(jìn)程結(jié)束之前被終止,就會(huì)出現(xiàn)必須以init為參照的情況。此時(shí)那些失去了父進(jìn)程的子進(jìn)程就都會(huì)以init作為它們的父進(jìn)程。如果執(zhí)行一下ps-af命令,可以列出許多父進(jìn)程ID為1的進(jìn)程來。Linux提供了一條pstree命令,允許用戶查看系統(tǒng)內(nèi)正在運(yùn)行的各個(gè)進(jìn)程之間的繼承關(guān)系。直接在命令行中輸入pstree即可,程序會(huì)以樹狀結(jié)構(gòu)方式列出系統(tǒng)中正在運(yùn)行的各進(jìn)程之間的繼承關(guān)系。

      三、理解Linux下進(jìn)程的結(jié)構(gòu)

      Linux中一個(gè)進(jìn)程在內(nèi)存里有三部分?jǐn)?shù)據(jù),就是“數(shù)據(jù)段”、“堆棧段”、“代碼段”。基于I386兼容的中央處理器,都有上述三種段寄存器,以方便操作系統(tǒng)的運(yùn)行,如下圖所示。

      代碼段

      數(shù)據(jù)段

      堆棧段

      代碼段是存放了程序代碼的數(shù)據(jù),假如機(jī)器中有數(shù)個(gè)進(jìn)程運(yùn)行相同的一個(gè)程序,那么它們就可以使用同一個(gè)代碼段。而數(shù)據(jù)段則存放程序的全局變量、常數(shù)及動(dòng)態(tài)數(shù)據(jù)分配的數(shù)據(jù)空間。堆棧段存放的就是子進(jìn)程的返回地址、子程序的參數(shù)及程序的局部變量。堆棧段包含在進(jìn)程控制塊PCB(Process Control Block)中。PCB處于進(jìn)程核心堆棧的底部,不需要額外分配空間。

      四、進(jìn)程狀態(tài)

      現(xiàn)在我們來看看,進(jìn)程在生存周期中的各種狀態(tài)及狀態(tài)的轉(zhuǎn)換。下面是Linux系統(tǒng)的進(jìn)程狀態(tài)模型的各種狀態(tài)。

      用戶狀態(tài):進(jìn)程在用戶狀態(tài)下運(yùn)行的狀態(tài)。 內(nèi)核狀態(tài):進(jìn)程在內(nèi)核狀態(tài)下運(yùn)行的狀態(tài)。 內(nèi)存中就緒:進(jìn)程沒有執(zhí)行,但處于就緒狀態(tài),只要內(nèi)核調(diào)度它,就可以執(zhí)行。 內(nèi)存中睡眠:進(jìn)程正在睡眠并且進(jìn)程存儲(chǔ)在內(nèi)存中,沒有被交換到SWAP設(shè)備。 就緒且換出:進(jìn)程處于就緒狀態(tài),但是必須把它換入內(nèi)存,內(nèi)核才能再次調(diào)度它運(yùn)行。 睡眠且換出:進(jìn)程正在睡眠,且被換出內(nèi)存。 被搶先:進(jìn)程從內(nèi)核狀態(tài)返回用戶狀態(tài)時(shí),內(nèi)核搶先于它做了上下文切換,調(diào)度了另一個(gè)進(jìn)程。原先這個(gè)進(jìn)程就處于被搶先狀態(tài)。 僵死狀態(tài)(zombie):進(jìn)程調(diào)用exit結(jié)束,進(jìn)程不再存在,但在進(jìn)程表項(xiàng)中仍有記錄,該記錄可由父進(jìn)程收集。

      現(xiàn)在我們從進(jìn)程的創(chuàng)建到退出來看看進(jìn)程的狀態(tài)轉(zhuǎn)化。需要說明的是,進(jìn)程在它的生命周期里并不一定要經(jīng)歷所有狀態(tài)。

      五、Linux進(jìn)程的創(chuàng)建

      fork函數(shù)在Linux下產(chǎn)生新的進(jìn)程的系統(tǒng)調(diào)用,這個(gè)函數(shù)名是英文中“分叉”的意思。為什么取這個(gè)名字呢? 因?yàn)橐粋(gè)進(jìn)程在運(yùn)行中,如果使用了fork,就產(chǎn)生了另一個(gè)進(jìn)程,于是進(jìn)程就“分叉”了,所以這個(gè)名字取得很形象。fork的語法如下所示:

      #include

      #include

      pid_t fork();

      在Linux網(wǎng)絡(luò)編程中經(jīng)常用到fork()系統(tǒng)調(diào)用。例如在一個(gè)客戶機(jī)/Web服務(wù)器構(gòu)建的網(wǎng)絡(luò)環(huán)境中,Web服務(wù)器往往可以滿足許多客戶端的請求。如果一個(gè)客戶機(jī)要訪問Web服務(wù)器,需要發(fā)送一個(gè)請求,此時(shí)由服務(wù)器生成一個(gè)父進(jìn)程,然后父進(jìn)程通過fork()系統(tǒng)調(diào)用產(chǎn)生一個(gè)子進(jìn)程,此時(shí)客戶機(jī)的請求由子進(jìn)程完成。父進(jìn)程可以再度回到等待狀態(tài)不斷服務(wù)其他客戶端。原理如下圖所示。

      有一個(gè)更簡單的執(zhí)行其他程序的函數(shù)system,參數(shù)string傳遞給一個(gè)命令解釋器(一般為sh)執(zhí)行,即string被解釋為一條命令,由sh執(zhí)行該命令。若參數(shù)string為一個(gè)空指針,則檢查命令解釋器是否存在。該命令可以和同命令行下的命令形式相同,但由于命令作為一個(gè)參數(shù)放在系統(tǒng)調(diào)用中,應(yīng)注意編譯時(shí)對特殊意義字符的處理。命令的查找是按PATH環(huán)境變量的定義執(zhí)行的。命令所生成的后果一般不會(huì)對父進(jìn)程編程造成影響。返回值:當(dāng)參數(shù)為空指針時(shí),只有當(dāng)命令解釋器有效時(shí)返回值為非零。若參數(shù)不為空指針,返回值為該命令的返回狀態(tài)(同waitpid())的返回值。命令無效或語法錯(cuò)誤則返回非零值,所執(zhí)行的命令被終止。其他情況則返回-1.它是一個(gè)較高層的函數(shù),實(shí)際上相當(dāng)于在shell下執(zhí)行一條命令,除了system之外,系統(tǒng)調(diào)用exec來執(zhí)行一個(gè)可執(zhí)行文件,來代替當(dāng)前進(jìn)程的執(zhí)行映像。系統(tǒng)調(diào)用exit的功能是終止發(fā)出調(diào)用的進(jìn)程。sleep函數(shù)調(diào)用用來指定進(jìn)程掛起的秒數(shù)。wait函數(shù)族用來等待和控制進(jìn)程。poppen函數(shù)和system函數(shù)類似,區(qū)別是它用管道方式處理輸出。

      父進(jìn)程和子進(jìn)程的關(guān)系是管理和被管理的關(guān)系,當(dāng)父進(jìn)程終止時(shí),子進(jìn)程也隨之而終止。但子進(jìn)程終止時(shí),父進(jìn)程并不一定終止。比如httpd服務(wù)器運(yùn)行時(shí),我們可以殺掉其子進(jìn)程,父進(jìn)程并不會(huì)因?yàn)樽舆M(jìn)程的終止而終止。

      六、進(jìn)程的管理

      1、啟動(dòng)進(jìn)程

      輸入需要運(yùn)行的程序的程序名,執(zhí)行一個(gè)程序,其實(shí)也就是啟動(dòng)了一個(gè)進(jìn)程。在Linux系統(tǒng)中,每個(gè)進(jìn)程都具有一個(gè)進(jìn)程號(PID),用于系統(tǒng)識別和調(diào)度進(jìn)程。啟動(dòng)一個(gè)進(jìn)程有兩個(gè)主要途徑:手工啟動(dòng)和調(diào)度啟動(dòng),后者是事先進(jìn)行設(shè)置,根據(jù)用戶要求自動(dòng)啟動(dòng)。由用戶輸入命令,直接啟動(dòng)一個(gè)進(jìn)程便是手工啟動(dòng)進(jìn)程。但手工啟動(dòng)進(jìn)程又可以分為很多種,根據(jù)啟動(dòng)的進(jìn)程類型不同;性質(zhì)不同,實(shí)際結(jié)果也不一樣。

      (1)前臺啟動(dòng)

      前臺啟動(dòng)是手工啟動(dòng)一個(gè)進(jìn)程的最常用的方式。用戶鍵入一個(gè)命令“df”,就已經(jīng)啟動(dòng)了一個(gè)進(jìn)程,而且是一個(gè)前臺的進(jìn)程。這時(shí)候系統(tǒng)其實(shí)已經(jīng)處于多進(jìn)程狀態(tài)。有許多運(yùn)行在后臺的、系統(tǒng)啟動(dòng)時(shí)就已經(jīng)自動(dòng)啟動(dòng)的進(jìn)程正在悄悄運(yùn)行著。有的用戶在鍵入“df”命令以后趕緊使用“ps -x”查看,卻沒有看到df進(jìn)程,會(huì)覺得很奇怪。其實(shí)這里因?yàn)閐f這個(gè)進(jìn)程結(jié)束太快,使用ps查看時(shí)該進(jìn)程已經(jīng)執(zhí)行結(jié)束了。如果啟動(dòng)一個(gè)比較耗時(shí)的進(jìn)程,例如在根命令下運(yùn)行:find,然后使用ps aux查看,就會(huì)看到在里面有一個(gè)find進(jìn)程。

      (2)后臺啟動(dòng)

      直接從后臺手工啟動(dòng)一個(gè)進(jìn)程用得比較小一些,除非是該進(jìn)程甚為耗時(shí),且用戶也不急著需要結(jié)果。假設(shè)用戶要啟動(dòng)一個(gè)需要長時(shí)間運(yùn)行的格式化文本文件的進(jìn)程,為了不使整個(gè)shell在格式化過程中都處于“癱瘓”狀態(tài),從后臺啟動(dòng)這個(gè)進(jìn)程是明智的選擇。

      2、進(jìn)程調(diào)度

      當(dāng)需要中斷一個(gè)前臺進(jìn)程的時(shí)候,通常使用Ctrl+C組合鍵。但是對于一個(gè)后臺進(jìn)程,就不是一個(gè)組合鍵所能解決的了,這時(shí)就必須使用kill命令。該命令可以終止后臺進(jìn)程。至于終止后臺進(jìn)程的原因有很多,或許是該進(jìn)程占用的CPU時(shí)間過多;或許是該進(jìn)程已經(jīng)掛死。這種情況是經(jīng)常發(fā)生的。kill命令的工作原理是:向Linux系統(tǒng)的內(nèi)核發(fā)送一個(gè)系統(tǒng)操作信號和某個(gè)程序的進(jìn)程標(biāo)識號,然后系統(tǒng)內(nèi)核就可以對進(jìn)程標(biāo)識號指定的進(jìn)程進(jìn)行操作。

      七、Linux的第一個(gè)進(jìn)程:init

      init是Linux系統(tǒng)執(zhí)行的第一個(gè)進(jìn)程,進(jìn)程ID為1,是系統(tǒng)所有進(jìn)程的起點(diǎn),主要用來執(zhí)行一些開機(jī)初始化腳本和監(jiān)視進(jìn)程。Linux系統(tǒng)在完成核內(nèi)引導(dǎo)以后就開始運(yùn)行init程序,init程序需要讀取配置文件/etc/inittab。Inittab是一個(gè)不可執(zhí)行的文本文件,它由若干行命令所組成。

      在RHEL 4系統(tǒng)中,inittab配置文件的內(nèi)容如下所示:

      #

      #inittab

      #

      #

      #author

      #

      #Default runlevel.the runlevels used by rhs are:

      #0 - halt (do not set initdefault to this)

      #1 - single user mode

      #2 - multiuser,without nfs (the same as 3, if you do not haver networking)

      #3 - full multiuser mode

      #4 - unused

      #5 - X11

      #6 - reboot (do not set initdefault to this)

      #

      //表示當(dāng)前缺省運(yùn)行級別為5,啟動(dòng)系統(tǒng)進(jìn)入圖形化界面

      id:5:initdefault:

      //啟動(dòng)時(shí)自動(dòng)執(zhí)行/etc/rc.d/rc.sysinit腳本

      #system initialization.

      si::sysinit:/etc/rc.d/rc.sysinit

      10:0:wait:/etc/rc.d/rc 0

      11:1:wait:/etc/rc.d/rc 1

      12:2:wait:/etc/rc.d/rc 2

      13:3:wait:/etc/rc.d/rc 3

      14:4:wait:/etc/rc.d/rc 4

      //當(dāng)運(yùn)行級別為5時(shí),以5為參數(shù)運(yùn)行/etc/rc.d/rc腳本,init將等待其返回

      15:5:wait:/etc/rc.d/rc 5

      16:6:wait:/etc/rc.d/rc 6

      //在啟動(dòng)過程中允許按[ctrl-alt-]重啟系統(tǒng)

      #trap ctrl-alt-

      ca::ctrlaltdel:/sbin/shutdown -t3 -r now

      #

      ..................................

      #

      //在運(yùn)行級別2、3、4、5以上ttyX為參數(shù)執(zhí)行/sbin/mingetty程序,打開ttyX終端用于用戶登錄,如果進(jìn)程退出則再次運(yùn)行mingetty程序

      #run gettys in standard runlevels

      1:2345:respawn:/sbin/mingetty tty1

      2:2345:respawn:/sbin/mingetty tty2

      3:2345:respawn:/sbin/mingetty tty3

      4:2345:respawn:/sbin/mingetty tty4

      5:2345:respawn:/sbin/mingetty tty5

      6:2345:respawn:/sbin/mingetty tty6

      //在級別5上運(yùn)行xdm程序,提供xdm圖形方式登錄界面,并在退出時(shí)重新執(zhí)行

      x:5:respawn:/etc/x11/prefdm -nodaemon

      #run xdm in runleverl 5

      Inittab配置文件每行的基本格式如下。

      id:runlevels:action:procees

      其中某些部分可以為空,下面我們逐一介紹。

      1、id

      1~2個(gè)字符,配置行的惟一標(biāo)識,在配置文件中不能重復(fù)。

      2、runlevels

      配置行適用的運(yùn)行級別,在這里可填入多個(gè)運(yùn)行級別,比如12345或者35等。

      Linux有7個(gè)運(yùn)行級別:

      0:關(guān)機(jī)

      1:單用戶字符界面

      2:不具備網(wǎng)絡(luò)文件系統(tǒng)(NFS)功能的多用戶字符界面

      3:具有網(wǎng)絡(luò)功能的多用戶字符界面

      4:保留不用

      5:具有網(wǎng)絡(luò)功能的圖形用戶界面

      6:重新啟動(dòng)系統(tǒng)

      3、action

      init有如下幾種行為,如下表所示。

      init行為

      行為

      描述

      respawn

      啟動(dòng)并監(jiān)視第4項(xiàng)指定的process,若process終止則重啟它

      wait

      執(zhí)行第4項(xiàng)指定的process,并等待它執(zhí)行完備

      once

      執(zhí)行第4項(xiàng)指定的process

      boot

      不論在哪個(gè)執(zhí)行等級,系統(tǒng)啟動(dòng)時(shí)都會(huì)運(yùn)行第4項(xiàng)指定的process

      bootwait

      不論在哪個(gè)執(zhí)行等級,系統(tǒng)啟動(dòng)時(shí)都會(huì)運(yùn)行第4項(xiàng)指定的process,且一直等它執(zhí)行完備

      off

      關(guān)閉任何動(dòng)作,相當(dāng)于忽略該配置行

      ondemand

      進(jìn)入ondemand執(zhí)行等級時(shí),執(zhí)行第4項(xiàng)指定的process

      initdefault

      系統(tǒng)啟動(dòng)后進(jìn)入的執(zhí)行等級,該行不需要指定process

      sysinit

      不論在哪個(gè)執(zhí)行等級,系統(tǒng)會(huì)在執(zhí)行boot及bootwait之前執(zhí)行第4項(xiàng)指定的process

      powerwait

      當(dāng)系統(tǒng)的供電不足時(shí)執(zhí)行第4項(xiàng)指定的process,且一直等它執(zhí)行完備

      powerfailnow

      當(dāng)系統(tǒng)的供電嚴(yán)重不足時(shí)執(zhí)行第4項(xiàng)指定的process

      ctrlaltdel

      當(dāng)用戶按下ctrl+alt+del 時(shí)執(zhí)行的操作

      kbrequest

      當(dāng)用戶按下特殊的組合鍵時(shí)執(zhí)行第4項(xiàng)指定的process,此組合鍵需在keymaps文件定義

      4、process

      Process為init執(zhí)行的進(jìn)程,這些進(jìn)程都保存在目錄/etc/rc.d/rcX中,其中的X代表運(yùn)行級別,rc程序接收X參數(shù),然后運(yùn)行/etc/rc.d/rc.X下面的程序。使用如下命令可以查看/etc/rc.d目錄內(nèi)容。

      #ls –l /etc/rc.d/

      total 112

      drwxr-xr-x 2 root root 4096 3/15 14:44 init.d

      -rxwr-xr-x 1 root root 2352 2004-3-17 rc

      drwxr-xr-x 2 root root 4096 3/15 14:44 rc0.d

      drwxr-xr-x 2 root root 4096 3/15 14:44 rc1.d

      drwxr-xr-x 2 root root 4096 3/15 14:44 rc2.d

      drwxr-xr-x 2 root root 4096 3/15 14:44 rc3.d

      drwxr-xr-x 2 root root 4096 3/15 14:44 rc4.d

      drwxr-xr-x 2 root root 4096 3/15 14:44 rc5.d

      drwxr-xr-x 2 root root 4096 3/15 14:44 rc6.d

      -rxwr-xr-x 1 root root 2200 2004-3-17 rc.local

      -rxwr-xr-x 1 root root 2352 2004-3-17 rc.sysinit

      …………

      使用如下命令查看/etc/rc.d/rc5.d的內(nèi)容。

      #ls –l /etc/rc.d/rc5.d

      這些文件都是符號鏈接,以S打頭的標(biāo)識啟動(dòng)該程序,而以K打頭的標(biāo)識終止該程序,后面的數(shù)字標(biāo)識執(zhí)行順序,越小越先執(zhí)行,剩下的標(biāo)識程序名。系統(tǒng)啟動(dòng)或者切換到該運(yùn)行級別時(shí)會(huì)執(zhí)行以S打頭的程序,系統(tǒng)切換到該運(yùn)行級別時(shí)會(huì)執(zhí)行以K打頭的程序。

      這個(gè)目錄下的程序可通過chkconfig程序進(jìn)行管理,當(dāng)然這個(gè)目錄下的程序需要符合一定規(guī)范,如果了解shell編程,可以查看這些符號鏈接所指向的程序的源碼。

      init也是一個(gè)進(jìn)程,和普通的進(jìn)程具有一樣的屬性。比如修改了/etc/inittab,想讓修改馬上生效,可通過運(yùn)行“kill-SIGHUP 1”來實(shí)現(xiàn),也可通過運(yùn)行“init q”來實(shí)現(xiàn)。

      八、Linux的線程簡介

      1、Linux線程的定義

      線程(thread)是在共享內(nèi)存空間中并發(fā)的多道執(zhí)行路徑,它們共享一個(gè)進(jìn)程的資源,如文件描述和信號處理。在兩個(gè)普通進(jìn)程(非線程)間進(jìn)行切換時(shí),內(nèi)核準(zhǔn)備從一個(gè)進(jìn)程的上下文切換到另一個(gè)進(jìn)程的上下文要花費(fèi)很大的開銷。這里上下文切換的主要任務(wù)是保存老進(jìn)程CPU狀態(tài)并加載新進(jìn)程的保存狀態(tài),用新進(jìn)程的內(nèi)存映像替換進(jìn)程的內(nèi)存映像。線程允許你的進(jìn)程在幾個(gè)正在運(yùn)行的任務(wù)之間進(jìn)行切換,而不必執(zhí)行前面提到的完整的上下文。另外本文介紹的線程是針對POSIX線程的,也就是Pthread。也因?yàn)長inux對它的支持最好,相對進(jìn)程而言,線程是一個(gè)更加接近于執(zhí)行體的概念,它可以與同進(jìn)程中的其他線程共享數(shù)據(jù),但擁有自己的棧空間,擁有獨(dú)立的執(zhí)行序列。在串行程序基礎(chǔ)上引入線程和進(jìn)程是為了提高程序的并發(fā)度,從而提高程序運(yùn)行效率和響應(yīng)時(shí)間。也可以將線程和輕量級進(jìn)程(LWP)視為等同的,但其實(shí)在不同的系統(tǒng)/實(shí)現(xiàn)中有不同的解釋,LWP更恰當(dāng)?shù)慕忉尀橐粋(gè)虛擬CPU或內(nèi)核的線程。它可以幫助用戶態(tài)線程實(shí)現(xiàn)一些特殊的功能。Pthread是一種標(biāo)準(zhǔn)化模型,它用來把一個(gè)程序分成一組能夠同時(shí)執(zhí)行的任務(wù)。

      2、什么場合使用Pthread,即線程

      (1)在返回前阻塞的I/O任務(wù)能夠使用一個(gè)線程處理I/O,同時(shí)繼續(xù)執(zhí)行其他處理任務(wù)。

      (2)在有一個(gè)或多個(gè)任務(wù)受不確定性事件,比如網(wǎng)絡(luò)通信的可獲得性影響的場合,能夠使用線程處理這些異步事件,同時(shí)繼續(xù)執(zhí)行正常的處理。

      (3)如果某些程序功能比其他的功能更重要,可以使用線程以保證所有功能都出現(xiàn),但那些時(shí)間密集型的功能具有更高的優(yōu)先級。

      以上三點(diǎn)可以歸納為:在檢查程序中潛在的并行性時(shí),也就是說在要找出能夠同時(shí)執(zhí)行任務(wù)時(shí)使用Pthread。上面已經(jīng)介紹了,Linux進(jìn)程模型提供了執(zhí)行多個(gè)進(jìn)程的能力,已經(jīng)可以進(jìn)行并行或并發(fā)編程,可是純種能夠讓你對多個(gè)任務(wù)的控制程序更好、使用資源更少,因?yàn)橐粋(gè)單一的資源,如全局變量,可以由多個(gè)線程共享。而且,在擁有多個(gè)處理器的系統(tǒng)上,多線程應(yīng)用會(huì)比用多個(gè)進(jìn)程實(shí)現(xiàn)的應(yīng)用執(zhí)行速度更快。

      3、Linux進(jìn)程和線程的發(fā)展

      1999年1月發(fā)布的Linux 2.2內(nèi)核中,進(jìn)程是通過系統(tǒng)調(diào)用fork創(chuàng)建的,新的進(jìn)程是原來進(jìn)程的子進(jìn)程。需要說明的是,在2.2.x版本中,不存在真正意義上的線程(thread)。Linux中常用的線程Pthread實(shí)際上是通過進(jìn)程來模擬的。也就是說Linux中的線程也是通過fork創(chuàng)建的,是“輕”進(jìn)程。Linux 2.2只默認(rèn)允許4096個(gè)進(jìn)程/線程同時(shí)運(yùn)行。高端系統(tǒng)同時(shí)要服務(wù)上千個(gè)用戶,所以這顯然是一個(gè)問題,它一度是阻礙Linux進(jìn)入企業(yè)級市場的一大因素。

      2001年1月發(fā)布的Linux 2.4內(nèi)核消除了這個(gè)限制,并且允許在系統(tǒng)運(yùn)行中動(dòng)態(tài)調(diào)整進(jìn)程數(shù)上限。因此,進(jìn)程數(shù)現(xiàn)在只受制于物理內(nèi)存的多少。在高端服務(wù)器上,即使安裝了512MB內(nèi)存,現(xiàn)在也能輕而易舉地同時(shí)支持1萬6千個(gè)進(jìn)程。

      2003年12月發(fā)布的2.6內(nèi)核,進(jìn)程調(diào)度經(jīng)過重新編寫,去掉了以前版本中效率不高的算法。以前,為了決定下一步要運(yùn)行哪一個(gè)任務(wù),進(jìn)程調(diào)度程序要查看每一個(gè)準(zhǔn)備好的任務(wù),并且經(jīng)過計(jì)算機(jī)來決定哪一個(gè)任務(wù)相對來更為重要。進(jìn)程標(biāo)識號(PID)的數(shù)目也從32000升到10億。內(nèi)核內(nèi)部的大改變之一就是Linux的線程框架被重寫,以使NPTL(Native POSIX Thread Library)可以運(yùn)行于其上。對于運(yùn)行負(fù)荷繁重的線程應(yīng)用的Pentium Pro及更先進(jìn)的處理器而言,這是一個(gè)主要的性能提升,也是企業(yè)級應(yīng)用中的很多高端系統(tǒng)一直以來所期待的。線程框架的改變包含Linux線程空間中的許多新的概念,包括線程組、線程各自的本地存儲(chǔ)區(qū)、POSIX風(fēng)格信號,以及其他改變。改進(jìn)后的多線程和內(nèi)存管理技術(shù)有助于更好地運(yùn)行大型多媒體應(yīng)用軟件。

      4、總結(jié)

      線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源的管理和保護(hù);而進(jìn)程正相反。同時(shí),線程適合于在對稱處理器的計(jì)算機(jī)上運(yùn)行,而進(jìn)程則可以跨機(jī)器遷移。另外,進(jìn)程可以擁有資源,線程共享進(jìn)程擁有的資源。進(jìn)程間的切換必須保存在進(jìn)程控制塊PCB(Process Control Block)中。同一個(gè)進(jìn)程的多個(gè)線程間的切換不用那么麻煩。最后一個(gè)實(shí)例來作為本文的結(jié)束:當(dāng)你在一臺Linux PC上打開兩個(gè)OICQ,每一個(gè)OICQ是一個(gè)進(jìn)程;而當(dāng)你在一個(gè)OICQ上和多人聊天時(shí),每一個(gè)聊天窗口就是一個(gè)線程。

    【論文:Linux進(jìn)程和線程的基礎(chǔ)與管理】相關(guān)文章:

    管理學(xué)基礎(chǔ)論文02-18

    舞蹈基礎(chǔ)論文03-15

    linux系統(tǒng)論文參考文獻(xiàn)11-14

    嵌入式Linux的MiniGUI研究和移植03-18

    畢業(yè)論文寫作基礎(chǔ)11-24

    基礎(chǔ)護(hù)理學(xué)論文07-05

    基礎(chǔ)護(hù)理學(xué)論文05-16

    和諧社會(huì)進(jìn)程中的政府危機(jī)管理03-18

    渠道管理背景下營運(yùn)資金管理的意義和優(yōu)化論文02-15

    夯實(shí)基礎(chǔ) 強(qiáng)化管理03-22

    主站蜘蛛池模板: 欧美巨大黑人精品videos| 久久久WWW免费人成精品| 国产啪亚洲国产精品无码| 日韩欧精品无码视频无删节| 精品久久久久久国产牛牛app| 国产国产精品人在线观看| 亚洲精品无码久久久| 国内精品久久久久国产盗摄| 91大神精品全国在线观看| 国产精品精品自在线拍| 无码人妻精品一区二区三区在线 | 青草国产精品视频。| 国产精品内射视频免费| 国产夫妇精品自在线| 国内精品久久久久久久97牛牛| 亚洲AV永久无码精品一百度影院| 欧美在线精品永久免费播放| 精品无码久久久久久国产| 国产精品99久久不卡| 99爱在线视频这里只有精品| 欧美精品国产日韩综合在线| 精品国产欧美另类一区| 久久99精品国产| 久久se精品一区二区| 九九热这里只有在线精品视| 99国产精品一区二区| 97精品伊人久久大香线蕉app| 精品卡一卡二卡乱码高清| 四虎国产精品永久在线观看| 亚洲国产精品一区二区成人片国内| 精品视频一区二区三区四区五区| 国产女人18毛片水真多18精品| 国产精品狼人久久久久影院| 国产精品乱伦| 国产欧美精品专区一区二区| 国产精品青青在线观看爽香蕉| 国产成人精品综合久久久| 国产精品久操视频| 精品视频一区二区三区| 亚洲av午夜国产精品无码中文字| 亚洲精品无码激情AV|