亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

深入理解進程間通信之共享內存

2024-06-28 13:19:44
字體:
來源:轉載
供稿:網友
深入理解進程間通信之共享內存

  共享內存可以說是最有用的進程間通信方式,也是最快的ipC形式。是針對其他通信機制運行效率較低而設計的。兩個不同進程A、B共享內存的意思是,同一塊物理內存被映射到進程A、B各自的進程地址空間。進程A可以即時看到進程B對共享內存中數據的更新,反之亦然。由于多個進程共享同一塊內存區域,必然需要某種同步機制,互斥鎖和信號量都可以。

  采用共享內存通信的一個顯而易見的好處是效率高,因為進程可以直接讀寫內存,而不需要任何數據的拷貝。對于像管道和消息隊列等通信方式,則需要在內核和用戶空間進行四次的數據拷貝,而共享內存則只拷貝兩次數據[1]:一次從輸入文件到共享內存區,另一次從共享內存區到輸出文件。實際上,進程之間在共享內存時,并不總是讀寫少量數據后就解除映射,有新的通信時,再重新建立共享內存區域。而是保持共享區域,直到通信完畢為止,這樣,數據內容一直保存在共享內存中,并沒有寫回文件。共享內存中的內容往往是在解除映射時才寫回文件的。因此,采用共享內存的通信方式效率是非常高的。

系統V共享內存原理

  進程間需要共享的數據被放在一個叫做IPC共享內存區域的地方,所有需要訪問該共享區域的進程都要把該共享區域映射到本進程的地址空間中去。系統V共享內存通過shmget獲得或創建一個IPC共享內存區域,并返回相應的標識符。內核在保證shmget獲得或創建一個共享內存區,初始化該共享內存區相應的shmid_kernel結構體的同時,還將在特殊文件系統shm中,創建并打開一個同名文件,并在內存中建立起該文件的相應dentry及inode結構,新打開的文件不屬于任何一個進程(任何進程都可以訪問該共享內存區)。所有這一切都是系統調用shmget完成的。

注:每一個共享內存區都有一個控制結構struct shmid_kernel,shmid_kernel是共享內存區域中非常重要的一個數據結構,它是存儲管理和文件系統結合起來的橋梁,定義如下:

struct shmid_kernel /* PRivate to the kernel */{        struct kern_ipc_perm shm_perm; /* Operation permission structure */    struct file *shm_file; /* pointer in kernel */    unsigned long shm_nattch; /* number of current attaches */    unsigned long shm_segsz; /* size of segment in bytes */    time_t shm_atim; /* last-attach time */    time_t shm_dtim; /* last-detach time */    time_t shm_ctim; /* last-change time */    pid_t shm_cprid; /* pid of creator */    pid_t shm_lprid; /* pid of last shmop() */};

  

  正如消息隊列和信號燈一樣,內核通過數據結構struct ipc_ids shm_ids維護系統中的所有共享內存區域。上圖中的shm_ids.entries變量指向一個ipc_id結構數組,而每個ipc_id結構數組中有個指向kern_ipc_perm結構的指針。到這里讀者應該很熟悉了,對于系統V共享內存區來說,kern_ipc_perm的宿主是 shmid_kernel結構,shmid_kernel是用來描述一個共享內存區域的,這樣內核就能夠控制系統中所有的共享區域。同時,在 shmid_kernel結構的file類型指針shm_file指向文件系統shm中相應的文件,這樣,共享內存區域就與shm文件系統中的文件對應起來。

  在創建了一個共享內存區域后,還要將它映射到進程地址空間,系統調用shmat()完成此項功能。由于在調用shmget()時,已經創建了文件系統 shm中的一個同名文件與共享內存區域相對應,因此,調用shmat()的過程相當于映射文件系統shm中的同名文件過程,原理與mmap()大同小異。

系統V共享內存API
  頭文件:    #include <sys/ipc.h>    #include <sys/shm.h>

  shmget()用來獲得共享內存區域的ID,如果不存在指定的共享區域就創建相應的區域。shmat()把共享內存區域映射到調用進程的地址空間中去,這樣,進程就可以方便地對共享區域進行訪問操作。shmdt()調用用來解除進程對共享內存區域的映射。shmctl實現對共享內存區域的控制操作。

系統V共享內存限制

  在/proc/sys/kernel/目錄下,記錄著系統V共享內存的一下限制,如一個共享內存區的最大字節數shmmax,系統范圍內最大共享內存區標識符數shmmni等,可以手工對其調整,但不推薦這樣做。

