LINUX進(jìn)程和線程的基礎(chǔ)與管理_第1頁(yè)
LINUX進(jìn)程和線程的基礎(chǔ)與管理_第2頁(yè)
LINUX進(jìn)程和線程的基礎(chǔ)與管理_第3頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余10頁(yè)可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、. 進(jìn)程的根本概念程序是為了完成某種任務(wù)而設(shè)計(jì)的軟件 ,比方 vi 是程序 。什么是進(jìn)程呢 ? 進(jìn)程就是運(yùn) 行中的程序。一個(gè)運(yùn)行著程序,可能有多個(gè)進(jìn)程。比方Web效勞器是Apache效勞器,當(dāng)管 理員啟動(dòng)效勞后 , 可能會(huì)有好多人來訪問 , 也就是說許多用戶同時(shí)請(qǐng)求 d , Apache 效勞 器將會(huì)創(chuàng)立多個(gè) d 進(jìn)程來對(duì)其進(jìn)行效勞 。首先我們看看進(jìn)程的定義 。進(jìn)程是一個(gè)具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次可以 并發(fā)執(zhí)行的運(yùn)行活動(dòng) , 是處于活動(dòng)狀態(tài)的電腦程序 。 進(jìn)程作為構(gòu)成系統(tǒng)的根本細(xì)胞 , 不僅是系 統(tǒng)內(nèi)部獨(dú)立運(yùn)行的實(shí)體 , 而且是獨(dú)立競(jìng)爭(zhēng)資源的根本實(shí)體 。了解進(jìn)程的本質(zhì) ,對(duì)于理解

2、 、描述 和設(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í)行的目錄 。程序效勞的文件和目錄 。程序訪問的權(quán)限 。內(nèi)存和其他分配給進(jìn)程的系統(tǒng)資源 。Linux 進(jìn)程中最知名的屬性就是它的進(jìn)程號(hào) (Process Idenity Number, PID) 和它的父進(jìn)程號(hào)

3、(Parent Process ID,PPID)。 PID 、 PPID 都是非零正整數(shù) 。 一個(gè) PID 唯一地標(biāo)識(shí)一個(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)號(hào)為 1 的進(jìn)程身上 , 這個(gè) 進(jìn)程叫做 init 進(jìn)程 ,是內(nèi)核自舉后第一個(gè)啟動(dòng)的進(jìn)程 。 init 進(jìn)程扮演終結(jié)父進(jìn)程的角色 。 因?yàn)?init 進(jìn)程永遠(yuǎn)不會(huì)終止 ,所以系統(tǒng)總是可以確信它的存在 , 并在必要的時(shí)候以它為參 照。 如果某個(gè)進(jìn)程它在衍生出來的全部子進(jìn)程結(jié)束之前被終止 , 就會(huì)出現(xiàn)必須以 init 為參照

4、 的情況 。 此時(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)存里有三局部數(shù)據(jù) ,就是數(shù)據(jù)段 、堆棧段、代碼段。基于 I386 兼容的中央處理器 ,都有上述三種段存放器 , 以方便操作系統(tǒng)的運(yùn)行 , 如以下圖所示 。代碼段數(shù)據(jù)段

5、堆棧段代碼段是存放了程序代碼的數(shù)據(jù), 假設(shè)機(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)存中就

6、緒 :進(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)

