亚洲香蕉成人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国产视频在线| 社区色欧美激情 | 亚洲3p在线观看| 亚洲电影免费观看高清完整版| 在线观看中文字幕亚洲| 欧美激情视频网址| 九九久久综合网站| 亚洲偷熟乱区亚洲香蕉av| 97香蕉超级碰碰久久免费的优势| 国内伊人久久久久久网站视频| 在线播放亚洲激情| 国产99久久精品一区二区| 国产精品激情自拍| 综合网日日天干夜夜久久| 日韩有码在线电影| 中国china体内裑精亚洲片| 亚洲最大在线视频| 亚洲国产精品悠悠久久琪琪| 亚洲成人国产精品| 欧美国产日韩一区二区| 日韩暖暖在线视频| 久久夜色精品国产亚洲aⅴ| 欲色天天网综合久久| 国产视频福利一区| 国产美女精品免费电影| 欧美性理论片在线观看片免费| 国产一区二区黑人欧美xxxx| 不卡av在线播放| 亚洲国产精品成人精品| 九九热精品视频国产| 欧美午夜激情视频| 欧美大秀在线观看| 欧美黑人极品猛少妇色xxxxx| 国产午夜精品久久久| 久久亚洲一区二区三区四区五区高| 国产精品女主播| 日韩精品免费一线在线观看| 日韩av片免费在线观看| 亚洲国产精品久久久| 国产伦精品一区二区三区精品视频| 欧美成人黄色小视频| 国产精品aaaa| 国内精品视频久久| 亚洲精品电影网在线观看| 久久99久久亚洲国产| 成人精品一区二区三区电影黑人| 日韩高清电影免费观看完整版| 国产一区欧美二区三区| 国产精品激情av电影在线观看| 伦伦影院午夜日韩欧美限制| 久久理论片午夜琪琪电影网| 国产啪精品视频网站| 精品国产依人香蕉在线精品| 午夜精品99久久免费| 日韩av在线影院| 日韩毛片在线看| 亚洲色图13p| 国产精品爽爽爽爽爽爽在线观看| 国产午夜精品理论片a级探花| 日韩电影在线观看中文字幕| 欧美性猛交xxxx乱大交蜜桃| 久久久日本电影| 日韩中文字在线| 中文字幕日本欧美| 久久99久久亚洲国产| 日韩精品免费综合视频在线播放| 久久精品国产69国产精品亚洲| 日韩美女视频免费看| 国产91在线视频| 欧美精品九九久久| 亚洲一区二区福利| 国产午夜精品一区理论片飘花| 国产精品专区一| 欧美激情区在线播放| 日韩免费看的电影电视剧大全| 九九热最新视频//这里只有精品| 久久久久久久久久久免费| 久久深夜福利免费观看| 亚洲精品久久久久久久久| 色樱桃影院亚洲精品影院| 久久中文字幕一区| 久久久久在线观看| 日韩激情在线视频| 日韩免费在线视频| 日韩av免费在线观看| 亚洲视频在线观看视频| 日韩激情片免费| 97高清免费视频| 久久综合伊人77777| 亚洲最大成人网色| 亚洲视频axxx| 亚洲一二在线观看| 欧美激情精品在线| 国产精品久久久久久久久粉嫩av| 国产精品久久久久久久久| 国产91精品黑色丝袜高跟鞋| 欧美日韩国产成人在线| 中文字幕在线国产精品| 精品福利免费观看| 91国产精品视频在线| 亚洲国产日韩欧美在线图片| 国产欧美一区二区三区视频| 亚洲精品日韩丝袜精品| 精品国产精品三级精品av网址| 精品国产美女在线| 成人激情在线播放| 中文字幕日韩电影| 一本色道久久综合狠狠躁篇的优点| 日本欧美中文字幕| 久久久久久久久久久91| 亚洲自拍av在线| 91久久久久久久| 亚洲精品短视频| 精品亚洲一区二区三区在线观看| 欧美中文字幕在线视频| 日本19禁啪啪免费观看www| 亚洲欧美国产日韩中文字幕| 亚洲美女av黄| 81精品国产乱码久久久久久| 亚洲精品97久久| 国产精品免费视频久久久| 国产97在线视频| 欧美性xxxx极品hd满灌| 亚洲美女喷白浆| 成人有码视频在线播放| 亚洲白拍色综合图区| 日本欧美黄网站| 2019亚洲日韩新视频| 成人免费看吃奶视频网站| 欧美激情高清视频| 亚洲国产精品久久91精品| 98午夜经典影视| 亚洲精品视频在线播放| 国产美女主播一区| 日韩天堂在线视频| 亚洲日韩欧美视频一区| 91精品国产91久久久久久最新| 久久影院在线观看| 亚洲成色999久久网站| 中文字幕成人在线| 免费91在线视频| 高清日韩电视剧大全免费播放在线观看| 国产自产女人91一区在线观看| 亚洲电影免费观看高清完整版| 在线观看国产精品91| 欧美日韩国产成人| 伊人伊成久久人综合网小说| 一本大道久久加勒比香蕉| 国产+成+人+亚洲欧洲| 欧美大尺度电影在线观看| 国产精品夜色7777狼人| 色哟哟网站入口亚洲精品| 久久久久中文字幕2018| 国内精品视频在线| 91美女福利视频高清| 人人澡人人澡人人看欧美|