python
nginx
windows
4. 數據的複製過程是不消耗CPU的bash
舉個例子:
一我的去 商店買一把菜刀,
他到商店問老闆有沒有菜刀(發起系統調用)
若是有(表示在內核緩衝區有須要的數據)
老闆直接把菜刀給買家(從內核緩衝區拷貝到用戶緩衝區)
這個過程買家一直在等待
若是沒有,商店老闆會向工廠下訂單(IO操做,等待數據準備好)
工廠把菜刀運給老闆(進入到內核緩衝區)
老闆把菜刀給買家(從內核緩衝區拷貝到用戶緩衝區)
這個過程買家一直在等待
是同步io
用戶進程發起請求,若是數據沒有準備好,那麼馬上告知用戶進程未準備好;此時用戶進程可選擇繼續發起請求、或者先去作其餘事情,稍後再回來繼續發請求,直到被告知數據準備完畢,能夠開始接收爲止; 數據會由用戶進程完成拷貝網絡
舉個例子: 一我的去 商店買一把菜刀, 他到商店問老闆有沒有菜刀(發起系統調用) 老闆說沒有,在向工廠進貨(返回狀態) 買家去別地方玩了會,又回來問,菜刀到了麼(發起系統調用) 老闆說尚未(返回狀態) 買家又去玩了會(不斷輪詢) 最後一次再問,菜刀有了(數據準備好了) 老闆把菜刀遞給買家(從內核緩衝區拷貝到用戶緩衝區) 整個過程輪詢+等待:輪詢時沒有等待,能夠作其餘事,從內核緩衝區拷貝到用戶緩衝區須要等待 是同步io
相似BIO,只不過找了一個代理,來掛起等待,並能同時監聽多個請求; 數據會由用戶進程完成拷貝異步
舉個例子:多我的去 一個商店買菜刀, 多我的給老闆打電話,說我要買菜刀(發起系統調用) 老闆把每一個人都記錄下來(放到select中) 老闆去工廠進貨(IO操做) 有貨了,再挨個通知買到的人,來取刀(通知/返回可讀條件) 買家來到商店等待,老闆把到給買家(從內核緩衝區拷貝到用戶緩衝區) 多路複用:老闆能夠同時接受不少請求(select模型最大1024個,epoll模型), 可是老闆把到給買家這個過程,還須要等待, 是同步io
select本質也是輪詢最多能夠監聽1024個,而epoll模型是事件驅動,好了會主動告訴你socket
-select:小明,你寫好了麼?小紅你寫好了麼?.......
-epoll:同窗寫好了,舉手告訴老師來檢查(nginx、tornado用的是epoll)windows平臺不支持epoll,用的是select函數
發起請求馬上獲得回覆,不用掛起等待; 數據會由內核進程主動完成拷貝,目前不成熟tornado
舉個例子:仍是買菜刀
如今是網上下單到商店(系統調用)
商店確認(返回)
商店去進貨(io操做)
商店收到貨把貨發個賣家(從內核緩衝區拷貝到用戶緩衝區)
買家收到貨(指定信號)
整個過程無等待
異步io