7、程在它的生命周 期里并不一定要經(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#includepid_t fork();在 Linux 網(wǎng)絡(luò)編程中經(jīng)常用到 fork() 系統(tǒng)調(diào)用 。 例如在一個(gè)客戶機(jī) /Web 效勞器構(gòu)建的 網(wǎng)絡(luò)環(huán)境中 , Web 效勞器往往可以滿足許多客戶端的請(qǐng)求 。 如果一個(gè)客戶機(jī)要訪問 We

8、b 效勞 器, 需要發(fā)送一個(gè)請(qǐng)求 , 此時(shí)由效勞器生成一個(gè)父進(jìn)程 , 然后父進(jìn)程通過 fork() 系統(tǒng)調(diào)用產(chǎn) 生一個(gè)子進(jìn)程 , 此時(shí)客戶機(jī)的請(qǐng)求由子進(jìn)程完成 。 父進(jìn)程可以再度回到等待狀態(tài)不斷效勞其他 客戶端 。 原理如以下圖所示 。有一個(gè)更簡(jiǎn)單的執(zhí)行其他程序的函數(shù) system , 參數(shù) string 傳遞給一個(gè)命令解釋器 ( 一 般為 sh) 執(zhí)行 , 即 string 被解釋為一條命令 , 由 sh 執(zhí)行該命令 。 假設(shè)參數(shù) string 為一個(gè) 空指針 , 那么檢查命令解釋器是否存在 。 該命令可以和同命令行下的命令形式相同 , 但由于命令 作為一個(gè)參數(shù)放在系統(tǒng)調(diào)用中 ,應(yīng)注意編譯時(shí)

9、對(duì)特殊意義字符的處理 。 命令的查找是按 PATH 環(huán)境變量的定義執(zhí)行的 。 命令所生成的后果一般不會(huì)對(duì)父進(jìn)程編程造成影響 。返回值 : 當(dāng)參數(shù) 為空指針時(shí) , 只有當(dāng)命令解釋器有效時(shí)返回值為非零 。 假設(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)用的

10、進(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)程并不一定終止 。比方 d 效勞器運(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)程號(hào) (PID) , 用于系統(tǒng)識(shí)別和調(diào)度進(jìn)程 。

11、啟動(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) 前臺(tái)啟動(dòng)前臺(tái)啟動(dòng)是手工啟動(dòng)一個(gè)進(jìn)程的最常用的方式。 用戶鍵入一個(gè)命令 df , 就已經(jīng)啟動(dòng)了一個(gè)進(jìn)程 ,而且是一個(gè)前臺(tái)的進(jìn)程 。 這時(shí)候系統(tǒng)其實(shí)已經(jīng)處于多進(jìn)程狀態(tài) 。有許多運(yùn)行在后臺(tái) 的、 系統(tǒng)啟動(dòng)時(shí)就已經(jīng)自動(dòng)啟動(dòng)的進(jìn)程正在悄悄運(yùn)行著 。有的用戶在鍵入 df 命令以后趕緊使 用 ps -x 查看,卻沒有看到 df 進(jìn)程 ,會(huì)覺得很奇怪

12、 。其實(shí)這里因?yàn)?df 這個(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) 后臺(tái)啟動(dòng)直接從后臺(tái)手工啟動(dòng)一個(gè)進(jìn)程用得比擬小一些, 除非是該進(jìn)程甚為耗時(shí) ,且用戶也不急著需要結(jié)果 。假設(shè)用戶要啟動(dòng)一個(gè)需要長(zhǎng)時(shí)間運(yùn)行的格式化文本文件的進(jìn)程 , 為了不使整個(gè) shell 在格式化過程中都處于癱瘓狀態(tài) , 從后臺(tái)啟動(dòng)這個(gè)進(jìn)程是明智的選擇 。2. 進(jìn)程調(diào)度當(dāng)需要中斷一個(gè)前臺(tái)進(jìn)程的時(shí)候 , 通常使用 Ctrl+C 組合鍵 。 但是對(duì)于一個(gè)后臺(tái)進(jìn)程 , 就

13、不是一個(gè)組合鍵所能解決的了 ,這時(shí)就必須使用 kill 命令 。該命令可以終止后臺(tái)進(jìn)程 。至于終止后臺(tái)進(jìn)程的原因有很多 ,或許是該進(jìn)程占用的 CPU 時(shí)間過多 ; 或許是該進(jìn)程已經(jīng)掛死 這種情況是經(jīng)常發(fā)生的 。 kill命令的工作原理是 : 向 Linux 系統(tǒng)的內(nèi)核發(fā)送一個(gè)系統(tǒng)操作信號(hào)和某個(gè)程序的進(jìn)程標(biāo)識(shí)號(hào) ,然后系統(tǒng)內(nèi)核就可以對(duì)進(jìn)程標(biāo)識(shí)號(hào)指定的進(jìn)程進(jìn)行操作 。七 .Linux的第一個(gè)進(jìn)程 : initinit 是 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程

14、序 , init 程序需要讀取配置文件 /etc/inittab。 Inittab 是一個(gè)不可執(zhí)行的文本文件, 它由假設(shè)干行命令所組成 。在 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 n

15、etworking)#3 - full multiuser mode#4 - unused#5 - X11#6 - reboot (do not set initdefault to this)#/ 表示當(dāng)前缺省運(yùn)行級(jí)別為 5, 啟動(dòng)系統(tǒng)進(jìn)入圖形化界面id:5:initdefault:/ 啟動(dòng)時(shí)自動(dòng)執(zhí)行腳本#system initialization./ 當(dāng)運(yùn)行級(jí)別為 5 時(shí), 以 5 為參數(shù)運(yùn)行腳本 ,init 將等待其返回/ 在啟動(dòng)過程中允許按 ctrl-alt-delete 重啟系統(tǒng)#trap ctrl-alt-deleteca:ctrlaltdel:/sbin/shutdown -t3

