大家好,久違了,我是大成子。前段時(shí)間因?yàn)橐咔?,自己有些松散,沒有進(jìn)行學(xué)習(xí)?,F(xiàn)在我們恢復(fù)正常學(xué)習(xí)和文章更新。本次學(xué)習(xí)將對進(jìn)程和線程有一個(gè)初步的認(rèn)識,理解其產(chǎn)生的原因,定義,算是開篇的一個(gè)理論知識點(diǎn),后面我們將一步步實(shí)踐學(xué)習(xí)。
背景知識
一個(gè)程序要能夠在計(jì)算機(jī)中進(jìn)行運(yùn)行,除了程序本身必須是機(jī)器可執(zhí)行的目標(biāo)代碼之外,還要有相應(yīng)的數(shù)據(jù)。程序和數(shù)據(jù)還要提前存儲在存儲器中,即需要把一定的存儲空間分配給這個(gè)程序和數(shù)據(jù)。另外,在執(zhí)行該程序前,處理器中的指令計(jì)數(shù)器必須指向存儲器中被執(zhí)行程序的首地址。如果有多個(gè)程序要進(jìn)入內(nèi)存并運(yùn)行,那么每個(gè)運(yùn)行的程序也需要準(zhǔn)備程序代碼,數(shù)據(jù),資源信息以及保存這些東西的存儲空間。為了在技術(shù)上能夠準(zhǔn)確的描述正在運(yùn)行,將要運(yùn)行或者剛剛退出運(yùn)行的各個(gè)程序的執(zhí)行代碼等信息,我們引入了進(jìn)程這個(gè)概念。
程序的順序執(zhí)行與并發(fā)執(zhí)行
程序是一個(gè)在時(shí)間上按照嚴(yán)格次序前后相繼的操作序列,這些操作是機(jī)器指令或高級語言編寫的語句。一個(gè)具有獨(dú)立功能的程序獨(dú)占處理器直到得到最終結(jié)果的過程稱為程序的順序執(zhí)行。
而兩個(gè)或者兩個(gè)以上程序在計(jì)算機(jī)系統(tǒng)當(dāng)中,同時(shí)處于已經(jīng)開始執(zhí)行且尚未結(jié)束的狀態(tài),我們稱為程序的并發(fā)執(zhí)行。程序的并發(fā)執(zhí)行,可以充分利用系統(tǒng)的資源,提高計(jì)算機(jī)的處理能力。
并發(fā)程序和順序程序的執(zhí)行有本質(zhì)的差異,為了能更好的描述程序的并發(fā)執(zhí)行,實(shí)現(xiàn)操作系統(tǒng)的并發(fā)性和共享性,引入了“進(jìn)程”這個(gè)概念。
進(jìn)程
進(jìn)程是具有一定獨(dú)立功能的程序在某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。
進(jìn)程可以分為系統(tǒng)進(jìn)程和用戶進(jìn)程。系統(tǒng)進(jìn)程是操作系統(tǒng)一些相關(guān)必要的程序,完成操作系統(tǒng)的某些功能;用戶進(jìn)程則是直接為用戶服務(wù),運(yùn)行用戶的程序。系統(tǒng)進(jìn)程優(yōu)先級一般高于用戶進(jìn)程的優(yōu)先級。
進(jìn)程和程序的區(qū)別和聯(lián)系
聯(lián)系:程序是構(gòu)成進(jìn)程的組成部分之一,一個(gè)進(jìn)程的運(yùn)行目標(biāo)就是執(zhí)行它所對應(yīng)的程序,如果沒有程序,進(jìn)程就失去了存在的意義。靜態(tài)角度看,進(jìn)程是由程序,數(shù)據(jù)和進(jìn)程控制塊(PCB,Process Control Block,用于系統(tǒng)中控制和描述進(jìn)程的活動(dòng)過程的一個(gè)專門的數(shù)據(jù)結(jié)構(gòu))三部分組成的。
區(qū)別:進(jìn)程是程序的一個(gè)執(zhí)行過程。程序是靜態(tài)的,而進(jìn)程是動(dòng)態(tài)的。程序的存在是永久的(不考慮關(guān)機(jī)等其他因素或人為終止一個(gè)程序),而進(jìn)程是為了程序的一次執(zhí)行而暫時(shí)存在的,進(jìn)程有生命周期,會產(chǎn)生也會消失。一個(gè)程序可以產(chǎn)生多個(gè)進(jìn)程,一個(gè)進(jìn)程也可以執(zhí)行多個(gè)程序。
進(jìn)程可以創(chuàng)建其他的進(jìn)程,被創(chuàng)建的進(jìn)程稱為子進(jìn)程,創(chuàng)建者稱為父進(jìn)程。
進(jìn)程的特性
并發(fā)性。一個(gè)進(jìn)程可以同其他進(jìn)程一起向前推進(jìn),即一個(gè)進(jìn)程的第一個(gè)動(dòng)作可以在另一個(gè)進(jìn)程的最后一個(gè)動(dòng)作結(jié)束之前就開始。
動(dòng)態(tài)性。進(jìn)程具有生命周期,在其生命周期當(dāng)中,它的狀態(tài)也是不斷在變化的。(進(jìn)程有三種狀態(tài):運(yùn)行,就緒,等待)
獨(dú)立性。一個(gè)進(jìn)程是一個(gè)相對完整的資源分配單位。
交往性。一個(gè)進(jìn)程在運(yùn)行的過程中可能會與其他的進(jìn)程發(fā)生直接或間接的相互作用。
異步性。每個(gè)進(jìn)程按照各自獨(dú)立的,不可預(yù)知的速度向前推進(jìn)。
結(jié)構(gòu)性。一個(gè)進(jìn)程由程序,數(shù)據(jù)和進(jìn)程控制塊構(gòu)成。
進(jìn)程的并發(fā)執(zhí)行基礎(chǔ)
(1)進(jìn)程是一個(gè)可擁有獨(dú)立資源的獨(dú)立單位;
(2)進(jìn)程同時(shí)又是一個(gè)可以獨(dú)立調(diào)度和分派的基本單位。
線程
隨著科技的進(jìn)步,計(jì)算機(jī)系統(tǒng)軟硬件日益強(qiáng)大,人們于是提出了比進(jìn)程更小的,能夠獨(dú)立運(yùn)行的基本單位:線程。線程可以提高系統(tǒng)內(nèi)程序并發(fā)執(zhí)行的級別,可以進(jìn)一步提高系統(tǒng)的效率。
在操作系統(tǒng)中引入進(jìn)程,是為了使多個(gè)程序并發(fā)執(zhí)行,以改善資源利用率和提高系統(tǒng)的效率;而引入線程,則是為了減少程序并發(fā)執(zhí)行所付出的空間和時(shí)間開銷,使操作系統(tǒng)具有更好的并發(fā)性。
線程是進(jìn)程中的一個(gè)實(shí)體,是處理器調(diào)度和分派的基本單位。線程自己基本上不擁有系統(tǒng)資源,只擁有少量的在運(yùn)行當(dāng)中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧等等),但他可與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源。【一般而言,線程自己并不擁有自己的系統(tǒng)資源,但它可以訪問其隸屬進(jìn)程的資源。比如一個(gè)進(jìn)程的代碼段,數(shù)據(jù)段,或者相關(guān)的系統(tǒng)資源(比如已經(jīng)打開的文件,分配使用的I/O設(shè)備等等),總之,一個(gè)進(jìn)程中的資源可以供它屬下的所有線程共享】同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。
線程的一些屬性
(1)不同的線程可以執(zhí)行相同的程序,即同一個(gè)服務(wù)程序被不同的用戶調(diào)用時(shí),系統(tǒng)可以為它們創(chuàng)建不同的線程。
(2)同一個(gè)進(jìn)程中的各個(gè)線程共享該進(jìn)程的內(nèi)存地址空間,各個(gè)線程之間的通信和同步的實(shí)現(xiàn)比較容易。線程之間的切換對操作系統(tǒng)的開銷要遠(yuǎn)遠(yuǎn)低于進(jìn)程之間的切換。
(3)線程是處理器的獨(dú)立調(diào)度單位,多個(gè)線程是可以并發(fā)執(zhí)行的。在單處理器的計(jì)算機(jī)系統(tǒng)中,各線程可交替占用處理器;在多處理器的計(jì)算機(jī)系統(tǒng)中,各個(gè)線程可同時(shí)占用不同的處理器;假如各個(gè)處理器同時(shí)為一個(gè)進(jìn)程的各線程服務(wù),則可縮短進(jìn)程的處理時(shí)間。
不僅進(jìn)程之間可以并發(fā)執(zhí)行,而且在一個(gè)進(jìn)程中的多個(gè)線程之間也可以并發(fā)執(zhí)行,因而使操作系統(tǒng)具有更好的并發(fā)性,從而更有效的使用系統(tǒng)資源和提高系統(tǒng)的吞吐量。
(4)一個(gè)線程在被創(chuàng)建后便開始了它的生命周期,直到消亡。
好了,今天的學(xué)習(xí)知識點(diǎn)就到這里了,可能有些無聊,但理解著去學(xué)習(xí),將對我們后面的實(shí)踐有很大的幫助和體會。有錯(cuò)誤的地方歡迎指出和交流,再見。