目錄python
串行和併發都是程序處理任務的方式linux
進程指的是正在運行中的程序,是操做系統調度以及進行資源分配的基礎單位編程
是一個資源單位windows
當把一個程序從硬盤讀入到內存,進程就產生了瀏覽器
進程來自於操做系統,由操做系統進行調度以及資源分配安全
多進程的實現原理其實就是操做系統調度進程的原理服務器
實現原理:多線程
1.空間複用 併發
同一時間,加載多個任務到內存中,多個進程之間內存區域須要相互隔離(這種隔離是物理隔離),其目的是爲了保證數據安全socket
2.時間複用
操做系統會在多個進程之間作切換執行
切換任務的兩種狀況
當一個進程遇到了IO操做時會自動切換
當一個任務執行時間超過閾值會強制切換(時間不會太長,切換的夠快用戶就感覺不到是串行的)
注意:在切換前必須保存狀態,以便後續恢復執行。而且頻繁的切換也須要消耗資源
其實當全部任務都沒有IO操做時,切換執行(上下文切換)效率反而更低,可是爲了保證併發執行,必須犧牲效率
簡單的總結就是切換加保存
有了多道技術,計算機就能夠同時併發的處理多個任務
串行:自上而下順序執行
併發:多個任務同時執行,可是本質是在多個進程之間切換執行,因爲速度很是快因此感受是同時運行
並行:是真正的同時運行,必須具有多核CPU,有幾個核心就能並行幾個任務,可是任務數量超過核心數時仍是併發執行
以上三個概念都是用於描述處理任務的方式
阻塞:指的是程序遇到了IO操做,沒法繼續執行代碼時的一種狀態
非阻塞:指的是程序沒有遇到IO操做的一個狀態
input() 默認是一個阻塞的操做
咱們能夠用一些手段將阻塞的操做變成非阻塞的操做,例如非阻塞的socket
一個進程的三種狀態
阻塞
運行
就緒
野指針,殭屍指針,內存泄漏
野指針:變量名沒有刪除
殭屍指針:變量值沒有被使用可是引用計數卻不爲0
對於計算機而言,必須具有建立和銷燬進程的能力
建立:
用戶的交互式請求,鼠標雙擊
系統初始化
銷燬:
程序是一堆代碼放在一個文件中,一般後綴是exe,本來是儲存在硬盤上的
進程是將代碼從硬盤讀取到內存而後執行,產生的
進程是由程序產生的
一個程序能夠產生多個進程,例如qq多開,每個進程都具有一個PID,且是惟一的
在linux中,進程具有父子關係,是一個樹狀結構,能夠相互查找,但不能使用
當一個程序開啓了另外一個不屬於本身管理的資源,手裏握着對方的地址信息,也就是句柄
在windows中,沒有層級關係,父進程能夠將子進程的句柄轉讓
父進程 子進程?
例如qq開啓了瀏覽器,那麼qq是父進程,瀏覽器是子進程
PID 當前進程的編號
PPID 父進程的編號
在pycharm中訪問PID與PPID
import os os.getpid() os.getppid()
在cmd中查找程序的pid
tasklist | findstr python
注意:當咱們運行Py文件時,其實運行的是python解釋器進程