一、並發與串行
1、目前程序存在的問題
程序默認執行方式就是 串行
即,程序自上而下,一行一行順序執行,必須把當前任務執行完畢才能執行下一個任務無論當前任務需要多長時間
問題舉例:
如tcp服務器的服務器中 ,如果正在進行通訊循環則無法,處理其他的客戶端請求
如從硬盤讀取大文件
執行了input
2、學習並發的目的
就是要編寫可以同時執行多個任務的程序,來提高效率
串行和並發都是程序處理任務的方式
3、實現並發的方式
1.多進程
2.多線程
3.協程
二、進程是什么
進程指得是正在運行的程序,是操作系統調度以及進行資源分配的基本單位
是一個資源單位
進程是怎么來的?
當把一個程序沖硬盤讀入到內存時,進程就產生了多進程 ,指的是同一時間有多個程序被裝入內存並執行進程來自於操作系統,有操作系統進行調度以及資源分配多進程的實現原理其實就是操作系統調度進程的原理
三、多道技術
實現原理:
1.空間復用
統一時間,加載多個任務到內存中,多個進程之間內存區域需要相互隔離,這種隔離是物理層面的隔離,其目的是為了保證數安全
2.時間復用
指的是,操作系統會在多個進程之間做切換執行
切換任務的兩種情況
1.當一個進程遇到了IO操作 時會自動切換
2.當一個任務執行時間超過閾值會強制切換
注意:在切換前必須保存狀態,以便后續恢復執行
並且 頻繁的切換其實也需要消耗資源
當所有任務都沒有IO操作時,切換執行效率反而降低,但是為了保證並發執行 必須犧牲效率
簡單的總結就是切換加保存
有了多道技術,計算機就可以同時並發的處理多個任務
四、並發編程中的重要概念
1、串行 自上而下順序執行
2、並發 多個任務同時執行 ,但是本質是在不同進程間切換執行,由於速度非常快所以感覺是同時運行
3、並行 是真正的同時運行,必須具備多核CPU ,有幾個核心就能並行幾個任務,當任務數量超過核心數還是並發執行
以上三個概念都是用於描述處理任務的方式
五、程序運行的狀態(阻塞和非阻塞)
1、阻塞:指的是程序遇到了IO操作,無法繼續執行代碼時的一種狀態
2、非阻塞: 指的是程序沒有遇到IO操作的一中狀態
阻塞非阻塞也可以用來描述執行任務的方式
input() 默認是一個阻塞的操作
我們可以用一些手段將阻塞的操作變成非阻塞的操作 , 例如非阻塞的socket
3、一個進程的三種狀態
阻塞
運行
就緒
進程的創建和銷毀 了解
對於通用計算機而言.必須具備創建和銷毀進程的能力
4、進程的創建
1.用戶的交互式請求 鼠標雙擊
2.由一個正在運行的程序 調用了開啟進程的接口 . 例如subprocess
3.一個批處理作業開始
4、系統初始化
5、進程的銷毀:
1.任務完成 自願退出
2.強制結束 taskkill kill 非自願
3.程序遇到了異常
4.嚴重錯誤 比如訪問了不該訪問的內存
六、進程和程序的區別
程序是 一堆代碼放在一個文件中 通常后綴為exe 原本是存儲在硬盤上的
進程是 將代碼從硬盤讀取到內存然后執行 產生的
進程是由程序產生的
一個程序可以產生多個進程,例如qq多開 每一個進程都具備一個PID 進程變編號 且是唯一的
進程的層次結構 了解
在linux中 進程具備父子關系,是一個樹狀結構 ,可以互相查找到對方
在windows 沒有層級關系 , 父進程可以將子進程的句柄轉讓
父進程 子進程? 例如qq開啟了瀏覽器 那么qq是父進程 瀏覽器是子進程
七、PID 和 PPID
PID 是當前進程的編號
PPID 是父進程的編號
注意:當我們運行py文件時其實運行的是python解釋器
訪問PID與PPID
import os
os.getpid()
os.getppid()