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

首頁 > 學院 > 開發設計 > 正文

共享內存在Java中的實現和應用

2019-11-18 13:24:52
字體:
來源:轉載
供稿:網友

  1 共享內存對應應用開發的意義
  對熟知UNIX系統應用開發的程序員來說,ipC(InterPRocess Communication)機制是非常熟悉的,IPC基本包括共享內存、信號燈操作、消息隊列、信號處理等部分,是開發應用中非常重要的必不可少的工具。其中共享內存IPC機制的要害,對于數據共享、系統快速查詢、動態配置、減少資源耗費等均有獨到的優點。
  
  對應UNIX系統來說,共享內存分為一般共享內存和映像文件共享內存兩種,而對應 Windows,實際上只有映像文件共享內存一種。所以java應用中也是只能創建映像文件共享內存。
  
  在java語言中,基本上沒有提及共享內存這個概念,但是,在某一些應用中,共享內存確實非常有用,例如采用java語言的分布式應用系統中,存在著大量的分布式共享對象,很多時候需要查詢這些對象的狀態,以查看系統是否運行正?;蛘吡私膺@些對象的目前的一些統計數據和狀態。假如采用網絡通信的方式,顯然會增加應用的額外負擔,也增加了一些不必要的應用編程。而假如采用共享內存的方式,則可以直接通過共享內存查看對象的狀態數據和統計數據,從而減少了一些不必要的麻煩。
  
  共享內存的使用有如下幾個特點:
  
  可以被多個進程打開訪問;
  讀寫操作的進程在執行讀寫操作時其他進程不能進行寫操作;
  多個進程可以交替對某一共享內存執行寫操作;
  一個進程執行了內存的寫操作后,不影響其他進程對該內存的訪問。同時其他進程對更新后的內存具有可見性。
  在進程執行寫操作時假如異常退出,對其他進程寫操作禁止應自動解除。
  相對共享文件,數據訪問的方便性和效率有
  
  
  另外,共享內存的使用上有如下情況:
  
  獨占的寫操作,相應有獨占的寫操作等待隊列。獨占的寫操作本身不會發生數據的一致性問題。
  共享的寫操作,相應有共享的寫操作等待隊列。共享的寫操作則要注重防止發生數據的一致性問題。
  獨占的讀操作,相應有共享的讀操作等待隊列;
  共享的讀操作,相應有共享的讀操作等待隊列。
  
  
  一般情況下,我們只是關心第一二種情況。
  
  2 共享內存在java中的實現
  在jdk1.4中提供的類MappedByteBuffer為我們實現共享內存提供了較好的方法。該緩沖區實際上是一個磁盤文件的內存映像。二者的變化將保持同步,即內存數據發生變化會馬上反映到磁盤文件中,這樣會有效的保證共享內存的實現。
  
  將共享內存和磁盤文件建立聯系的是文件通道類:FileChannel。該類的加入是JDK為了統一對外部設備(文件、網絡接口等)的訪問方法,并且加強了多線程對同一文件進行存取的安全性。例如讀寫操作統一成read和write。這里只是用它來建立共享內存用,它建立了共享內存和磁盤文件之間的一個通道。
  
  打開一個文件建立一個文件通道可以用RandomaccessFile類中的方法getChannel。該方法將直接返回一個文件通道。該文件通道由于對應的文件設為隨機存取文件,一方面可以進行讀寫兩種操作,另一方面使用它不會破壞映像文件的內容(假如用FileOutputStream直接打開一個映像文件會將該文件的大小置為0,當然數據會全部丟失)。這里,假如用 FileOutputStream和FileInputStream則不能理想的實現共享內存的要求,因為這兩個類同時實現自由的讀寫操作要困難得多。
  
  下面的代碼實現了如上功能,它的作用類似UNIX系統中的mmap函數。
  
  // 獲得一個只讀的隨機存取文件對象
  RandomAccessFile RAFile = new RandomAccessFile(filename,"r");
  
  // 獲得相應的文件通道
  FileChannel fc = RAFile.getChannel();
  
  // 取得文件的實際大小,以便映像到共享內存
  int size = (int)fc.size();
  
  // 獲得共享內存緩沖區,該共享內存只讀
  MappedByteBuffer mapBuf = fc.map(FileChannel.MAP_RO,0,size);
  
  // 獲得一個可讀寫的隨機存取文件對象
  RAFile = new RandomAccessFile(filename,"rw");
  
  // 獲得相應的文件通道
  fc = RAFile.getChannel();
  
  // 取得文件的實際大小,以便映像到共享內存
  size = (int)fc.size();
  
  // 獲得共享內存緩沖區,該共享內存可讀寫
  mapBuf = fc.map(FileChannel.MAP_RW,0,size);
  
  // 獲取頭部消息:存取權限
  mode = mapBuf.getInt();
  
  假如多個應用映像同一文件名的共享內存,則意味著這多個應用共享了同一內存數據。這些應用對于文件可以具有同等存取權限,一個應用對數據的刷新會更新到多個應用中。
  
  為了防止多個應用同時對共享內存進行寫操作,可以在該共享內存的頭部信息加入寫操作標志。該共享內存的頭部基本信息至少有:
  
  int Length; // 共享內存的長度。
  int mode; // 該共享內存目前的存取模式。
  
  
  
  
  
  共享內存的頭部信息是類的私有信息,在多個應用可以對同一共享內存執行寫操作時,開始執行寫操作和結束寫操作時,需調用如下方法:
  
  public boolean StartWrite()
  {
  if(mode == 0) { // 標志為0,則表示可寫
  mode = 1; // 置標志為1,意味著別的應用不可寫該共享內存
  mapBuf.flip();
  mapBuf.putInt(mode); // 寫如共享內存的頭部信息
  return true;
  }
  else {
  return false; // 指明已經有應用在寫該共享內存,本應用不可寫該共享內存
  }
  }
  
  public boolean StopWrite()
  {
  mode = 0; // 釋放寫權限
  mapBuf.flip();
  mapBuf.putInt(mode); // 寫入共享內存頭部信息
  return true;
  }
  
  
  這里提供的類文件mmap.java封裝了共享內存的基本接口,讀者可以用該類擴展成自己需要的功能全面的類。
  
  
  假如執行寫操作的應用異常中止,那么映像文件的共享內存將不再能執行寫操作。為了在應用異常中止后,寫操作禁止標志自動消除,必須讓運行的應用獲知退出的應用。在多線程應用中,可以用同步方法獲得這樣的效果,但是在多進程中,同步是不起作用的。方法可以采用的多種技巧,這里只是描述一可能的實現:采用文件鎖的方式。寫共享內存應用在獲得對一個共享內存寫權限的時候,除了判定頭部信息的寫權限標志外,還要判定一個臨時的鎖文件是否可以得到,假如可以得到,則即使頭部信息的寫權限標志為1(上述),也可以啟動寫權限,其實這已經表明寫權限獲得的應用已經異常退出,這段代碼如下:
  
  // 打開一個臨時的文件,注重同一共享內存,該文件名要相同,可以在共享文件名后加后綴“.lock”。
  RandomAccessFile fis = new RandomAccessFile("shm.lock","rw");
  // 獲得文件通道
  FileChannel lockfc = fis.getChannel();
  // 獲得文件的獨占鎖,該方法不產生堵塞,馬上返回
  FileLock flock = lockfc.tryLock();
  // 假如為空,則表明已經有應用占有該鎖
  if(flock == null) {
  ...// 不能執行寫操作
  }
  else {
  ...// 可以執行寫操作
  }
  
  
  
  該鎖會在應用異常退出后自動釋放,這正是該處所需要的方法。
  
  
  3 共享內存在java中的應用
  共享內存在java應用中,經常有如下兩種種應用:
  
  永久對象配置。
  在java服務器應用中,用戶可能會在運行過程中配置一些參數,而這些參數需要永久有效,當服務器應用重新啟動后,這些配置參數仍然可以對應用起作用。這就可以用到該文中的共享內存。該共享內存中保存了服務器的運行參數和一些對象運行特性??梢栽趹脝訒r讀入以啟用以前配置的參數。
  
  查詢共享數據。
  一個應用(例 sys.java)是系統的服務進程,其系統的運行狀態記錄在共享內存中,其中運行狀態可能是不斷變化的。為了隨時了解系統的運行狀態,啟動另一個應用(例 mon.java),該應用查詢該共享內存,匯報系統的運行狀態。
  
  可見,共享內存在java應用中還是很有用的,只要組織好共享內存的數據結構,共享內存就可以在應用開發中發揮很不錯的作用。

