linux 网络io模型
Last updated
Last updated
特点: 进程发起IO请求后,一直阻塞等待内核返回结果
过程:
用户线程发起系统调用(如read),进入内核
内核等待数据准备就绪
数据准备就绪后,内核将数据拷贝到用户空间
系统调用返回,用户线程开始处理数据
特点: I/O操作不会阻塞进程,如果数据未准备好,系统会立即返回错误,进程可以选择继续执行其他任务或稍后再试
过程:
用户线程发起系统调用,设置文件描述符为非阻塞
内核立即返回,不管数据是否准备就绪
用户线程需要不断地发起系统调用,检查数据是否就绪
特点: 通过select
、poll
、epoll
等系统调用,允许一个线程/进程同时监听多个文件描述符,当某个文件描述符准备就绪时,系统会通知应用程序去处理
过程:
用户线程将多个文件描述符注册到内核
内核监控这些文件描述符
当某个文件描述符就绪时,内核通知用户线程
用户线程对就绪的文件描述符进行读写操作
示例: IO多路复用
特点: 进程发起IO请求后,既不阻塞,也不需要不断地检查IO操作是否就绪,内核完全负责IO操作,当I/O操作准备好时,内核通过信号通知进程
过程:
用户线程发起系统调用,请求内核在IO操作就绪时发送信号
内核继续执行,当IO操作就绪时,发送信号给用户线程
用户线程收到信号后,再发起系统调用进行实际的IO操作
示例: Signal-Driven I/O Model(信号驱动)
特点: 进程发起I/O操作后,不会等待I/O完成,而是继续执行其他任务。当I/O操作完成时,内核通过回调机制通知应用程序
过程:
用户线程发起IO请求
内核完全负责IO操作,包括数据传输
当IO操作完成后,内核通知用户线程