【java】【07】BIO和NIO

1.BIO

BIO是accept和recv都是阻塞的系統調用,新啓動一個線程來進行recv系統調用,服務的最大連接數受到線程的限制
Socket 系統調用
bind 系統調用
listen 系統調用
accept 系統調用
recv 系統調用

socket 系統調用 返回文件描述符3
bind 系統調用 綁定文件描述符3和端口
listen 系統調用 3

accept 系統調用 阻塞接受新城連接

每一個連接啓動一個線程
連接1 ---- 線程1 recv 系統調用 阻塞接受數據
連接2 ---- 線程1 recv 系統調用 阻塞接受數據
。。。
在這裏插入圖片描述

2.NIO

NIO是socket系統調用增加noblocking參數使得accept和recv都變成非阻塞的
accept和recv調用後立即返回,如果是-1表示沒有數據,這種設計會有很多空跑系統調用

socket 系統調用 返回文件描述符5
bind 系統調用 綁定文件描述符5和端口
listen 系統調用 監聽文件描述符5

fcntl 系統調用 把5變成非阻塞的
while(true)
accept 系統調用 非阻塞接受新城連接 沒有連接返回-1,繼續循環

accept 系統調用 非阻塞接受新城連接 沒有連接返回6
fcntl 系統調用 把6變成非阻塞的
while(true){
recv 系統調用 非阻塞的接受數據
recv 系統調用 非阻塞的接受數據
。。。。。
}

)

3.IO多路複用技術

select 系統調用可以知道有那些文件描述符有系統調用,不用循環空跑系統調用了,但是每次都有很多文件描述符傳輸,也是一個一個輪詢問
epoll 通過以下三個系統調用epoll_create創建實例,通過epoll_ctl系統調用把文件描述符放到內核空間,
通過epoll_wait和cpu的中斷把有數據的文件描述符交給應用程序處理
epoll_create
epoll_ctl
epoll_wait

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章