百科給出的概念:
https://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B/382503?fr=aladdin通過(guò)操作系統(tǒng)角度去理解進(jìn)程:
http://blog.csdn.net/ching_zhi/article/details/53819099通過(guò)CPU的角度去解釋進(jìn)程土辩、線程的區(qū)別:
https://www.zhihu.com/question/25532384/answer/81152571
http://blog.csdn.net/luoweifu/article/details/46595285通過(guò)一個(gè)工廠實(shí)例的角度去解釋進(jìn)程媒怯、線程的區(qū)別:
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html進(jìn)程內(nèi)存分配模型:
https://www.cnblogs.com/tiankong101/p/4229584.html進(jìn)程韧拒、線程的概括性總結(jié):
http://www.reibang.com/p/aecff59430fa對(duì)計(jì)算機(jī)系統(tǒng)的概述
http://www.360doc.com/content/16/0307/00/30119560_540088282.shtml
通過(guò)cpu角度去理解進(jìn)程的概念:
進(jìn)程和線程都是一個(gè)時(shí)間段的描述,是對(duì)CPU工作時(shí)間段的一個(gè)描述眨层。
下面細(xì)說(shuō)背景:
CPU+RAM+各種資源(比如顯卡,光驅(qū),鍵盤贝咙,GPS, 等等外設(shè))構(gòu)成我們的電腦,但是電腦的運(yùn)行拂募,實(shí)際就是CPU和相關(guān)寄存器以及RAM之間的事情庭猩。
一個(gè)最最基礎(chǔ)的事實(shí):
CPU太快窟她,太快,太快了蔼水,寄存器僅僅能夠追的上他的腳步震糖,RAM和別的掛在各總線上的設(shè)備完全是望其項(xiàng)背。那當(dāng)多個(gè)任務(wù)要執(zhí)行的時(shí)候怎么辦呢趴腋?輪流著來(lái)?或者誰(shuí)優(yōu)先級(jí)高誰(shuí)來(lái)吊说?不管怎么樣的策略,一句話就是在CPU看來(lái)就輪流著來(lái)优炬。
一個(gè)必須知道的事實(shí):
執(zhí)行一段程序代碼颁井,實(shí)現(xiàn)一個(gè)功能的過(guò)程介紹 ,當(dāng)?shù)玫紺PU的時(shí)候穿剖,相關(guān)的資源必須也已經(jīng)就位蚤蔓,就是顯卡啊,GPS啊什么的必須就位糊余,然后CPU開始執(zhí)行秀又。這里除了CPU以外所有的就構(gòu)成了這個(gè)程序的執(zhí)行環(huán)境,也就是我們所定義的程序上下文贬芥。當(dāng)這個(gè)程序執(zhí)行完了吐辙,或者分配給他的CPU執(zhí)行時(shí)間用完了,那它就要被切換出去蘸劈,等待下一次CPU的臨幸昏苏。在被切換出去的最后一步工作就是保存程序上下文,因?yàn)檫@個(gè)是下次他被CPU臨幸的運(yùn)行環(huán)境威沫,必須保存贤惯。
串聯(lián)起來(lái)的事實(shí):
前面講過(guò)在CPU看來(lái)所有的任務(wù)都是一個(gè)一個(gè)的輪流執(zhí)行的,具體的輪流方法就是:先加載程序A的上下文棒掠,然后開始執(zhí)行A孵构,保存程序A的上下文,調(diào)入下一個(gè)要執(zhí)行的程序B的程序上下文烟很,然后開始執(zhí)行B,保存程序B的上下文颈墅。。雾袱。恤筛。
========= 重要的東西出現(xiàn)了========
進(jìn)程和線程就是這樣的背景出來(lái)的,兩個(gè)名詞不過(guò)是對(duì)應(yīng)的CPU時(shí)間段的描述芹橡,名詞就是這樣的功能毒坛。
進(jìn)程就是包換上下文切換的程序執(zhí)行時(shí)間總和 = CPU加載上下文+CPU執(zhí)行+CPU保存上下文線程是什么呢?
進(jìn)程的顆粒度太大林说,每次都要有上下的調(diào)入粘驰,保存屡谐,調(diào)出。如果我們把進(jìn)程比喻為一個(gè)運(yùn)行在電腦上的軟件蝌数,那么一個(gè)軟件的執(zhí)行不可能是一條邏輯執(zhí)行的,必定有多個(gè)分支和多個(gè)程序段度秘,就好比要實(shí)現(xiàn)程序A顶伞,實(shí)際分成 a,b剑梳,c等多個(gè)塊組合而成唆貌。那么這里具體的執(zhí)行就可能變成:
程序A得到CPU =》CPU加載上下文,開始執(zhí)行程序A的a小段垢乙,然后執(zhí)行A的b小段锨咙,然后再執(zhí)行A的c小段,最后CPU保存A的上下文追逮。這里a酪刀,b,c的執(zhí)行是共享了A的上下文钮孵,CPU在執(zhí)行的時(shí)候沒有進(jìn)行上下文切換的骂倘。
這里的a,b巴席,c就是線程历涝,也就是說(shuō)線程是共享了進(jìn)程的上下文環(huán)境,的更為細(xì)小的CPU時(shí)間段漾唉。到此全文結(jié)束荧库,
再一個(gè)總結(jié):進(jìn)程和線程都是一個(gè)時(shí)間段的描述,是CPU工作時(shí)間段的描述赵刑,不過(guò)是顆粒大小不同分衫。
并發(fā)的本質(zhì):是在時(shí)間上重疊的多個(gè)邏輯流,也就是說(shuō)同時(shí)運(yùn)行的多個(gè)邏輯流料睛。
關(guān)于進(jìn)程和線程丐箩,大家總是說(shuō)的一句話是“進(jìn)程是操作系統(tǒng)分配資源的最小單元,線程是操作系統(tǒng)調(diào)度的最小單元”恤煞。這句話理論上沒問(wèn)題屎勘,我們來(lái)看看什么是所謂的“資源”呢。
什么是計(jì)算機(jī)資源
經(jīng)典的馮諾依曼結(jié)構(gòu)把計(jì)算機(jī)系統(tǒng)抽象成 CPU + 存儲(chǔ)器 + IO居扒,那么計(jì)算機(jī)資源無(wú)非就兩種:
- 計(jì)算資源
- 存儲(chǔ)資源
CPU是計(jì)算單元概漱,單純從CPU的角度來(lái)說(shuō)它是一個(gè)黑盒,它只對(duì)輸入的指令和數(shù)據(jù)進(jìn)行計(jì)算喜喂,然后輸出結(jié)果瓤摧,它不負(fù)責(zé)管理計(jì)算哪些”指令和數(shù)據(jù)“竿裂。 換句話說(shuō)CPU只提供了計(jì)算能力,但是不負(fù)責(zé)分配計(jì)算資源照弥。
計(jì)算資源是操作系統(tǒng)來(lái)分配的腻异,也就是常說(shuō)的操作系統(tǒng)的調(diào)度模塊,由操作系統(tǒng)按照一定的規(guī)則來(lái)分配什么時(shí)候由誰(shuí)來(lái)獲得CPU的計(jì)算資源这揣,比如分時(shí)間片
存儲(chǔ)資源就是內(nèi)存悔常,磁盤這些存儲(chǔ)設(shè)備的資源。在這篇計(jì)算機(jī)底層知識(shí)拾遺(一)理解虛擬內(nèi)存機(jī)制 我們說(shuō)了操作系統(tǒng)使用了虛擬內(nèi)存機(jī)制來(lái)管理存儲(chǔ)器给赞,從緩存原理的角度來(lái)說(shuō)机打,把內(nèi)存作為磁盤的緩存。進(jìn)程是面向磁盤的片迅,為什么這么說(shuō)呢残邀,進(jìn)程表示一個(gè)運(yùn)行的程序,程序的代碼段柑蛇,數(shù)據(jù)段這些都是存放在磁盤中的芥挣,在運(yùn)行時(shí)加載到內(nèi)存中。所以虛擬內(nèi)存面向的是磁盤唯蝶,虛擬頁(yè)是對(duì)磁盤文件的分配九秀,然后被緩存到物理內(nèi)存的物理頁(yè)中桨啃。
所以存儲(chǔ)資源是操作系統(tǒng)由虛擬內(nèi)存機(jī)制來(lái)管理和分配的伟葫。進(jìn)程應(yīng)該是操作系統(tǒng)分配存儲(chǔ)資源的最小單元。
再來(lái)看看線程泻帮,理論上說(shuō)Linux內(nèi)核是沒有線程這個(gè)概念的征字,只有內(nèi)核調(diào)度實(shí)體(Kernal Scheduling Entry都弹, KSE)這個(gè)概念。Linux的線程本質(zhì)上是一種輕量級(jí)的進(jìn)程匙姜,是通過(guò)clone系統(tǒng)調(diào)用來(lái)創(chuàng)建的畅厢。何謂“輕量級(jí)”會(huì)在后面細(xì)說(shuō)。進(jìn)程是一種KSE氮昧,線程也是一種KSE框杜。所以“線程是操作系統(tǒng)調(diào)度的最小單元”這句話沒問(wèn)題。