python进程join的用法_python 进程介绍 进程简单使用 join 验证空间隔离
一、多道程序設(shè)計技術(shù)(詳情參考:https://www.cnblogs.com/clschao/articles/9613464.html)
所謂多道程序設(shè)計技術(shù),就是指允許多個程序同時進入內(nèi)存并運行。即同時把多個程序放入內(nèi)存,并允許它們交替在CPU中運行,它們共享系統(tǒng)中的各種硬、軟件資源。當(dāng)一道程序因I/O請求而暫停運行時,CPU便立即轉(zhuǎn)去運行另一道程序。
在A程序計算時,I/O空閑, A程序I/O操作時,CPU空閑(B程序也是同樣);必須A工作完成后,B才能進入內(nèi)存中開始工作,兩者是串行的,全部完成共需時間=T1+T2。
將A、B兩道程序同時存放在內(nèi)存中,它們在系統(tǒng)的控制下,可相互穿插、交替地在CPU上運行:當(dāng)A程序因請求I/O操作而放棄CPU時,B程序就可占用CPU運行,這樣 CPU不再空閑,而正進行A I/O操作的I/O設(shè)備也不空閑,顯然,CPU和I/O設(shè)備都處于“忙”狀態(tài),大大提高了資源的利用率,從而也提高了系統(tǒng)的效率,A、B全部完成所需時間<
多道程序設(shè)計技術(shù)不僅使CPU得到充分利用,同時改善I/O設(shè)備和內(nèi)存的利用率,從而提高了整個系統(tǒng)的資源利用率和系統(tǒng)吞吐量(單位時間內(nèi)處理作業(yè)(程序)的個數(shù)),最終提高了整個系統(tǒng)的效率。
單處理機系統(tǒng)中多道程序運行時的特點:
(1)多道:計算機內(nèi)存中同時存放幾道相互獨立的程序;
(2)宏觀上并行:同時進入系統(tǒng)的幾道程序都處于運行過程中,即它們先后開始了各自的運行,但都未運行完畢;
(3)微觀上串行:實際上,各道程序輪流地用CPU,并交替運行。
空間上的復(fù)用:將內(nèi)存分為幾部分,每個部分放入一個程序,這樣,同一時間內(nèi)存中就有了多道程序。
時間上的復(fù)用:當(dāng)一個程序在等待I/O時,另一個程序可以使用cpu,如果內(nèi)存中可以同時存放足夠多的作業(yè),則cpu的利用率可以接近100%
二、分時系統(tǒng)
由于CPU速度不斷提高和采用分時技術(shù),一臺計算機可同時連接多個用戶終端,而每個用戶可在自己的終端上聯(lián)機使用計算機,好象自己獨占機器一樣。
分時技術(shù):把處理機的運行時間分成很短的時間片,按時間片輪流把處理機分配給各聯(lián)機作業(yè)使用。
若某個作業(yè)在分配給它的時間片內(nèi)不能完成其計算,則該作業(yè)暫時中斷,把處理機讓給另一作業(yè)使用,等待下一輪時再繼續(xù)其運行。由于計算機速度很快,作業(yè)運行輪轉(zhuǎn)得很快,給每個用戶的印象是,好象他獨占了一臺計算機。而每個用戶可以通過自己的終端向系統(tǒng)發(fā)出各種操作控制命令,在充分的人機交互情況下,完成作業(yè)的運行。
具有上述特征的計算機系統(tǒng)稱為分時系統(tǒng),它允許多個用戶同時聯(lián)機使用計算機。
特點:
(1)多路性。若干個用戶同時使用一臺計算機。微觀上看是各用戶輪流使用計算機;宏觀上看是各用戶并行工作。
(2)交互性。用戶可根據(jù)系統(tǒng)對請求的響應(yīng)結(jié)果,進一步向系統(tǒng)提出新的請求。這種能使用戶與系統(tǒng)進行人機對話的工作方式,明顯地有別于批處理系統(tǒng),因而,分時系統(tǒng)又被稱為交互式系統(tǒng)。
(3)獨立性。用戶之間可以相互獨立操作,互不干擾。系統(tǒng)保證各用戶程序運行的完整性,不會發(fā)生相互混淆或破壞現(xiàn)象。
(4)及時性。系統(tǒng)可對用戶的輸入及時作出響應(yīng)。分時系統(tǒng)性能的主要指標(biāo)之一是響應(yīng)時間,它是指:從終端發(fā)出命令到系統(tǒng)予以應(yīng)答所需的時間。
分時系統(tǒng)的主要目標(biāo):對用戶響應(yīng)的及時性,即不至于用戶等待每一個命令的處理時間過長。
分時系統(tǒng)可以同時接納數(shù)十個甚至上百個用戶,由于內(nèi)存空間有限,往往采用對換(又稱交換)方式的存儲方法。即將未“輪到”的作業(yè)放入磁盤,一旦“輪到”,再將其調(diào)入內(nèi)存;而時間片用完后,又將作業(yè)存回磁盤(俗稱“滾進”、“滾出“法),使同一存儲區(qū)域輪流為多個用戶服務(wù)。
多用戶分時系統(tǒng)是當(dāng)今計算機操作系統(tǒng)中最普遍使用的一類操作系統(tǒng)。
注意:分時系統(tǒng)的分時間片工作,在沒有遇到IO操作的時候就用完了自己的時間片被切走了,這樣的切換工作其實并沒有提高cpu的效率,反而使得計算機的效率降低了。為什么下降了呢?因為CPU需要切換,并且記錄每次切換程序執(zhí)行到了哪里,以便下次再切換回來的時候能夠繼續(xù)之前的程序,雖然我們犧牲了一點效率,但是卻實現(xiàn)了多個程序共同執(zhí)行的效果,這樣你就可以在計算機上一邊聽音樂一邊聊qq了。
三、進程 (詳情參考:https://www.cnblogs.com/clschao/articles/9629392.html?tdsourcetag=s_pctim_aiomsg)
1、進程(Process)是計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。
(在早期面向進程設(shè)計的計算機結(jié)構(gòu)中,進程是程序的基本執(zhí)行實體;在當(dāng)代面向線程設(shè)計的計算機結(jié)構(gòu)中,進程是線程的容器。程序是指令、數(shù)據(jù)及其組織形式的描述,進程是程序的實體。我們自己在python文件中寫了一些代碼,這叫做程序,運行這個python文件的時候,這叫做進程。)
2、狹義定義:進程是正在運行的程序的實例(an instance of a computer program that is being executed)。
廣義定義:進程是一個具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。它是操作系統(tǒng)動態(tài)執(zhí)行的基本單元,在傳統(tǒng)的操作系統(tǒng)中,進程既是基本的分配單元,也是基本的執(zhí)行單元。
3、進程的六大特征
動態(tài)性:進程的實質(zhì)是程序在多道程序系統(tǒng)中的一次執(zhí)行過程,進程是動態(tài)產(chǎn)生,動態(tài)消亡的。
并發(fā)性:任何進程都可以同其他進程一起并發(fā)執(zhí)行
獨立性:進程是一個能獨立運行的基本單位,同時也是系統(tǒng)分配資源和調(diào)度的獨立單位;
異步性:由于進程間的相互制約,使進程具有執(zhí)行的間斷性,即進程按各自獨立的、不可預(yù)知的速度向前推進
結(jié)構(gòu)特征:進程由程序、數(shù)據(jù)和進程控制塊三部分組成。
多個不同的進程可以包含相同的程序:一個程序在不同的數(shù)據(jù)集里就構(gòu)成不同的進程,能得到不同的結(jié)果;但是執(zhí)行過程中,程序不能發(fā)生改變。
六大特征
程序是靜止的永久的,而進程是暫時的。
4、進程調(diào)度:要想多個進程交替運行,操作系統(tǒng)必須對這些進程進行調(diào)度,這個調(diào)度也不是隨即進行的,而是需要遵循一定的法則,由此就有了進程的調(diào)度算法。
進程調(diào)度由操作系統(tǒng)完成。
四、進程調(diào)度
要想多個進程交替運行,操作系統(tǒng)必須對這些進程進行調(diào)度,這個調(diào)度也不是隨即進行的,而是需要遵循一定的法則,由此就有了進程的調(diào)度算法。
先來先服務(wù)(FCFS)調(diào)度算法是一種最簡單的調(diào)度算法,該算法既可用于作業(yè)調(diào)度,也可用于進程調(diào)度。FCFS算法比較有利于長作業(yè)(進程),而不利于短作業(yè)(進程)。由此可知,本算法適合于CPU繁忙型作業(yè),而不利于I/O繁忙型的作業(yè)(進程)。
先來先服務(wù)調(diào)度算法
短作業(yè)(進程)優(yōu)先調(diào)度算法(SJ/PF)是指對短作業(yè)或短進程優(yōu)先調(diào)度的算法,該算法既可用于作業(yè)調(diào)度,也可用于進程調(diào)度。但其對長作業(yè)不利;不能保證緊迫性作業(yè)(進程)被及時處理;作業(yè)的長短只是被估算出來的。
短作業(yè)優(yōu)先調(diào)度算法
時間片輪轉(zhuǎn)(Round Robin,RR)法的基本思路是讓每個進程在就緒隊列中的等待時間與享受服務(wù)的時間成比例。在時間片輪轉(zhuǎn)法中,需要將CPU的處理時間分成固定大小的時間片,例如,幾十毫秒至幾百毫秒。如果一個進程在被調(diào)度選中之后用完了系統(tǒng)規(guī)定的時間片,但又未完成要求的任務(wù),則它自行釋放自己所占有的CPU而排到就緒隊列的末尾,等待下一次調(diào)度。同時,進程調(diào)度程序又去調(diào)度當(dāng)前就緒隊列中的第一個進程。
顯然,輪轉(zhuǎn)法只能用來調(diào)度分配一些可以搶占的資源。這些可以搶占的資源可以隨時被剝奪,而且可以將它們再分配給別的進程。CPU是可搶占資源的一種。但打印機等資源是不可搶占的。由于作業(yè)調(diào)度是對除了CPU之外的所有系統(tǒng)硬件資源的分配,其中包含有不可搶占資源,所以作業(yè)調(diào)度不使用輪轉(zhuǎn)法。
在輪轉(zhuǎn)法中,時間片長度的選取非常重要。首先,時間片長度的選擇會直接影響到系統(tǒng)的開銷和響應(yīng)時間。如果時間片長度過短,則調(diào)度程序搶占處理機的次數(shù)增多。這將使進程上下文切換次數(shù)也大大增加,從而加重系統(tǒng)開銷。反過來,如果時間片長度選擇過長,例如,一個時間片能保證就緒隊列中所需執(zhí)行時間最長的進程能執(zhí)行完畢,則輪轉(zhuǎn)法變成了先來先服務(wù)法。時間片長度的選擇是根據(jù)系統(tǒng)對響應(yīng)時間的要求和就緒隊列中所允許最大的進程數(shù)來確定的。
在輪轉(zhuǎn)法中,加入到就緒隊列的進程有3種情況:
一種是分給它的時間片用完,但進程還未完成,回到就緒隊列的末尾等待下次調(diào)度去繼續(xù)執(zhí)行。
另一種情況是分給該進程的時間片并未用完,只是因為請求I/O或由于進程的互斥與同步關(guān)系而被阻塞。當(dāng)阻塞解除之后再回到就緒隊列。
第三種情況就是新創(chuàng)建進程進入就緒隊列。
如果對這些進程區(qū)別對待,給予不同的優(yōu)先級和時間片從直觀上看,可以進一步改善系統(tǒng)服務(wù)質(zhì)量和效率。例如,我們可把就緒隊列按照進程到達就緒隊列的類型和進程被阻塞時的阻塞原因分成不同的就緒隊列,每個隊列按FCFS原則排列,各隊列之間的進程享有不同的優(yōu)先級,但同一隊列內(nèi)優(yōu)先級相同。這樣,當(dāng)一個進程在執(zhí)行完它的時間片之后,或從睡眠中被喚醒以及被創(chuàng)建之后,將進入不同的就緒隊列。
時間輪片調(diào)度
前面介紹的各種用作進程調(diào)度的算法都有一定的局限性。如短進程優(yōu)先的調(diào)度算法,僅照顧了短進程而忽略了長進程,而且如果并未指明進程的長度,則短進程優(yōu)先和基于進程長度的搶占式調(diào)度算法都將無法使用。
而多級反饋隊列調(diào)度算法則不必事先知道各種進程所需的執(zhí)行時間,而且還可以滿足各種類型進程的需要,因而它是目前被公認的一種較好的進程調(diào)度算法。在采用多級反饋隊列調(diào)度算法的系統(tǒng)中,調(diào)度算法的實施過程如下所述。
(1) 應(yīng)設(shè)置多個就緒隊列,并為各個隊列賦予不同的優(yōu)先級。第一個隊列的優(yōu)先級最高,第二個隊列次之,其余各隊列的優(yōu)先權(quán)逐個降低。該算法賦予各個隊列中進程執(zhí)行時間片的大小也各不相同,在優(yōu)先權(quán)愈高的隊列中,為每個進程所規(guī)定的執(zhí)行時間片就愈小。例如,第二個隊列的時間片要比第一個隊列的時間片長一倍,……,第i+1個隊列的時間片要比第i個隊列的時間片長一倍。
(2) 當(dāng)一個新進程進入內(nèi)存后,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調(diào)度。當(dāng)輪到該進程執(zhí)行時,如它能在該時間片內(nèi)完成,便可準(zhǔn)備撤離系統(tǒng);如果它在一個時間片結(jié)束時尚未完成,調(diào)度程序便將該進程轉(zhuǎn)入第二隊列的末尾,再同樣地按FCFS原則等待調(diào)度執(zhí)行;如果它在第二隊列中運行一個時間片后仍未完成,再依次將它放入第三隊列,……,如此下去,當(dāng)一個長作業(yè)(進程)從第一隊列依次降到第n隊列后,在第n 隊列便采取按時間片輪轉(zhuǎn)的方式運行。
(3) 僅當(dāng)?shù)谝魂犃锌臻e時,調(diào)度程序才調(diào)度第二隊列中的進程運行;僅當(dāng)?shù)?~(i-1)隊列均空時,才會調(diào)度第i隊列中的進程運行。如果處理機正在第i隊列中為某進程服務(wù)時,又有新進程進入優(yōu)先權(quán)較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶占正在運行進程的處理機,即由調(diào)度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優(yōu)先權(quán)進程。
多級反饋調(diào)度
四、并發(fā)和并行
通過進程之間的調(diào)度,也就是進程之間的切換,我們用戶感知到的好像是兩個視頻文件同時在播放,或者音樂和游戲同時在進行,那就讓我們來看一下什么叫做并發(fā)和并行
并發(fā):是偽并行,即看起來是同時運行。單個cpu+多道技術(shù)就可以實現(xiàn)并發(fā),(并行也屬于并發(fā))
并行:同時運行,只有具備多個cpu才能實現(xiàn)并行
五、同步、異步、阻塞、非阻塞(詳情參考:https://www.cnblogs.com/clschao/articles/9629392.html?tdsourcetag=s_pctim_aiomsg)
1、進程三態(tài)
(1)就緒(Ready)狀態(tài)
當(dāng)進程已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執(zhí)行,這時的進程狀態(tài)稱為就緒狀態(tài)。
(2)執(zhí)行/運行(Running)狀態(tài)
當(dāng)進程已獲得處理機,其程序正在處理機上執(zhí)行,此時的進程狀態(tài)稱為執(zhí)行狀態(tài)。
(3)阻塞(Blocked)狀態(tài)
正在執(zhí)行的進程,由于等待某個事件發(fā)生而無法執(zhí)行時,便放棄處理機而處于阻塞狀態(tài)。引起進程阻塞的事件可有多種,例如,等待I/O完成、申請緩沖區(qū)不能滿足、等待信件(信號)等。
六、python 進程
1、創(chuàng)建進程的兩種方法
方法一:
from multiprocessing importProcess#定義執(zhí)行函數(shù)
deffunc1():pass
if __name__ == '__main__':#p=Process(target=func1,args=(10,)) #位置傳參
p=Process(target=func1,kwargs={"a":10,"b":20,})#關(guān)鍵字傳參
from multiprocessing importProcessimporttime,osdeffunc1():
time.sleep(2)print("我是func1")deffunc2():
time.sleep(2)print("子進程pid>>>",os.getpid())print("子進程的父進程pid>>>", os.getppid())print("我是func2")if __name__ == '__main__':#查看當(dāng)前進程pid
print("主進程pid>>>",os.getpid()) #查看主進程pid
print("主進程父進程pid>>>",os.getppid())#查看主程序父進程
start_time=time.time()
p=Process(target=func2)#創(chuàng)建進程
p.start() #就緒,告訴操作系統(tǒng)等待調(diào)度
func1()
end_time=time.time()
dif_time=end_time-start_timeprint("時間差>>>",dif_time)
模塊傳參創(chuàng)建進程
方法二:
from multiprocessing importProcess#方法二
classMyProcess(Process):#引入Process中的屬性
def __init__(self,n): #n為傳入的參數(shù)
super().__init__()pass
if __name__ == '__main__':
p=MyProcess(10)
p.start()
importtimefrom multiprocessing importProcessclassMyProcess(Process):def __init__(self,n):
super().__init__()#引入父類的屬性進行
self.n=ndefrun(self):
time.sleep(2)print("傳入的參數(shù)>>>",self.n)print("我是類創(chuàng)建的進程")if __name__ == '__main__':
p=MyProcess(10)
p.start()
類方法創(chuàng)建進程
2、進程相關(guān)的功能
os.getpid( )? 表示獲取進程的pid號
os.getppid() 表示獲取父進程的pid號
p=Process(target= func1, args=( ,)) 創(chuàng)建一個進程p,執(zhí)行函數(shù)為func1,函數(shù)參數(shù)為args
p.start() 就緒,等待操作系統(tǒng)開啟進程和執(zhí)行進程
p.join( ) 等待進程p執(zhí)行完后,再繼續(xù)執(zhí)行
p.terminate() 關(guān)閉進程,不會立即關(guān)閉,有個等待著操作系統(tǒng)去關(guān)閉這個進程的時間
p.is_alive() 判斷進程是否還存在,如果存在就返回True
p.pid( ) 查看pid
p.name() 查看pid名字
3、join 實例
importtimefrom multiprocessing importProcessdeffunc1(n,m):print('參數(shù)%s'%n)print(m)
time.sleep(2)print('我是func1')deffunc2():
time.sleep(3)print('我是func2')if __name__ == '__main__':
p1= Process(target=func1,args=(10,20,))#p1 = Process(target=func1,kwargs={'n':10,'m':20})
p2 = Process(target=func2)
p1.start()
p2.start()print('主進程運行到這里了')
p1.join()#等待1號子進程運行結(jié)束
p2.join()print('主進程結(jié)束')
4、進程空間隔離驗證
思路:如果進程能對全局變量進行更改,就是進程空間不能隔離,否則就是進程空間隔離
from multiprocessing importProcess
num= 20
deffunc():globalnum
num= 10
print('子進程的num>>>>',num)if __name__ == '__main__':
p= Process(target=func,)
p.start()
p.join()print('主進程num:',num)
總結(jié)
以上是生活随笔為你收集整理的python进程join的用法_python 进程介绍 进程简单使用 join 验证空间隔离的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pythontemp_python 临时
- 下一篇: python 文件写入多个参数_pand