簡體   English   中英

就內存空間而言,線程還是進程?

[英]Threads vs Process in terms of memory space?

我試圖了解流程和線程之間的區別,並且了解所有要點,但無法理解以下內容:

典型的區別是(同一進程的)線程在共享內存空間中運行,而進程在單獨的內存空間中運行。

這是參考

誰能幫助我了解這里的存儲空間是什么意思? 上面這行對於外行人意味着什么,以便我理解?

如果系統中的所有內存都是紙疊。 每個過程都是一個小男孩或女孩,他們從一堆文件中擁有自己的一堆來做藝術品。 這些是您的應用程序。

現在,如果其中一些應用程序是線程化的,則可以將其想像成是兩個小女孩或男孩與同一堆文件一起工作。 他們倆都在給他們的同一張紙上亂塗亂畫。 雖然其他的小女孩和男孩沒有彼此共享論文,但他們是獨立的-單線程。

換句話說,兩個線程可以從相同的內存中讀取並訪問相同的全局變量。 即內存是共享的,因為它是相同的地址空間。

單獨的進程無法做到這一點,它們彼此獨立。

內存空間就像一個邊界。 為了避免相互隔離,相互覆蓋,進程無法訪問彼此的變量等,因此必須使用IPC進行相互通信。 但是線程可以訪問全局變量(通常在讀寫時使用某種保護,例如互斥體)。

Assume ( T = Thread, P = Process, and V = variable ) 
P1 
global_var
T1 
  can set global_var = 2
T2 
  can read global_var
  and can ever reset global_var

P2
  It cannot read P1::global_var

希望這可以幫助!

“內存空間”是指地址到內容的映射。 因此,例如,在兩個不同的過程中,同一地址的內容可能會有所不同,因為它們具有不同的存儲空間。

已經有幾個很好的答案。

一些細節:每個進程都被賦予一個虛擬內存地址,其地址范圍為2個冪字大小(10年前應該是2個冪32(對於32位機器))。 該進程可以使用這些地址,就好像它是物理內存一樣。 在后台,OS進行了大量從虛擬到物理(虛擬地址轉換)的交換/分頁/轉換等操作。 操作系統確保當兩個進程進行讀寫時,物理內存不會交錯。 但是,兩個進程在運行時可以具有相同的地址(虛擬),但映射到RAM /主內存中的不同物理地址。

線程變量位於堆棧之下,並且是相對的,並且位於線程內存空間/邊界之內,因此一個線程中的地址不能在另一個線程中引用,但可以訪問線程堆棧之外的內容,但可以訪問進程的地址空間。

在Java的特定上下文中,啟動一個JVM(Java虛擬機)的單個Java調用是一個過程; JVM中的代碼可以訪問該JVM中的內存,但不能訪問其他JVM中的內存。

在每個JVM中,可以有多個線程。 這些線程可以共享一個內存空間,因為它們可以訪問同一JVM中其他線程創建的對象。 但是,它們無法訪問由其他JVM中的線程創建的對象,因為這些對象位於其他JVM的內存空間中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM