




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)操作系統(tǒng)講義操作系統(tǒng)講義西安財(cái)經(jīng)學(xué)院LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院操作系統(tǒng)概述操作系統(tǒng)概述 系統(tǒng)啟動(dòng)及用戶界面系統(tǒng)啟動(dòng)及用戶界面進(jìn)程管理與調(diào)度進(jìn)程管理與調(diào)度進(jìn)程同步進(jìn)程同步第一章第二章第三章第四章文件管理文件管理 第七章Contents課程內(nèi)容安排課程內(nèi)容安排 西安財(cái)經(jīng)學(xué)院設(shè)備管理設(shè)備管理第六章存儲(chǔ)器管理存儲(chǔ)器管理 第五章LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院第四章第四章 進(jìn)程間通信進(jìn)程間通信-IPC 臨界區(qū)管理臨界區(qū)管理1并發(fā)進(jìn)程并發(fā)進(jìn)程2信號(hào)量與信號(hào)量與P、 V操作操作 3西安財(cái)經(jīng)學(xué)院進(jìn)程間通信進(jìn)程間通信-IPC4死鎖及管程死鎖及管程5LOGO房地產(chǎn)房地產(chǎn)
2、E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院4.1 并發(fā)進(jìn)程并發(fā)進(jìn)程系統(tǒng)中的程序執(zhí)行可分為:系統(tǒng)中的程序執(zhí)行可分為:l 順序執(zhí)行順序執(zhí)行l(wèi) 并發(fā)執(zhí)行并發(fā)執(zhí)行順序執(zhí)行:順序執(zhí)行:是單道批處理系統(tǒng)的執(zhí)行方式,操作系統(tǒng)依次執(zhí)行各程序,在一個(gè)程序的整個(gè)執(zhí)行過(guò)程中該程序執(zhí)行占用所有系統(tǒng)資源,不會(huì)中途暫停。程序的順序執(zhí)行具有下列三個(gè)特征:v 順序性:程序的執(zhí)行是按照程序結(jié)構(gòu)所指定的次序進(jìn)行的,可能的次序有分支、循環(huán)或跳轉(zhuǎn)等;v 封閉性:程序在執(zhí)行過(guò)程中獨(dú)占全部資源,計(jì)算機(jī)的狀態(tài)完全由該程序的控制邏輯所決定v 可再現(xiàn)性:只要程序執(zhí)行的初始條件相同,執(zhí)行結(jié)果就完全相同。例如,在程序中可利用空指令控制時(shí)間關(guān)系。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)
3、西安財(cái)經(jīng)學(xué)院程序并發(fā)執(zhí)行的前趨圖程序并發(fā)執(zhí)行的前趨圖LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院并發(fā)式的運(yùn)行方式并發(fā)式的運(yùn)行方式v 多道系統(tǒng)采用并發(fā)式的運(yùn)行方式,以提高系統(tǒng)資源的利用率。這種程序執(zhí)行環(huán)境的變化體現(xiàn)在以下三個(gè)方面:間斷(異步)性:處理器交替執(zhí)行多個(gè)程序,每個(gè)程序都是以“走走停?!钡姆绞綀?zhí)行,可能走到中途停下來(lái),而且程序無(wú)法預(yù)知每次執(zhí)行和暫停的時(shí)間長(zhǎng)度,從而失去了原有的時(shí)序關(guān)系;失去封閉性:由于多個(gè)程序共享一個(gè)計(jì)算機(jī)系統(tǒng)的多種資源,因此每個(gè)程序的執(zhí)行都會(huì)受其他程序的控制邏輯的影響,例如,一個(gè)程序?qū)懙酱鎯?chǔ)器中的數(shù)據(jù)可能被另一個(gè)程序修改,失去原有的數(shù)據(jù)不變特征;失去可再現(xiàn)性:由于程序執(zhí)行環(huán)境
4、的封閉性不再成立,因此程序每次執(zhí)行的環(huán)境可能會(huì)不同,執(zhí)行環(huán)境在程序的兩次執(zhí)行期間發(fā)生變化導(dǎo)致執(zhí)行結(jié)果的不同,程序的執(zhí)行結(jié)果失去原有的可重復(fù)特征。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院任意兩個(gè)進(jìn)程可以并發(fā)的條件(任意兩個(gè)進(jìn)程可以并發(fā)的條件(Bernstein條件)條件):v其中It、Ot分別表示進(jìn)程t的輸入變量或輸出變量。ijOI jiOI ijOO LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院進(jìn)程間的同步示意圖進(jìn)程間的同步示意圖 所謂同步是指進(jìn)程之間按照內(nèi)在的約束關(guān)系執(zhí)行。看教材上的例子4-1,4-2 LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院4.2 臨界區(qū)管理臨界區(qū)管理v 臨界資源:一次僅允許一個(gè)進(jìn)程
5、使用的資源。 v 臨界區(qū):在每個(gè)進(jìn)程中訪問(wèn)臨界資源的那段程序。v 臨界區(qū)管理原則:v 有空讓進(jìn)、無(wú)空等待、多中選一、有限等待、讓權(quán)等待有空讓進(jìn)、無(wú)空等待、多中選一、有限等待、讓權(quán)等待。v 1) 如果有若干進(jìn)程要求進(jìn)入空閑的臨界區(qū),一次僅允許一個(gè)進(jìn)程進(jìn)入。 v 2) 任何時(shí)候,處于臨界區(qū)內(nèi)的進(jìn)程不可多于一個(gè)。如已有進(jìn)程進(jìn)入自己的臨界區(qū),則其它所有試圖進(jìn)入臨界區(qū)的進(jìn)程必須等待。 v 3) 進(jìn)入臨界區(qū)的進(jìn)程要在有限時(shí)間內(nèi)退出,以便其它進(jìn)程能及時(shí)進(jìn)入自己的臨界區(qū)。 v 4) 如果進(jìn)程不能進(jìn)入自己的臨界區(qū),則應(yīng)讓出CPU,避免進(jìn)程出現(xiàn)“忙等”現(xiàn)象。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院失敗嘗試失敗嘗試1
6、flag0= false flag1= false p0:whilewhile (flag1=true)busy wait flag0=true/ critical section .flag0= false / remainder section p1:whilewhile (flag0 =true) busy wait flag1=true/ critical section . flag1= false / remainder section LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院失敗嘗試失敗嘗試2flag0:= false flag1 := false p0:flag0=true wh
7、ilewhile (flag1=true)busy wait /(臨界區(qū))critical section .flag0 := false / remainder section p1:flag1=true whilewhile (flag0 =true) busy wait / (臨界區(qū))critical section . flag1 := false / remainder section LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院臨界區(qū)管理的軟件方法:臨界區(qū)管理的軟件方法:Peterson算法算法flag0 =0flag1 =0 turn p0:flag0=1 turn=1whilewhi
8、le (flag1 =1&turn=1)busy wait / critical section .flag0=0 / remainder section p1:flag1=1 turn=0whilewhile (flag0 =1&turn=0) busy wait / critical section . flag1=0 / remainder section LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院臨界區(qū)管理的軟件方法:臨界區(qū)管理的軟件方法:Dekker算法算法flag0=0 flag1=0 turn=0 /or 1p0:flag0=1 whilewhile flag1 =1
9、 if if turn 0 flag0=0 whilewhile turn 0 flag0=1 / critical section . turn= 1 flag0=0 / remainder section p1: flag1=1whilewhile flag0 =1 if if turn 1 flag1=0 whilewhile turn 1 flag1=1 / critical section . turn=0 flag1=0 / remainder section LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院硬件方法硬件方法 ,Test and Set指令/lock 為內(nèi)存變量,為內(nèi)存變量,
10、reg為寄存器,為寄存器,tsl為為CPU指令指令test and set lockenter_region: tsl reg, lock /復(fù)制復(fù)制lock當(dāng)前值到寄存器當(dāng)前值到寄存器,并設(shè)置并設(shè)置lock為為1 cmp reg, #0 jnz enter_region /不相等不相等,則跳轉(zhuǎn)至則跳轉(zhuǎn)至enter_region retleave_region: move lock, #0 retv 應(yīng)用v 用于內(nèi)核級(jí)互斥訪問(wèn)短臨用于內(nèi)核級(jí)互斥訪問(wèn)短臨界代碼區(qū)界代碼區(qū)v lock是共享鎖變量lock=0;Pi: 。 enter_region(lock); 臨界區(qū)。 leave_region()
11、;。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院4.3 信號(hào)量與信號(hào)量與P、 V操作操作 1965年 Dijkstra提出了信號(hào)量(semaphore)與P、V操作機(jī)制。規(guī)定semaphore大于等于零的時(shí)候代表可供并發(fā)進(jìn)程使用的資源實(shí)體數(shù),semaphore小于零的時(shí)候,表示正在等待使用臨界區(qū)的進(jìn)程的個(gè)數(shù)。 LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院信號(hào)量的信號(hào)量的P、V操作操作P(s) s.value=s.value-;if(s.value0)該進(jìn)程置等待態(tài);該進(jìn)程的PCB插入s.queue等待隊(duì)列; V(s) s.value=s.value+;if(s.value 0 ) /是否有空座位 Numb
12、erOfFreeSeats- /占用一個(gè)座位 V(Customers) /告知理發(fā)師有顧客 V(accessSeats) /解鎖座位計(jì)數(shù) P(Barber) /等待理發(fā)師 /享受理發(fā)服務(wù) else /沒(méi)有空位子 V(accessSeats) /解鎖座位計(jì)數(shù) /顧客離開(kāi) LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院POSIX信號(hào)量信號(hào)量POSIX有兩種信號(hào)量實(shí)現(xiàn)機(jī)制:有兩種信號(hào)量實(shí)現(xiàn)機(jī)制:v 無(wú)名信號(hào)量:基于內(nèi)存操作;v 有名信號(hào)量:基于文件操作。Posix有名信號(hào)量常用函數(shù):有名信號(hào)量常用函數(shù):Sem_open()Sem_close()Sem_unlink()Sem_getvalue()Sem_wa
13、it()/sem_trywait()Sem_post()LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院POSIX信號(hào)量函數(shù)介紹信號(hào)量函數(shù)介紹名稱::sem_open功能:創(chuàng)建并初始化有名信號(hào)量頭文件: #include 函數(shù)原形:sem_t *sem_open(const char *name,int oflag,/*mode_t mode,unsigned int value*/);參數(shù):name 信號(hào)量的外部名字oflag 選擇創(chuàng)建或打開(kāi)一個(gè)現(xiàn)有的信號(hào)量mode 權(quán)限位value 信號(hào)量初始值返回值: 成功時(shí)返回指向信號(hào)量的指針,出錯(cuò)時(shí)為SEM_FAILEDLOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院P
14、OSIX信號(hào)量函數(shù)介紹信號(hào)量函數(shù)介紹v oflag參數(shù)可以是0、O_CREAT(創(chuàng)建一個(gè)信號(hào)量)或O_CREAT|O_EXCL(如果沒(méi)有指定的信號(hào)量就創(chuàng)建),如果指定了O_CREAT,那么第三個(gè)和第四個(gè)參數(shù)是需要的;其中mode參數(shù)指定權(quán)限位,value參數(shù)指定信號(hào)量的初始值,通常用來(lái)指定共享資源的數(shù)量。該初始不能超過(guò)SEM_VALUE_MAX,這個(gè)常值必須低于為32767。二值信號(hào)量的初始值通常為1,計(jì)數(shù)信號(hào)量的初始值則往往大于1。v 如果指定了O_CREAT(而沒(méi)有指定O_EXCL),那么只有所需的信號(hào)量尚未存在時(shí)才初始化它。所需信號(hào)量已存在條件下指定O_CREAT不是一個(gè)錯(cuò)誤。該標(biāo)志的意
15、思僅僅是“如果所需信號(hào)量尚未存在,那就創(chuàng)建并初始化它”。但是所需信號(hào)量等已存在條件下指定O_CREAT|O_EXCL卻是一個(gè)錯(cuò)誤。v sem_open返回指向sem_t信號(hào)量的指針,該結(jié)構(gòu)里記錄著當(dāng)前共享資源的數(shù)目。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院POSIX信號(hào)量函數(shù)介紹信號(hào)量函數(shù)介紹名稱::sem_close功能:關(guān)閉有名信號(hào)量頭文件: #include 函數(shù)原形:int sem_close(sem_t *sem);參數(shù):sem 指向信號(hào)量的指針?lè)祷刂担?若成功則返回0,否則返回-1。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院有名信號(hào)量的關(guān)閉有名信號(hào)量的關(guān)閉v 一個(gè)進(jìn)程終止時(shí),內(nèi)核還對(duì)其上
16、仍然打開(kāi)著的所有有名信號(hào)量自動(dòng)執(zhí)行這樣的信號(hào)量關(guān)閉操作。不論該進(jìn)程是自愿終止的還是非自愿終止的,這種自動(dòng)關(guān)閉都會(huì)發(fā)生。v 但應(yīng)注意的是關(guān)閉一個(gè)信號(hào)量并沒(méi)有將它從系統(tǒng)中刪除。這就是說(shuō),Posix有名信號(hào)量至少是隨內(nèi)核持續(xù)的:即使當(dāng)前沒(méi)有進(jìn)程打開(kāi)著某個(gè)信號(hào)量,它的值仍然保持。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院有名信號(hào)量的刪除有名信號(hào)量的刪除名稱::sem_unlink功能:從系統(tǒng)中刪除信號(hào)量頭文件: #include 函數(shù)原形:int sem_unlink(const char *name);參數(shù):name 信號(hào)量的外部名字返回值: 若成功則返回0,否則返回-1。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安
17、財(cái)經(jīng)學(xué)院有名信號(hào)量的刪除有名信號(hào)量的刪除v有名信號(hào)量使用sem_unlink從系統(tǒng)中刪除。v每個(gè)信號(hào)量有一個(gè)引用計(jì)數(shù)器記錄當(dāng)前的打開(kāi)次數(shù),sem_unlink必須等待這個(gè)數(shù)為0時(shí)才能把name所指的信號(hào)量從文件系統(tǒng)中刪除。也就是要等待最后一個(gè)sem_close發(fā)生。 LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院有名信號(hào)量函數(shù)有名信號(hào)量函數(shù)名稱::sem_getvalue功能:測(cè)試信號(hào)量頭文件: #include 函數(shù)原形:int sem_getvalue(sem_t *sem,int *valp);參數(shù):sem 指向信號(hào)量的指針?lè)祷刂担?若成功則返回0,否則返回-1。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)
18、經(jīng)學(xué)院GETVALUE函數(shù)函數(shù)vsem_getvalue在由valp指向的正數(shù)中返回所指定信號(hào)量的當(dāng)前值。如果該信號(hào)量當(dāng)前已上鎖,那么返回值或?yàn)?,或?yàn)槟硞€(gè)負(fù)數(shù),其絕對(duì)值就是等待該信號(hào)量解鎖的線程數(shù)。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院有名信號(hào)量函數(shù)有名信號(hào)量函數(shù)名稱::sem_wait/sem_trywait功能:等待共享資源頭文件: #include 函數(shù)原形:int sem_wait(sem_t *sem); int sem_trywait(sem_t *sem);參數(shù):sem 指向信號(hào)量的指針?lè)祷刂担?若成功則返回0,否則返回-1。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院用用sem_w
19、ait來(lái)申請(qǐng)共享資源來(lái)申請(qǐng)共享資源vsem_wait函數(shù)可以測(cè)試所指定信號(hào)量的值。v如果該值大于0,那就將它減1并立即返回。我們就可以使用申請(qǐng)來(lái)的共享資源了。v如果該值等于0,調(diào)用線程就被進(jìn)入睡眠狀態(tài),直到該值變?yōu)榇笥?,這時(shí)再將它減1,函數(shù)隨后返回。vsem_wait操作必須是原子的。vsem_wait和sem_trywait的差別是:當(dāng)所指定信號(hào)量的值已經(jīng)是0時(shí),后者并不將調(diào)用線程投入睡眠。相反,它返回一個(gè)EAGAIN錯(cuò)誤。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院有名信號(hào)量函數(shù)有名信號(hào)量函數(shù)名稱::sem_post功能:掛出共享資源頭文件: #include 函數(shù)原形:int sem_pos
20、t(sem_t *sem);int sem_getvalue(sem_t *sem,int *valp);參數(shù):sem 指向信號(hào)量的指針?lè)祷刂担?若成功則返回0,否則返回-1。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院有名信號(hào)量函數(shù)有名信號(hào)量函數(shù)v當(dāng)一個(gè)線程使用完某個(gè)信號(hào)量時(shí),它應(yīng)該調(diào)用sem_post來(lái)告訴系統(tǒng)申請(qǐng)的資源已經(jīng)用完。本函數(shù)和sem_wait函數(shù)的功能正好相反,它把所指定的信號(hào)量的值加1,然后喚醒正在等待該信號(hào)量值變?yōu)檎龜?shù)的任意線程。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院關(guān)于關(guān)于posix有名信號(hào)量使用的幾點(diǎn)注意有名信號(hào)量使用的幾點(diǎn)注意 v1.Posix有名信號(hào)量的值是隨內(nèi)核持續(xù)的。
21、也就是說(shuō),一個(gè)進(jìn)程創(chuàng)建了一個(gè)信號(hào)量,這個(gè)進(jìn)程結(jié)束后,這個(gè)信號(hào)量還存在,并且信號(hào)量的值也不會(huì)改變。v如:# ./semopen test# ./semgetvalue testvalue=1 信號(hào)的值仍然是1LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院2。當(dāng)持有某個(gè)信號(hào)量鎖的進(jìn)程沒(méi)有釋放它就終止時(shí),內(nèi)核并不給該信號(hào)量解鎖。#./semopen test#./semwait test&pid 1834 has semaphore,value=0 #./semgetvalue test value=0 信號(hào)量的值變?yōu)?了LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院posix有名信號(hào)量應(yīng)用于多線程有名信號(hào)
22、量應(yīng)用于多線程 v #include v #include v #include v #include v #include v v void *thread_function(void *arg); /*線程入口函數(shù)*/v void print(); /*共享資源函數(shù)*/v sem_t *sem; /*定義Posix有名信號(hào)量*/v int val; /*定義信號(hào)量當(dāng)前值*/LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院int main(int argc,char *argv)int n=0;if(argc!=2) printf(“please input a file name!n”); exit
23、(1);LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院sem=sem_open(argv1,O_CREAT,0644,3); /*打開(kāi)一個(gè)信號(hào)量*/while(n+5) /*循環(huán)創(chuàng)建5個(gè)子線程,使它們同步運(yùn)行*/ if(pthread_create(&a_thread,NULL,thread_function,NULL))!=0) perror(“Thread creation failed”); exit(1); pthread_join(a_thread,NULL); /等待線程結(jié)束,類似于wait()sem_close(bin_sem);sem_unlink(argv1);LOGO房地產(chǎn)
24、房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院void *thread_function(void *arg)sem_wait(sem); /*申請(qǐng)信號(hào)量*/ print(); /*調(diào)用共享代碼段*/ sleep(1); /滯留1s sem_post(sem); /*釋放信號(hào)量*/ printf(“Im finished,my tid is %dn”,pthread_self();LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院void print() /模擬的共享代碼printf(“I get it,my tid is %dn”,pthread_self(); /顯示當(dāng)前線程號(hào)sem_getvalue(sem,&v
25、al);printf(“Now the value have %dn”,val); /顯示信號(hào)量值LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院v程序用循環(huán)的方法建立5個(gè)線程,然后讓它們調(diào)用同一個(gè)線程處理函數(shù)thread_function,在函數(shù)里我們利用信號(hào)量來(lái)限制訪問(wèn)共享資源的線程數(shù)。共享資源我們用print函數(shù)來(lái)代表,在真正編程中它有可以是一個(gè)終端設(shè)備(如打印機(jī))或是一段有實(shí)際意義的代碼。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院運(yùn)行結(jié)果為運(yùn)行結(jié)果為v #gcc lpthread o sem_thread sem_thread.cv #./sem_thread testv I get it,my t
26、id is 1893v Now the value have 2v I get it,my tid is 1894v Now the value have 1v Iget it,my tid is 1895v Now the value have 0v Im finished,my tid is 1893v Im finished,my tid is 1894v Im finished,my tid is 1895v I get it,my tid is 1896v Now the value have 2v I get it,my tid is 1897v Now the value hav
27、e 1v Im finished,my tid is 1896v Im finished,my tid is 1897LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院posix有名信號(hào)量應(yīng)用于多進(jìn)程有名信號(hào)量應(yīng)用于多進(jìn)程 v#include v#include v#include v#include vvoid print(pid_t);vsem_t *sem; /*定義Posix有名信號(hào)量*/vint val; /*定義信號(hào)量當(dāng)前值*/LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院int main(int argc,char *argv)int n=0;if(argc!=2) printf(“please i
28、nput a file name!n”); exit(1);LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院v sem=sem_open(argv1,O_CREAT,0644,2); /*打開(kāi)一個(gè)信號(hào)量, 初值設(shè)為2*/v while(n+5) /*循環(huán)創(chuàng)建5個(gè)子進(jìn)程,使它們同步運(yùn)行*/v v if(fork()=0) v v sem_wait(sem); /*申請(qǐng)信號(hào)量*/v print(getpid(); /*調(diào)用共享代碼段*/v sleep(1); v sem_post(sem); /*釋放信號(hào)量*/v printf(“Im finished,my pid is %dn”,getpid();v r
29、eturn 0; v v wait(); /*等待所有子進(jìn)程結(jié)束*/v sem_close(sem);v sem_unlink(argv1);v exit(0);v LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院void print(pid_t pid)printf(“I get it,my pid is %dn”,pid);sem_getvalue(sem,&val);printf(“Now the value have %dn”,val); LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院程序編譯后運(yùn)行會(huì)得到如下結(jié)果程序編譯后運(yùn)行會(huì)得到如下結(jié)果 v #./sem_process testv I ge
30、t it,my pid is 1082330304v Now the value have 1v I get it,my pid is 1090718784v Now the value have 0v I finished,my pid is 1082330304v I finished,my pid is 1090718784v I get it,my pid is 1099107264v Now the value have 1v I get it,my pid is 1116841120v Now the value have 0v I finished,my pid is 10991
31、07264v I finished,my pid is 1116841120v I get it,my pid is 1125329600v Now the value have 1v I finished,my pid is 1125329600LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院無(wú)名信號(hào)量無(wú)名信號(hào)量-基于內(nèi)存的信號(hào)量基于內(nèi)存的信號(hào)量 vPosix提供的無(wú)名信號(hào)量是基于內(nèi)存的信號(hào)量,它們由應(yīng)用程序分配信號(hào)量的內(nèi)存空間,然后由系統(tǒng)初始化它們的值。 LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院名稱::sem_init/sem_destroy功能:初始化/關(guān)閉信號(hào)等頭文件:#include 函數(shù)原形:
32、int sem_init(sem_t *sem,int shared,unsigned int value);int sem_getvalue(sem_t *sem);參數(shù):sem 指向信號(hào)量的指針shared 作用范圍value 信號(hào)量初始值返回值:若成功則返回0,否則返回-1。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院v基于內(nèi)存的信號(hào)量是由sem_init初始化的。sem參數(shù)指向必須由應(yīng)用程序分配的sem_t變量。如果shared為0,那么待初始化的信號(hào)量是在同一進(jìn)程的各個(gè)線程共享的,否則該信號(hào)量是在進(jìn)程間共享的。當(dāng)shared為非0時(shí),該信號(hào)量必須存放在即將使用它的所有進(jìn)程都能訪問(wèn)的某種類型
33、的共享內(nèi)存中。跟sem_open一樣,value參數(shù)是該信號(hào)量的初始值。v 使用完一個(gè)基于內(nèi)存的信號(hào)量后,調(diào)用sem_destroy關(guān)閉它。v除了sem_open和sem_close外,其它的poisx有名信號(hào)量函數(shù)都可以用于基于內(nèi)存的信號(hào)量。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院無(wú)名信號(hào)量實(shí)現(xiàn)一個(gè)進(jìn)程的各個(gè)線程間的互斥無(wú)名信號(hào)量實(shí)現(xiàn)一個(gè)進(jìn)程的各個(gè)線程間的互斥 v #include v #include v #include v #include v #include v #incude v void *thread_function(void *arg); /*線程入口函數(shù)*/v void
34、print(void); /*共享資源函數(shù)*/v sem_t bin_sem; /*定義信號(hào)量*/v int value; /*定義信號(hào)量的燈*/LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院int main()int n=0;pthread_t a_thread; if(sem_init(&bin_sem,0,2)!=0) /*初始化信號(hào)量,初始值為2*/ perror(“sem_init”); exit(1);LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院v while(n+5) /*循環(huán)創(chuàng)建5個(gè)線程*/v v if(pthread_create(&a_thread,NULL,thread
35、_function,NULL)!=0) v v perror(“Thread creation failed”);v exit(1);v v v pthread_join(a_thread,NULL);/*等待子線程返回*/v LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院void *thread_function(void *arg)sem_wait(&bin_sem); /*等待信號(hào)量*/print();sleep(1);sem_post(&bin_sem); /*喚起信號(hào)量*/printf(“I finished,my pid is %dn”,pthread_self();pth
36、read_exit(arg);LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院void print()printf(“I get it,my tid is %dn”,pthread_self();sem_getvalue(&bin_sem,&value); /*獲取信號(hào)量的值*/printf(“Now the value have %dn”,value); LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院下面是運(yùn)行結(jié)果下面是運(yùn)行結(jié)果 v #gcc lpthread o seminitthread seminitthread.cv #./seminitthread v I get it,my tid
37、 is 1082330304v Now the value have 1v I get it,my tid is 1090718784v Now the value have 0v I finished,my pid is 1082330304v I finished,my pid is 1090718784v I get it,my tid is 1099107264v Now the value have 1v I get it,my tid is 1116841120v Now the value have 0v I finished,my pid is 1099107264v I fi
38、nished,my pid is 1116841120v I get it,my tid is 1125329600v Now the value have 1v I finished,my pid is 1125329600LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院無(wú)名信號(hào)量實(shí)現(xiàn)各進(jìn)程間的互斥無(wú)名信號(hào)量實(shí)現(xiàn)各進(jìn)程間的互斥 v#include v#include v#include vvoid print(pid_t);vsem_t bin_sem; /*定義Posix信號(hào)量*/vint val; /*定義信號(hào)量當(dāng)前值*/LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院int main( )int n=0;
39、if(sem_init(&bin_sem,0,3)!=0) /*初始化信號(hào)量,初始值為3*/ perror(“sem_init”); exit(1);LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院sem_getvalue(&bin_sem,&val); /*查看信號(hào)量的值*/printf(“The value have %dn”,val);while(n+5) /*循環(huán)創(chuàng)建5個(gè)子進(jìn)程,使它們同步運(yùn)行*/ if(fork()=0) sem_wait(&bin_sem); /*申請(qǐng)信號(hào)量*/ print(getpid(); /*調(diào)用共享代碼段*/ sleep(1); sem
40、_post(&bin_sem); /*釋放信號(hào)量*/ printf(“Im finished,my pid is %dn”,getpid(); return 0; wait(); /*等待所有子進(jìn)程結(jié)束*/return 0;LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院vvoid print(pid_t pid)vvprintf(“I get it,my pid is %dn”,pid);vsem_getvalue(&bin_sem,&val);vprintf(“Now the value have %dn”,val);v LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院下面是運(yùn)行結(jié)果下
41、面是運(yùn)行結(jié)果 v#gcc lpthread o sem sem.cv#./sem vThe value have 3vI get it,my pid is 2236vNow the value have 2vI get it,my pid is 2237vNow the value have 2vI get it,my pid is 2238vNow the value have 2vI get it,my pid is 2239vNow the value have 2vIget it,my pid is 2240vNow the value have 2vIm finished,my pi
42、d is 2236vIm finished,my pid is 2237vIm finished,my pid is 2238vIm finished,my pid is 2239vIm finished,my pid is 2240LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院v問(wèn)題在于sem信號(hào)量不在共享內(nèi)存區(qū)中。fork出來(lái)的子進(jìn)程通常不共享父進(jìn)程的內(nèi)存空間。子進(jìn)程是在父進(jìn)程內(nèi)存空間的拷貝上啟動(dòng)的,它跟共享內(nèi)存不是一回事。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院Posix無(wú)名信號(hào)量與有名信號(hào)量的區(qū)別無(wú)名信號(hào)量與有名信號(hào)量的區(qū)別 1.sem_open不需要shared參數(shù),有名信號(hào)量總是可以在不同進(jìn)
43、程間共享的。2.sem_init不使用任何類似于O_CREAT標(biāo)志的東西,也就是說(shuō),sem_init總是初始化信號(hào)量的值。因此,對(duì)于一個(gè)給定的信號(hào)量,我們必須小心保證只調(diào)用一次sem_init。3.sem_open返回一個(gè)指向某個(gè)sem_t變量的指針,該變量由函數(shù)本身分配并初始化。 但sem_init的第一個(gè)參數(shù)是一個(gè)指向某個(gè)sem_t變量的指針,該變量由調(diào)用者分配,然后由sem_init函數(shù)初始化。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院4.posix有名信號(hào)量是通過(guò)內(nèi)核持續(xù)的,一個(gè)進(jìn)程創(chuàng)建一個(gè)信號(hào)量,另外的進(jìn)程可以通過(guò)該信號(hào)量的外部名(創(chuàng)建信號(hào)量使用的文件名)來(lái)訪問(wèn)它。 posix基于內(nèi)存的
44、信號(hào)量的持續(xù)性卻是不定的,如果基于內(nèi)存的信號(hào)量是由單個(gè)進(jìn)程內(nèi)的各個(gè)線程共享的,那么該信號(hào)量就是隨進(jìn)程持續(xù)的,當(dāng)該進(jìn)程終止時(shí)它也會(huì)消失。 如果某個(gè)基于內(nèi)存的信號(hào)量是在不同進(jìn)程間同步的,該信號(hào)量必須存放在共享內(nèi)存區(qū)中,只要該共享內(nèi)存區(qū)存在,該信號(hào)量就存在。5.基于內(nèi)存的信號(hào)量應(yīng)用于進(jìn)程很麻煩,而有名信號(hào)量卻很方便,基于內(nèi)存的信號(hào)量比較適合應(yīng)用于一個(gè)進(jìn)程的多個(gè)線程。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院4.4 IPC(Inter Process Communication)v共享內(nèi)存共享內(nèi)存v在相互通信的進(jìn)程之間設(shè)有一個(gè)公共內(nèi)存區(qū),一組進(jìn)程向該公共內(nèi)存中寫,另一組進(jìn)程從共內(nèi)存中讀,通過(guò)這種方式實(shí)現(xiàn)兩
45、組進(jìn)程間的信息交換。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院消息機(jī)制 進(jìn)程通過(guò)某種手段發(fā)出自己的消息或接收其他進(jìn)程發(fā)來(lái)的消息。這種方式類似于人們通過(guò)郵局收發(fā)信件來(lái)實(shí)現(xiàn)交換信息的目的。消息通信機(jī)制包含以下列內(nèi)容: (1) 消息緩沖區(qū),這是一個(gè)由以下幾項(xiàng)組成的數(shù)據(jù)結(jié)構(gòu): 1 消息長(zhǎng)度 2 消息正文 3 發(fā)送者 4 消息隊(duì)列指針 (2)消息隊(duì)列首指針m_q,一般保存在PCB中。 1 互斥信號(hào)量m_mutex,初值為1,用于互斥訪問(wèn)消息隊(duì)列,在PCB中設(shè)置。 2 同步信號(hào)量m_syn,初值為0,用于消息計(jì)數(shù),在PCB中設(shè)置。 3 發(fā)送消息原語(yǔ)send 4 接收消息原語(yǔ)receive(a) LOGO房地產(chǎn)
46、房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院管道通信 v所謂管道,就是連接在兩個(gè)進(jìn)程之間的一個(gè)打開(kāi)的共享文件,專用于進(jìn)程之間進(jìn)行數(shù)據(jù)通信。發(fā)送進(jìn)程可以源源不斷地從管道一端寫入數(shù)據(jù)流,每次寫入的長(zhǎng)度是可變的;接收進(jìn)程在需要時(shí)可以從管道的另一端讀出數(shù)據(jù),讀出單位長(zhǎng)度也是可變的。顯然,管道通信的基礎(chǔ)是文件系統(tǒng)。 v 管道通信具有傳送數(shù)據(jù)量大的優(yōu)點(diǎn),但通信速度較慢.LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院Linux中的中的IPC機(jī)制機(jī)制LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院v最初Unix IPC包括:管道、FIFO、信號(hào);vSystem V IPC包括:System V消息隊(duì)列、System V信號(hào)量、System V共享
47、內(nèi)存區(qū);vPosix IPC包括: Posix消息隊(duì)列、Posix信號(hào)量、Posix共享內(nèi)存區(qū)。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院Linux下進(jìn)程間通信的幾種主要手段下進(jìn)程間通信的幾種主要手段 v 信號(hào)量(semaphore):主要作為進(jìn)程間以及同一進(jìn)程不同線程之間的同步手段。v 信號(hào)(Signal):信號(hào)是比較復(fù)雜的通信方式,用于通知接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外,進(jìn)程還可以發(fā)送信號(hào)給進(jìn)程本身;linux除了支持Unix早期信號(hào)語(yǔ)義函數(shù)signal外,還支持語(yǔ)義符合Posix.1標(biāo)準(zhǔn)的信號(hào)函數(shù)sigaction;v 管道(Pipe)及有名管道(FIFO):管道可用于具有親緣
48、關(guān)系進(jìn)程間的通信,有名管道克服了管道沒(méi)有名字的限制,因此,除具有管道所具有的功能外,它還允許無(wú)親緣關(guān)系進(jìn)程間的通信;FIFO是全雙工的管道,管道是半雙工的。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院v 消息隊(duì)列(報(bào)文隊(duì)列):消息隊(duì)列是消息的鏈接表,包括Posix消息隊(duì)列和system V消息隊(duì)列。有足夠權(quán)限的進(jìn)程可以向隊(duì)列中添加消息,被賦予讀權(quán)限的進(jìn)程則可以讀走隊(duì)列中的消息。消息隊(duì)列克服了信號(hào)承載信息量少,管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。v 共享內(nèi)存(Share memory):使得多個(gè)進(jìn)程可以訪問(wèn)同一塊內(nèi)存空間,是最快的可用IPC形式。是針對(duì)其他通信機(jī)制運(yùn)行效率較低而設(shè)計(jì)的。往
49、往與其它通信機(jī)制,如信號(hào)量結(jié)合使用,來(lái)達(dá)到進(jìn)程間的同步及互斥。 v 套接口(Socket):更為一般的進(jìn)程間通信機(jī)制,可用于不同機(jī)器之間的進(jìn)程間通信。起初是由Unix系統(tǒng)的BSD分支開(kāi)發(fā)出來(lái)的,但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:Linux和System V的變種都支持套接字。 LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院1. Signal機(jī)制機(jī)制vSignal機(jī)制可以被理解成進(jìn)程的軟中斷,因此,在實(shí)時(shí)性方面還是相對(duì)比較高的。進(jìn)程控制塊中設(shè)計(jì)了一個(gè)signal的位圖信息(在signal.h中定義),其中的每位與具體的signal相對(duì)應(yīng),這與中斷機(jī)制是保持一致的。 LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安
50、財(cái)經(jīng)學(xué)院v當(dāng)系統(tǒng)中一個(gè)進(jìn)程A通過(guò)signal系統(tǒng)調(diào)用向進(jìn)程B發(fā)送signal時(shí),設(shè)置進(jìn)程B的對(duì)應(yīng)signal位圖,類似于觸發(fā)了signal對(duì)應(yīng)中斷。發(fā)送signal只是“中斷”觸發(fā)的一個(gè)過(guò)程,具體執(zhí)行會(huì)在兩個(gè)階段發(fā)生:1、 system call返回。進(jìn)程B由于調(diào)用了system call后,從內(nèi)核返回用戶態(tài)時(shí)需要檢查他擁有的signal位圖信息表,此時(shí)是一個(gè)執(zhí)行點(diǎn)。2、 中斷返回。進(jìn)程被系統(tǒng)中斷打斷之后,系統(tǒng)將CPU交給進(jìn)程時(shí),需要檢查即將執(zhí)行進(jìn)程所擁有的signal位圖信息表,此時(shí)也是一個(gè)執(zhí)行點(diǎn)。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院v 綜上所述,signal的執(zhí)行點(diǎn)可以理解成從內(nèi)核態(tài)返回
51、用戶態(tài)時(shí),在返回時(shí),如果發(fā)現(xiàn)待執(zhí)行進(jìn)程存在被觸發(fā)的signal,那么在離開(kāi)內(nèi)核態(tài)之后(也就是將CPU切換到用戶模式),執(zhí)行用戶進(jìn)程為該signal綁定的signal處理函數(shù),從這一點(diǎn)上看,signal處理函數(shù)是在用戶進(jìn)程上下文中執(zhí)行的。當(dāng)執(zhí)行完signal處理函數(shù)之后,再返回到用戶進(jìn)程被中斷或者system call(軟中斷或者指令陷阱)打斷的地方。vSignal機(jī)制實(shí)現(xiàn)的比較靈活,用戶進(jìn)程由于中斷或者system call陷入內(nèi)核之后,將斷點(diǎn)信息都保存到了堆棧中,在內(nèi)核返回用戶態(tài)時(shí),如果存在被觸發(fā)的signal,那么直接將待執(zhí)行的signal處理函數(shù)push到堆棧中,在CPU切換到用戶模式之
52、后,直接pop堆棧就可以執(zhí)行signal處理函數(shù)并且返回到用戶進(jìn)程了。Signal處理函數(shù)應(yīng)用了進(jìn)程上下文,并且應(yīng)用實(shí)際的中斷模擬了進(jìn)程的軟中斷過(guò)程。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院應(yīng)用實(shí)例:應(yīng)用實(shí)例:實(shí)驗(yàn)三實(shí)驗(yàn)三 Linux進(jìn)程信號(hào)通信進(jìn)程信號(hào)通信v#include v#include v#include vvoid waiting( ),stop( );vint wait_mark;LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院main( )int p1,p2,stdout; signal(SIGINT,stop); /*接收到接收到c信號(hào),轉(zhuǎn)信號(hào),轉(zhuǎn)stop*/while(p1=fork(
53、 )= =-1); /*創(chuàng)建子進(jìn)程創(chuàng)建子進(jìn)程p1*/if (p10) while(p2=fork( )= =-1); /*創(chuàng)建子進(jìn)程創(chuàng)建子進(jìn)程p2*/if(p20) wait_mark=1;waiting( );kill(p1,16); /*向向p1發(fā)軟中斷信號(hào)發(fā)軟中斷信號(hào)16*/kill(p2,17); /*向向p2發(fā)軟中斷信號(hào)發(fā)軟中斷信號(hào)17*/wait(0); /*同步同步*/wait(0);printf(Parent process is killed!n);exit(0);LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院else wait_mark=1;signal(17,stop); /*接
54、收到軟中斷信號(hào)接收到軟中斷信號(hào)17,轉(zhuǎn),轉(zhuǎn)stop*/waiting( );lockf(stdout,1,0);printf(Child process 2 is killed by parent!n);lockf(stdout,0,0);exit(0);elsewait_mark=1;signal(16,stop); /*接收到軟中斷信號(hào)接收到軟中斷信號(hào)16,轉(zhuǎn),轉(zhuǎn)stop*/waiting( );lockf(stdout,1,0);printf(Child process 1 is killed by parent!n);lockf(stdout,0,0);exit(0); LOGO房地產(chǎn)
55、房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院void waiting( ) while(wait_mark!=0);void stop( )wait_mark=0;LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院本實(shí)驗(yàn)中的問(wèn)題本實(shí)驗(yàn)中的問(wèn)題vsignal(SIGINT,stop)語(yǔ)句的作用是信號(hào)設(shè)置。v如果放在位置或處信號(hào)設(shè)置的作用范圍有所不同。v在原處設(shè)置,三個(gè)進(jìn)程收到SIGINT后都使用stopv在處設(shè)置,父進(jìn)程和子進(jìn)程1采用。v在處設(shè)置,只有父進(jìn)程采用。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院在處設(shè)置時(shí)出現(xiàn)的問(wèn)題在處設(shè)置時(shí)出現(xiàn)的問(wèn)題v運(yùn)行時(shí)會(huì)發(fā)現(xiàn)Ctrl-c后,只會(huì)打印 Parent process is killed
56、 ,這是因?yàn)楫?dāng)你Ctrl-c的時(shí)候,系統(tǒng)會(huì)給父進(jìn)程及其兩個(gè)子進(jìn)程都發(fā)送 SIGINT信號(hào) (對(duì)bash來(lái)說(shuō),這三個(gè)進(jìn)程都是前臺(tái)進(jìn)程,所以都發(fā)送), 對(duì)于父進(jìn)程來(lái)說(shuō),收到這個(gè)信號(hào)自然是調(diào)用 stop函數(shù)了,但是對(duì)于兩個(gè)子進(jìn)程來(lái)說(shuō),默認(rèn)的對(duì)這個(gè)信號(hào)的處理就是退出(exit),所以你看不到子進(jìn)程的打印。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院解決方法有兩種解決方法有兩種vA: 不要用Ctrl-c的方法來(lái)發(fā)送SIGINT,而是用 kill 命令來(lái)向父進(jìn)程單獨(dú)發(fā)送 SIGINT,比如父進(jìn)程pid是12345,那么就在終端下 kill -SIGINT 12345,你就可以看到你所預(yù)想看到的打印了。vB: 在
57、兩個(gè)子進(jìn)程中,調(diào)用 signal(SIGINT, SIG_IGN); 來(lái)讓子進(jìn)程忽略SIGINT信號(hào). (具體你可以放在你原來(lái)代碼中 signal(16, stop)和signal(17, stop) 的后面),這樣Ctrl-c后,也能看到你所想要的打印。 LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院2. 消息隊(duì)列消息隊(duì)列v消息隊(duì)列為進(jìn)程提供了一種異步傳遞消息的方法。在使用msgget()建立了一條消息隊(duì)列之后,發(fā)送進(jìn)程和接收進(jìn)程就可以通過(guò)這條消息隊(duì)列交換消息。v發(fā)送進(jìn)程將消息發(fā)送到指定的消息隊(duì)列,而接收者試圖從指定的消息隊(duì)列中獲取消息。如果該隊(duì)列中沒(méi)有消息的話,則接收者根據(jù)自己是否要等待的意愿而阻
58、塞或返回某個(gè)標(biāo)志。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院msgget()key_t ftok (char*pathname, char proj_id); v 該函數(shù)用于為消息隊(duì)列、信號(hào)量、共享存儲(chǔ)等IPC機(jī)制創(chuàng)建鍵值。pathname是一個(gè)存在的文件名。proj_id是子序號(hào),在實(shí)現(xiàn)中,是將文件的索引節(jié)點(diǎn)號(hào)取出,前面加上子序號(hào)得到key_t的返回值。1) int msgget(key_t key, int msgflg)v參數(shù)key是一個(gè)鍵值,由ftok獲得;msgflg參數(shù)是一些標(biāo)志位。該調(diào)用返回與健值key相對(duì)應(yīng)的消息隊(duì)列描述字。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院msgget()在以
59、下兩種情況下,該調(diào)用將創(chuàng)建一個(gè)新的消息隊(duì)列:1.如果沒(méi)有消息隊(duì)列與健值key相對(duì)應(yīng),并且msgflg中包含了IPC_CREAT標(biāo)志位;2. key參數(shù)為IPC_PRIVATE;v 參數(shù)msgflg可以為以下:IPC_CREAT、IPC_EXCL、IPC_NOWAIT或三者的或結(jié)果;為0則不創(chuàng)建,只查找已有的消息隊(duì)列。v調(diào)用返回:成功返回消息隊(duì)列描述字,否則返回-1。v注:參數(shù)key設(shè)置成常數(shù)IPC_PRIVATE并不意味著其他進(jìn)程不能訪問(wèn)該消息隊(duì)列,只意味著即將按照隨機(jī)數(shù)創(chuàng)建新的消息隊(duì)列。LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院msgrcv()2)int msgrcv(int msqid, st
60、ruct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);v 該系統(tǒng)調(diào)用從msgid代表的消息隊(duì)列中讀取一個(gè)消息,并把消息存儲(chǔ)在msgp指向的msgbuf結(jié)構(gòu)中。v msqid為消息隊(duì)列描述字;消息返回后存儲(chǔ)在msgp指向的地址,msgsz指定msgbuf的mtext成員的長(zhǎng)度(即消息內(nèi)容的長(zhǎng)度),msgtyp為請(qǐng)求讀取的消息類型; v 消息緩沖區(qū):struct msgbuf long mtype;/消息類型 char mtextSIZE;/消息內(nèi)容 LOGO房地產(chǎn)房地產(chǎn)E網(wǎng)網(wǎng)西安財(cái)經(jīng)學(xué)院讀消息標(biāo)志讀消息標(biāo)志msgflg可以為以下幾個(gè)常值的或可以為以下幾個(gè)常值的或 vIPC_NOWAIT 如果沒(méi)有滿足條件的消息,調(diào)用立即返回,此時(shí),errno=ENOMSG vIPC_EXCEPT 與
溫馨提示
- 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年度教師教育培訓(xùn)機(jī)構(gòu)戰(zhàn)略合作合同
- 2025福建省安全員《C證》考試題庫(kù)
- 2025年度企業(yè)產(chǎn)品質(zhì)量認(rèn)證服務(wù)合同范本
- 2025年度歷史輔導(dǎo)班協(xié)議書退費(fèi)及人文知識(shí)拓展合同
- 2025年度教育機(jī)構(gòu)員工入職教學(xué)與培訓(xùn)合同
- 2025年度勞動(dòng)解除協(xié)議書:物流行業(yè)員工退工補(bǔ)償與就業(yè)安置合同
- 智能家居融資居間合同范例
- 2025年度養(yǎng)豬業(yè)品牌營(yíng)銷推廣合作協(xié)議
- 2025年度體育賽事賽事獎(jiǎng)勵(lì)及獎(jiǎng)金分配轉(zhuǎn)委托合同
- 2025年度5G通信技術(shù)合作介紹費(fèi)合同
- 生產(chǎn)與運(yùn)作管理-第5版 課件全套 陳志祥 第1-14章 生產(chǎn)系統(tǒng)與生產(chǎn)運(yùn)作管理概述 -豐田生產(chǎn)方式與精益生產(chǎn)
- 2025年湖南理工職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 罕見(jiàn)病診治與病例管理制度
- 課題申報(bào)書:“四新”建設(shè)與創(chuàng)新創(chuàng)業(yè)人才培養(yǎng)基本范式研究
- 婦科常見(jiàn)急危重癥護(hù)理
- 春季高考高職單招數(shù)學(xué)模擬試題七套含答案
- 2024-2025學(xué)年陜西省寶雞市高三上學(xué)期高考模擬檢測(cè)(一)英語(yǔ)試題(含解析)
- 2025年企業(yè)的演講稿例文(2篇)
- 電瓶三輪車安全培訓(xùn)
- 造船廠有限空間作業(yè)安全措施方案
- 人教版三年級(jí)下冊(cè)數(shù)學(xué)第一單元 位置與方向(一)(單元練習(xí))
評(píng)論
0/150
提交評(píng)論