版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第6章 進(jìn)程與存儲(chǔ)管理示例6.1 Linux進(jìn)程和存儲(chǔ)管理簡(jiǎ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存儲(chǔ)管理本章小結(jié)習(xí)題本章以Linux 2.6為主,介紹Linux的進(jìn)程和存儲(chǔ)管理方法。6.1 Linux進(jìn)程和存儲(chǔ)管理簡(jiǎn)介L(zhǎng)inux系統(tǒng)的核心部分從整體上說(shuō)可以分為兩大部分,即“靜”的文件系統(tǒng)和“動(dòng)”的進(jìn)程控制系統(tǒng)。文件系統(tǒng)主要用來(lái)存放、管理那些暫時(shí)不被處理機(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)核能在每次開(kāi)機(jī)時(shí)順利地裝入內(nèi)存,用戶必須事先把Linux操作系統(tǒng)的執(zhí)行代碼以文件方式存儲(chǔ)在計(jì)算機(jī)硬盤(pán)設(shè)備中,并對(duì)計(jì)算機(jī)系統(tǒng)中的相應(yīng)資源,例如高速緩存、交換區(qū)等進(jìn)行初始化。這一過(guò)程被稱(chēng)為操作系統(tǒng)的安裝過(guò)程。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í)行會(huì)引起錯(cuò)誤,只能在核心態(tài)下執(zhí)行。在不同
3、的執(zhí)行模式下執(zhí)行時(shí),同一進(jìn)程使用不同的堆棧,分別稱(chēng)為核心態(tài)堆棧和用戶態(tài)堆棧。在進(jìn)程切換到不同執(zhí)行模式時(shí)候,操作系統(tǒng)負(fù)責(zé)為進(jìn)程切換到相應(yīng)的堆棧。Linux系統(tǒng)中進(jìn)程通過(guò)請(qǐng)求操作系統(tǒng)服務(wù)進(jìn)入核心態(tài)的機(jī)制稱(chēng)為系統(tǒng)調(diào)用。具體實(shí)現(xiàn)和硬件平臺(tái)的體系結(jié)構(gòu)相關(guān),在80 x86系統(tǒng)中,用戶進(jìn)程通過(guò)int 0 x80指令請(qǐng)求系統(tǒng)調(diào)用,系統(tǒng)調(diào)用完成后通過(guò)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) 一個(gè)進(jìn)程是對(duì)一個(gè)程序的執(zhí)行。(2) 一個(gè)進(jìn)程的存在
4、意味著存在一個(gè)“task_struct”結(jié)構(gòu),它包含著相應(yīng)的進(jìn)程控制信息。(3) 一個(gè)進(jìn)程可以生成或者消滅其子進(jìn)程(4) 一個(gè)進(jìn)程是獲得和釋放系統(tǒng)資源的基本單位第(2)點(diǎn)反映了進(jìn)程的靜態(tài)特性一個(gè)進(jìn)程的靜態(tài)描述是由三部分組成的,即進(jìn)程狀態(tài)控制塊PCB,進(jìn)程的程序文本(正文)段以及進(jìn)程的數(shù)據(jù)段。這三部分統(tǒng)稱(chēng)為進(jìn)程上下文.6.2.2 進(jìn)程的虛擬地址結(jié)構(gòu)Linux進(jìn)程的虛擬地址結(jié)構(gòu)依賴(lài)于硬件,本書(shū)默認(rèn)那些與硬件有關(guān)部分依賴(lài)于intel 80 x86。80 x86平臺(tái)中,每個(gè)進(jìn)程擁有一個(gè)4GB的虛擬空間。其中0-3GB的地址空間有用戶進(jìn)程使用,3-4GB的地址空間稱(chēng)為核心地址空間,在所有進(jìn)程中共享,只被
5、核心使用,用戶進(jìn)程不能使用。 Linux進(jìn)程由邏輯段組成,一個(gè)進(jìn)程的虛擬地址空間被分成若干個(gè)虛擬區(qū)域來(lái)存放上述的邏輯段。區(qū)是虛擬地址空間上的一段連續(xù)區(qū)域,是共享、保護(hù)以及進(jìn)行內(nèi)存分配和地址變換的獨(dú)立實(shí)體。Linux中的區(qū)和段頁(yè)式管理中的段非常相像。所不同的是,段頁(yè)式管理中的虛擬地址空間是二維的,而Linux的各個(gè)進(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)程上下文的各個(gè)部分按照一定的規(guī)則分布在進(jìn)程虛擬空間的不同位置上。對(duì)于不同的機(jī)器和硬件結(jié)構(gòu),進(jìn)程上
6、下文的分布規(guī)則不同。例如,在80 x86上,其虛擬地址空間劃分為進(jìn)程空間和系統(tǒng)空間兩大部分。其尋址范圍為 232個(gè)單元。其中,虛擬空間的低位地址的半部分(0 3G)是進(jìn)程虛擬空間,其余為所有進(jìn)程共享的系統(tǒng)空間,操作系統(tǒng)核心程序占據(jù)這個(gè)區(qū)。圖6.3 進(jìn)程空間結(jié)構(gòu)圖6.4 執(zhí)行copy程序時(shí)用戶棧和核心棧的變化2. 進(jìn)程上下文的組成部分進(jìn)程上下文由task_struct結(jié)構(gòu)、用戶棧和核心棧的內(nèi)容、用戶地址空間的正文段、數(shù)據(jù)段、硬件寄存器的內(nèi)容以及頁(yè)表等組成。6.2.4 進(jìn)程的狀態(tài)和狀態(tài)轉(zhuǎn)換一個(gè)進(jìn)程的生命期是由一組狀態(tài)來(lái)刻畫(huà)的。這些狀態(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啟動(dòng)及進(jìn)程樹(shù)的形成 當(dāng)用戶打開(kāi)PC的電源,BIOS開(kāi)機(jī)自檢,按BIOS中設(shè)置的啟動(dòng)設(shè)備(通常是硬盤(pán))啟動(dòng),接著啟動(dòng)設(shè)備上安裝的引導(dǎo)程序lilo或grub開(kāi)始引導(dǎo)Linux,Linux首先進(jìn)行內(nèi)核的引導(dǎo),接下來(lái)執(zhí)行init程序,init程序調(diào)用了rc.sysinit和rc等程序,rc.sysinit和rc當(dāng)完成系統(tǒng)初始化和運(yùn)行服務(wù)的任務(wù)后,返回init;init啟動(dòng)了mingetty后,打開(kāi)了終端供用戶登錄系統(tǒng),用戶登錄成功后進(jìn)入了Shell,這樣就完成了從開(kāi)機(jī)到登錄的整個(gè)啟動(dòng)過(guò)程。 6.3.2 進(jìn)程控制1. 進(jìn)程的創(chuàng)建該節(jié)主要討論用戶進(jìn)程的創(chuàng)建、執(zhí)
8、行和自我終止問(wèn)題,與此相對(duì)應(yīng),Linux系統(tǒng)提供有相應(yīng)的系統(tǒng)調(diào)用fork( ),exec( )和exit( ),以便在用戶級(jí)上實(shí)現(xiàn)上述功能。fork的功能是創(chuàng)建一個(gè)子進(jìn)程。調(diào)用fork的進(jìn)程稱(chēng)為父進(jìn)程。系統(tǒng)調(diào)用fork的語(yǔ)法格式是: pid fork ( ) ;從系統(tǒng)調(diào)用fork返回時(shí),父進(jìn)程和子進(jìn)程除了返回值pid 與task_struct結(jié)構(gòu)中某些特性參數(shù)不同之外,其他完全相同。CPU 在父進(jìn)程中時(shí),pid 值為所創(chuàng)建子進(jìn)程的進(jìn)程號(hào),若在子進(jìn)程中時(shí),pid 的值為零。下面介紹一下fork的功能與實(shí)現(xiàn)過(guò)程。(1) 為子進(jìn)程分配一個(gè)task_struct結(jié)構(gòu),將父進(jìn)程的結(jié)構(gòu)復(fù)制到其中,并進(jìn)行修
9、改。(2) 為子進(jìn)程賦一個(gè)唯一的進(jìn)程標(biāo)識(shí)號(hào)pid 。(3) 復(fù)制一個(gè)父進(jìn)程上下文的邏輯副本。 (4) 復(fù)制父進(jìn)程相關(guān)聯(lián)的有關(guān)文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和用戶文件描述符表。(5)復(fù)制軟中斷信號(hào)有關(guān)數(shù)據(jù)結(jié)構(gòu)(6)設(shè)置子進(jìn)程狀態(tài),并加入就緒隊(duì)列(7) 對(duì)父進(jìn)程返回子進(jìn)程的進(jìn)程標(biāo)識(shí)號(hào),對(duì)子進(jìn)程返回零。2. 執(zhí)行一個(gè)文件的調(diào)用當(dāng)父進(jìn)程使用fork創(chuàng)建了子進(jìn)程之后,子進(jìn)程繼承了父進(jìn)程的正文段和數(shù)據(jù)段,從而限制了子進(jìn)程可以執(zhí)行的程序規(guī)模。那么,子進(jìn)程用什么辦法來(lái)執(zhí)行那些不屬于父進(jìn)程正文段和數(shù)據(jù)段的呢?這就是利用系統(tǒng)調(diào)用exec( )或exece( )。系統(tǒng)調(diào)用exec引出另一個(gè)程序,它用一個(gè)可執(zhí)行文件的副本覆蓋調(diào)用
10、進(jìn)程的正文段和數(shù)據(jù)段,并以調(diào)用進(jìn)程提供的參數(shù)轉(zhuǎn)去執(zhí)行這個(gè)新的正文段程序。系統(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)用實(shí)現(xiàn)一個(gè)shell 的基本處理過(guò)程。利用fork-exec 可實(shí)現(xiàn)一個(gè)shell 的基本功能。用戶輸入命令后,按以下步驟執(zhí)行用戶命令(圖6.11)。(1) 利用fork,創(chuàng)建子進(jìn)程。(2) 利用exec,啟動(dòng)命令程序。(3) 利用wait,父進(jìn)程和子進(jìn)程同步。圖6.11 shell執(zhí)行過(guò)程#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)時(shí)間信息加到自己的task_struct結(jié)構(gòu)的有關(guān)項(xiàng)中去。6.4 LINUX進(jìn)程調(diào)度LINUX的進(jìn)程調(diào)度由核心的調(diào)度過(guò)程schedule()實(shí)現(xiàn)。Linux中沒(méi)有高級(jí)調(diào)度和中級(jí)調(diào)度。1. 調(diào)度原理對(duì)實(shí)時(shí)
13、進(jìn)程和普通進(jìn)程采用不同的調(diào)度算法。普通進(jìn)程基于時(shí)間片的動(dòng)態(tài)優(yōu)先數(shù)調(diào)度法實(shí)時(shí)進(jìn)程先來(lái)先服務(wù)和輪轉(zhuǎn)法2. 調(diào)度的時(shí)機(jī)處理機(jī)從核心態(tài)向用戶態(tài)轉(zhuǎn)換之前的瞬間當(dāng)進(jìn)程狀態(tài)發(fā)生變化時(shí)3. 調(diào)度標(biāo)識(shí)的設(shè)置使用need_resched標(biāo)志運(yùn)行進(jìn)程時(shí)間片耗盡進(jìn)程被喚醒,且其優(yōu)先級(jí)高于當(dāng)前運(yùn)行進(jìn)程優(yōu)先級(jí)4. 調(diào)度策略與優(yōu)先數(shù)的計(jì)算動(dòng)態(tài)優(yōu)先數(shù)調(diào)度法Weight = counter + priority - nice先來(lái)先服務(wù)輪轉(zhuǎn)法5. 調(diào)度的實(shí)現(xiàn)進(jìn)程選擇進(jìn)程切換6.5 進(jìn) 程 通 信Linux 中的進(jìn)程通信分為三個(gè)部分:低級(jí)通信、管道通信和進(jìn)程間通信IPC(interprocess communacation)。同時(shí)
14、支持計(jì)算機(jī)間通信(網(wǎng)絡(luò)通信)用的TCPIP 協(xié)議。6.5.1 Linux的低級(jí)通信Linux的低級(jí)通信主要用來(lái)傳遞進(jìn)程間的控制信號(hào)。軟中斷信號(hào)目的是通知對(duì)方發(fā)生了異步事件。軟中斷是對(duì)硬件中斷的一種模擬,發(fā)送軟中斷就是向接收進(jìn)程的proc結(jié)構(gòu)中的相應(yīng)項(xiàng)發(fā)送圖6.10中的一個(gè)信號(hào)。接收進(jìn)程在收到軟中斷信號(hào)后,將按照事先的規(guī)定去執(zhí)行一個(gè)軟中斷處理程序。但是,軟中斷處理程序不像硬中斷處理程序那樣,收到中斷信號(hào)后立即被啟動(dòng),它必須等到接收進(jìn)程執(zhí)行時(shí)才能生效。一個(gè)進(jìn)程自己也可以向自己發(fā)送軟中斷信號(hào),以便在某些意外的情況下,進(jìn)程能轉(zhuǎn)入規(guī)定好的處理程序。例如,大部分陷阱都是由當(dāng)前進(jìn)程自己向自己發(fā)送一個(gè)軟中斷信
15、號(hào)而立即轉(zhuǎn)入相應(yīng)處理的。圖6.10Linux軟中斷信號(hào) 文件鎖庫(kù)函數(shù)可以用于互斥lockf (fd ,function ,size)其中,fd是被鎖定文件標(biāo)識(shí),function是控制值。size表示自fd文件的size個(gè)相連字節(jié)之后開(kāi)始鎖定程序段。如果size等于零,則表示從調(diào)用lockf 后開(kāi)始鎖定。例子見(jiàn)本書(shū)72頁(yè)。用于同步的系統(tǒng)調(diào)用是wait()或sleep(n)。其中,wait()用于父子進(jìn)程之間的同步,而sleep 則使得當(dāng)前進(jìn)程睡眠n 秒后自動(dòng)喚醒自己。系統(tǒng)調(diào)用kill(pid,sig) 和signal(sig,func)被用來(lái)傳遞和接收軟中斷信號(hào)。一個(gè)用戶進(jìn)程可調(diào)用kill(pi
16、d,sig) 向另一個(gè)標(biāo)識(shí)號(hào)為pid 的用戶進(jìn)程發(fā)送軟中斷信號(hào)sig 。標(biāo)識(shí)號(hào)為pid 的進(jìn)程通過(guò)signal(sig,func)捕捉到信號(hào)sig之后,執(zhí)行預(yù)先約定的動(dòng)作func,從而達(dá)到這兩個(gè)進(jìn)程的通信目的。一個(gè)經(jīng)常用到的例子是signal(SIGINT,SIG-IGN),表示當(dāng)前進(jìn)程不做任何指定的工作而忽略鍵盤(pán)中斷信號(hào)的影響。6.5.2 進(jìn)程間通信IPCIPC 是UNIX System 的一個(gè)核心程序包,它負(fù)責(zé)完成System 進(jìn)程之間的大量數(shù)據(jù)傳送工作。在IPC 包被開(kāi)發(fā)出來(lái)之前,通信能力一直是UNIX系統(tǒng)的一個(gè)弱點(diǎn),因?yàn)橹荒芾胮ipe來(lái)傳遞大量數(shù)據(jù)。而pipe又存在著只有調(diào)用pipe
17、的進(jìn)程的子孫后代才能使用它進(jìn)行通信的缺點(diǎn)。雖然有名管道能使非同族進(jìn)程之間相互通信,但它們不能復(fù)用一個(gè)有名管道以便為多對(duì)通信進(jìn)程提供私用通道。也就是說(shuō),有名管道不能識(shí)別其通信伙伴,也不能有選擇地接收信息。IPC核心程序包解決了這些弱點(diǎn)。Linux完整繼承了System 進(jìn)程間通信IPC。IPC 軟件包分三個(gè)組成部分:(1) 消息(message)用于進(jìn)程之間傳遞分類(lèi)的格式化數(shù)據(jù)。(2) 共享存儲(chǔ)器(shared memory)方式可使得不同進(jìn)程通過(guò)共享彼此的虛擬空間而達(dá)到互相對(duì)共享區(qū)操作和數(shù)據(jù)通信的目的。(3) 信號(hào)量(semaphore)機(jī)制用于通信進(jìn)程之間同步控制。信號(hào)量通常和共享存儲(chǔ)器方式
18、一起使用。它們具有下述共同性質(zhì):(1) 每種機(jī)制都用兩種基本數(shù)據(jù)結(jié)構(gòu)來(lái)描述該機(jī)制。即: 索引表 實(shí)例表(2) 索引表項(xiàng)中的關(guān)鍵字是一個(gè)大于零的整數(shù),它由用戶選擇名字。(3) 索引表的訪問(wèn)控制結(jié)構(gòu)中含有創(chuàng)建該表項(xiàng)進(jìn)程的用戶id和用戶組id。由后述“control”類(lèi)系統(tǒng)調(diào)用,可為用戶和同組用戶設(shè)置讀寫(xiě)執(zhí)行許可權(quán),從而起到通信保護(hù)的作用。(4) 每種通信機(jī)制的“control”類(lèi)系統(tǒng)調(diào)用可用來(lái)查詢索引表項(xiàng)中的狀態(tài),以及置狀態(tài)信息或從系統(tǒng)中刪除表項(xiàng)。圖6.11 索引表與實(shí)例表的關(guān)系(5) 除了“control”類(lèi)系統(tǒng)調(diào)用之外,每種通信機(jī)制還含有一個(gè)“get”類(lèi)系統(tǒng)調(diào)用,以創(chuàng)建一個(gè)新的索引表項(xiàng)或者用于
19、獲得已建立的索引表項(xiàng)的描述字。(6) 每一種索引表項(xiàng)都使用下列公式計(jì)算索引表項(xiàng)的描述字:描述字 索引表長(zhǎng)度分配序號(hào)索引表項(xiàng)下標(biāo)下面,簡(jiǎn)單地介紹三種通信機(jī)制的系統(tǒng)調(diào)用。(1) 消息機(jī)制消息機(jī)制提供四個(gè)系統(tǒng)調(diào)用。它們是:msgqid msgget (key ,msgflg) 生成1個(gè)新的表項(xiàng)并返回描述字 返回已有表項(xiàng)的描述字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) ; /*建立消息隊(duì)列*/pid = getpid ( ) ;pint = (int *) msg.mtext ;*pint = pid ;msg.mtype = 1 ;/*指定消息類(lèi)型*/msgsnd(msgqid,&msg,size
21、of(int),0); /*往msgqid發(fā)送消息msg*/msgrcv(msgqid,&msg,256,pid,0) ; /*接收來(lái)自服務(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)程相同的消息隊(duì)列*/msgqid = msgget (MSGKEY ,0777 IPC-CREAT) ; for (; ;) /* 接收來(lái)自顧客進(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ā)送一個(gè)含有進(jìn)程號(hào)pid 以及類(lèi)型為1 的消息,向服務(wù)者進(jìn)程發(fā)出服務(wù)請(qǐng)求。然后,從服務(wù)者進(jìn)程接收相應(yīng)的回答或服務(wù)。(2) 共享存儲(chǔ)區(qū)機(jī)制進(jìn)程能夠通過(guò)共享虛擬地址空間的若干部分,然后對(duì)存儲(chǔ)在共享存儲(chǔ)區(qū)中的數(shù)據(jù)進(jìn)行讀和寫(xiě)來(lái)直接地彼此通信。操縱共享存儲(chǔ)區(qū)的系統(tǒng)調(diào)用類(lèi)似于消息機(jī)制,共有4個(gè)系統(tǒng)調(diào)用。它們是: 建立新的共享區(qū)或返回一個(gè)已存在的共享存儲(chǔ)區(qū)描述
24、字的shmget(key,size,flag) 。其中,key 是用戶指定的共享區(qū)號(hào),size是共享存儲(chǔ)區(qū)的長(zhǎng)度,而flag則與msgget中的msgflg含義相同。 將物理共享區(qū)附接到進(jìn)程虛擬地址空間的調(diào)用shmat(shmid,addr,flag)。其中,shmid 是shmget返回的共享區(qū)描述字,而addr是將共享區(qū)附接到其上的用戶虛擬地址,當(dāng)addr等于零時(shí),系統(tǒng)自動(dòng)選擇適當(dāng)?shù)刂愤M(jìn)行附接(默認(rèn))。flag規(guī)定對(duì)此區(qū)是否是只讀的,以及核心是否應(yīng)對(duì)用戶規(guī)定的地址作舍入操作。shmat 返回系統(tǒng)附接該共享區(qū)后的虛擬地址。 進(jìn)程從其虛擬地址空間斷接一個(gè)共享存儲(chǔ)區(qū)的系統(tǒng)調(diào)用shmdt(addr
25、) 。其中,addr是shmat 返回的虛擬地址。 查詢及設(shè)置一個(gè)共享存儲(chǔ)區(qū)狀態(tài)和有關(guān)參數(shù)的系統(tǒng)調(diào)用shmctl(shmid,cmd,buf)。其中,shmid是共享存儲(chǔ)區(qū)的描述字,cmd規(guī)定操作類(lèi)型,而buf則是用戶數(shù)據(jù)結(jié)構(gòu)的地址,這個(gè)用戶數(shù)據(jù)結(jié)構(gòu)中含有該共享存儲(chǔ)區(qū)的狀態(tài)信息。圖6.14 共享存儲(chǔ)區(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ū)第一個(gè)字中
27、寫(xiě)入長(zhǎng)度256,以便接收進(jìn)程讀*/*pint = 256 ;pause ( ) ; /* 等待接收進(jìn)程讀 */cleanup ( )shmctl (shmid ,IPC-RMID ,0) ;exit ( ) ;圖6.15 共享存儲(chǔ)區(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ū)的第一個(gè)字節(jié)為零時(shí),等待*/for (i=0 ; i256 ; *pint+) /*打印共享區(qū)中內(nèi)容*/printf (%dn . *pint+) ;圖6.16 共享存儲(chǔ)區(qū)程序?qū)嵗?3) 信號(hào)量機(jī)制信號(hào)量機(jī)制是基于第3章所述的、原語(yǔ)原理的。System 中一個(gè)信號(hào)量由以下幾部分組成: 信號(hào)量的值,一個(gè)大于、小于或等于零的整數(shù)。 最后一個(gè)操縱信號(hào)量的進(jìn)程的進(jìn)程id。 等待著信號(hào)量值增加的進(jìn)程數(shù)。 等待
29、著信號(hào)量值等于零的進(jìn)程數(shù)。信號(hào)量機(jī)制提供下列系統(tǒng)調(diào)用對(duì)信號(hào)量進(jìn)行創(chuàng)建、控制、以及、操作。它們是: 用于產(chǎn)生一個(gè)信號(hào)量數(shù)組以及得以存取它們的系統(tǒng)調(diào)用semget(semkey ,count,flag) 。其中,semkey和flag類(lèi)似于建立消息和共享存儲(chǔ)區(qū)時(shí)的這些參數(shù)。semkey是用戶指定的關(guān)鍵字,count 規(guī)定信號(hào)量數(shù)組的長(zhǎng)度,flag為操作標(biāo)識(shí)。semget用來(lái)創(chuàng)建信號(hào)量數(shù)組或查找已創(chuàng)建信號(hào)量數(shù)組的描述字。semid semget (SEMKEY ,2 ,0777IPC-CREAT) ;創(chuàng)建一個(gè)關(guān)鍵字為SEMKEY的含有兩個(gè)元素的信號(hào)量數(shù)組。圖6.21 信號(hào)量數(shù)組 用于、操作的系統(tǒng)調(diào)用
30、semop (semid, oplist, count) 。其中,semid 是semget返回的描述字,oplist是用戶提供的操作數(shù)組的指針,count 是該數(shù)組的大小。semop 返回在該組操作中最后被操作的信號(hào)量在操作完成前的值。用戶定義的操作數(shù)組中的每個(gè)元素包含三個(gè)內(nèi)容,它們是信號(hào)量序號(hào)、操作內(nèi)容(對(duì)信號(hào)量進(jìn)行操作或操作的值)、標(biāo)識(shí)。一個(gè)數(shù)組可同時(shí)包含對(duì)n(n1)個(gè)信號(hào)量的操作。semop 根據(jù)操作數(shù)組所規(guī)定的操作內(nèi)容改變信號(hào)量的值。如果操作內(nèi)容為正數(shù)(操作),則它將該信號(hào)量增加該操作內(nèi)容的值,并喚醒所有等待此信號(hào)量值增加的進(jìn)程。如果操作內(nèi)容為零,則semop 檢查信號(hào)量的值,若為零
31、,semop 執(zhí)行對(duì)同一操作數(shù)組中其他信號(hào)量的操作;如果操作內(nèi)容是負(fù)數(shù)且絕對(duì)值小于等于信號(hào)量值,則semop 從信號(hào)量值中減去操作內(nèi)容;否則,調(diào)用sleep 讓該進(jìn)程睡眠在等待信號(hào)量值增加的事件上。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) ;定義了一個(gè)對(duì)二元信號(hào)量數(shù)組中第一個(gè)信號(hào)量的操作。其中,SEM-UNDO是為了保證操作的原子性而設(shè)置的標(biāo)識(shí)。 對(duì)信號(hào)量進(jìn)行控制操作的系統(tǒng)調(diào)用semctl(sem
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度公益慈善晚會(huì)活動(dòng)策劃與實(shí)施合同4篇
- 2025年度互聯(lián)網(wǎng)內(nèi)容提供商ICP證年審全權(quán)委托服務(wù)合同3篇
- 二零二五年度生物科技研發(fā)農(nóng)民工就業(yè)服務(wù)合同4篇
- 電子商務(wù)平臺(tái)消費(fèi)者權(quán)益保護(hù)2025年度國(guó)際協(xié)調(diào)合同2篇
- 2025年度牛肝菌有機(jī)認(rèn)證與市場(chǎng)拓展合同
- 二零二五版昆明滇池度假區(qū)酒店管理合同3篇
- 二零二五年度農(nóng)業(yè)種植勞務(wù)作業(yè)承包合同范本3篇
- 2025年度塑料管材國(guó)際貿(mào)易爭(zhēng)端解決合同
- 2025年度私立學(xué)校校長(zhǎng)任期教育科研成果轉(zhuǎn)化合同
- 二零二五年度企業(yè)員工期權(quán)激勵(lì)合同范本
- 廣東省佛山市2025屆高三高中教學(xué)質(zhì)量檢測(cè) (一)化學(xué)試題(含答案)
- 人教版【初中數(shù)學(xué)】知識(shí)點(diǎn)總結(jié)-全面+九年級(jí)上冊(cè)數(shù)學(xué)全冊(cè)教案
- 四川省成都市青羊區(qū)成都市石室聯(lián)合中學(xué)2023-2024學(xué)年七上期末數(shù)學(xué)試題(解析版)
- 咨詢公司績(jī)效工資分配實(shí)施方案
- 2024-2025學(xué)年人教版七年級(jí)英語(yǔ)上冊(cè)各單元重點(diǎn)句子
- 2025新人教版英語(yǔ)七年級(jí)下單詞表
- 公司結(jié)算資金管理制度
- 2024年小學(xué)語(yǔ)文教師基本功測(cè)試卷(有答案)
- 未成年入職免責(zé)協(xié)議書(shū)
- 項(xiàng)目可行性研究報(bào)告評(píng)估咨詢管理服務(wù)方案1
- 5歲幼兒數(shù)學(xué)練習(xí)題
評(píng)論
0/150
提交評(píng)論