buukle 我梦寐以求 是真理和自由

操作系统(1) - nio机制

BIO每一次客户端连接,都会在linux内核 指定区域创建一个文件描述符,并指向一个 "文件"每个文件描述符(对应一个客户端连接 ,socket) 一旦开始被线程处理,便必须等该连接释放线程才能切换(否则中断后,数据丢失了)在java中,每接到一个连接,便copy主线程(java进程) 一份作为子线程 去处理客户端的连接来解决阻塞的问题,这使 java web 服务端能够以多线程的形式处理多个客户端的连接;图片来自视频 https://www.bilibili.com/video/BV11K4y1C7rm?p=2NIO通过对连接的不同阶段添加状态位 , 将连接的处理进行分解,并允许同一线程断点接续处理,避免每个连接都需要新线程去处理, 多连接的情况下,线程切换成本较高问题 : 每个文件描述符被访问的时候,线程需要能够切换,回来还能继续执行;方案 : 通过添加并维护客户端连接 (文件描述符) 的状态位 ,使同一线程在处理不同连接时,能够根据上次切换前的处理进度继续处理; 状态位 服务端接收客户端连接事件 OP_ACCEPT 客户端连接服务端事件 OP_CONNECT 读事件 OP_READ 写事件 OP_WRIT

administrator administrator Published on 2021-03-16