進(jìn)程、線(xiàn)程、進(jìn)程池、進(jìn)程三態(tài)、同步、異步、并發(fā)、并行、串行
公眾號(hào)關(guān)注“杰哥的IT之旅”,
選擇“星標(biāo)”,重磅干貨,第一時(shí)間送達(dá)!
來(lái)源:cnblogs.com/songhaixing/p/13799827.html
一進(jìn)程, 線(xiàn)程
1.進(jìn)程
什么是進(jìn)程?
開(kāi)發(fā)寫(xiě)的代碼我們稱(chēng)為程序,那么將開(kāi)發(fā)的代碼運(yùn)行起來(lái)。我們稱(chēng)為進(jìn)程。
明白點(diǎn): 當(dāng)我們運(yùn)行一個(gè)程序,那么我們將運(yùn)行的程序叫進(jìn)程。
精簡(jiǎn)重點(diǎn)
進(jìn)程是申請(qǐng)一塊內(nèi)存空間,將數(shù)據(jù)放到內(nèi)存空間中去, 是申請(qǐng)數(shù)據(jù)的過(guò)程是最小的資源管理單元
進(jìn)程是線(xiàn)程的容器
程序與進(jìn)程的區(qū)別
程序是數(shù)據(jù)和指令的集合, 是一個(gè)靜態(tài)的概念, 就是一堆代碼, 可以長(zhǎng)時(shí)間的保存在系統(tǒng)中
進(jìn)程是程序運(yùn)行的過(guò)程, 是一個(gè)動(dòng)態(tài)的概念, 進(jìn)程存在著生命周期, 也就是說(shuō)進(jìn)程會(huì)隨著程序的終止而銷(xiāo)毀, 不會(huì)永久存在系統(tǒng)中
進(jìn)程之間交互
進(jìn)程之間通過(guò) TCP/IP 端口實(shí)現(xiàn)
2.線(xiàn)程
什么是線(xiàn)程
線(xiàn)程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。
它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。
一條線(xiàn)程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線(xiàn)程,每條線(xiàn)程并行執(zhí)行不同的任務(wù)。
精簡(jiǎn)重點(diǎn)
是進(jìn)程的一條流水線(xiàn), 只用來(lái)執(zhí)行程序,而不涉及到申請(qǐng)資源, 是程序的實(shí)際執(zhí)行者最小的執(zhí)行單元
線(xiàn)程之間交互
多個(gè)線(xiàn)程共享同一塊內(nèi)存,通過(guò)共享的內(nèi)存空間來(lái)進(jìn)行交互
3.進(jìn)程與線(xiàn)程的關(guān)系
例子:
我們打開(kāi)一個(gè)聊天軟件,這就是開(kāi)啟了一個(gè)進(jìn)程;當(dāng)我們?cè)谲浖锩娲蜷_(kāi)一些功能,比如空間, 掃一掃, 設(shè)置...,這些操作就是線(xiàn)程
所以可以說(shuō) "進(jìn)程" 包含 "線(xiàn)程", "線(xiàn)程" 是 "進(jìn)程" 的子集
進(jìn)程是線(xiàn)程的容器
工廠(chǎng)流水線(xiàn)例子:


4.總結(jié)
進(jìn)程:指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序;程序一旦運(yùn)行就是進(jìn)程;進(jìn)程——
資源分配的最小單位。線(xiàn)程:系統(tǒng)分配處理器時(shí)間資源的基本單元,或者說(shuō)進(jìn)程之內(nèi)獨(dú)立執(zhí)行的一個(gè)單元執(zhí)行流。線(xiàn)程——
程序執(zhí)行的最小單位。進(jìn)程要分配一大部分的內(nèi)存,而線(xiàn)程只需要分配一部分棧就可以了.
一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程.
一個(gè)線(xiàn)程可以創(chuàng)建和撤銷(xiāo)另一個(gè)線(xiàn)程,同一個(gè)進(jìn)程中的多個(gè)線(xiàn)程之間可以并發(fā)執(zhí)行.
二.并行, 并發(fā), 串行
并發(fā): 多個(gè)任務(wù)看起來(lái)是同時(shí)進(jìn)行, 這是一種假并行
單核下使用多道技術(shù)實(shí)現(xiàn)

