![計算機(jī)操作系統(tǒng)教程_第四版_第6章 進(jìn)程與存儲管理示例_第1頁](http://file4.renrendoc.com/view/903216ccf2059ea7a9f4cb7ccfc16849/903216ccf2059ea7a9f4cb7ccfc168491.gif)
![計算機(jī)操作系統(tǒng)教程_第四版_第6章 進(jìn)程與存儲管理示例_第2頁](http://file4.renrendoc.com/view/903216ccf2059ea7a9f4cb7ccfc16849/903216ccf2059ea7a9f4cb7ccfc168492.gif)
![計算機(jī)操作系統(tǒng)教程_第四版_第6章 進(jìn)程與存儲管理示例_第3頁](http://file4.renrendoc.com/view/903216ccf2059ea7a9f4cb7ccfc16849/903216ccf2059ea7a9f4cb7ccfc168493.gif)
![計算機(jī)操作系統(tǒng)教程_第四版_第6章 進(jìn)程與存儲管理示例_第4頁](http://file4.renrendoc.com/view/903216ccf2059ea7a9f4cb7ccfc16849/903216ccf2059ea7a9f4cb7ccfc168494.gif)
![計算機(jī)操作系統(tǒng)教程_第四版_第6章 進(jìn)程與存儲管理示例_第5頁](http://file4.renrendoc.com/view/903216ccf2059ea7a9f4cb7ccfc16849/903216ccf2059ea7a9f4cb7ccfc168495.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第6章 進(jìn)程與存儲管理示例6.1 Linux進(jìn)程和存儲管理簡介6.2 Linux進(jìn)程結(jié)構(gòu)6.3 進(jìn)程控制6.4 Linux進(jìn)程調(diào)度6.5 進(jìn)程通信6.6 Linux存儲管理本章小結(jié)習(xí)題本章以Linux 2.6為主,介紹Linux的進(jìn)程和存儲管理方法。6.1 Linux進(jìn)程和存儲管理簡介Linux系統(tǒng)的核心部分從整體上說可以分為兩大部分,即“靜”的文件系統(tǒng)和“動”的進(jìn)程控制系統(tǒng)。文件系統(tǒng)主要用來存放、管理那些暫時不被處理機(jī)執(zhí)行的程序和數(shù)據(jù),它為程序和數(shù)據(jù)文件分配空間,控制文件存取和為用戶檢索信息。進(jìn)程控制系統(tǒng)則負(fù)責(zé)為將要執(zhí)行的程序和數(shù)據(jù)文件分配內(nèi)存空間,并負(fù)責(zé)進(jìn)程調(diào)度、控制并發(fā)進(jìn)程的執(zhí)行速度和分
2、配必要的資源,以及負(fù)責(zé)進(jìn)程通信和內(nèi)存管理等。為了使操作系統(tǒng)內(nèi)核能在每次開機(jī)時順利地裝入內(nèi)存,用戶必須事先把Linux操作系統(tǒng)的執(zhí)行代碼以文件方式存儲在計算機(jī)硬盤設(shè)備中,并對計算機(jī)系統(tǒng)中的相應(yīng)資源,例如高速緩存、交換區(qū)等進(jìn)行初始化。這一過程被稱為操作系統(tǒng)的安裝過程。Intel 80 x86提供了4種不同權(quán)限的執(zhí)行模式,Linux系統(tǒng)使用其中2種模式:核心態(tài)和用戶態(tài)。兩態(tài)之間的主要區(qū)別是,用戶態(tài)下的進(jìn)程能存取它們自己的指令與數(shù)據(jù),但不能存取核心指令和數(shù)據(jù)。然而,核心態(tài)下的進(jìn)程能存取核心和用戶地址。另外,某些機(jī)器的指令是特權(quán)指令(如輸入輸出指令),在用戶態(tài)下執(zhí)行會引起錯誤,只能在核心態(tài)下執(zhí)行。在不同
3、的執(zhí)行模式下執(zhí)行時,同一進(jìn)程使用不同的堆棧,分別稱為核心態(tài)堆棧和用戶態(tài)堆棧。在進(jìn)程切換到不同執(zhí)行模式時候,操作系統(tǒng)負(fù)責(zé)為進(jìn)程切換到相應(yīng)的堆棧。Linux系統(tǒng)中進(jìn)程通過請求操作系統(tǒng)服務(wù)進(jìn)入核心態(tài)的機(jī)制稱為系統(tǒng)調(diào)用。具體實現(xiàn)和硬件平臺的體系結(jié)構(gòu)相關(guān),在80 x86系統(tǒng)中,用戶進(jìn)程通過int 0 x80指令請求系統(tǒng)調(diào)用,系統(tǒng)調(diào)用完成后通過iret指令返回到用戶態(tài)。它們之間的關(guān)系如圖6.2所示。圖6.2 Linux進(jìn)程的核心態(tài)與用戶態(tài)之間的轉(zhuǎn)換6.2 LINUX進(jìn)程結(jié)構(gòu)6.2.1 進(jìn)程的概念在LINUX系統(tǒng)中,進(jìn)程被賦予了下述特定的含義和特性:(1) 一個進(jìn)程是對一個程序的執(zhí)行。(2) 一個進(jìn)程的存在
4、意味著存在一個“task_struct”結(jié)構(gòu),它包含著相應(yīng)的進(jìn)程控制信息。(3) 一個進(jìn)程可以生成或者消滅其子進(jìn)程(4) 一個進(jìn)程是獲得和釋放系統(tǒng)資源的基本單位第(2)點反映了進(jìn)程的靜態(tài)特性一個進(jìn)程的靜態(tài)描述是由三部分組成的,即進(jìn)程狀態(tài)控制塊PCB,進(jìn)程的程序文本(正文)段以及進(jìn)程的數(shù)據(jù)段。這三部分統(tǒng)稱為進(jìn)程上下文.6.2.2 進(jìn)程的虛擬地址結(jié)構(gòu)Linux進(jìn)程的虛擬地址結(jié)構(gòu)依賴于硬件,本書默認(rèn)那些與硬件有關(guān)部分依賴于intel 80 x86。80 x86平臺中,每個進(jìn)程擁有一個4GB的虛擬空間。其中0-3GB的地址空間有用戶進(jìn)程使用,3-4GB的地址空間稱為核心地址空間,在所有進(jìn)程中共享,只被
5、核心使用,用戶進(jìn)程不能使用。 Linux進(jìn)程由邏輯段組成,一個進(jìn)程的虛擬地址空間被分成若干個虛擬區(qū)域來存放上述的邏輯段。區(qū)是虛擬地址空間上的一段連續(xù)區(qū)域,是共享、保護(hù)以及進(jìn)行內(nèi)存分配和地址變換的獨立實體。Linux中的區(qū)和段頁式管理中的段非常相像。所不同的是,段頁式管理中的虛擬地址空間是二維的,而Linux的各個進(jìn)程的分區(qū)虛擬地址仍然是一維的。6.2.3 進(jìn)程上下文Linux進(jìn)程上下文是由正文段,也就是CPU 執(zhí)行指令的集合、核心數(shù)據(jù)結(jié)構(gòu)、和有關(guān)寄存器的內(nèi)容與數(shù)據(jù)段組成。1. 進(jìn)程上下文的基本結(jié)構(gòu)進(jìn)程上下文的各個部分按照一定的規(guī)則分布在進(jìn)程虛擬空間的不同位置上。對于不同的機(jī)器和硬件結(jié)構(gòu),進(jìn)程上
6、下文的分布規(guī)則不同。例如,在80 x86上,其虛擬地址空間劃分為進(jìn)程空間和系統(tǒng)空間兩大部分。其尋址范圍為 232個單元。其中,虛擬空間的低位地址的半部分(0 3G)是進(jìn)程虛擬空間,其余為所有進(jìn)程共享的系統(tǒng)空間,操作系統(tǒng)核心程序占據(jù)這個區(qū)。圖6.3 進(jìn)程空間結(jié)構(gòu)圖6.4 執(zhí)行copy程序時用戶棧和核心棧的變化2. 進(jìn)程上下文的組成部分進(jìn)程上下文由task_struct結(jié)構(gòu)、用戶棧和核心棧的內(nèi)容、用戶地址空間的正文段、數(shù)據(jù)段、硬件寄存器的內(nèi)容以及頁表等組成。6.2.4 進(jìn)程的狀態(tài)和狀態(tài)轉(zhuǎn)換一個進(jìn)程的生命期是由一組狀態(tài)來刻畫的。這些狀態(tài)是進(jìn)程task_struct結(jié)構(gòu)的一部分。圖6.5進(jìn)程狀態(tài)轉(zhuǎn)換圖
7、 6.3 進(jìn) 程 控 制6.3.1 Linux啟動及進(jìn)程樹的形成 當(dāng)用戶打開PC的電源,BIOS開機(jī)自檢,按BIOS中設(shè)置的啟動設(shè)備(通常是硬盤)啟動,接著啟動設(shè)備上安裝的引導(dǎo)程序lilo或grub開始引導(dǎo)Linux,Linux首先進(jìn)行內(nèi)核的引導(dǎo),接下來執(zhí)行init程序,init程序調(diào)用了rc.sysinit和rc等程序,rc.sysinit和rc當(dāng)完成系統(tǒng)初始化和運行服務(wù)的任務(wù)后,返回init;init啟動了mingetty后,打開了終端供用戶登錄系統(tǒng),用戶登錄成功后進(jìn)入了Shell,這樣就完成了從開機(jī)到登錄的整個啟動過程。 6.3.2 進(jìn)程控制1. 進(jìn)程的創(chuàng)建該節(jié)主要討論用戶進(jìn)程的創(chuàng)建、執(zhí)
8、行和自我終止問題,與此相對應(yīng),Linux系統(tǒng)提供有相應(yīng)的系統(tǒng)調(diào)用fork( ),exec( )和exit( ),以便在用戶級上實現(xiàn)上述功能。fork的功能是創(chuàng)建一個子進(jìn)程。調(diào)用fork的進(jìn)程稱為父進(jìn)程。系統(tǒng)調(diào)用fork的語法格式是: pid fork ( ) ;從系統(tǒng)調(diào)用fork返回時,父進(jìn)程和子進(jìn)程除了返回值pid 與task_struct結(jié)構(gòu)中某些特性參數(shù)不同之外,其他完全相同。CPU 在父進(jìn)程中時,pid 值為所創(chuàng)建子進(jìn)程的進(jìn)程號,若在子進(jìn)程中時,pid 的值為零。下面介紹一下fork的功能與實現(xiàn)過程。(1) 為子進(jìn)程分配一個task_struct結(jié)構(gòu),將父進(jìn)程的結(jié)構(gòu)復(fù)制到其中,并進(jìn)行修
9、改。(2) 為子進(jìn)程賦一個唯一的進(jìn)程標(biāo)識號pid 。(3) 復(fù)制一個父進(jìn)程上下文的邏輯副本。 (4) 復(fù)制父進(jìn)程相關(guān)聯(lián)的有關(guān)文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和用戶文件描述符表。(5)復(fù)制軟中斷信號有關(guān)數(shù)據(jù)結(jié)構(gòu)(6)設(shè)置子進(jìn)程狀態(tài),并加入就緒隊列(7) 對父進(jìn)程返回子進(jìn)程的進(jìn)程標(biāo)識號,對子進(jìn)程返回零。2. 執(zhí)行一個文件的調(diào)用當(dāng)父進(jìn)程使用fork創(chuàng)建了子進(jìn)程之后,子進(jìn)程繼承了父進(jìn)程的正文段和數(shù)據(jù)段,從而限制了子進(jìn)程可以執(zhí)行的程序規(guī)模。那么,子進(jìn)程用什么辦法來執(zhí)行那些不屬于父進(jìn)程正文段和數(shù)據(jù)段的呢?這就是利用系統(tǒng)調(diào)用exec( )或exece( )。系統(tǒng)調(diào)用exec引出另一個程序,它用一個可執(zhí)行文件的副本覆蓋調(diào)用
10、進(jìn)程的正文段和數(shù)據(jù)段,并以調(diào)用進(jìn)程提供的參數(shù)轉(zhuǎn)去執(zhí)行這個新的正文段程序。系統(tǒng)調(diào)用exec( )包含六種不同的調(diào)用格式,但它們都完成同一工作,即把文件系統(tǒng)中的可執(zhí)行文件調(diào)入并覆蓋調(diào)用進(jìn)程的正文段和數(shù)據(jù)段之后執(zhí)行。有關(guān)exec的各種系統(tǒng)調(diào)用的區(qū)別主要在參數(shù)處理方法上。這些系統(tǒng)調(diào)用使用不同的輸入?yún)?shù)、環(huán)境變量和路徑變量。這里,系統(tǒng)調(diào)用execvp()和execlp()在程序中經(jīng)常用到,其調(diào)用格式是:execvp (filename ,argp), 或execlp (filename ,arg0 ,arg1,.,(char *)0); 其中,filename是要執(zhí)行的文件名指針,argp是輸入?yún)?shù)序列
11、的指針,而0則是參數(shù)序列的結(jié)束標(biāo)志。例:用execlp 調(diào)用實現(xiàn)一個shell 的基本處理過程。利用fork-exec 可實現(xiàn)一個shell 的基本功能。用戶輸入命令后,按以下步驟執(zhí)行用戶命令(圖6.11)。(1) 利用fork,創(chuàng)建子進(jìn)程。(2) 利用exec,啟動命令程序。(3) 利用wait,父進(jìn)程和子進(jìn)程同步。圖6.11 shell執(zhí)行過程#include stdio.hmain ( ) char command32 ;char * prompt = “ $ ” ;while (printf (“%s” ,prompt) ,gets (command) != NULL)if (fork
12、 () = 0)execlp (command ,command ,(char *)0) ;elsewait (0) ; 3. 進(jìn)程的終止系統(tǒng)調(diào)用exit(rv)自我終止當(dāng)前進(jìn)程,使其進(jìn)入ZOMBIE 僵死狀態(tài),等待父進(jìn)程進(jìn)行善后處理。exit調(diào)用將導(dǎo)致釋放除task_struct結(jié)構(gòu)之外的所有資源,并清除進(jìn)程上下文。父進(jìn)程在收到子進(jìn)程的信息之后,將釋放子進(jìn)程的task_struct結(jié)構(gòu)和將有關(guān)時間信息加到自己的task_struct結(jié)構(gòu)的有關(guān)項中去。6.4 LINUX進(jìn)程調(diào)度LINUX的進(jìn)程調(diào)度由核心的調(diào)度過程schedule()實現(xiàn)。Linux中沒有高級調(diào)度和中級調(diào)度。1. 調(diào)度原理對實時
13、進(jìn)程和普通進(jìn)程采用不同的調(diào)度算法。普通進(jìn)程基于時間片的動態(tài)優(yōu)先數(shù)調(diào)度法實時進(jìn)程先來先服務(wù)和輪轉(zhuǎn)法2. 調(diào)度的時機(jī)處理機(jī)從核心態(tài)向用戶態(tài)轉(zhuǎn)換之前的瞬間當(dāng)進(jìn)程狀態(tài)發(fā)生變化時3. 調(diào)度標(biāo)識的設(shè)置使用need_resched標(biāo)志運行進(jìn)程時間片耗盡進(jìn)程被喚醒,且其優(yōu)先級高于當(dāng)前運行進(jìn)程優(yōu)先級4. 調(diào)度策略與優(yōu)先數(shù)的計算動態(tài)優(yōu)先數(shù)調(diào)度法Weight = counter + priority - nice先來先服務(wù)輪轉(zhuǎn)法5. 調(diào)度的實現(xiàn)進(jìn)程選擇進(jìn)程切換6.5 進(jìn) 程 通 信Linux 中的進(jìn)程通信分為三個部分:低級通信、管道通信和進(jìn)程間通信IPC(interprocess communacation)。同時
14、支持計算機(jī)間通信(網(wǎng)絡(luò)通信)用的TCPIP 協(xié)議。6.5.1 Linux的低級通信Linux的低級通信主要用來傳遞進(jìn)程間的控制信號。軟中斷信號目的是通知對方發(fā)生了異步事件。軟中斷是對硬件中斷的一種模擬,發(fā)送軟中斷就是向接收進(jìn)程的proc結(jié)構(gòu)中的相應(yīng)項發(fā)送圖6.10中的一個信號。接收進(jìn)程在收到軟中斷信號后,將按照事先的規(guī)定去執(zhí)行一個軟中斷處理程序。但是,軟中斷處理程序不像硬中斷處理程序那樣,收到中斷信號后立即被啟動,它必須等到接收進(jìn)程執(zhí)行時才能生效。一個進(jìn)程自己也可以向自己發(fā)送軟中斷信號,以便在某些意外的情況下,進(jìn)程能轉(zhuǎn)入規(guī)定好的處理程序。例如,大部分陷阱都是由當(dāng)前進(jìn)程自己向自己發(fā)送一個軟中斷信
15、號而立即轉(zhuǎn)入相應(yīng)處理的。圖6.10Linux軟中斷信號 文件鎖庫函數(shù)可以用于互斥lockf (fd ,function ,size)其中,fd是被鎖定文件標(biāo)識,function是控制值。size表示自fd文件的size個相連字節(jié)之后開始鎖定程序段。如果size等于零,則表示從調(diào)用lockf 后開始鎖定。例子見本書72頁。用于同步的系統(tǒng)調(diào)用是wait()或sleep(n)。其中,wait()用于父子進(jìn)程之間的同步,而sleep 則使得當(dāng)前進(jìn)程睡眠n 秒后自動喚醒自己。系統(tǒng)調(diào)用kill(pid,sig) 和signal(sig,func)被用來傳遞和接收軟中斷信號。一個用戶進(jìn)程可調(diào)用kill(pi
16、d,sig) 向另一個標(biāo)識號為pid 的用戶進(jìn)程發(fā)送軟中斷信號sig 。標(biāo)識號為pid 的進(jìn)程通過signal(sig,func)捕捉到信號sig之后,執(zhí)行預(yù)先約定的動作func,從而達(dá)到這兩個進(jìn)程的通信目的。一個經(jīng)常用到的例子是signal(SIGINT,SIG-IGN),表示當(dāng)前進(jìn)程不做任何指定的工作而忽略鍵盤中斷信號的影響。6.5.2 進(jìn)程間通信IPCIPC 是UNIX System 的一個核心程序包,它負(fù)責(zé)完成System 進(jìn)程之間的大量數(shù)據(jù)傳送工作。在IPC 包被開發(fā)出來之前,通信能力一直是UNIX系統(tǒng)的一個弱點,因為只能利用pipe來傳遞大量數(shù)據(jù)。而pipe又存在著只有調(diào)用pipe
17、的進(jìn)程的子孫后代才能使用它進(jìn)行通信的缺點。雖然有名管道能使非同族進(jìn)程之間相互通信,但它們不能復(fù)用一個有名管道以便為多對通信進(jìn)程提供私用通道。也就是說,有名管道不能識別其通信伙伴,也不能有選擇地接收信息。IPC核心程序包解決了這些弱點。Linux完整繼承了System 進(jìn)程間通信IPC。IPC 軟件包分三個組成部分:(1) 消息(message)用于進(jìn)程之間傳遞分類的格式化數(shù)據(jù)。(2) 共享存儲器(shared memory)方式可使得不同進(jìn)程通過共享彼此的虛擬空間而達(dá)到互相對共享區(qū)操作和數(shù)據(jù)通信的目的。(3) 信號量(semaphore)機(jī)制用于通信進(jìn)程之間同步控制。信號量通常和共享存儲器方式
18、一起使用。它們具有下述共同性質(zhì):(1) 每種機(jī)制都用兩種基本數(shù)據(jù)結(jié)構(gòu)來描述該機(jī)制。即: 索引表 實例表(2) 索引表項中的關(guān)鍵字是一個大于零的整數(shù),它由用戶選擇名字。(3) 索引表的訪問控制結(jié)構(gòu)中含有創(chuàng)建該表項進(jìn)程的用戶id和用戶組id。由后述“control”類系統(tǒng)調(diào)用,可為用戶和同組用戶設(shè)置讀寫執(zhí)行許可權(quán),從而起到通信保護(hù)的作用。(4) 每種通信機(jī)制的“control”類系統(tǒng)調(diào)用可用來查詢索引表項中的狀態(tài),以及置狀態(tài)信息或從系統(tǒng)中刪除表項。圖6.11 索引表與實例表的關(guān)系(5) 除了“control”類系統(tǒng)調(diào)用之外,每種通信機(jī)制還含有一個“get”類系統(tǒng)調(diào)用,以創(chuàng)建一個新的索引表項或者用于
19、獲得已建立的索引表項的描述字。(6) 每一種索引表項都使用下列公式計算索引表項的描述字:描述字 索引表長度分配序號索引表項下標(biāo)下面,簡單地介紹三種通信機(jī)制的系統(tǒng)調(diào)用。(1) 消息機(jī)制消息機(jī)制提供四個系統(tǒng)調(diào)用。它們是:msgqid msgget (key ,msgflg) 生成1個新的表項并返回描述字 返回已有表項的描述字msgctl (msgqid ,cmd ,buf)msgsnd (msgqid ,msgp ,msgsz ,msgflg)msgrcv (msgqid ,msgp ,msgsz ,msgtyp ,msgflg)顧客進(jìn)程和服務(wù)者進(jìn)程調(diào)用的程序例子。#include systype
20、s.h#include sysipc.h#include sysmsg.h#define MSGKEY 75struct msgform long mtype ;char mtext 256 ; ;main ( ) struct msgform msg ;int msgqid ,pid ,*pint ;msgqid = msgget (MSGKEY ,0777) ; /*建立消息隊列*/pid = getpid ( ) ;pint = (int *) msg.mtext ;*pint = pid ;msg.mtype = 1 ;/*指定消息類型*/msgsnd(msgqid,&msg,size
21、of(int),0); /*往msgqid發(fā)送消息msg*/msgrcv(msgqid,&msg,256,pid,0) ; /*接收來自服務(wù)進(jìn)程的消息*/printf(client : receive from pid%dn,*pint) ;圖6.12 顧客進(jìn)程的程序段#include systypes.h#include sysipc.h#include sysmsg.h#define MSGKEY 75struct msgform long mtype ;char mtext 256 ; msg ;int msgqid ;main ( )int i ,pid ,*pint ;extern
22、cleanup ( ) ;for (i=0 ; i20 ; i+) /*軟中斷處理*/ signal (i ,cleanup) ;/*建立與顧客進(jìn)程相同的消息隊列*/msgqid = msgget (MSGKEY ,0777 IPC-CREAT) ; for (; ;) /* 接收來自顧客進(jìn)程的消息 */msgrcv (msgqid ,&msg ,256 ,1 ,0) ; pint = (int*) msg.mtext ;pid = *pint ;printf (server : receive from pid %dn ,pid) ;msg.mtype = pid ;*pint = getp
23、id () ;msgsnd (msgqid,&msg,sizeof(int),0);/*發(fā)送應(yīng)答消息*/ cleanup ()msgctl (msgqid ,IPC-RMID ,0) ;exit () ;圖6.13服務(wù)者進(jìn)程的程序段顧客進(jìn)程向服務(wù)者進(jìn)程發(fā)送一個含有進(jìn)程號pid 以及類型為1 的消息,向服務(wù)者進(jìn)程發(fā)出服務(wù)請求。然后,從服務(wù)者進(jìn)程接收相應(yīng)的回答或服務(wù)。(2) 共享存儲區(qū)機(jī)制進(jìn)程能夠通過共享虛擬地址空間的若干部分,然后對存儲在共享存儲區(qū)中的數(shù)據(jù)進(jìn)行讀和寫來直接地彼此通信。操縱共享存儲區(qū)的系統(tǒng)調(diào)用類似于消息機(jī)制,共有4個系統(tǒng)調(diào)用。它們是: 建立新的共享區(qū)或返回一個已存在的共享存儲區(qū)描述
24、字的shmget(key,size,flag) 。其中,key 是用戶指定的共享區(qū)號,size是共享存儲區(qū)的長度,而flag則與msgget中的msgflg含義相同。 將物理共享區(qū)附接到進(jìn)程虛擬地址空間的調(diào)用shmat(shmid,addr,flag)。其中,shmid 是shmget返回的共享區(qū)描述字,而addr是將共享區(qū)附接到其上的用戶虛擬地址,當(dāng)addr等于零時,系統(tǒng)自動選擇適當(dāng)?shù)刂愤M(jìn)行附接(默認(rèn))。flag規(guī)定對此區(qū)是否是只讀的,以及核心是否應(yīng)對用戶規(guī)定的地址作舍入操作。shmat 返回系統(tǒng)附接該共享區(qū)后的虛擬地址。 進(jìn)程從其虛擬地址空間斷接一個共享存儲區(qū)的系統(tǒng)調(diào)用shmdt(addr
25、) 。其中,addr是shmat 返回的虛擬地址。 查詢及設(shè)置一個共享存儲區(qū)狀態(tài)和有關(guān)參數(shù)的系統(tǒng)調(diào)用shmctl(shmid,cmd,buf)。其中,shmid是共享存儲區(qū)的描述字,cmd規(guī)定操作類型,而buf則是用戶數(shù)據(jù)結(jié)構(gòu)的地址,這個用戶數(shù)據(jù)結(jié)構(gòu)中含有該共享存儲區(qū)的狀態(tài)信息。圖6.14 共享存儲區(qū)示意圖#include systypes.h#include sysipc.h#include sysshm.h#define SHMKEY75#define K1024int shmid ;main ( ) int i ,*pint ;char *addr ;extern char *shmat
26、 ( ) ;extern cleanup ( ) ;for (i=0 ; i20 ; i+) /* 軟中斷處理 */ signal (i ,cleanup) ;shmid = shmget (SHMKEY ,16*K ,0777IPC-CREAT) ; /* 建立16K共享區(qū)SHMKEY */addr = shmat (shmid ,0 ,0) ; /* 共享區(qū)首地址 */printf (addr 0 x%x n ,addr) ;pint = (int*)addr ;for (i=0 ; i256 ; i+) *pint+ = i ;pint = (int*)addr ; /*共享區(qū)第一個字中
27、寫入長度256,以便接收進(jìn)程讀*/*pint = 256 ;pause ( ) ; /* 等待接收進(jìn)程讀 */cleanup ( )shmctl (shmid ,IPC-RMID ,0) ;exit ( ) ;圖6.15 共享存儲區(qū)程序?qū)嵗?include systypes.h#include sysipc.h#include sysshm.h#define SHMKEY 75#define K1024int shmid ;main ( )int i ,*pint ;char *addr ;extern char *shmat ( ) ;/*取共享區(qū)SHMKEY的id*/shmid= shmg
28、et(SHMKEY,8*K,0777); addr = shmat (shmid,0,0) ; /*連接共享區(qū)*/pint = (int*)addr ; while (*pint=0); /*共享區(qū)的第一個字節(jié)為零時,等待*/for (i=0 ; i256 ; *pint+) /*打印共享區(qū)中內(nèi)容*/printf (%dn . *pint+) ;圖6.16 共享存儲區(qū)程序?qū)嵗?3) 信號量機(jī)制信號量機(jī)制是基于第3章所述的、原語原理的。System 中一個信號量由以下幾部分組成: 信號量的值,一個大于、小于或等于零的整數(shù)。 最后一個操縱信號量的進(jìn)程的進(jìn)程id。 等待著信號量值增加的進(jìn)程數(shù)。 等待
29、著信號量值等于零的進(jìn)程數(shù)。信號量機(jī)制提供下列系統(tǒng)調(diào)用對信號量進(jìn)行創(chuàng)建、控制、以及、操作。它們是: 用于產(chǎn)生一個信號量數(shù)組以及得以存取它們的系統(tǒng)調(diào)用semget(semkey ,count,flag) 。其中,semkey和flag類似于建立消息和共享存儲區(qū)時的這些參數(shù)。semkey是用戶指定的關(guān)鍵字,count 規(guī)定信號量數(shù)組的長度,flag為操作標(biāo)識。semget用來創(chuàng)建信號量數(shù)組或查找已創(chuàng)建信號量數(shù)組的描述字。semid semget (SEMKEY ,2 ,0777IPC-CREAT) ;創(chuàng)建一個關(guān)鍵字為SEMKEY的含有兩個元素的信號量數(shù)組。圖6.21 信號量數(shù)組 用于、操作的系統(tǒng)調(diào)用
30、semop (semid, oplist, count) 。其中,semid 是semget返回的描述字,oplist是用戶提供的操作數(shù)組的指針,count 是該數(shù)組的大小。semop 返回在該組操作中最后被操作的信號量在操作完成前的值。用戶定義的操作數(shù)組中的每個元素包含三個內(nèi)容,它們是信號量序號、操作內(nèi)容(對信號量進(jìn)行操作或操作的值)、標(biāo)識。一個數(shù)組可同時包含對n(n1)個信號量的操作。semop 根據(jù)操作數(shù)組所規(guī)定的操作內(nèi)容改變信號量的值。如果操作內(nèi)容為正數(shù)(操作),則它將該信號量增加該操作內(nèi)容的值,并喚醒所有等待此信號量值增加的進(jìn)程。如果操作內(nèi)容為零,則semop 檢查信號量的值,若為零
31、,semop 執(zhí)行對同一操作數(shù)組中其他信號量的操作;如果操作內(nèi)容是負(fù)數(shù)且絕對值小于等于信號量值,則semop 從信號量值中減去操作內(nèi)容;否則,調(diào)用sleep 讓該進(jìn)程睡眠在等待信號量值增加的事件上。struct sembuf unsigned short sem-num ; shorsem-op ; shortsem-flg ; Psembuf ;semid = semget (SEMKEY ,2 ,0777) ;Psembuf.sem-num = first ;Psembuf.sem-op = -1 ;Psembuf.sem-flg = SEM-UNDO ;semop (semid ,&psembuf ,1) ;定義了一個對二元信號量數(shù)組中第一個信號量的操作。其中,SEM-UNDO是為了保證操作的原子性而設(shè)置的標(biāo)識。 對信號量進(jìn)行控制操作的系統(tǒng)調(diào)用semctl(sem
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度國際勞務(wù)輸出合同管理與勞動權(quán)益保障
- 2025年度廣州科技創(chuàng)新園區(qū)建設(shè)工程施工合同參考范本
- 2025年度城市更新改造工程監(jiān)理服務(wù)合同
- 長春2024年吉林長春市市直事業(yè)單位招聘13人筆試歷年參考題庫附帶答案詳解
- 貴州2025年貴州省殘疾人聯(lián)合會直屬事業(yè)單位招聘13人筆試歷年參考題庫附帶答案詳解
- 西雙版納2025年云南西雙版納州婦幼保健院第一批非在編護(hù)理人員招聘筆試歷年參考題庫附帶答案詳解
- 舟山浙江舟山岱山縣司法局招聘編外工作人員(二)筆試歷年參考題庫附帶答案詳解
- 綏化2025年黑龍江肇東市急需緊缺高中教師招聘6人筆試歷年參考題庫附帶答案詳解
- 湖北2025年湖北醫(yī)藥學(xué)院專項招聘90人筆試歷年參考題庫附帶答案詳解
- 河南2025年河南財政金融學(xué)院招聘高層次人才筆試歷年參考題庫附帶答案詳解
- 水稻葉齡診斷栽培技術(shù)課件
- 2023年中國工商銀行蘇州分行社會招聘30人筆試備考試題及答案解析
- 經(jīng)纖支鏡氣道球囊擴(kuò)張術(shù)課件
- 汽車尾氣污染與治理汽車尾氣污染課件
- 河南神火興隆礦業(yè)有限責(zé)任公司泉店煤礦礦產(chǎn)資源開采與生態(tài)修復(fù)方案
- 對外漢語教學(xué)論
- 《十萬個為什么》推進(jìn)課(小學(xué)課件)
- 全國主要城市的月日均總輻照量和年日均總輻照量
- 會計公司員工手冊
- GB/T 13404-2008管法蘭用非金屬聚四氟乙烯包覆墊片
- 任職宣布大會上的講話(集團(tuán)公司任命子公司領(lǐng)導(dǎo)班子成員)
評論
0/150
提交評論