兩個進程間可以共享內(nèi)存嗎 進程間通信,內(nèi)存映射和共享內(nèi)存的區(qū)別?
進程間通信,內(nèi)存映射和共享內(nèi)存的區(qū)別?內(nèi)存映射文件是使用虛擬內(nèi)存將文件映射到進程的地址空間。之后,進程像處理空間中的地址一樣操作文件,比如C語言中的memcpy。這種方法可以很好地應(yīng)用于文件或大文件需
進程間通信,內(nèi)存映射和共享內(nèi)存的區(qū)別?
內(nèi)存映射文件是使用虛擬內(nèi)存將文件映射到進程的地址空間。之后,進程像處理空間中的地址一樣操作文件,比如C語言中的memcpy。這種方法可以很好地應(yīng)用于文件或大文件需要頻繁處理的場合,其IO效率高于普通IO
共享內(nèi)存是內(nèi)存映射文件的特例,它映射的是一塊內(nèi)存而不是磁盤上的文件。共享記憶的主題是過程。默認情況下,操作系統(tǒng)為每個進程分配一個內(nèi)存空間。每個進程只允許訪問操作系統(tǒng)分配給它的內(nèi)存,而不允許訪問其他進程的內(nèi)存。有時需要在不同的進程之間訪問相同的內(nèi)存。我們該怎么辦?操作系統(tǒng)提供了訪問共享內(nèi)存的API。需要共享內(nèi)存的進程可以通過這組定義的api訪問多個進程之間的共享內(nèi)存。每個進程訪問這個內(nèi)存就像訪問硬盤上的文件。NET4.0引入了系統(tǒng)IO. memorymappedfiles封裝了windows共享內(nèi)存API,這使它更易于使用。Net程序員使用內(nèi)存映射文件。
如何理解Golang中“不要通過共享內(nèi)存來通信,而應(yīng)該通過通信來共享內(nèi)存”?
共享內(nèi)存模式需要各種鎖,性能不高。即使鎖使用不當,也會造成線程不安全,即同一內(nèi)存地址中的值被并發(fā)線程同時修改,甚至造成死鎖。圍棋的思想是通過交流來共享變量。渠道是解決方案。當然,go仍然保持著通過共享內(nèi)存進行通信的方式。如何做要看項目的實際情況。