并行: 多個(gè)任務(wù)同時(shí)進(jìn)行
并行必須有多核才能實(shí)現(xiàn),否則只能實(shí)現(xiàn)并發(fā)(偽并行)

串行: 一個(gè)程序完完整整的運(yùn)行完,再運(yùn)行下一個(gè)進(jìn)程

四.任務(wù)運(yùn)行的三種狀態(tài)
進(jìn)程在運(yùn)行的過(guò)程中不斷地改變其運(yùn)行狀態(tài)
通常一個(gè)運(yùn)行的進(jìn)程必須具有三種狀態(tài):就緒態(tài), 運(yùn)行態(tài), 阻塞態(tài)
1.就緒態(tài) (Ready)
當(dāng)進(jìn)程已分配到除CPU以外的所有必要的資源后,只要再獲得CPU, 便可執(zhí)行程序, 進(jìn)程這時(shí)的狀態(tài)就稱(chēng)為就緒態(tài),
在一個(gè)系統(tǒng)中處于就緒態(tài)的進(jìn)程可能有多個(gè), 通常將他們排成一個(gè)隊(duì)列, 這就叫就緒隊(duì)列
2.運(yùn)行態(tài) (Running)
當(dāng)進(jìn)程已經(jīng)獲得CPU操作權(quán)限, 其程序正在運(yùn)行, 著就叫做運(yùn)行態(tài)
在單核操作系統(tǒng)中, 只有一個(gè)進(jìn)程處于運(yùn)行態(tài), 多核操作系統(tǒng)有多個(gè)進(jìn)程處于運(yùn)行態(tài)
3.阻塞態(tài) (Blocked)(sleep)
正在執(zhí)行的進(jìn)程, 由于等待某個(gè)事件而無(wú)法執(zhí)行時(shí), 便被操作系統(tǒng)剝奪了cpu的操作時(shí)間, 這是就是阻塞態(tài)
引起阻塞的原因多種, 例如: 等待I/O操作, 更高優(yōu)先級(jí)的任務(wù)搶走了CPU權(quán)限等.
4.進(jìn)程三種狀態(tài) 間的轉(zhuǎn)換
一個(gè)進(jìn)程在運(yùn)行期間, 會(huì)不斷地在一種狀態(tài)切換到另一只種狀態(tài)
他可以是多次處于就緒態(tài)和運(yùn)行態(tài), 也可以多次處于阻塞態(tài), 下圖是三種狀態(tài)的轉(zhuǎn)換圖

