1. 程式人生 > 其它 >利用邏輯迴歸模型判斷使用者提問意圖

利用邏輯迴歸模型判斷使用者提問意圖

Unix IO模型

對於一個套接字上的輸入操作,分為兩步:

  1. 等待資料準備好(從網路中到達,到核心緩衝區)
  2. 將資料從核心緩衝區複製到應用程序緩衝區

I/O模型主要為以下五種:

  1. 阻塞I/O
  2. 非阻塞I/O
  3. I/O多路複用
  4. 訊號驅動I/O
  5. 非同步I/O

阻塞式I/O

recvfrom - 系統呼叫,應用程序從執行系統呼叫會一直阻塞直到資料被複制到應用程序緩衝區。阻塞期間,CPU處理其他事情。

非阻塞I/O

應用程序執行系統呼叫後,核心返回錯誤碼EWOULDBLOCK,應用程序繼續執行,但需要不斷執行系統呼叫獲知I/O是否完成(即輪詢, polling)。會佔用更多CPU,CPU要處理很多系統呼叫。

I/O多路複用

使用select或者poll等待資料,並且可以等待多個套接字中的任何一個變為可讀,此期間被阻塞。核心通知可讀後,應用程序再呼叫recvfrom讀資料。它使得單個程序具備處理多個I/O事件的能力,又叫做Event Driven I/O。select, poll, epoll都是I/O多路複用的機制。

  • select
int select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

select監視的檔案描述符有3種,分別是writefds, readfds, exceptfds。呼叫後,當檔案準備好時(可讀,可寫,except),就返回。返回後,需要遍歷fdset來找到哪個就緒了。優點在於基本所有平臺都支援。缺點在於一個程序可以監視的檔案描述符數量有限,linux一般是1024個。

  • poll
int poll (struct pollfd *fds, unsigned int nfds, int timeout);

poll使用一個pollfd指標實現,和select相比實現方式不同,且沒有最大數量限制。相同點是返回後都需要遍歷pollfd來找到就緒的檔案描述符。

struct pollfd {
    int fd; /* file descriptor */
    short events; /* requested events to watch */
    short revents; /* returned events witnessed */
};
  • epoll
    epoll更加靈活,沒有檔案描述符限制,將使用者關心的檔案描述符時間存放在核心的事件表中,在使用者空間和核心空間的拷貝只要一次。
/*
 *建立一個epoll的控制代碼
 *size用來告訴核心這個監聽的數目一共有多大
 *size只是對核心初始分配內部資料結構做一個建議,並不限制所能監聽的最大檔案描述符
 *建立好後,epool會佔用一個fd
*/
int epoll_create(int size);
/*
 *對指定描述符fd進行op操作
 *op:ADD, DEL, MOD
*/
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
/*
 *等待epfd上的io事件
*/
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

epoll會通過epoll_ctl註冊一個檔案描述符,一旦某個檔案描述符就緒,核心會採用類似callback的機制,啟用這個檔案描述符,就省去了select和poll的遍歷檔案描述符的操作,則其IO效率不會隨著監視fd的數量的增長而下降。epoll可以支援的fd在1G記憶體上大概有10萬,可通過cat /proc/sys/fs/file-max檢視。

訊號驅動I/O

非同步I/O

Java IO多路複用

一些概念

Channel

顧名思義,Channel是一個通道,通道即連線兩端,一端為應用程式,另一端則為作業系統。可以說Channel是一個在應用程式和作業系統之間可傳遞內容,互動事件的通道。一個通道會有一個專屬的檔案狀態描述符

  • ServerSocketChannel : 應用伺服器的監聽通道,只能關注OP_ACCEPT事件
  • SocketChannel : TCP Socket套接字的監聽通道

檔案描述符

Unix/Linux系統為了統一對各種硬體操作,簡化介面,將這些硬體裝置都看做一個檔案。對這些檔案的操作,等同於磁碟上普通檔案的操作。為了區分不同“檔案”,Unix/Linux會為每個檔案分配一個ID,這個ID是個整數,即檔案描述符(File Descriptor)。例如,通常用0表示標準輸入檔案如鍵盤,1表示標準輸出檔案如顯示器。所以,這裡“檔案”可以代表著一個硬體裝置,磁碟上普通檔案,甚至網路連線。Windows系統也有類似“檔案描述符”的概念,一般被叫做“檔案控制代碼”,但Windows會區分網路連線和檔案。

注意:網路連線也是一個檔案。可以通過socket()函式建立一個網路連線或者說開啟一個網路檔案。

Socket 套接字

Socket原意為插座,它其實就是一個網路連線。或者也可以把Socket直接想象成一個"伺服器IP:Port <-> 客戶端IP:Port"的網路連線。

Selector

I/O多路複用是應用程序執行系統呼叫,等待任意一個套接字資料準備好的過程。而Selector在其中充當的角色即為“輪詢代理器”,應用程序只需要向Selector註冊關注的Channel,Selector內部也維護一個Channel容器,Selector向作業系統詢問這些資料準備好沒有呀。I/O多路複用需要作業系統支援,不同作業系統的實現細節是不同的,Selector作為輪詢代理期,也是一個抽象,遮蔽不同作業系統的差異,都有一個Selector。

參考資料:
IO 模型
Java NIO - IO多路複用
Socket是什麼?套接字是什麼?