第七章 進(jìn)程通信_(tái)第1頁(yè)
第七章 進(jìn)程通信_(tái)第2頁(yè)
第七章 進(jìn)程通信_(tái)第3頁(yè)
第七章 進(jìn)程通信_(tái)第4頁(yè)
第七章 進(jìn)程通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第七章 進(jìn)程通信進(jìn)程通信 進(jìn)程之間的相互通信被稱為進(jìn)程間通訊IPC 管道 命名管道FIFO 消息隊(duì)列 信號(hào)量 共享內(nèi)存2管道 管道是UNIX IPC的最老形式,所有的UNIX系統(tǒng)都支持此種通訊機(jī)制 管道有兩種限制:(1)它們是半雙工的,數(shù)據(jù)只能在一個(gè)方向上流動(dòng);(2) 它們只能在具有公共祖先的進(jìn)程之間使用。通常,一個(gè)管道由一個(gè)進(jìn)程創(chuàng)建,然后該進(jìn)程調(diào)用fork()函數(shù),此后父進(jìn)程和子進(jìn)程之間就可以使用該管道。3管道 管道的創(chuàng)建 進(jìn)程使用fork()創(chuàng)建了子進(jìn)程以后,父子進(jìn)程就有各自獨(dú)立的存儲(chǔ)空間,互不影響。兩個(gè)進(jìn)程之間交換數(shù)據(jù)就不可能像進(jìn)程內(nèi)的函數(shù)調(diào)用那樣,通過(guò)傳遞參數(shù)或者使用全局變量實(shí)現(xiàn),必須

2、通過(guò)其他的方式。例如:父子進(jìn)程共同訪問(wèn)同一個(gè)磁盤(pán)文件交換數(shù)據(jù),但是這很不方便。 UNIX提供了很多種進(jìn)程之間通信的手段。管道是一種很簡(jiǎn)單的進(jìn)程間通信方式,最早的UNIX中就提供管道機(jī)制。4管道 管道的創(chuàng)建 使用管道的基本方法是創(chuàng)建一個(gè)內(nèi)核中的管道對(duì)象,進(jìn)程可以得到兩個(gè)文件描述符。 程序像訪問(wèn)文件一樣地訪問(wèn)管道,write()將數(shù)據(jù)寫(xiě)入管道,read()從管道中讀出寫(xiě)入的內(nèi)容。 讀入的順序和寫(xiě)入的順序相同,看起來(lái)管道就像是一個(gè)僅有一個(gè)字節(jié)粗細(xì)的管子一樣傳遞數(shù)據(jù)流。 在內(nèi)核的活動(dòng)文件目錄的三級(jí)結(jié)構(gòu)中,管道的兩個(gè)文件描述符和普通文件一樣,只是內(nèi)核的inode中記文件類型為特殊文件:“管道文件”,操作

3、系統(tǒng)在內(nèi)核中實(shí)現(xiàn)管道機(jī)制。5管道 管道的創(chuàng)建6#include int pipe(int filedes2)成功返回0; 出錯(cuò)返回-1filedes0用于讀管道,filedes1用于寫(xiě)管道。這樣,如果進(jìn)程向filedes1寫(xiě)入數(shù)據(jù),那么就會(huì)從filedes0順序讀出來(lái)。 如果僅有一個(gè)進(jìn)程,創(chuàng)建一個(gè)這樣的管道交換進(jìn)程內(nèi)的數(shù)據(jù)沒(méi)什么意義。管道 管道的創(chuàng)建 使用fork()創(chuàng)建子進(jìn)程之后,文件描述符被繼承。這樣,父進(jìn)程從filedes1寫(xiě)入的數(shù)據(jù),子進(jìn)程就可以從filedes0讀出,從而實(shí)現(xiàn)父子進(jìn)程之間的通信。 如果父進(jìn)程創(chuàng)建兩個(gè)子進(jìn)程,都繼承管道的文件描述符,兩個(gè)子進(jìn)程間也可交換數(shù)據(jù)。 一般的,有