就緒態(tài)??運(yùn)行態(tài)
處于就緒態(tài)的進(jìn)程, 當(dāng)進(jìn)程調(diào)度程序?yàn)橹峙淞薈PU的時(shí)間片后, 該進(jìn)程就會(huì)由就緒態(tài)轉(zhuǎn)變成運(yùn)行態(tài)
運(yùn)行態(tài)??就緒態(tài)
處于運(yùn)行態(tài)的進(jìn)程在運(yùn)行過(guò)程中, 因?yàn)榉峙涞臅r(shí)間片用完了, 于是失去了CPU的使用權(quán)限, 運(yùn)行態(tài)就會(huì)重新轉(zhuǎn)為就緒態(tài)
運(yùn)行態(tài)??阻塞態(tài)
正在運(yùn)行的進(jìn)程由于遇到I/O操作或被更高優(yōu)先級(jí)的任務(wù)搶走CPU使用權(quán)限而無(wú)法繼續(xù)執(zhí)行, 便從運(yùn)行態(tài)轉(zhuǎn)為阻塞態(tài)
阻塞態(tài)??就緒態(tài)
處于阻塞態(tài)的進(jìn)程, 若其等待的事情已經(jīng)處理完畢, 于是進(jìn)程從阻塞態(tài)轉(zhuǎn)為就緒態(tài)
四.任務(wù)提交的兩種方式
1.同步
同步是指發(fā)送方發(fā)送數(shù)據(jù)后, 等接收方發(fā)回響應(yīng)后才發(fā)下一個(gè)數(shù)據(jù)報(bào)的通訊方式
同步是指兩個(gè)程序的運(yùn)行是相關(guān)的, 其中一個(gè)線(xiàn)程在阻塞需要等待狀態(tài), 那另一個(gè)線(xiàn)程才運(yùn)行
2.異步
異步是指發(fā)送方發(fā)出數(shù)據(jù)后, 不等接收方發(fā)回響應(yīng), 接著就發(fā)下個(gè)數(shù)據(jù)報(bào)的通訊方式
異步是指兩個(gè)線(xiàn)程毫無(wú)相關(guān), 自己運(yùn)行自己的
3.例子
同步
?你叫我去吃飯, 我聽(tīng)到了就立即和你去吃飯, 如果沒(méi)有聽(tīng)到, 你就不停的叫, 直到我告訴你聽(tīng)到了, 才一起去吃飯
?打電話(huà)好比同步, 兩邊是同時(shí)進(jìn)行不能再打給另一個(gè)人
異步
?你叫我去吃飯, 然后自己去吃飯了, 我得到消息后可能立即走, 也可能過(guò)會(huì)兒走
?發(fā)消息好比異步, 和一個(gè)人發(fā)完消息就可能和另一個(gè)人發(fā)消息
五.進(jìn)程池
1.什么是進(jìn)程池?
進(jìn)程池是資源進(jìn)程, 管理進(jìn)程組成的技術(shù)的應(yīng)用.
2.為什么要有進(jìn)程池?
??忙時(shí)會(huì)有成千上萬(wàn)的任務(wù)需要被執(zhí)行,閑時(shí)可能只有零星任務(wù)。
??那么在成千上萬(wàn)個(gè)任務(wù)需要被執(zhí)行的時(shí)候,我們就需要去創(chuàng)建成千上萬(wàn)個(gè)進(jìn)程么?
??首先,創(chuàng)建進(jìn)程需要消耗時(shí)間,銷(xiāo)毀進(jìn)程也需要消耗時(shí)間。
??第二即便開(kāi)啟了成千上萬(wàn)的進(jìn)程,操作系統(tǒng)也不能讓他們同時(shí)執(zhí)行,這樣反而會(huì)影響程序的效率。
??因此我們不能無(wú)限制的根據(jù)任務(wù)去開(kāi)啟或者結(jié)束進(jìn)程。那么我們要怎么做呢?
3.進(jìn)程池的概念
定義一個(gè)池子,在里面放上固定數(shù)量的進(jìn)程,有需求來(lái)了,就拿一個(gè)池中的進(jìn)程來(lái)處理任務(wù)
等到處理完畢,進(jìn)程并不關(guān)閉,而是將進(jìn)程再放回進(jìn)程池中繼續(xù)等待任務(wù)
如果有很多任務(wù)需要執(zhí)行,池中的進(jìn)程數(shù)量不夠,任務(wù)就要等待之前的進(jìn)程執(zhí)行任務(wù)完畢歸來(lái),拿到空閑進(jìn)程才能繼續(xù)執(zhí)行。
也就是說(shuō),進(jìn)池中進(jìn)程的數(shù)量是固定的,那么同一時(shí)間最多有固定數(shù)量的進(jìn)程在運(yùn)行
這樣不會(huì)增加操作系統(tǒng)的調(diào)度難度,還節(jié)省了開(kāi)關(guān)進(jìn)程的時(shí)間,也一定程度上能夠實(shí)現(xiàn)并發(fā)效果。
4.資源進(jìn)程
預(yù)先創(chuàng)建好的空閑進(jìn)程,管理進(jìn)程(好比池子)會(huì)把工作分發(fā)到空閑進(jìn)程來(lái)處理。
5.管理進(jìn)程
管理進(jìn)程負(fù)責(zé)創(chuàng)建資源進(jìn)程,把工作交給空閑資源進(jìn)程處理,回收已經(jīng)處理完工作的資源進(jìn)程。
資源進(jìn)程與管理進(jìn)程的交互
管理進(jìn)程如何有效的管理資源進(jìn)程,分配任務(wù)給資源進(jìn)程?
通過(guò)IPC,信號(hào),信號(hào)量,消息隊(duì)列,管道等進(jìn)行交互。
推薦閱讀
線(xiàn)程、進(jìn)程、多線(xiàn)程、多進(jìn)程和多任務(wù)有啥關(guān)系?

