1. IO函数和内核的关系
read从内核读缓冲区中将数据拷贝到用户空间,write把数据从用户空间拷贝到内核的写缓冲区中。
2. 阻塞IO和非阻塞IO
2.1 阻塞IO
2.2 非阻塞IO
2.3 区别
阻塞IO和非阻塞IO的区别在数据准备阶段。如果是阻塞IO,那么read一直等待,只到数据到达。如果是阻塞IO,那么read直接返回-1,errno被设置为EAGAIN或EWOULDBLOCK。
在数据拷贝阶段,阻塞IO和非阻塞IO是一样的,都是阻塞的,等待数据从内核空间拷贝到用户空间。
由于非阻塞IO直接返回,所以不知道数据什么时候准备好,需要主动探测,需要多次调用read读取数据。
对于阻塞IO,如果数据没有准备好,会阻塞当前线程。
3. IO多路复用与阻塞IO/非阻塞IO的关系
IO多路复用(select/poll/epoll)不进行实际的IO操作,仅在数据准备阶段提供了监测的机制。监测文件描述符是否就绪(可读或可写),从而进行实际的IO操作read或write。
对于阻塞IO,IO多路复用避免了数据准备阶段的阻塞等待。
对于非阻塞IO,IO多路复用提供了通知的机制,避免了多次read/write,提高了性能。
- 网路编程流程