上一篇:判斷鼠標雙擊

下一篇:如何保護Java程序

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品专区久久| 欧美日韩综合视频网址| 日本精品免费观看| 精品人伦一区二区三区蜜桃网站| 亚洲成av人影院在线观看| 麻豆国产精品va在线观看不卡| 91干在线观看| 日韩精品黄色网| 美日韩精品免费视频| 国产成人免费91av在线| 日韩成人高清在线| 亚洲国产天堂久久国产91| 欧美精品福利在线| 7m精品福利视频导航| 国产精品成人一区二区三区吃奶| 亚洲a级在线播放观看| 久久久中文字幕| 欧美午夜女人视频在线| 精品偷拍一区二区三区在线看| 久久久久久久国产精品视频| 久久久久免费视频| 亚洲性生活视频在线观看| 亚洲第一av网| 午夜精品久久久久久久99黑人| 在线视频欧美日韩| 中文字幕欧美精品在线| 欧美电影院免费观看| 中文字幕v亚洲ⅴv天堂| 国产视频精品xxxx| 欧美在线一区二区三区四| 中文国产亚洲喷潮| 欧美精品在线看| 国产精品欧美亚洲777777| 欧美大成色www永久网站婷| 久久91精品国产91久久跳| 国内精品久久久久影院 日本资源| 欧美精品国产精品日韩精品| 91精品国产综合久久香蕉的用户体验| 色综合视频网站| 亚洲电影在线观看| 成人免费视频xnxx.com| 国产精品久久久久久av福利软件| 中文字幕亚洲色图| 欧美性视频网站| 国产综合香蕉五月婷在线| 国产精品久久久久久久久久久久久久| 456国产精品| 国产成人精品免高潮在线观看| 久久久久久久久久久亚洲| 精品毛片网大全| 日韩专区中文字幕| 欧美视频在线观看 亚洲欧| 色老头一区二区三区在线观看| 欧美激情一区二区三级高清视频| 国产视频在线观看一区二区| 久久久久久亚洲精品中文字幕| 色在人av网站天堂精品| 国产亚洲人成a一在线v站| 欧美大片免费观看在线观看网站推荐| 欧美日韩国产专区| 久久综合伊人77777尤物| 久久久久久久久中文字幕| 国产亚洲精品成人av久久ww| 国产精品成人观看视频国产奇米| 两个人的视频www国产精品| 成人免费视频97| 日韩在线观看成人| 国产精品高潮呻吟久久av黑人| 亚洲v日韩v综合v精品v| 亚洲男人天堂久| 日本国产欧美一区二区三区| 色噜噜亚洲精品中文字幕| 欧美日韩午夜视频在线观看| 98精品国产高清在线xxxx天堂| 伊人伊成久久人综合网小说| 日韩黄色av网站| www.欧美精品一二三区| 欧美在线一区二区三区四| 亚洲成av人乱码色午夜| 久久久久中文字幕2018| 国产精品久久久久久久久久东京| 国产精品爽爽ⅴa在线观看| 亚洲欧美一区二区三区情侣bbw| 国产91精品久久久久| 综合av色偷偷网| 懂色av中文一区二区三区天美| 日韩免费在线播放| 久久99久久99精品中文字幕| 亚洲第一在线视频| 人人做人人澡人人爽欧美| 国产激情久久久久| 性欧美长视频免费观看不卡| 欧美激情视频在线免费观看 欧美视频免费一| 欧洲精品在线视频| 国产精品久久久久久久天堂| 亚洲国产成人久久综合| 国产福利视频一区二区| 欧美激情视频在线免费观看 欧美视频免费一| 51精品国产黑色丝袜高跟鞋| 久久久噜噜噜久久中文字免| 97色在线视频观看| 日韩网站免费观看| 91sa在线看| 91chinesevideo永久地址| 成人免费在线视频网址| 欧美精品日韩www.p站| 亚洲一区久久久| 精品无码久久久久久国产| 国产成人av在线播放| 久久精品国产69国产精品亚洲| 国产精品久久久亚洲| 亚洲精品久久久久久久久久久久久| 亚洲毛片一区二区| 91a在线视频| 日韩日本欧美亚洲| 成人观看高清在线观看免费| 岛国av一区二区| 国产精品久久国产精品99gif| 国产精品第一区| 456亚洲影院| 欧美精品在线看| 欧美亚洲成人免费| 欧美日韩综合视频| 欧美精品在线第一页| 日韩综合视频在线观看| 日韩精品在线电影| 国产精品久久久久久久9999| 欧美大全免费观看电视剧大泉洋| 日韩中文字幕第一页| 欧美极品第一页| 国产精品99久久99久久久二8| 亚洲一区亚洲二区| 欧美电影免费观看网站| 久久久国产精品x99av| 美女扒开尿口让男人操亚洲视频网站| 菠萝蜜影院一区二区免费| 一区二区三区精品99久久| 97色在线观看免费视频| 国产成人精品在线视频| 久久99久久99精品中文字幕| 国产亚洲欧美aaaa| 国产精品成人国产乱一区| 国产精品久久久久久中文字| 992tv成人免费影院| 国产精品r级在线| 深夜福利一区二区| 日韩视频精品在线| 欧美人在线观看| 精品视频在线播放免| 国产精品高潮呻吟久久av黑人| 国产国产精品人在线视| 亚洲午夜av电影| 亚洲精品91美女久久久久久久| 久久久久99精品久久久久| 亚洲欧美在线免费观看| 午夜欧美不卡精品aaaaa| 在线观看精品国产视频| 久久噜噜噜精品国产亚洲综合| 欧美日韩国产影院| 亚洲第一中文字幕| 深夜福利91大全| 欧美激情免费看| 欧美一级免费视频| 国产精品免费一区二区三区都可以|