1. 程式人生 > >http協議,阻塞IO,非阻塞IO,IO多路複用,位運算,select方法

http協議,阻塞IO,非阻塞IO,IO多路複用,位運算,select方法

HTTP請求   Request

請求格式:

請求行  
    GET          /         HTTP/1.1
 請求種類    請求內容       協議版本

    請求種類 : GET    獲取網路資源
                POST   提交一定的附加資料,得到返回        結果
        HEAD   獲取響應頭
        PUT     更新伺服器資源
        DELETE  刪除伺服器資源
        CONNECT  預留
        TRACE     測試
        OPTIONS  獲取伺服器效能

請求頭   對請求內容的具體描述

* 以鍵值對的形式對請求資訊進行描述
e.g. 

 Accept: text/html
 Accept-Encoding: gzip, deflate, br
 Accept-Language: zh-CN,zh;q=0.9
 Cache-Control: max-age=0
 Connection: keep-alive

空行

請求體   提交具體的請求引數


HTTP響應    Response

響應格式 

響應行   反饋具體的響應情況

    HTTP/1.1      200        OK
    版本資訊     響應碼    附加資訊
    
    響應碼 :  1xx   提示資訊 表示請求已經接受
               2xx   響應成功
           3xx   響應需要重新請定向
           4xx   客戶端錯誤
           5xx   伺服器錯誤
    常見響應碼 : 200   成功
                      404   請求頁面不存在
              401   沒有訪問許可權
              500   伺服器發生未知錯誤
              503   伺服器暫時無法執行

響應頭   對響應資訊的具體描述

e.g.
Cache-Control: private
Connection: Keep-Alive

空行
響應體   將客戶想要的內容進行返回

要求 :  知道什麼是HTTP協議,功能特點
         知道請求和響應的格式和作用
     知道請求頭的種類,基本的響應碼的意義
     瞭解http請求和響應的完整過程

基礎的http服務流程程式
1. 接收http請求
2. 給出一定的響應

通過tcp進行檔案傳輸
read --》 send
recv -->  write


IO   input  output 
凡是在記憶體中存在資料交換的操作都可以認為是IO操作

比如: 記憶體和磁碟互動       讀寫 read write
       記憶體和終端互動       print   input
       記憶體和網路互動       recv  send  

IO密集型程式 : 程式的執行過程中進行大量的IO操作,而只有較少的cpu運算。消耗計算機資源較少,執行時間長。

CPU密集型程式(計算密集型): 程式執行中需要大量的cpu運算,IO操作較少。消耗cpu資源多,執行速度快

IO分類
阻塞IO   非阻塞IO   IO多路複用   事件IO   非同步IO

阻塞IO : 預設形態  效率很低的一種IO

阻塞情況 :  * 因為某種條件沒有達到造成的阻塞
                e.g.   input   accept   recv
         
         * 處理IO事件的時間消耗較長帶來阻塞
                e.g. 檔案的讀寫過程,網路資料傳送過程

非阻塞IO :  通過修改IO事件的屬性,使其變為非阻塞狀態,即避免條件阻塞的情況

* 非阻塞IO往往和迴圈搭配使用,這樣可以不斷執行部分需要執行的程式碼,也不影響對阻塞條件的判斷

設定套接字為非阻塞
s.setblocking()
功能 : 設定套接字的阻塞狀態
引數 : 設定為False則套接字呼叫函式為非阻塞


超時檢測

將原本阻塞的IO設定一個最長阻塞等待時間,在規定時間內如果達到條件則正常執行,如果時間到仍未達到條件則結束阻塞。

s.settimeout(sec)
功能 : 設定套接字超時時間
引數 : 設定的時間


IO多路複用

定義 : 同時監控多個IO事件,當哪個IO事件準備就緒就執行哪個IO事件。 此時形成多個IO時間都可以操作的現象,不必逐個等待執行。

準備就緒 : IO事件即將發生的臨界狀態


import select 

select   ---》 windows   linux  unix
poll  ---》 linux   unix
epoll ---》 linux   unix

r, w, x = select(rlist, wlist, xlist[, timeout])
功能: 監控IO事件,阻塞等待IO事件發生
引數: rlist  列表  存放被動等待處理的IO事件
       wlist  列表  存放需要主動處理的IO
       xlist  列表  存入如果發生異常需要處理的IO
       timeout  超時時間
返回值 : r   列表   rlist中準備就緒的IO
          w   列表   wlist中準備就緒的IO
      x   列表   xlist中準備就緒的IO

注意事項 : 

1. IO多路複用 處理IO的過程中不應有死迴圈出現,使一個客戶端長期佔有服務端
2. IO多路複用是一種併發行為,但是是單程序程式,效率較高


位運算

按照二進位制位來進行運算操作

&  按位與
|  按位或
^  按位異或
<<  左移
>>  右移

11   1011
14   1110  

11 & 14 --》10
11 | 14 --》15
11 ^ 14 --> 5
11 << 2 --> 44
14 >> 2 --> 3

使用 : 1 在底層做硬體暫存器的操作
        2 做標誌位的過濾選擇 

1.建立poll物件
p=select.poll()
2.註冊關注的IO
p.register(s,POLLIN|POLLHUP)
p.unregister(s)
3.監控IO
events=p.poll()
功能個:監控關注的IO事件
返回值:返回發生的IO事件
events 是一個列表 [(fileno,event),(),()...]
每個就緒IO對應列表中一個元組:(描述符,就緒事件)
IO地圖:
{s.fileno():s}
4.處理IO事件