1-進(jìn)程和線程之由來(lái)

進(jìn)程和線程之由來(lái)

操作系統(tǒng)中為什么會(huì)出現(xiàn)進(jìn)程

說(shuō)起進(jìn)程的由來(lái),我們需要從操作系統(tǒng)的發(fā)展歷史談起。

也許在今天,我們無(wú)法想象在很多年以前計(jì)算機(jī)是什么樣子。我們現(xiàn)在可以用計(jì)算機(jī)來(lái)做很多事情:辦公、娛樂(lè)、上網(wǎng),但是在計(jì)算機(jī)剛出現(xiàn)的時(shí)候,是為了解決數(shù)學(xué)計(jì)算的問(wèn)題,因?yàn)楹芏啻罅康挠?jì)算通過(guò)人力去完成是很耗時(shí)間和人力成本的。在最初的時(shí)候,計(jì)算機(jī)只能接受一些特定的指令,用戶輸入一個(gè)指令,計(jì)算機(jī)就做一個(gè)操作。當(dāng)用戶在思考或者輸入數(shù)據(jù)時(shí),計(jì)算機(jī)就在等待。顯然這樣效率和很低下,因?yàn)楹芏鄷r(shí)候,計(jì)算機(jī)處于等待用戶輸入的狀態(tài)。

那么能不能把一系列需要操作的指令預(yù)先寫(xiě)下來(lái),形成一個(gè)清單,然后一次性交給計(jì)算機(jī),計(jì)算機(jī)不斷地去讀取指令來(lái)進(jìn)行相應(yīng)的操作?就這樣,批處理操作系統(tǒng)誕生了。用戶可以將需要執(zhí)行的多個(gè)程序?qū)懺诖艓?,然后交由?jì)算機(jī)去讀取并逐個(gè)地執(zhí)行這些程序,并將輸出結(jié)果寫(xiě)到另一個(gè)磁帶上。

雖然批處理操作系統(tǒng)的誕生極大地提高了任務(wù)處理的便捷性,但是仍然存在一個(gè)很大的問(wèn)題:

假如有兩個(gè)任務(wù)A和B,任務(wù)A在執(zhí)行到一半的過(guò)程中,需要讀取大量的數(shù)據(jù)輸入(I/O操作),而此時(shí)CPU只能靜靜地等待任務(wù)A讀取完數(shù)據(jù)才能繼續(xù)執(zhí)行,這樣就白白浪費(fèi)了CPU資源。人們于是想,能否在任務(wù)A讀取數(shù)據(jù)的過(guò)程中,讓任務(wù)B去執(zhí)行,當(dāng)任務(wù)A讀取完數(shù)據(jù)之后,讓任務(wù)B暫停,然后讓任務(wù)A繼續(xù)執(zhí)行?

但是這樣就有一個(gè)問(wèn)題,原來(lái)每次都是一個(gè)程序在計(jì)算機(jī)里面運(yùn)行,也就說(shuō)內(nèi)存中始終只有一個(gè)程序的運(yùn)行數(shù)據(jù)。而如果想要任務(wù)A執(zhí)行I/O操作的時(shí)候,讓任務(wù)B去執(zhí)行,必然內(nèi)存中要裝入多個(gè)程序,那么如何處理呢?多個(gè)程序使用的數(shù)據(jù)如何進(jìn)行辨別呢?并且當(dāng)一個(gè)程序運(yùn)行暫停后,后面如何恢復(fù)到它之前執(zhí)行的狀態(tài)呢?

這個(gè)時(shí)候人們就發(fā)明了進(jìn)程,用進(jìn)程來(lái)對(duì)應(yīng)一個(gè)程序,每個(gè)進(jìn)程對(duì)應(yīng)一定的內(nèi)存地址空間,并且只能使用它自己的內(nèi)存空間,各個(gè)進(jìn)程間互不干擾。并且進(jìn)程保存了程序每個(gè)時(shí)刻的運(yùn)行狀態(tài),這樣就為進(jìn)程切換提供了可能。當(dāng)進(jìn)程暫停時(shí),它會(huì)保存當(dāng)前進(jìn)程的狀態(tài)(比如進(jìn)程標(biāo)識(shí)、進(jìn)程的使用的資源等),在下一次重新切換回來(lái)時(shí),便根據(jù)之前保存的狀態(tài)進(jìn)行恢復(fù),然后繼續(xù)執(zhí)行。

這就是并發(fā),能夠讓操作系統(tǒng)從宏觀上看起來(lái)同一個(gè)時(shí)間段有多個(gè)任務(wù)在執(zhí)行。換句話說(shuō),進(jìn)程讓操作系統(tǒng)的并發(fā)成為了可能。

注意,雖然并發(fā)從宏觀上看有多個(gè)任務(wù)在執(zhí)行,但是事實(shí)上,任一個(gè)具體的時(shí)刻,只有一個(gè)任務(wù)在占用CPU資源(當(dāng)然是對(duì)于單核CPU來(lái)說(shuō)的)。

為什么會(huì)出現(xiàn)線程

