共享內(nèi)存的實(shí)現(xiàn)

共享內(nèi)存可以說最有用的進(jìn)程間通信方式,也是最快的IPC形式。兩個(gè)不同進(jìn)程A,B共享內(nèi)存的意思是,同一塊物理內(nèi)存被映射到進(jìn)程A,B各自的進(jìn)程地址空間。進(jìn)程A可以及時(shí)看到進(jìn)程B對共享內(nèi)存中數(shù)據(jù)的更新,反之亦然 。由于多個(gè)進(jìn)程共享同一塊內(nèi)存區(qū)域,必然需要某種同步機(jī)制 ,互斥鎖和信號量都可以。

創(chuàng)新互聯(lián)建站是網(wǎng)站建設(shè)專家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,專業(yè)領(lǐng)域包括網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、電商網(wǎng)站制作開發(fā)、重慶小程序開發(fā)、微信營銷、系統(tǒng)平臺(tái)開發(fā),與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!

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

下面我們來寫一段程序來看看共享內(nèi)存的應(yīng)用:

comm.c文件:

   #include "comm.h"

   

   int comm_shm_creat(int flag)

   {

       key_t _key=ftok(_PATH_,_PROJ_ID_);

       if(_key<0)

       {

           perror("ftok");

           return -1;

      }

      int shm_id=shmget(_key,_SIZE_,flag);

      if(shm_id<0)

      {

          perror("shmget");

          return -1;

      }

      return shm_id;

  }

  

  int shm_creat()

  {

      umask(0);

      int flag=IPC_CREAT|IPC_EXCL|0666;

      return comm_shm_creat(flag);

  }

  

  int shm_get()

  {

      int flag=IPC_CREAT;

      return comm_shm_creat(flag);

  }

  

  int shm_destroy(int shm_id)                                                                                                                                         

  {

      if(shmctl(shm_id,IPC_RMID,NULL)<0)

      {

            perror("shmctl");

            return -1;

      }

      return 0;                                                                                                                                                       

  }

  

  void* at_shm(int shm_id)

  {

      return shmat(shm_id,NULL,0);

  }

  

  int dt_shm(void *addr)

  {

      return shmdt(addr);

  }

 

shm_server.c文件:

   #include "comm.h"

   

   int main()                                                                                                                                               

   {

       int shm_id=shm_creat();

       char *start=at_shm(shm_id);

       int i=0;

       for(;i<_SIZE_;++i)

       {

          printf("%s\n",start);

          sleep(1);

      }

      dt_shm(start);

      shm_destroy(shm_id);

      return 0;

  }

shm_client.c文件:

 

   #include "comm.h"

   

   int main()

   {

       int shm_id=shm_get();

       char *start=at_shm(shm_id);

       int i=0;

       for(;i<_SIZE_;++i)

       {

          start[i]='A';

          start[i+1]='\0';

          sleep(1);                                                                                                                                                   

      }

      dt_shm(start);

      return 0;

  }

運(yùn)行結(jié)果如下:

 

 共享內(nèi)存的實(shí)現(xiàn)

 

從上圖結(jié)果可以看到,他們shmget的ID相同,而且client寫的內(nèi)容被server接收到了,實(shí)現(xiàn)了進(jìn)程間通信的目的。

 

 

網(wǎng)站欄目:共享內(nèi)存的實(shí)現(xiàn)
鏈接地址:http://bm7419.com/article22/pcepjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站營銷、、建站公司網(wǎng)站維護(hù)、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司