青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 15,comments - 21,trackbacks - 0
進程間通信方式包括了管道,消息隊列,FIFO,共享內存,而共享內存是其中效率最高的。下圖解釋了其效率最高的原因(圖片截取自《UNIX網絡編程》)

我們可以看到上面的拷貝次數是4次,下面則是2次。
接下來我們看看使用,其實網上和書上都有了很多資料,API就是那么幾個。
int shmget(key_t key,size_t size,int shmflag)。
key:可以指定IPC_PRIVATE,那么系統會為你創建一個key,并且返回一個id號。也可以通過ftok函數生成一個key(不了解ftok的童鞋可以動手man一下)。那么為什么要一個IPC既要一個key又有一個ID呢。這里我覺得是為了方便其他進程訪問。進程A創建了一個共享內存,內核為其分配一個ID,這個時候進程B想要訪問,他怎么獲取這個ID(難道需要A把ID發送給B??)。但是我們用一個key就很方便了。事先A,B進程都知道這個key,那么A創建了,B就可以通過事先知道key找到這塊內存。
size:共享內存的大小。如果是獲得一塊內存,則該值應該為0。
shmflag:讀寫權限的組合,可以與IPC_CREAT和IPC_EXCL按位或。當指定一個key時,IPC_CREAT和IPC_EXCL配合使用可以在存在該key的共享內存時返回-1。
當該函數調用成功后,返回一個系統分配的共享內存,并且size大小的字節被初始化為0

void *shmat(int shmid, const void *shmaddr, int shmflg)
有了一塊共享內存后,進程需要映射該內存到進程的地址空間。這個函數就是作用。
shmid就是之前獲得ID,shmaddr如果指定了,就會配合shmflg確定映射地址,不過一般都不這么干的。返回值就是獲得的地址,你可以往里面寫你或者讀你需要的數據了。同時調用了該函數,系統會修改shmid_ds數據。

int shmdt(const void *shmaddr)
解除綁定關系,參數就是我們之前獲取的那個返回地址。(其實我覺得這里參數如果為ID貌似更統一些吧)

int shmctl(int shmid, int cmd, struct shmid_ds *buf)
這個函數主要做一些修改和查詢。比如設置鎖,解鎖,移除一塊共享內存。

簡單介紹了API,還要說一下一些注意的東西
1.共享內存不會把數據寫入磁盤文件中,這個區別于mmap
2.即使沒有進程綁定在共享內存,共享內存也不會消失的。必須通過shmctl或者ipcrm刪除(或者更暴力的方式關掉電腦)

另外我們可能會考慮,系統最多創建多少個共享內存,一個進程最多可以綁定多少個內存,一個共享內存創建的size最大最小值是多少。其實這些設置在/proc/sys/kernel下面,我們也可以自己寫程序來讀取。貼一段代碼用來獲取上面的信息
#define MAX_SHMIDS        8196

