(5)進程(子進程的開啓)

串行問題:併發

多道處理技術 (*******************)
1. 時間的複用,cpu在多個任務之間不斷的進行切換異步

2. 空間的複用
多個任務必須開闢屬於本身的內存空間 (物理級別的隔離)函數

相關概念:(*******************)
cpu: 計算執行任務的 不會執行IO操做(I/O輸入/輸出(Input/Output))
spa

cpu切換的條件:
1. 遇到IO操做,就切換
2. 遇到優先級比較高的任務會進行切換
3. 若是某一個任務長時間佔用CPU資源,也會切換 , 要全部的任務雨露均沾操作系統

 

什麼是串行、併發以及並行繼承

a. 串行 : 程序一個接一個的執行
b. 併發 : 單個CPU執行多個程序任務, CPU在程序之間不斷的進行切換, 感受好像是並行 (僞並行)
c. 並行 : 多個CPU同時執行多個程序任務進程

 

 

什麼是進程
進程和程序的區別:
程序:靜態的程序代碼
進程:正在運行的程序ip

 

進程的開啓方式(有兩種方式)內存

開啓進程須要調用multprocessing包下的Process資源

進程開啓方式1,函數方式 (推薦這種方式,簡單明瞭)
import time
from multiprocessing import Process #調用multprocessing包


def task(x):
print('%s is running' % x)
time.sleep(2)
print('%s is done' % x)


if __name__ == '__main__':
p = Process(target=task, args=('子進程',)) #開啓進程須要實例化,開始進程實例
PS:實例化進程,須要執行的任務的目標函數就是task。當調用的時候就會將‘子進程’傳給task函數的形參x
p.start() #向操做系統申請資源,開啓子進程(包括子進程的空間大小,子進程的pid號,)
print('主...')

PS:Process裏面的參數,traget就是執行任務的目標函數,args必須傳入一個元祖(‘子進程’,),kwargs傳一個字典{‘x’: '子進程'}就是傳入的值(value)要賦值給哪個變量(key)

PS:執行程序的時候,是從上而下運行的,因此在程序執行到開啓子進程的時候(p.start),就是在主進程裏開啓了一個子進程,p.start這裏就是向操做系統申請了一塊內存空間,而後執行子進程的程序,可是申請的時間是慢於主進程,由於程序是一直由上而下的運行,不會停頓,開啓子進程須要申請內存空間,這個動做是要向操做系統去申請,而後操做系統開闢一個內存空間給子進程,這一個過程是很是耗費資源和時間的,因此主進程的速度是快於子進程

進程開啓方式2 類方式
from multiprocessing import Process
import time

class MyProcess(Process): #本身寫一個類,可是這個類必需要繼承Process類的

def __init__(self,x = None): #
super(MyProcess,self).__init__() #由於是繼承Prcess類,因此要在Process類的基礎上增長咱們本身要的參數,要重寫初始化函數
self.x = x #self.x是成員變量

def run(self): #子進程執行的這個函數不能亂寫,必需要重寫Process類下面的run
print('%s is running'%self.x)
print('%s is done' %self.x)

if __name__ == '__main__':
p = MyProcess('子進程') #這裏實例化的是本身寫的類
p.start()
print('主...')

 

子進程底層的運行原理

程序的運行的時候是由上而下運行,主進程是一個順序的運行過程,在主進程運行的p.start()的時候,出現了一個分支運行了一個子進程,這時候主進程是不會中止的,繼續向下運行,這時候子進程也是在運行,這個就叫作異步

主進程結束同時也會回收子進程

底層的運行原理

因爲主進程(父進程)不知道子進程何時結束,因此主進程須要循環不斷的向子進程發送一個wait/waitpd()函數,就是不斷的向子進程詢問狀態(有沒有執行完),收到子進程已經執行完的狀態後,就會向操做系統發送請求,告訴操做系統全部的程序都已經執行完畢,這時候退出程序。

PS:全部的子進程在執行完畢以後並不會當即消失,操做系統會收回子進程佔用的內存空間,可是會保留進程號,進程執行時間等,這個過程叫殭屍進程,全部的子進程都會經歷一個過程叫殭屍進程,在殭屍進程時候就會告訴主進程已經執行完畢

 

進程的故障

一、主進程沒結束,子進程還在運行,可是父進程不發送wait函數

主進程還在運行,主進程也不會向子進程循環發送一個wait/waitpd()函數,這時候主進程結束了,子進程繼續在運行,若是操做系統裏面主進程生成了大量的子進程,可是不回收,會致使系統奔潰死機,這時候用指令找到殭屍進程的父進程,直接殺死父進程,重啓須要的進程便可

二、父進程結束,子進程繼續運行(子進程就是孤兒進程)

孤兒進程會被一個權限最高的進程 init 進程接管,進程號(0),代替主進程的角色向子進程發送wait/waitpid()

相關文章
相關標籤/搜索