16、 -r now#/ 在運(yùn)行級(jí)別 2、3、4、5 以上 ttyX 為參數(shù)執(zhí)行 /sbin/mingetty 程序 ,翻開 ttyX 終端用于用戶登錄 ,如果進(jìn)程退出那么再次運(yùn)行 mingetty 程序#run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tt

17、y56:2345:respawn:/sbin/mingetty tty6/ 在級(jí)別 5 上運(yùn)行 xdm 程序 ,提供 xdm 圖形方式登錄界面 x:5:respawn:/etc/x11/prefdm -nodaemon#run xdm in runleverl 5Inittab 配置文件每行的根本格式如下 。 id:runlevels:action:procees 其中某些局部可以為空 , 下面我們逐一介紹 。12 個(gè)字符 , 配置行的惟一標(biāo)識(shí) ,在配置文件中不能重復(fù) 。配置行適用的運(yùn)行級(jí)別 , 在這里可填入多個(gè)運(yùn)行級(jí)別 ,比方 Linux 有 7 個(gè)運(yùn)行級(jí)別 :0:關(guān)機(jī)1:?jiǎn)斡脩糇址缑?

18、:不具備網(wǎng)絡(luò)文件系統(tǒng) (NFS) 功能的多用戶字符界面 3:具有網(wǎng)絡(luò)功能的多用戶字符界面4:保存不用 5:具有網(wǎng)絡(luò)功能的圖形用戶界面 6:重新啟動(dòng)系統(tǒng)init 有如下幾種行為 , 如下表所示 。,并在退出時(shí)重新執(zhí)行12345 或者 35 等 。init 行為行為描述respawn啟動(dòng)并監(jiān)視第 4 項(xiàng)指定的 process , 假設(shè) process 終止那么重啟它wait執(zhí)行第 4 項(xiàng)指定的 process , 并等待它執(zhí)行完備once執(zhí)行第 4 項(xiàng)指定的 process boot不管在哪個(gè)執(zhí)行等級(jí) , 系統(tǒng)啟動(dòng)時(shí)都會(huì)運(yùn)行第 4 項(xiàng)指定的 process bootwait, 且一直不管在哪個(gè)執(zhí)行

19、等級(jí) , 系統(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í)行等級(jí)時(shí) ,執(zhí)行第 4 項(xiàng)指定的 processinitdefault系統(tǒng)啟動(dòng)后進(jìn)入的執(zhí)行等級(jí) , 該行不需要指定 processsysinit不管在哪個(gè)執(zhí)行等級(jí) , 系統(tǒng)會(huì)在執(zhí)行 boot 及 bootwait 之前執(zhí)行第 4 項(xiàng)指 定的 processpowerwait當(dāng)系統(tǒng)的供電缺乏時(shí)執(zhí)行第 4 項(xiàng)指定的 process , 且一直等它執(zhí)行完備powerfailnow當(dāng)系統(tǒng)的供電嚴(yán)重缺乏時(shí)執(zhí)行第 4 項(xiàng)指定的 processctrla

20、ltdelkbrequest當(dāng)用戶按下特殊的組合鍵時(shí)執(zhí)行第 4 項(xiàng)指定的 process ,此組合鍵需在keymaps文件定義當(dāng)用戶按下 ctrl+alt+del時(shí)執(zhí)行的操作Process 為 init 執(zhí)行的進(jìn)程 ,這些進(jìn)程都保存在目錄中 ,其中的 X 代表運(yùn)行級(jí)別 , rc 程序接收 X 參數(shù) , 然后運(yùn)行下面的程序 。使用如下命令可以查看目錄內(nèi)容 。代碼如下 :total 112-rxwr-xr-x 1 root root 2352 2004-3-17 rc使用如下命令查看的內(nèi)容代碼如下 :這些文件都是符號(hào)鏈接 ,以 S 打頭的標(biāo)識(shí)啟動(dòng)該程序 , 而以 K 打頭的標(biāo)識(shí)終止該程序 , 后面