4、共同祖先的進(jìn)程就有機(jī)會(huì)從同一個(gè)祖先繼承這個(gè)祖先創(chuàng)建的管道的文件描述符,從而互相間通過(guò)管道通信。 fork以后,父子進(jìn)程可關(guān)閉不再需要的文件描述符。7管道 管道的創(chuàng)建8管道 管道的讀寫(xiě)操作 對(duì)于寫(xiě)操作write()來(lái)說(shuō),由于管道是內(nèi)核中的一個(gè)緩沖區(qū),緩沖區(qū)不可能無(wú)限大。若管道已滿,則write()操作就會(huì)導(dǎo)致進(jìn)程被阻塞,直到管道另一端read()將已進(jìn)入管道的數(shù)據(jù)取走后,內(nèi)核才把阻塞在write()的寫(xiě)端進(jìn)程喚醒。 讀操作的三種情況: 第一種情況,管道為空,則read調(diào)用就會(huì)將進(jìn)程阻塞,而不是返回0。 第二種情況,管道不為空,返回讀取的內(nèi)容。 第三種情況,管道寫(xiě)端已關(guān)閉,則返回0。9管道 管道的

5、讀寫(xiě)操作 兩個(gè)獨(dú)立的進(jìn)程對(duì)管道的讀寫(xiě)操作,如果未寫(xiě)之前,讀先行一步,那么,操作系統(tǒng)內(nèi)核在系統(tǒng)調(diào)用read()中讓讀端進(jìn)程睡眠,等待寫(xiě)端送來(lái)數(shù)據(jù)。 同樣,如果寫(xiě)端的數(shù)據(jù)太多或者寫(xiě)得太快,讀端來(lái)不及讀,管道滿了之后操作系統(tǒng)內(nèi)核就會(huì)在系統(tǒng)調(diào)用write()中讓寫(xiě)端進(jìn)程睡眠,等待讀端讀走數(shù)據(jù)。 這種同步機(jī)制,在讀寫(xiě)速度不匹配時(shí)不會(huì)丟失數(shù)據(jù)。10管道 管道的關(guān)閉 只有所有進(jìn)程中引用管道寫(xiě)端的文件描述符都關(guān)閉了,讀端read()調(diào)用才返回0。 關(guān)閉讀端,不再有任何進(jìn)程讀,則導(dǎo)致寫(xiě)端write()調(diào)用返回1,終止調(diào)用write()的進(jìn)程。11管道 兩個(gè)進(jìn)程通過(guò)管道傳送數(shù)據(jù)的例子: 程序文件pwrite.c創(chuàng)

6、建管道,并通過(guò)管道向程序pread.c傳遞數(shù)據(jù)。12管道 應(yīng)注意的問(wèn)題 管道傳輸?shù)氖且粋€(gè)無(wú)記錄邊界的字節(jié)流。寫(xiě)端的一次write所發(fā)送的數(shù)據(jù),讀端可能需要多次read才能讀??;也有可能寫(xiě)端的多次write所發(fā)送的數(shù)據(jù),讀端一次全部讀出積壓在管道中的所有數(shù)據(jù)。 父子進(jìn)程需要雙向通信時(shí),應(yīng)采用兩個(gè)管道。 父子進(jìn)程使用兩個(gè)管道傳遞數(shù)據(jù),安排不當(dāng)就有可能產(chǎn)生死鎖。 管道的缺點(diǎn)。管道是半雙工通信通道,數(shù)據(jù)只能在一個(gè)方向上流動(dòng);管道通信只限于父子進(jìn)程或者同祖先的進(jìn)程間通信,而且沒(méi)有保留記錄邊界。13命名管道FIFO 命名管道最早出現(xiàn)在UNIX System ,允許沒(méi)有共同祖先的不相干進(jìn)程訪問(wèn)一個(gè)FIFO管

7、道。 命名管道的創(chuàng)建14#include #includeint mkfifo(const char *pathname, mode_t mode)成功返回0; 出錯(cuò)返回-1命名管道FIFO 命名管道的使用一旦用mkfifo()創(chuàng)建了一個(gè)FIFO,就可以像一般的文件一樣對(duì)其進(jìn)行I/O操作 發(fā)送者調(diào)用: fd = open(pipename, O_WRONLY);write(fd, buf, len); 接收者調(diào)用: fd = open(pipename, O_RDONLY);len = read(fd, buf, sizeof buf); 15命名管道FIFO 命名管道的用途: FIFO由sh

