IO 摘自 brpc 做者之一html
IO 模型linux
使用Linux下的系統調用recv做爲例子編程
IO分兩階段:windows
1.數據準備階段 2.內核空間複製回用戶進程緩衝區階段
阻塞IO模型以下,是同步的。網絡
非阻塞 IO模型異步
IO複用模型socket
調用recv前先調用select或者poll,這2個系統調用均可以在內核準備好數據(網絡數據到達內核)時告知用戶進程,這個時候再調用recv必定是有數據的。所以這一過程當中它是阻塞於select或poll,而沒有阻塞於recv,async
信號驅動 IO函數
經過調用sigaction註冊信號函數,等內核數據準備好的時候系統中斷當前程序,執行信號函數(在這裏面調用recv)。oop
異步 IO 模型
調用aio_read,讓內核等數據準備好,而且複製到用戶進程空間後執行事先指定好的函數。
JavaScprit工做機制
JavaScript 是單線程的,是指的 JS 引擎中負責解釋和執行 JS 代碼的線程只有一個,不放叫主線程,實際上還有其餘線程,例如處理 Ajax請求的線程、處理 Dom事件的線程、定時器線程、讀寫文件的線程等,能夠叫工做線程
主線程和工做線程的機制是
工做線程將消息放到消息隊列,主線程經過事件循環過程去取消。
Event Loop:http://www.ruanyifeng.com/blog/2013/10/event_loop.html
https://yq.aliyun.com/articles/47658
通常狀況下應用程序經過應用編程接口API,而不是直接經過系統調用來編程。在Unix世界,最流行的API是基於POSIX標準的。(不懂)
recv相關功能描述:
從套接字上接收一個消息。對於recvfrom 和 recvmsg,可同時應用於面向鏈接的和無鏈接的套接字。recv通常只用在面向鏈接的套接字,幾乎等同於recvfrom,只要將recvfrom的第五個參數設置NULL。
若是消息太大,沒法完整存放在所提供的緩衝區,根據不一樣的套接字,多餘的字節會丟棄。
假如套接字上沒有消息能夠讀取,除了套接字已被設置爲非阻塞模式,不然接收調用會等待消息的到來。
用法:
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sock, void *buf, size_t len, int flags);
ssize_t recvfrom(int sock, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);
ssize_t recvmsg(int sock, struct msghdr *msg, int flags);
參數:
sock:索引將要從其接收數據的套接字。
buf:存放消息接收後的緩衝區。
len:buf所指緩衝區的容量。
flags:是如下一個或者多個標誌的組合體,可經過or操做連在一塊兒
MSG_DONTWAIT:操做不會被阻塞。 MSG_ERRQUEUE: 指示應該從套接字的錯誤隊列上接收錯誤值,依據不一樣的協議,錯誤值以某種輔佐性消息的方式傳遞進來, 使用者應該提供足夠大的緩衝區。致使錯誤的原封包經過msg_iovec做爲通常的數據來傳遞。致使錯誤的數據報原目標地址做爲msg_name被提供