poll,epoll方法,本地套接字,多工程式設計,父子程序
poll
from select import poll
1. 建立poll物件
p = poll()
2. 新增關注的IO
poll IO 事件分類
POLLIN POLLOUT POLLERR POLLHUP POLLPRI POLLVAL
rlist wlist xlist 斷開連線 緊急處理 無效
p.register(s,POLLIN | POLLERR)
p.unregister(s) 取消對IO的關注
3. 進行監控
events = p.poll()
功能 : 監控關注的IO,阻塞等待IO發生
返回值 : events是一個列表,列表中每個元素為一個元 組,代表準備就緒需要處理的IO
events --》 [( fileno, event),(),()]
就緒IO的fileno 哪個事件就緒
因為要獲取IO物件呼叫函式---》通過fileno得到物件
實施方法 : 建立比照字典 {s.fileno():s}
4. 處理IO
epoll
使用方法 : 與poll基本相同
* 生成物件使用epoll() 而不是poll()
* register註冊IO事件事件型別改為epoll事件型別
select poll epoll 區別
1. select可以很好支援windows
2. epoll比select和poll效率高,select和poll差不多
3. epoll提供了更多的觸發方式
本地套接字
linux下檔案型別
b 塊裝置檔案 c 字元裝置檔案 d 目錄
- 普通檔案 l 連結 s 套接字 p 管道
作用 : 用於本地不同程式間進行通訊
通過記憶體進行資料傳輸
本地套接字建立流程:
1. 建立套接字物件
sockfd = socket(AF_UNIX,SOCK_STREAM)
2. 繫結本地套接字檔案
sockfd.bind(path)
path : 一個檔案
3. 監聽
3. 接受傳送訊息
cookie
os.path.exists(path)
功能 : 判斷一個資料夾下是否有某個檔案
In [4]: os.path.exists('./tcp_client.py')
Out[4]: True
os.unlink(path) os.remove(path)
功能 : 刪除一個檔案
多工程式設計
意義 : 充分利用計算機的資源提高程式的執行效率
定義 : 通過應用程式利用計算機多個核心,達到同時執 行多個任務的目的。
實施方案 : 多程序 多執行緒
並行 : 多個計算機核心在同時處理多個任務,多個任務之間是並行關係
併發 : 計算機同時處理多個任務,核心在多個任務間 不斷切換,達到好像在同時處理的執行效果。此時多個任務實際為併發關係
程序 : 程式在計算機中執行一次的過程
程式 : 是一個可執行檔案,是靜態的,佔有磁碟,不 佔有計算機執行資源
程序 : 程序是一個動態的過程描述,佔有cpu記憶體等計算機資源的,有一定的生命週期
* 同一個程式的不同執行過程是不同的程序,因為分配的計算機資源等均不同
程序的建立流程
1.使用者空間執行一個程式,發起程序建立
2.作業系統接受使用者請求,開啟程序建立
3.作業系統分配系統資源,確認程序狀態
4.將建立好的程序提供給應用層使用
cpu時間片
如果一個程序佔有計算機核心,我們稱為該程序在cpu時間片上。多個任務實際對cpu會進行爭奪,一般由作業系統分配cpu時間片
PCB(程序控制塊)
在作業系統中,程序建立後會自動產生一個空間存放程序資訊,稱為程序控制塊。
程序資訊 : 程序PID ,程序佔有的記憶體位置,建立時間,使用者......
程序 PID : 程序在作業系統中的唯一編號,大於0整數,由系統自動分配
程序資訊檢視命令 : ps -aux
程序特徵
* 程序是作業系統分配計算機資源的最小單位
* 每個程序都有自己單獨的虛擬記憶體空間
* 程序間的執行相互獨立,互不影響
程序的狀態
三態
* 就緒態:程序具備執行條件,等待系統分配cpu
* 執行態:程序佔有cpu處理器,處於執行狀態
* 等待態:程序暫時不具備執行條件,需要阻塞等待
五態 (增加新建態和終止態)
* 新建態 : 建立一個新的程序,獲取資源的過程
* 終止態 : 程序結束釋放資源的過程
ps -aux ---> STAT 檢視程序狀態
D 等待態 (不可中斷等待)
S 等待態 (可中斷等待)
T 等待態 (暫停狀態)
R 執行態 (就緒態 執行態)
Z 殭屍態
+ 前臺程序
< 高優先順序
N 低優先順序
l 有程序連結
s 會話組組長
程序優先順序
優先順序決定了一個程序的執行許可權和佔有資源的優先程度
檢視程序優先順序
top : 動態的檢視程序優先順序 <> 翻頁 q退出
取值範圍: -20 --- 19 -20優先順序最高
nice : 指定優先順序執行程式
e.g. nice -9 ./while.py
sudo nice --9 ./while.py -9優先順序
父子程序
在系統中除了初始化程序每個程序都有一個父程序,可能有0個或者多個子程序。由此形成父子程序關係。我們認為每個程序都是父程序發起請求建立的。
程序(process)
檢視程序樹: pstree
檢視父程序PID : ps -ajx
要求 : 什麼是程序,程序和程式的區別
瞭解程序的特徵
清楚程序的狀態及狀態間的轉化關係
並行和併發的區別,作業系統功能
需求 :編寫一個程式,能夠同時執行多個任務。同時需要在程式執行過程中,根據情況建立程序。
import os
pid = os.fork()
功能 : 建立一個新的程序
引數: 無
返回值: 失敗返回一個負數 -1
成功 在原有程序中返回新的程序的PID
在新的程序中返回0
* 子程序會複製父程序全部程式碼段,包括fork前的程式碼
* 子程序從fork的下一句開始執行
* 父子程序通常會根據fork返回值的差異選擇執行不同的程式碼 (使用if結構)
* 父子程序在執行上互不干擾,執行順序不確定
* 子程序雖然複製父程序記憶體空間,但是有自己的特性,比如PID號,PCB等
* 父子程序空間獨立,各自修改各自的內容,互不影響
獲取程序PID
os.getpid()
功能:獲取程序的PID號
返回值:返回程序的PID號
os.getppid()
功能:獲取父程序的pid號
os._exit(整數)
sys.exit()