8、ell命令使用以便將數(shù)據(jù)從一條管道線傳送到另一條,為此無(wú)需創(chuàng)建中間臨時(shí)文件; FIFO用于客戶機(jī)-服務(wù)器應(yīng)用程序中,以便在客戶機(jī)和服務(wù)器之間傳輸數(shù)據(jù)。16命名管道FIFO17消息隊(duì)列 管道是最早用于進(jìn)程之間通信的手段; 后來(lái)增加了命名管道; UNIX從System V開(kāi)始增強(qiáng)了進(jìn)程之間的通信機(jī)制IPC(inter-process communication),主要是提供了消息隊(duì)列,信號(hào)量和共享內(nèi)存。 18消息隊(duì)列 消息隊(duì)列的訪問(wèn)模型與磁盤(pán)文件有些類似; 首先需要一個(gè)進(jìn)程創(chuàng)建消息隊(duì)列,不過(guò)消息隊(duì)列不是存放在磁盤(pán)上,而是存放在操作系統(tǒng)內(nèi)核內(nèi)存中的數(shù)據(jù)對(duì)象; 創(chuàng)建消息隊(duì)列時(shí)也需要提供一個(gè)類似文件名作

9、用的整數(shù)KEY; 消息隊(duì)列一旦創(chuàng)建,內(nèi)核中的數(shù)據(jù)對(duì)象就存在,即使創(chuàng)建消息隊(duì)列的進(jìn)程終止,仍舊存在; 其他的進(jìn)程只需要知道消息隊(duì)列的KEY,就可以像文件一樣對(duì)消息隊(duì)列進(jìn)行讀寫(xiě)操作。19消息隊(duì)列 文件文件名open()filedeswrite()read()lsrm20 消息隊(duì)列消息隊(duì)列的KEYmsgget() qid msgsnd msgrcv ipcs ipcrm消息隊(duì)列 創(chuàng)建新的消息隊(duì)列,或者獲得已有消息隊(duì)列的qid21#include #include #include int msgget(key_t key, int flag)成功返回qid; 出錯(cuò)返回-1例1:創(chuàng)建一個(gè)KEY為462

10、101的消息隊(duì)列。 qid = msgget(462101, IPC_CREAT | 0666); 例2:取得一個(gè)KEY為462101的已存在的消息隊(duì)列。qid = msgget(462101, 0); 消息隊(duì)列 消息的發(fā)送22#include int msgsnd(int msqid, void *ptr, size_t nbytes, int flag); 成功返回0; 出錯(cuò)返回-1 當(dāng)flag為0時(shí),如果消息隊(duì)列滿或者其他原因?qū)е聲簳r(shí)無(wú)法發(fā)送消息,則msgsnd()等待,進(jìn)程處于睡眠狀態(tài),一直睡眠到能夠把消息發(fā)送出去為止; 當(dāng)flag為IPC_NOWAIT時(shí),如果消息隊(duì)列滿或其他原因無(wú)法

11、立刻發(fā)送成功,則msgsnd()立刻返回-1,不等待。消息隊(duì)列 消息的接收23#include int msgrcv(int msqid, void *ptr, size_t nbytes, long mtype, int flags); 成功返回0; 出錯(cuò)返回-1 mtype為0,返回隊(duì)列上的第一個(gè)消息,以FIFO方式得到隊(duì)列的消息; mtype大于0,返回類型為mtype的第一個(gè)消息; mtype小于0,返回第一個(gè)類型值-mtype的消息; mtype不為0時(shí),進(jìn)程只選擇自己感興趣的消息接收。消息隊(duì)列 消息隊(duì)列的特點(diǎn) 保持了記錄邊界,而且消息傳遞是可靠的,不會(huì)丟失數(shù)據(jù)。這對(duì)于應(yīng)用程序來(lái)說(shuō)非

