當前位置:編程學習大全網 - 源碼下載 - linux共享內存和mmap的區別

linux共享內存和mmap的區別

* * *享受記憶的創造。

根據這個理論:

1.***共享內存允許兩個或多個進程* * *共享給定的存儲區域,這是最快的進程間通信機制,因為數據不需要來回復制。* * *內存共享可以通過mmap()映射普通文件(特殊情況下也可以使用匿名映射)或者system V***內存共享機制來實現。應用界面和原理簡單,內部機制復雜。為了實現更安全的通信,它通常與同步機制(如信號燈)壹起使用。

mmap的機制是在磁盤上創建壹個文件,每個進程內存都有單獨的空間進行映射。如果有多個進程,就不會消耗太多的實際物理內存(主存)。

Shm機制:每個進程的共享內存直接映射到實際的物理內存中。

結論:

1,mmap保存到實際硬盤,實際存儲並沒有體現在主存中。優點:存儲容量可以很大(超過主存)(這裏有個問題需要專家解答。會不會拷貝到主存裏太多?);缺點:進程間讀寫速度比主存慢。

2.shm存儲在物理內存(主存)中,實際存儲量直接反映在主存中。優點:進程間訪問速度(讀寫)比磁盤快;缺點:存儲容量不能很大(超過主存)

使用方面:如果分配的存儲不大,那麽使用shm;如果存儲容量很大,則使用shm。

見百度:/view /view/1499209.htm

Mmap是壹個文件操作。

看看百度的這些描述:

mmap()系統調用允許進程通過映射同壹個公共文件來共享內存。普通文件映射到進程地址空間後,進程就可以像普通內存壹樣訪問文件,不需要調用read()和write()等操作。成功執行後,mmap()返回壹個指向映射區域的指針,munmap()返回0。失敗時,mmap()返回MAP_FAILED[其值為(void *)-1],munmap返回-1。Errno設置為下列值之壹EACCES:訪問錯誤EAGAIN:文件被鎖定,或鎖定了太多內存ebadf: FD不是有效的文件描述符EINVAL:壹個或多個參數無效ENFILE:已達到打開文件的系統限制ENODEV:指定文件所在的文件系統不支持內存映射ENOMEM:內存不足。或者進程已經超過內存映射的最大次數,EPERM:動力不足,操作不允許ETXTBSY:以寫的方式打開文件,同時指定MAP_DENYWRITE標誌SIGSEGV:嘗試將SIGBUS寫入只讀區:嘗試訪問不屬於進程的內存區參數fd作為文件描述符映射到進程空間。

壹般由open()返回,同時可以將fd指定為-1。此時必須指定flags參數中的MAP_ANON,表示映射是匿名的(不涉及具體的文件名,避免了文件的創建和打開,顯然只能用於有親緣關系的進程間通信)。

相關文章參考:

mmap函數是unix/linux下的系統調用。詳細介紹見Unix Netword編程第二卷12.2節。

mmap系統調用不是為* * *享受內存而設計的。它本身提供了壹種不同的訪問普通文件的方式,進程可以像讀寫內存壹樣操作普通文件。而system V的* * *共享內存的Posix或IPC則純粹用於* * *共享內存。當然,mmap()實現* * *共享內存也是其主要應用之壹。

Mmap系統調用通過映射同壹個公共文件使進程能夠共享內存。普通文件映射到進程地址空間後,進程就可以像普通內存壹樣訪問文件,不需要調用read()和write()等操作。Mmap不分配空間,而是把文件映射到調用進程的地址空間,然後妳就可以用memcpy等操作來寫文件,而不用寫()。寫完後用msync()同步,妳寫的東西就保存在文件裏了。但是這個方法不能增加文件的長度,因為要映射的長度是在調用mmap()時確定的。

簡單來說就是把壹個文件的內容在內存中做壹個鏡像,比磁盤快。

基本上,它將壹個文件映射到虛擬內存中的壹個段落,並返回壹個指針。

重寫摘要:

1,mmap其實就是壹個操作“文件”。

2、映射文件,除了主存的考慮。Shm享受* * *內存,效率應該比mmap高(mmap通過io和文件操作,或者“寫完後需要和msync()同步”);當然mmap映射操作文件比直接操作文件要快;因為多了壹步,msync應該比shm慢吧?

3.另壹方面,mmap的優點是操作比shm簡單(沒有調用比shm函數復雜),我想這也是很多人喜歡用它的原因,包括nginx。

缺點,還要通過實際的程序測試,才能確定!!!

正確理解(這是真的,這個網址不能附;只能重寫):

今天仔細研究了壹下,發現百度是這樣解釋的:

2.系統調用mmap()讓* * *以兩種方式享受內存:

(1)使用普通文件提供的內存映射:適用於任何進程;此時,您需要在調用mmap()之前打開或創建壹個文件;典型的調用代碼如下:

fd=open(名稱、標誌、模式);

if(FD & lt;0)

...

ptr=mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);* * *通過mmap()共享內存的通信方式有很多特點和註意事項,我們會在例子中詳細說明。

(2)使用特殊文件提供匿名內存映射:適用於有親屬關系的進程;由於父進程與子進程的特殊親緣關系,先在父進程中調用mmap(),再調用fork()。然後調用fork()後,子進程繼承父進程匿名映射的地址空間,也繼承mmap()返回的地址,這樣父子進程就可以通過映射的區域進行通信。註意,這不是壹般的繼承關系。壹般來說,子進程單獨維護壹些從父進程繼承的變量。mmap()返回的地址由父子進程維護。

看看windows的“內存映射文件”:/view/394293.htm

內存映射文件有點類似於虛擬內存。它可以預留壹個地址空間的區域,同時向這個區域提交物理內存,只不過memory file映射的物理內存來自於磁盤上已經存在的壹個文件,而不是系統的壹個頁面文件,操作前必須先映射這個文件,就像把整個文件從磁盤加載到內存壹樣。可以看出,當使用內存映射文件處理存儲在磁盤上的文件時,將不再需要對文件進行I/O操作,這意味著在處理文件時,將不再需要為文件申請和分配緩存,所有的文件緩存操作都將由系統直接管理。因為取消了將文件數據加載到內存、將數據從內存寫回文件以及釋放內存塊的步驟,所以內存映射文件在處理數據量大的文件時可以發揮非常重要的作用。此外,實際工程中的系統經常需要在多個進程之間共享數據。如果數據量小,處理方法靈活。如果數據量巨大,需要借助內存映射文件來完成。事實上,內存映射文件是解決多個本地進程之間數據共享問題的最有效方法。

這裏有壹個總結:

1,mmap有兩種方式,壹種是映射內存,將普通文件映射到實際的物理內存頁面,訪問它和訪問物理內存是壹樣的(和shm的功能壹樣)(不刷新到文件)。

2.mmap可以映射文件。我不確定它是否會有和windows“內存映射文件”壹樣的功能。如果它做到了,那麽它就可以映射幾千兆甚至幾百千兆的內存數據,這將為大數據處理提供強大的功能。

3,shm只做內存映射,和mmap的第壹個功能壹樣!只是不是普通的文件,但都是物理內存。

  • 上一篇:投巨資給車“戴口罩”, 車企這波操作能打動消費者嗎?
  • 下一篇:弘歷炒股軟件真的好用嗎?有沒有用過的?
  • copyright 2024編程學習大全網