在出現(xiàn)了進(jìn)程之后,操作系統(tǒng)的性能得到了大大的提升。雖然進(jìn)程的出現(xiàn)解決了操作系統(tǒng)的并發(fā)問(wèn)題,但是人們?nèi)匀徊粷M足,人們逐漸對(duì)實(shí)時(shí)性有了要求。因?yàn)橐粋€(gè)進(jìn)程在一個(gè)時(shí)間段內(nèi)只能做一件事情,如果一個(gè)進(jìn)程有多個(gè)子任務(wù),只能逐個(gè)地去執(zhí)行這些子任務(wù)。比如對(duì)于一個(gè)監(jiān)控系統(tǒng)來(lái)說(shuō),它不僅要把圖像數(shù)據(jù)顯示在畫(huà)面上,還要與服務(wù)端進(jìn)行通信獲取圖像數(shù)據(jù),還要處理人們的交互操作。如果某一個(gè)時(shí)刻該系統(tǒng)正在與服務(wù)器通信獲取圖像數(shù)據(jù),而用戶又在監(jiān)控系統(tǒng)上點(diǎn)擊了某個(gè)按鈕,那么該系統(tǒng)就要等待獲取完圖像數(shù)據(jù)之后才能處理用戶的操作,如果獲取圖像數(shù)據(jù)需要耗費(fèi)10s,那么用戶就只有一直在等待。顯然,對(duì)于這樣的系統(tǒng),人們是無(wú)法滿足的。

那么可不可以將這些子任務(wù)分開(kāi)執(zhí)行呢?即在系統(tǒng)獲取圖像數(shù)據(jù)的同時(shí),如果用戶點(diǎn)擊了某個(gè)按鈕,則會(huì)暫停獲取圖像數(shù)據(jù),而先去響應(yīng)用戶的操作(因?yàn)橛脩舻牟僮魍鶊?zhí)行時(shí)間很短),在處理完用戶操作之后,再繼續(xù)獲取圖像數(shù)據(jù)。人們就發(fā)明了線程,讓一個(gè)線程去執(zhí)行一個(gè)子任務(wù),這樣一個(gè)進(jìn)程就包括了多個(gè)線程,每個(gè)線程負(fù)責(zé)一個(gè)獨(dú)立的子任務(wù),這樣在用戶點(diǎn)擊按鈕的時(shí)候,就可以暫停獲取圖像數(shù)據(jù)的線程,讓UI線程響應(yīng)用戶的操作,響應(yīng)完之后再切換回來(lái),讓獲取圖像的線程得到CPU資源。從而讓用戶感覺(jué)系統(tǒng)是同時(shí)在做多件事情的,滿足了用戶對(duì)實(shí)時(shí)性的要求。

換句話說(shuō),進(jìn)程讓操作系統(tǒng)的并發(fā)性成為可能,而線程讓進(jìn)程的內(nèi)部并發(fā)成為可能。

但是要注意,一個(gè)進(jìn)程雖然包括多個(gè)線程,但是這些線程是共同享有進(jìn)程占有的資源和地址空間的。進(jìn)程是操作系統(tǒng)進(jìn)行資源分配的基本單位,而線程是操作系統(tǒng)進(jìn)行調(diào)度的基本單位。

多線程并發(fā)

由于多個(gè)線程是共同占有所屬進(jìn)程的資源和地址空間的,那么就會(huì)存在一個(gè)問(wèn)題:

如果多個(gè)線程要同時(shí)訪問(wèn)某個(gè)資源,怎么處理?

這個(gè)問(wèn)題就是后序文章中要重點(diǎn)講述的同步問(wèn)題。

那么可能有朋友會(huì)問(wèn),現(xiàn)在很多時(shí)候都采用多線程編程,那么是不是多線程的性能一定就優(yōu)于單線程呢?

不一定,要看具體的任務(wù)以及計(jì)算機(jī)的配置。比如說(shuō):

對(duì)于單核CPU,如果是CPU密集型任務(wù),如解壓文件,多線程的性能反而不如單線程性能,因?yàn)榻鈮何募枰恢闭加肅PU資源,如果采用多線程,線程切換導(dǎo)致的開(kāi)銷反而會(huì)讓性能下降。

但是對(duì)于比如交互類型的任務(wù),肯定是需要使用多線程的。

而對(duì)于多核CPU,對(duì)于解壓文件來(lái)說(shuō),多線程肯定優(yōu)于單線程,因?yàn)槎鄠€(gè)線程能夠更加充分利用每個(gè)核的資源。

雖然多線程能夠提升程序性能,但是相對(duì)于單線程來(lái)說(shuō),它的編程要復(fù)雜地多,要考慮線程安全問(wèn)題。因此,在實(shí)際編程過(guò)程中,要根據(jù)實(shí)際情況具體選擇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 又來(lái)到了一個(gè)老生常談的問(wèn)題,應(yīng)用層軟件開(kāi)發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問(wèn)題開(kāi)始,來(lái)談?wù)劜?..
    tangsl閱讀 4,322評(píng)論 0 23
  • 操作系統(tǒng)概論 操作系統(tǒng)的概念 操作系統(tǒng)是指控制和管理計(jì)算機(jī)的軟硬件資源,并合理的組織調(diào)度計(jì)算機(jī)的工作和資源的分配,...
    野狗子嗷嗷嗷閱讀 12,477評(píng)論 3 34
  • 開(kāi)始喜歡你的時(shí)候應(yīng)該是你那次給我打了五十多分鐘電話來(lái)抱怨你與室友的糾紛,我呆呆的站在冷冷的陽(yáng)臺(tái)上,可是心里是暖的...
    夢(mèng)開(kāi)始在心底閱讀 504評(píng)論 0 0
  • 求真務(wù)實(shí),刨根問(wèn)底的精神。不輕言放棄。
    櫻澤莉雅閱讀 65評(píng)論 0 0
  • 遺憾,最難讓人忘記,又最撓人……《天外飛仙》中,小七和童遠(yuǎn)的結(jié)局最終還是天各一方,盡管雙方都為此努力爭(zhēng)取了很多很久...
    蒙子閱讀 550評(píng)論 0 0

友情鏈接更多精彩內(nèi)容