12、常方便; 獨(dú)立啟動(dòng)的多個(gè)進(jìn)程只要使用相同的消息隊(duì)列KEY值,就可以共享消息隊(duì)列; 可以多路復(fù)用,實(shí)現(xiàn)了“信箱”的功能,便于多個(gè)進(jìn)程共享消息隊(duì)列; 同共享內(nèi)存相比,消息隊(duì)列也有缺點(diǎn):多個(gè)進(jìn)程之間的通信數(shù)據(jù)必須經(jīng)過(guò)內(nèi)核復(fù)制,當(dāng)數(shù)據(jù)量極大時(shí),不如共享內(nèi)存快。24消息隊(duì)列使用消息隊(duì)列實(shí)現(xiàn)一個(gè)服務(wù)進(jìn)程為多個(gè)客戶進(jìn)程服務(wù)25消息隊(duì)列 在設(shè)計(jì)UNIX的多進(jìn)程間通信時(shí),必須仔細(xì)分析所設(shè)計(jì)的進(jìn)程通信機(jī)制會(huì)不會(huì)產(chǎn)生死鎖問(wèn)題。 在使用管道,消息隊(duì)列,信號(hào)量時(shí),都有可能產(chǎn)生死鎖。26消息隊(duì)列 如果客戶進(jìn)程每次都要產(chǎn)生一個(gè)體積較大的請(qǐng)求消息發(fā)送到消息隊(duì)列。假設(shè)消息隊(duì)列最多可以容納8個(gè)這樣的消息,而有9個(gè)客戶端進(jìn)程。 在

13、特定的情況下,9個(gè)進(jìn)程同時(shí)把自己的請(qǐng)求消息發(fā)送到消息隊(duì)列,由于隊(duì)列最多可以容納8個(gè)消息,這樣,最后一個(gè)進(jìn)程的發(fā)送請(qǐng)求被阻塞。 當(dāng)服務(wù)進(jìn)程從隊(duì)列里取走一個(gè)數(shù)據(jù)正在進(jìn)行處理的時(shí)候,這第9個(gè)進(jìn)程醒過(guò)來(lái),把它的數(shù)據(jù)注入到消息隊(duì)列中,導(dǎo)致隊(duì)列滿。服務(wù)進(jìn)程在處理完畢數(shù)據(jù)后,處理結(jié)果要發(fā)送到消息隊(duì)列中,隊(duì)列滿,就會(huì)等待; 而所有的9個(gè)客戶進(jìn)程都在等待自己的應(yīng)答消息,也在等待。這樣死鎖就會(huì)產(chǎn)生。27消息隊(duì)列使用兩個(gè)消息隊(duì)列在客戶服務(wù)進(jìn)程之間傳遞數(shù)據(jù)28消息隊(duì)列三個(gè)進(jìn)程通過(guò)消息隊(duì)列通信29消息隊(duì)列 命令ipcs打印IPC機(jī)制的狀態(tài)(包括消息隊(duì)列,共享內(nèi)存和信號(hào)量) ipcs對(duì)消息隊(duì)列操作時(shí),常用命令ipcs -

14、q或ipcs -aq,其中選項(xiàng)-q,指定僅打印與消息隊(duì)列(queue)有關(guān)的內(nèi)容,不打印信號(hào)量和共享內(nèi)存的相關(guān)內(nèi)容。 其他的幾個(gè)選項(xiàng),用于控制需要打印出關(guān)于消息隊(duì)列狀態(tài)的msgqid_ds結(jié)構(gòu)中的那些域。30信號(hào)量 信號(hào)量(semaphore)是UNIX提供的一種機(jī)制,它用于控制多個(gè)進(jìn)程對(duì)共享資源的互斥性訪問(wèn)和進(jìn)程之間的同步; 為獲得共享資源,進(jìn)程需要執(zhí)行:1. 測(cè)試控制該資源的信號(hào)量;2. 若信號(hào)量為正,則進(jìn)程可以使用該資源;進(jìn)程將信號(hào)量-1;3. 若信號(hào)量為0,則進(jìn)程進(jìn)入睡眠狀態(tài),直至信號(hào)量為正;進(jìn)程被喚醒后返回至第1步測(cè)試狀態(tài)。31信號(hào)量 信號(hào)量創(chuàng)建和引用的模式,與消息隊(duì)列類似。 UNI