int main(int argc,char *argv[])
{
    int i,j;
    int shmid[MAX_SHMIDS] = {0};
    void *addr[MAX_SHMIDS] = {0};
    
    //測試可以創建多少個共享內存
    for ( i = 0;i < MAX_SHMIDS;++i )
    {
        shmid[i] = shmget(IPC_PRIVATE,1024,0666|IPC_CREAT);
        if ( shmid[i] == -1 )
        {
            printf("create shared memory failed,max create num[%d],%s\r\n",i,strerror(errno));
            break;
        }
    }
    
    for ( int j = 0;j < i;++j )
    {
        shmctl(shmid[j],IPC_RMID,NULL);
    }
    
    //測試每個進程可以attach的最大數
    for ( i = 0;i < MAX_SHMIDS;++i )
    {
        shmid[i] = shmget(IPC_PRIVATE,1024,0666|IPC_CREAT);
        if ( shmid[i] != -1 )
        {
            addr[i] = shmat(shmid[i],0,0);
            if ( addr[i] == (void *)-1 )
            {
                printf("process attach shared memory failed,max num[%d],%s\r\n",i,strerror(errno));
                shmctl(shmid[i],IPC_RMID,NULL);
                break;
            }
        }
        else
        {
            printf("max num of process attach shared memory is[%d]\r\n",i-1);
            break;
        }
    }
    
    for ( j = 0;j < i;++j )
    {
        shmdt(addr[j]);
        shmctl(shmid[j],IPC_RMID,NULL);
    }
    
    //測試一個共享內存創建最小的size
    size_t size = 0;
    for ( ;;size++ )
    {
        shmid[0] = shmget(IPC_PRIVATE,size,0666|IPC_CREAT);
        if ( shmid[0] != -1 )
        {
            printf("create shared memory succeed,min size[%d]\r\n",size);
            shmctl(shmid[0],IPC_RMID,NULL);
            break;
        }
    }
    
    //測試共享內存創建最大的size
    for ( size = 65536;;size += 1024 )
    {
        shmid[0] = shmget(IPC_PRIVATE,size,0666|IPC_CREAT);
        if ( shmid[0] == -1 )
        {
            printf("create shared memory failed,max size[%ld],%s\r\n",size,strerror(errno));
            break;
        }
        
        shmctl(shmid[0],IPC_RMID,NULL);
    }
    
    exit(0);
}
好了,下篇開始介紹如何控制讀寫。
posted on 2012-09-06 19:26 梨樹陽光 閱讀(2265) 評論(0)  編輯 收藏 引用 所屬分類: Linux

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美绝品在线观看成人午夜影视| 亚洲精品美女免费| 亚洲精品视频在线播放| 国内外成人在线视频| 亚洲乱码日产精品bd| 亚洲第一天堂av| 欧美一区二区三区视频在线 | 亚洲高清在线观看| 国产欧美精品在线播放| 日韩一本二本av| 日韩一级黄色av| 免费在线成人| 欧美国产日本在线| 狠狠色丁香婷综合久久| 性欧美暴力猛交另类hd| 欧美伊人久久大香线蕉综合69| 欧美午夜寂寞影院| 99国内精品久久| 亚洲影音先锋| 国产精品久久久久久久久免费樱桃| 亚洲毛片在线| 亚洲一区二区三区三| 欧美日韩亚洲一区三区| 亚洲美女黄网| 亚洲自拍三区| 国产精品日本一区二区| 亚洲五月婷婷| 久久久久国产精品厨房| 精品不卡一区| 免费看亚洲片| 日韩亚洲欧美一区| 亚洲欧美日韩国产精品 | 欧美日韩亚洲一区二| 99re8这里有精品热视频免费 | 亚洲靠逼com| 欧美福利电影在线观看| 亚洲精品乱码久久久久久久久| 日韩一级片网址| 欧美午夜无遮挡| 欧美一区二区三区的| 另类欧美日韩国产在线| 亚洲美女精品成人在线视频| 欧美午夜a级限制福利片| 亚洲在线播放电影| 巨乳诱惑日韩免费av| 亚洲成人在线观看视频| 欧美美女操人视频| 香蕉av777xxx色综合一区| 欧美成人乱码一区二区三区| aa级大片欧美三级| 国产精品久久精品日日| 欧美专区日韩专区| 亚洲人成网站777色婷婷| 午夜精品美女久久久久av福利| 韩日欧美一区二区三区| 欧美高清视频www夜色资源网| 亚洲午夜女主播在线直播| 久久人人97超碰精品888| 亚洲剧情一区二区| 国产乱码精品一区二区三区不卡| 久久婷婷久久| 亚洲精品欧美| 久久先锋影音av| 一本不卡影院| 狠狠干狠狠久久| 欧美午夜剧场| 麻豆9191精品国产| 亚洲一区二区日本| 亚洲国产欧美一区二区三区丁香婷 | 国产精品毛片va一区二区三区 | 亚洲国产欧美日韩另类综合| 欧美亚洲在线| 99精品99久久久久久宅男| 国产婷婷色综合av蜜臀av| 欧美日本三级| 免费av成人在线| 午夜精品av| 一本色道久久综合亚洲精品按摩| 久久在线免费| 欧美一区二区三区成人| 夜夜嗨av一区二区三区四区| 亚洲成人在线| 狠色狠色综合久久| 国产精自产拍久久久久久| 欧美人与性禽动交情品| 免费黄网站欧美| 久久久蜜桃精品| 欧美一区二区在线观看| 一区二区欧美亚洲| 亚洲久久在线| 亚洲黄色毛片| 亚洲黑丝在线| 欧美激情中文不卡| 久久资源在线| 久久久久成人网| 久久精品中文字幕一区二区三区| 亚洲性人人天天夜夜摸| 亚洲免费不卡| 亚洲麻豆av| 亚洲裸体视频| 99国产精品国产精品久久| 亚洲人成在线观看| 亚洲人成网站777色婷婷| 亚洲国产精品一区二区第一页 | 亚洲深夜福利视频| 日韩视频免费在线观看| 亚洲日韩第九十九页| 欧美激情亚洲自拍| 亚洲国产精品成人综合| 亚洲国产欧美在线人成| 亚洲电影下载| 亚洲欧洲日韩在线| 日韩亚洲欧美精品| 亚洲性视频网址| 亚洲欧美视频在线观看视频| 亚洲欧美日本另类| 欧美一级专区免费大片| 久久国产精品黑丝| 免费观看在线综合色| 欧美极品在线观看| 欧美午夜精品| 国产一区二区三区在线观看精品| 国内精品伊人久久久久av一坑| 国内外成人免费激情在线视频网站 | 蘑菇福利视频一区播放| 欧美二区在线| 一本久久a久久精品亚洲| 亚洲性感美女99在线| 欧美一区二区三区免费视频| 久久综合中文色婷婷| 欧美日本三区| 国产亚洲精品bv在线观看| 在线精品一区| 中日韩美女免费视频网址在线观看| 亚洲专区一区二区三区| 久久精品国产欧美亚洲人人爽| 欧美成人一区二区| avtt综合网| 欧美一区二视频在线免费观看| 久久综合中文| 国产精品久久久91| 亚洲福利视频在线| 亚洲欧美另类国产| 欧美国产在线电影| 亚洲欧美国产精品桃花| 久久伊人精品天天| 欧美性大战久久久久| 曰韩精品一区二区| 中日韩高清电影网| 玖玖在线精品| 亚洲午夜电影网| 免费久久99精品国产| 国产日韩在线看片| 这里只有精品视频在线| 久久中文在线| 亚洲欧美不卡| 欧美日韩精品免费观看| 好吊成人免视频| 亚洲欧美中文日韩v在线观看| 免费成人av| 欧美一区二区视频在线| 欧美日韩一二三四五区| 一区免费观看| 久久精品一二三| 亚洲一区二区在线播放| 欧美高潮视频| 亚洲国产精品尤物yw在线观看| 欧美诱惑福利视频| 一本久久a久久精品亚洲| 免费欧美日韩| 亚洲动漫精品| 快she精品国产999| 欧美一区二区日韩| 国产精品久久福利| 亚洲图片欧美午夜| 亚洲精品九九| 欧美成人资源网| 亚洲黄色影院| 男男成人高潮片免费网站| 久久精品99无色码中文字幕| 国产精品一区二区三区久久| 中文日韩在线| 一本色道久久综合亚洲精品高清| 欧美大片免费| 99日韩精品| 亚洲黄一区二区三区| 欧美大胆人体视频| 亚洲美女av电影| 亚洲国产精品一区二区久| 男人插女人欧美| 亚洲欧洲在线播放| 亚洲韩国一区二区三区| 欧美高清视频一区| 99在线精品视频| 一区二区三区视频在线观看| 国产精品mv在线观看| 亚洲欧美中文另类| 亚洲欧美日韩综合国产aⅴ| 国产女优一区| 久久久精品国产一区二区三区|