本文由以下文章參考整理:
http://www.cnblogs.com/Eva-J
https://www.jb51.net/article/102004.htm
進程:擁有自己獨立的堆和棧,既不共享堆,也不共享棧,進程由操作系統調度;
線程:擁有自己獨立的棧和共享的堆,共享堆,不共享棧,標準線程由操作系統調度;
協程:擁有自己獨立的棧和共享的堆,共享堆,不共享棧,協程由程序員在協程的代碼里顯示調度
# 例,進一步講述“線程和協程”之間的區別:
假設有一個單核的操作系統,系統上沒有其它的程序需要運行,現有兩個線程 A 和 B,A 和 B 在單獨
運行時都需要10 秒來完成自己的任務,而且任務都是運算操作,線程 A 和 B 之間沒有競爭和共享數據
的問題?,F在讓 A 和 B 兩個線程并行,則操作系統會不停的在 A 和 B 兩個線程之間切換,達到一種
偽并行的效果。
如果操作系統切換的頻率是每秒一次,切換的成本是 0.1 秒(主要是棧切換),則總共需
20 + 19 * 0.1 = 21.9 秒;如果使用協程的方式,可以先運行協程 A,A 結束的時候讓位給協程 B,
只發生一次切換,則總共需要 20 + 1 * 0.1 = 20.1 秒。如果操作系統是雙核的,而且線程是標準線程,
那么線程 A 和 B 可以達到真的并行,則總時間為 10 秒;而協程的方式仍然需要 20.1 秒的時間
1. 線程棧: windows 默認1M ,Linux 默認8M ,根據線程實際需要動態擴展棧大小
------在windows中------
$ 若線程需要的線程棧小于默認的1M,則按照頁面文件大小的倍數開辟, 例需要10k 則開辟 4k * 3 = 12k
$ 若大于1M,例 需要1025k, 則按照1M的整數倍開辟??臻g 2M
進程切換分兩步:
1.切換頁目錄以使用新的地址空間
2.切換內核棧和硬件上下文
對于linux來說,線程和進程的最大區別就在于地址空間,對于線程切換,第1步是不需要做的,第2是進程和線程
切換都要做的。
切換的性能消耗:
1、線程上下文切換和進程上下問切換一個最主要的區別是線程的切換虛擬內存空間依然是相同的,但是進程切換
是不同的。這兩種上下文切換的處理都是通過操作系統內核來完成的。內核的這種切換過程伴隨的最顯著的性能
損耗是將寄存器中的內容切換出。
2、另外一個隱藏的損耗是上下文的切換會擾亂處理器的緩存機制。簡單的說,一旦去切換上下文,處理器中所有
已經緩存的內存地址一瞬間都作廢了。還有一個顯著的區別是當你改變虛擬內存空間的時候,處理的頁表緩沖
(processor's Translation Lookaside Buffer (TLB))或者相當的神馬東西會被全部刷新,這將導致內存的
訪問在一段時間內相當的低效。但是在線程的切換中,不會出現這個問題
未完,待續~~
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。