系統V共享內存范例
/***** testwrite.c *******/#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <unistd.h>typedef struct{    char name[4];    int age;} people;main(int argc, char** argv){    int shm_id,i;    key_t key;    char temp;    people *p_map;    char* name = "/dev/shm/myshm2";    key = ftok(name,0);    if(key==-1)        perror("ftok error");    shm_id=shmget(key,4096,IPC_CREAT);        if(shm_id==-1)    {        perror("shmget error");        return;    }    p_map=(people*)shmat(shm_id,NULL,0);    temp='a';    for(i = 0;i<10;i++)    {        temp+=1;        memcpy((*(p_map+i)).name,&temp,1);        (*(p_map+i)).age=20+i;    }    if(shmdt(p_map)==-1)        perror(" detach error ");}/********** testread.c ************/#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <unistd.h>typedef struct{    char name[4];    int age;} people;main(int argc, char** argv){    int shm_id,i;    key_t key;    people *p_map;    char* name = "/dev/shm/myshm2";    key = ftok(name,0);    if(key == -1)        perror("ftok error");    shm_id = shmget(key,4096,IPC_CREAT);        if(shm_id == -1)    {        perror("shmget error");        return;    }    p_map = (people*)shmat(shm_id,NULL,0);    for(i = 0;i<10;i++)    {    printf( "name:%s/n",(*(p_map+i)).name );    printf( "age %d/n",(*(p_map+i)).age );    }    if(shmdt(p_map) == -1)        perror(" detach error ");}
View Code

  


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
自拍偷拍免费精品| 91精品国产91久久久久久久久| 亚洲精品电影网站| 97久久精品人搡人人玩| 日韩美女视频在线观看| 日韩精品中文在线观看| 欧美福利视频网站| 国产精品27p| 狠狠做深爱婷婷久久综合一区| 亚洲美女性视频| 亚洲性视频网站| 日本精品性网站在线观看| 欧美在线欧美在线| 久久韩剧网电视剧| 欧美一二三视频| 久久色在线播放| 色综合久久88| 久久久电影免费观看完整版| 色综合色综合网色综合| 亚洲精品电影在线观看| 亚洲人成毛片在线播放| 亚洲18私人小影院| 亚洲精品一区中文| 97超级碰碰人国产在线观看| 成人午夜在线观看| 尤物yw午夜国产精品视频| 在线看片第一页欧美| 国产91精品久久久久| 亚洲国产精品久久91精品| 国产精品久久二区| 91av视频在线免费观看| 亚洲午夜久久久影院| 久久99国产综合精品女同| 欧美极品在线视频| 亚洲999一在线观看www| 欧美人与性动交a欧美精品| 红桃视频成人在线观看| 97视频在线播放| 热re91久久精品国99热蜜臀| 91爱视频在线| 亚洲精品一区在线观看香蕉| 亚洲丝袜一区在线| 欧美第一页在线| 一色桃子一区二区| 91精品视频网站| 国产精品欧美激情| 国产视频在线观看一区二区| 91久久精品国产91久久| 亚洲自拍另类欧美丝袜| 精品亚洲一区二区三区| 日本精品视频在线| 一区二区三区视频在线| 国产亚洲精品va在线观看| 美女福利视频一区| 精品无人区乱码1区2区3区在线| 日韩av黄色在线观看| 色综合久久88色综合天天看泰| 欧美人与物videos| 亚洲一区二区中文字幕| 亚洲欧美国产va在线影院| 亚洲一区二区三区sesese| 91精品国产色综合久久不卡98口| 国产一区二区激情| 黑人巨大精品欧美一区二区一视频| 国产一区二区三区在线视频| 欧美日韩一区二区免费视频| 久久久久国色av免费观看性色| 狠狠干狠狠久久| 日韩av电影在线免费播放| 91中文字幕在线| 国模极品一区二区三区| 91wwwcom在线观看| 2019中文字幕全在线观看| 中文欧美在线视频| 久久久天堂国产精品女人| 色偷偷91综合久久噜噜| 全球成人中文在线| 国产a∨精品一区二区三区不卡| 91亚洲精品久久久久久久久久久久| 久久成人亚洲精品| 欧美视频在线观看免费网址| 伊人久久大香线蕉av一区二区| 亚洲一区久久久| 亚洲国产天堂网精品网站| 日韩电视剧在线观看免费网站| 久久久免费精品| 日韩高清免费在线| 亚州精品天堂中文字幕| 57pao成人国产永久免费| 国产成人亚洲综合91精品| 国产日产欧美精品| 日韩精品极品视频| 亚洲人成在线观看| 国产91免费观看| 国产亚洲欧洲高清一区| 国产香蕉一区二区三区在线视频| 伊人伊成久久人综合网小说| 亚洲电影免费观看高清完整版在线| 国产欧美日韩中文字幕在线| 中文字幕亚洲欧美| 日韩欧美中文第一页| 欧美大片第1页| 日韩av影院在线观看| 91亚洲一区精品| 久久久久女教师免费一区| 久久久www成人免费精品张筱雨| 国产玖玖精品视频| 欧美激情久久久久| 国产经典一区二区| 国产成人精品亚洲精品| 国产视频精品一区二区三区| 精品久久久免费| 91av在线不卡| 日韩电影中文 亚洲精品乱码| 欧美最猛性xxxxx(亚洲精品)| 欧美视频不卡中文| 欧美黄色片视频| 欧美电影免费播放| 成人做爰www免费看视频网站| 欧美一区二粉嫩精品国产一线天| 91理论片午午论夜理片久久| 日韩在线观看免费网站| 黄色一区二区在线| 久久综合久久88| 亚洲国产精品va在线看黑人动漫| 亚洲色图15p| 国产91成人在在线播放| 国产日产欧美a一级在线| 亚洲国产一区二区三区在线观看| 国产亚洲精品美女久久久| 国产视频亚洲精品| 亚洲bt欧美bt日本bt| 97国产精品免费视频| 亚洲成人免费在线视频| 国产ts人妖一区二区三区| 夜夜躁日日躁狠狠久久88av| 91色精品视频在线| 久久久av网站| 久久噜噜噜精品国产亚洲综合| 欧美交受高潮1| 欧美麻豆久久久久久中文| 国产精品久久久久久久久粉嫩av| 777精品视频| 亚洲第一精品夜夜躁人人躁| 欧美日韩国产一区二区| 久久91亚洲精品中文字幕奶水| 日本免费一区二区三区视频观看| 欧美日韩aaaa| 在线电影中文日韩| 午夜精品三级视频福利| 国产有码在线一区二区视频| 成人xxxx视频| 日韩专区在线观看| 久久这里有精品| 成人黄色av播放免费| 日韩中文字幕网址| 中文字幕欧美日韩精品| 国语自产精品视频在免费| 欧美色图在线视频| 国产精品久久久久久久久久久不卡| 精品国产欧美一区二区三区成人| 亚洲精品一二区| 国产精品一二三在线| 97国产精品免费视频|