1. 程式人生 > >poll,epoll方法,本地套接字,多工程式設計,父子程序

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()