『壹』 使用mmap(linux系統調用)追加文件內容
如果你想體驗Linux系統,我覺得最好的辦法是安裝了Linux操作系統,再好的園林綠化,模擬工具不能讓你真正體驗到了Linux的真正威力。一般可以安裝Vista系統的配置非常高,可以安裝虛擬機軟體的Windows平台,虛擬機內安裝了Linux系統。在這種情況下,有一個完整的Linux系統(帶獨立的桌面環境,文件系統,內存空間等,和一台電腦沒有區別),而要像在Windows下運行的Windows應用程序,不會將您的Windows產生任何危害。
常見的虛擬機軟體Vmware的,現在最新的版本是6.0,很不錯,推薦,以及微軟的VirtualPC,功能也很不錯,但我還沒有用完。
『貳』 linux共享內存和mmap的區別
共享內存的創建
根據理論:
1. 共享內存允許兩個或多個進程共享一給定的存儲區,因為數據不需要來回復制,所以是最快的一種進程間通信機制。共享內存可以通過mmap()映射普通文件(特殊情況下還可以採用匿名映射)機制實現,也可以通過系統V共享內存機制實現。應用介面和原理很簡單,內部機制復雜。為了實現更安全通信,往往還與信號燈等同步機制共同使用。
mmap的機制如:就是在磁碟上建立一個文件,每個進程存儲器裡面,單獨開辟一個空間來進行映射。如果多進程的話,那麼不會對實際的物理存儲器(主存)消耗太大。
shm的機制:每個進程的共享內存都直接映射到實際物理存儲器裡面。
結論:
1、mmap保存到實際硬碟,實際存儲並沒有反映到主存上。優點:儲存量可以很大(多於主存)(這里一個問題,需要高手解答,會不會太多拷貝到主存裡面???);缺點:進程間讀取和寫入速度要比主存的要慢。
2、shm保存到物理存儲器(主存),實際的儲存量直接反映到主存上。優點,進程間訪問速度(讀寫)比磁碟要快;缺點,儲存量不能非常大(多於主存)
使用上看:如果分配的存儲量不大,那麼使用shm;如果存儲量大,那麼使用shm。
參看網路:http://ke..com/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 programming》卷二12.2節有詳細介紹。
mmap系統調用並不是完全為了用於共享內存而設計的。它本身提供了不同於一般對普通文件的訪問方式,進程可以像讀寫內存一樣對普通文件的操作。而Posix或系統V的共享內存IPC則純粹用於共享目的,當然mmap()實現共享內存也是其主要應用之一。
mmap系統調用使得進程之間通過映射同一個普通文件實現共享內存。普通文件被映射到進程地址空間後,進程可以像訪問普通內存一樣對文件進行訪問,不必再 調用read(),write()等操作。mmap並不分配空間, 只是將文件映射到調用進程的地址空間里, 然後你就可以用memcpy等操作寫文件, 而不用write()了.寫完後用msync()同步一下, 你所寫的內容就保存到文件里了. 不過這種方式沒辦法增加文件的長度, 因為要映射的長度在調用mmap()的時候就決定了.
簡單說就是把一個文件的內容在內存裡面做一個映像,內存比磁碟快些。
基本上它是把一個檔案對應到你的virtual memory 中的一段,並傳回一個指針。
重寫總結:
1、mmap實際就是操作「文件」。
2、映射文件,除了主存的考慮外。shm的內存共享,效率應該比mmap效率要高(mmap通過io和文件操作,或「需要寫完後用msync()同步一下」);當然mmap映射操作文件,比直接操作文件要快些;由於多了一步msync應該可以說比shm要慢了吧???
3、另一方面,mmap的優點是,操作比shm簡單(沒有調用比shm函數復雜),我想這也是許多人喜歡用的原因,包括nginx。
缺點,還得通過實際程序測試,確定!!!
修正理解(這也真是的,這個網站沒辦法附加;只能重寫了):
今天又細心研究了一下,發現網路這么一段說明:
2、系統調用mmap()用於共享內存的兩種方式:
(1)使用普通文件提供的內存映射:適用於任何進程之間;此時,需要打開或創建一個文件,然後再調用mmap();典型調用代碼如下:
fd=open(name, flag, mode);
if(fd<0)
...
ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通過mmap()實現共享內存的通信方式有許多特點和要注意的地方,我們將在範例中進行具體說明。
(2)使用特殊文件提供匿名內存映射:適用於具有親緣關系的進程之間;由於父子進程特殊的親緣關系,在父進程中先調用mmap(),然後調用fork()。那麼在調用fork()之後,子進程繼承父進程匿名映射後的地址空間,同樣也繼承mmap()返回的地址,這樣,父子進程就可以通過映射區域進行通信了。注意,這里不是一般的繼承關系。一般來說,子進程單獨維護從父進程繼承下來的一些變數。而mmap()返回的地址,卻由父子進程共同維護。
看了一下windows「內存映射文件」:http://ke..com/view/394293.htm
內存映射文件與虛擬內存有些類似,通過內存映射文件可以保留一個地址空間的區域,同時將物理存儲器提交給此區域,只是內存文件映射的物理存儲器來自一個已經存在於磁碟上的文件,而非系統的頁文件,而且在對該文件進行操作之前必須首先對文件進行映射,就如同將整個文件從磁碟載入到內存。由此可以看出,使用內存映射文件處理存儲於磁碟上的文件時,將不必再對文件執行I/O操作,這意味著在對文件進行處理時將不必再為文件申請並分配緩存,所有的文件緩存操作均由系統直接管理,由於取消了將文件數據載入到內存、數據從內存到文件的回寫以及釋放內存塊等步驟,使得內存映射文件在處理大數據量的文件時能起到相當重要的作用。另外,實際工程中的系統往往需要在多個進程之間共享數據,如果數據量小,處理方法是靈活多變的,如果共享數據容量巨大,那麼就需要藉助於內存映射文件來進行。實際上,內存映射文件正是解決本地多個進程間數據共享的最有效方法。
這里再總結一次:
1、mmap有兩種方式,一種是映射內存,它把普通文件映射為實際物理內存頁,訪問它就和訪問物理內存一樣(這也就和shm的功能一樣了)(同時不用刷新到文件)
2、mmap可以映射文件,不確定會不會像windows「內存映射文件」一樣的功能,如果是,那麼他就能映射好幾G甚至好幾百G的內存數據,對大數據處理將提供強大功能了???
3、shm只做內存映射,和mmap第一個功能一樣!只不過不是普通文件而已,但都是物理內存。
『叄』 學python一定要Linux系統嗎
並不是說學Python一定要Linux系統,Windows系統也可以,只不過Linux更合適。
線上伺服器99%都是Linux系統,也就是說都是基於Linux系統的,比如centos,紅帽,ubuntu等Linux系統。為什麼會選擇Linux系統?大部分語言是穩定,可能Windows伺服器長時間運行會出現宕機,但是Linux系統是不會的,在Linux幾乎很少出現這種情況。Linux伺服器可以無休止運行,具有非常好的穩定性以及高效性,因為穩定的特性受到了眾多用戶喜歡,使用范圍廣闊,並且Linux還可以提供高可靠性的服務。
其次,大量的Linux開發都是基於Python。openstack私有雲,ansible自動化運維工具,fail2ban防暴力破解工具等都是基於Python語言開發的。所以要求Python開發人員對Linux有基本了解,伺服器工程流程需要熟悉。
『肆』 linux中mmap函數怎麼用
mmap系統調用並不是完全為了用於共享內存而設計的。它本身提供了不同於一般對普通文件的訪問方式,進程可以像讀寫內存一樣對普通文件的操作。
用open系統調用打開文件, 並返回描述符fd.
用mmap建立內存映射, 並返回映射首地址指針start.
對映射(文件)進行各種操作, 顯示(printf), 修改(sprintf).
用munmap(void *start, size_t lenght)關閉內存映射.
用close系統調用關閉文件fd. 推薦你一本《linux就該這么學》書,看看吧會對你有用的
『伍』 Python腳本在Linux上怎麼運行
一、首先下載安裝python,建議安裝2.7版本以上,3.0版本以下,由於3.0版本以上不向下兼容,體驗較差。
『陸』 如何在linux下用mmap映射超大文件,並讀
manpage裡面的東西:
void *mmap(void *start, size_t length, int prot, int flags,
int fd, off_t offset);
The mmap() function asks to map length bytes starting at offset offset from the file (or other object) specified by the file descriptor fd into memory,
就是說,從offset位置開始,把文件fd的length位元組映射到地址start上。
如果是64位的應用,4G是沒有問題的,32位的應用不能。
『柒』 怎麼在linux上運行python
Linux默認是已經安裝好了Python程序
目前來說,大多數的Linux發行版是安裝了兩個版本的Python程序
一個是Python 2.x
一個是Python 3.x
一些系統自帶的程序文件需要Python 2的支持,另外Python 3又是大勢所趨
所以,我們最好不要動系統的Python版本
需要使用哪個版本直接聲明就可以了
運行Python的方法:
我們在Linux系統上打開終端
輸入python
會彈出Python 2的版本和解釋器
輸入python3
會彈出Python 3的版本和解釋器
所以我們一般情況下,運行python 2的程序就輸入命令
python 程序文件
運行python 3的程序輸入命令
python3 程序文件
這里我們默認使用版本為Python 3
在終端輸入命令
Python3
彈出Python的解釋器以>>>開頭
我們可以在上面輸入Python程序
它會直接輸出結果
比如:
我們這里輸入32+46,輸出結果為78
輸入print('hello python'),輸出結果hello python
注意:當我們運行.py文件時,文件里的32+46是不會直接列印出來的
必須加列印命令
print(32+46)
我們退出python3解釋器的快捷鍵不是Ctrl+C
而是Ctrl+Z
更多Python相關技術文章,請訪問Python教程欄目進行學習!以上就是小編分享的關於怎麼在linux上運行python的詳細內容希望對大家有所幫助,更多有關python教程請關注環球青藤其它相關文章!
『捌』 如何在 Python 中進行跨進程跨腳本同步
既然是兩個腳本,想必就是兩個 python 進程了
IPC 的話基本沒有簡單的解決方案= =
基本上簡單的就是文件和埠了吧= =
跨平台的話,像你說的 Windows 有 mutex 的介面,但是 Linux 還有 mmap 呢,不過這兩個都不能算跨平台了