15、X提供的信號(hào)量機(jī)制是信號(hào)量組,允許一次創(chuàng)建多個(gè)信號(hào)量和一次操作多個(gè)信號(hào)量。 使用信號(hào)量時(shí),程序需要首先根據(jù)KEY(類似文件名),使用semget()系統(tǒng)調(diào)用創(chuàng)建一個(gè)新的信號(hào)量組或者獲取一個(gè)已存在的信號(hào)量組,得到一個(gè)內(nèi)部的信號(hào)量組的ID(類似fd)。 獨(dú)立啟動(dòng)的多個(gè)進(jìn)程可以根據(jù)事先約定好的相同的KEY得到id,以訪問(wèn)同一個(gè)信號(hào)量組。 semctl()可以用來(lái)查詢信號(hào)量的狀態(tài),還用來(lái)刪除不再使用的信號(hào)量組。32信號(hào)量 要調(diào)用的第一個(gè)函數(shù)是semget()以獲得一個(gè)信號(hào)量ID33#include #include #include int semget(key_t key, int nsems, i

16、nt flag);成功返回信號(hào)量ID; 出錯(cuò)返回-1參數(shù)key是信號(hào)量組的KEY。參數(shù)nsems指明信號(hào)量組中包含有多少個(gè)信號(hào)量,這個(gè)參數(shù)僅在創(chuàng)建新信號(hào)量組時(shí)使用,獲取已存在的信號(hào)量組,將這個(gè)參數(shù)設(shè)為0。信號(hào)量 這個(gè)系統(tǒng)調(diào)用可以查詢信號(hào)量組的狀態(tài),刪除信號(hào)量組。34#include #include #include int semctl(int sem_id, int snum, int cmd, void *arg);出錯(cuò)返回-1參數(shù)cmd是控制命令號(hào),參數(shù)snum是信號(hào)量在信號(hào)量組中的編號(hào),arg是執(zhí)行這一控制命令所需要的參數(shù)存放區(qū)。信號(hào)量 最重要的一個(gè)系統(tǒng)調(diào)用,對(duì)信號(hào)量施行P操作或者V

17、操作,可能會(huì)導(dǎo)致調(diào)用進(jìn)程在此睡眠。35int semop(int sem_id, struct sembuf sops, int nsops); 出錯(cuò)返回-1參數(shù)sem_id為信號(hào)量組的ID,是semget()的返回值。數(shù)組sops可以指定多個(gè)操作,數(shù)組的每個(gè)元素是一個(gè)結(jié)構(gòu)體,描述需要進(jìn)行什么操作。參數(shù)nsops說(shuō)明這個(gè)數(shù)組中有多少個(gè)有效元素。信號(hào)量 sembuf描述了對(duì)信號(hào)量的一個(gè)操作,結(jié)構(gòu)定義如下:36struct sembuf short sem_num; /* 信號(hào)量在信號(hào)量組中的編號(hào),從0開(kāi)始編號(hào) */ short sem_op; /* 信號(hào)量操作 */ short sem_flg;

18、 /* 操作選項(xiàng) */; sem_num指出要操作的這一信號(hào)量在信號(hào)量組中的編號(hào),按照C語(yǔ)言的慣例,編號(hào)從0開(kāi)始。sem_op指出需要進(jìn)行的信號(hào)量操作。P操作相當(dāng)于執(zhí)行sem_op=-1的操作;V操作相當(dāng)于執(zhí)行sem_op=1的操作。共享內(nèi)存 共享內(nèi)存(share memory)就是多個(gè)進(jìn)程共同使用同一段物理內(nèi)存空間。 同消息隊(duì)列相比,使用共享內(nèi)存在多個(gè)進(jìn)程之間傳送數(shù)據(jù),速度更快。尤其是進(jìn)程之間傳送的數(shù)據(jù)量很大時(shí),效果明顯。 但是,共享同一物理內(nèi)存段的多個(gè)進(jìn)程之間,必須自行解決對(duì)共享內(nèi)存訪問(wèn)的互斥和同步問(wèn)題。UNIX操作系統(tǒng)本身并不自動(dòng)解決這些問(wèn)題。37共享內(nèi)存 前面介紹的消息隊(duì)列自動(dòng)實(shí)現(xiàn)了收