21、的數(shù)字標(biāo)識(shí)執(zhí)行順序 ,越小越先執(zhí)行 , 剩下的標(biāo)識(shí)程序名 。系統(tǒng)啟動(dòng)或者切換到該運(yùn)行級(jí) 別時(shí)會(huì)執(zhí)行以 S 打頭的程序 , 系統(tǒng)切換到該運(yùn)行級(jí)別時(shí)會(huì)執(zhí)行以 K 打頭的程序 。這個(gè)目錄下的程序可通過 chkconfig 程序進(jìn)行管理 , 當(dāng)然這個(gè)目錄下的程序需要符合一 定標(biāo)準(zhǔn) ,如果了解 shell 編程 ,可以查看這些符號(hào)鏈接所指向的程序的源碼 。init 也是一個(gè)進(jìn)程 ,和普通的進(jìn)程具有一樣的屬性 。 比方修改了 /etc/inittab, 想讓修改馬上生效 ,可通過運(yùn)行 kill-SIGHUP 1 來實(shí)現(xiàn) ,也可通過運(yùn)行 init q 來實(shí)現(xiàn) 。八 .Linux 的線程簡(jiǎn)介線程的定義線程 (

22、thread) 是在共享內(nèi)存空間中并發(fā)的多道執(zhí)行路徑 ,它們共享一個(gè)進(jìn)程的資源 ,如 文件描述和信號(hào)處理 。在兩個(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í)行前面提到的完整的上下文 。 另外本文介 紹的線程是針對(duì) POSIX 線程的 , 也就是 Pthread 。 也因?yàn)?Linux 對(duì)它的支持最好 ,相對(duì)進(jìn) 程而言 , 線程是一個(gè)更加接近于執(zhí)行體的概

23、念, 它可以與同進(jìn)程中的其他線程共享數(shù)據(jù),但擁有自己的??臻g , 擁有獨(dú)立的執(zhí)行序列 。在串行程序根底上引入線程和進(jìn)程是為了提高程序的 并發(fā)度 , 從而提高程序運(yùn)行效率和響應(yīng)時(shí)間。 也可以將線程和輕量級(jí)進(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. 什么場(chǎng)合使用 Pthread ,即線程(1) 在返回前阻塞的 I/O 任務(wù)能夠使用一個(gè)線程處理 I/O , 同時(shí)繼續(xù)執(zhí)行其他處理任 務(wù)。

24、(2) 在有一個(gè)或多個(gè)任務(wù)受不確定性事件 ,比方網(wǎng)絡(luò)通信的可獲得性影響的場(chǎng)合 ,能夠使 用線程處理這些異步事件 , 同時(shí)繼續(xù)執(zhí)行正常的處理 。(3) 如果某些程序功能比其他的功能更重要 , 可以使用線程以保證所有功能都出現(xiàn) , 但那 些時(shí)間密集型的功能具有更高的優(yōu)先級(jí) 。以上三點(diǎn)可以歸納為 : 在檢查程序中潛在的并行性時(shí) ,也就是說在要找出能夠同時(shí)執(zhí)行任 務(wù)時(shí)使用 Pthread 。上面已經(jīng)介紹了 ,Linux 進(jìn)程模型提供了執(zhí)行多個(gè)進(jìn)程的能力 , 已經(jīng)可 以進(jìn)行并行或并發(fā)編程 , 可是純種能夠讓你對(duì)多個(gè)任務(wù)的控制程序更好、 使用資源更少 ,因?yàn)橐粋€(gè)單一的資源 , 如全局變量 ,可以由多個(gè)線程共享 。而且,在擁有多個(gè)處理器的系統(tǒng)上 ,多 線程應(yīng)用會(huì)比用多個(gè)進(jìn)程實(shí)現(xiàn)的應(yīng)用執(zhí)行速度更快 。進(jìn)程和線程的開展1999 年 1 月發(fā)布的內(nèi)核中 ,進(jìn)程是通過系統(tǒng)調(diào)用 fork 創(chuàng)立的 , 新的進(jìn)程是原來進(jìn)程的 子進(jìn)程 。需要說明的是 ,在版本中 ,不存在真正意義上的線程 (thread) 。 Linux 中常用的線 程 Pthread 實(shí)際上是通過進(jìn)程來模擬的 。 也就是說 Linux 中的線程也是通過 fork 創(chuàng)立 的,是輕進(jìn)程 。只默認(rèn)允許 4096 個(gè)進(jìn)程 / 線程同時(shí)運(yùn)行 。高端系統(tǒng)同時(shí)要效勞上千個(gè)用戶 , 所以這顯然是一個(gè)問題 , 它一度是阻礙 L

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論