19、發(fā)進(jìn)程的數(shù)據(jù)緩沖,如果使用共享內(nèi)存完全代替消息隊(duì)列的功能在多個(gè)進(jìn)程之間傳送數(shù)據(jù),需要增加信號(hào)量在多進(jìn)程之間實(shí)現(xiàn)互斥。程序編制起來(lái)要復(fù)雜得多。38共享內(nèi)存 共享內(nèi)存還可以用在許多其他的應(yīng)用中: 例如:進(jìn)程可以使用共享內(nèi)存向動(dòng)態(tài)產(chǎn)生的數(shù)量不固定的多個(gè)查詢進(jìn)程發(fā)布數(shù)據(jù),這有點(diǎn)類似廣播。 再如,通信協(xié)議處理程序把當(dāng)前的通信狀態(tài)和統(tǒng)計(jì)信息放入共享內(nèi)存中,這樣,在通信協(xié)議處理程序運(yùn)行過(guò)程中,可以隨時(shí)啟動(dòng)另外一個(gè)監(jiān)視程序,從共享內(nèi)存中讀取數(shù)據(jù)以窺視協(xié)議有限狀態(tài)機(jī)當(dāng)前狀態(tài)和統(tǒng)計(jì)信息,了解通信狀況。監(jiān)視程序可以隨時(shí)終止,監(jiān)視程序的運(yùn)行與否對(duì)通信進(jìn)程毫無(wú)影響。協(xié)議程序需要做的惟一配合就是將本來(lái)就放在內(nèi)存中的數(shù)據(jù),

20、放到共享內(nèi)存中,除了可以被其他進(jìn)程讀寫(xiě)外,速度上也不會(huì)受任何影響。39共享內(nèi)存 在Windows和其他的多任務(wù)操作系統(tǒng)中,也都提供共享內(nèi)存機(jī)制,基本功能是一樣的,在函數(shù)格式上有些不同。 與共享內(nèi)存相關(guān)的一組系統(tǒng)調(diào)用函數(shù)的體系,類似于消息隊(duì)列和信號(hào)量組的系統(tǒng)調(diào)用40#include #include #include int shmget(key_t key, int nbytes, int flag);成功返回共享內(nèi)存段ID; 出錯(cuò)返回-1共享內(nèi)存 使用共享內(nèi)存段時(shí),程序需要首先根據(jù)KEY使用shmget()系統(tǒng)調(diào)用創(chuàng)建一個(gè)新的或獲取一個(gè)已存在的共享內(nèi)存段,得到一個(gè)內(nèi)部的共享內(nèi)存段ID。 新創(chuàng)

21、建共享內(nèi)存段時(shí),參數(shù)nbytes和flags的后9比特才有意義。共享內(nèi)存段大小為nbytes字節(jié),flags的后9比特是該共享內(nèi)存段的訪問(wèn)權(quán)限,創(chuàng)建共享內(nèi)存段時(shí),flags的IPC_CREAT比特要置位。 如果該KEY對(duì)應(yīng)的共享內(nèi)存段已經(jīng)存在,則得到共享內(nèi)存段的ID,參數(shù)nbytes和flags無(wú)意義,都填為0。41共享內(nèi)存 獲取指向共享內(nèi)存段的指針42void *shmat(int shm_id, void *shmaddr, int shmflg);成功返回一個(gè)指向共享內(nèi)存段首地址的指針;出錯(cuò)返回-1 shm_id是共享內(nèi)存段的ID,是shmget()的返回值。 shmat()根據(jù)shm_

22、id得到指向共享內(nèi)存段的指針,就是共享內(nèi)存段在當(dāng)前進(jìn)程地址空間中的地址值,這個(gè)工作叫attach。 參數(shù)shmaddr和shmflg用于選擇進(jìn)程期望得到的地址值范圍,一般情況下,這兩項(xiàng)都填為0,由系統(tǒng)自動(dòng)選取有效地址。共享內(nèi)存43int shmctl(int shm_id, int cmd, void *arg); 出錯(cuò)返回-1 這一系統(tǒng)調(diào)用實(shí)現(xiàn)對(duì)共享內(nèi)存段的控制操作,如:刪除,查詢狀態(tài)。這里僅介紹用于刪除系統(tǒng)中共享內(nèi)存段的調(diào)用:shmctl(shm_id, IPC_RMID, 0);共享內(nèi)存 與共享內(nèi)存有關(guān)的命令有ipcs和ipcrm。 ipcs -m用于觀察共享內(nèi)存的當(dāng)前狀態(tài),ipcrm

23、-m用于從系統(tǒng)中刪除一段共享內(nèi)存。 內(nèi)核參數(shù)對(duì)共享內(nèi)存也有一定的限制。SHMMAX限制一個(gè)共享內(nèi)存段的最大尺寸,典型值為128KB(即1281024B),SHMMNI限制系統(tǒng)中共享內(nèi)存段的段數(shù),典型值為100,SHMSEG限制每個(gè)進(jìn)程最多可訪問(wèn)的共享內(nèi)存段數(shù),典型值為6。 444546內(nèi)存映射 傳統(tǒng)的訪問(wèn)磁盤(pán)文件的模式是打開(kāi)一個(gè)文件,然后通過(guò)read和write訪問(wèn)文件。現(xiàn)代的操作系統(tǒng),包括UNIX和Windows都提供了一種“內(nèi)存映射”(memory map)方式讀寫(xiě)文件的方法。 內(nèi)存映射方式訪問(wèn)文件時(shí),將文件中的一部分連續(xù)的區(qū)域,映射成一段進(jìn)程邏輯地址空間中的內(nèi)存。進(jìn)程獲取這段映射內(nèi)存的指

24、針后,就把這個(gè)指針當(dāng)作普通的數(shù)據(jù)指針一樣引用。修改其中的數(shù)據(jù),實(shí)際修改了文件,引用其中的數(shù)據(jù)值,就是讀取了文件。47內(nèi)存映射 內(nèi)存映射方式訪問(wèn)文件,并非操作系統(tǒng)特意設(shè)置的功能。進(jìn)程的指令段就是按照這種方式實(shí)現(xiàn)的,進(jìn)程邏輯地址空間中的指令段是程序文件中的一段內(nèi)容的內(nèi)存映射。指令段分得一段連續(xù)的邏輯地址空間,程序的順序執(zhí)行或者指令跳轉(zhuǎn)就是對(duì)指令段中某地址單元中指令代碼的訪問(wèn)。系統(tǒng)不會(huì)實(shí)實(shí)在在地為一個(gè)大的指令段分配與指令段大小相等的一段物理內(nèi)存,而是根據(jù)虛擬內(nèi)存的頁(yè)面調(diào)度算法,按需調(diào)入程序文件中的內(nèi)容,必要時(shí)淘汰已經(jīng)從程序文件中讀入的內(nèi)存頁(yè)面。48內(nèi)存映射 同樣,系統(tǒng)也不會(huì)為數(shù)據(jù)文件的內(nèi)存映射區(qū)域分配相同大小的物理內(nèi)存,而是由虛擬內(nèi)存的頁(yè)面調(diào)度算法自動(dòng)進(jìn)行物理內(nèi)存分配,與指令段不同的是頁(yè)面淘汰操作,必要時(shí)需要將物理內(nèi)存中內(nèi)容回寫(xiě)到磁盤(pán)數(shù)據(jù)文件中。49內(nèi)存映射 內(nèi)存映射方式讀寫(xiě)文件比使用read,write方式速度更快。 以read為例,內(nèi)核需要將磁盤(pán)數(shù)據(jù)首先讀入到內(nèi)核中的緩沖區(qū),然后復(fù)制到用戶進(jìn)程的緩沖區(qū)中。而內(nèi)存映射方式,通過(guò)進(jìn)程的

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論