图文详解Linux的IO模型和相关技术

阻塞IO模型(Blocking I/O)
 

 

Linux 内核一开始提供了 read 与 write 阻塞式操作。

当客户端连接时,会在对应进程的文件描述符目录(/proc/进程号/fd)生成对应的文件描述符(0 标准输入;1 标准输出;2 标准错误输出;),比如 fd 8 , fd 9;
应用程序需要读取的时候,通过系统调用 read (fd8)读取,如果数据还没到来,此应用程序的进程或线程会阻塞等待。
man 2 read
概述
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
描述
read() 从文件描述符 fd 中读取 count 字节的数据并放入从 buf 开始的缓冲区中.
如果 count 为零,read()返回0,不执行其他任何操作. 如果 count 大于SSIZE_MAX,那么结果将不可预料.
返回值
成功时返回读取到的字节数(为零表示读到文件描述符), 此返回值受文件剩余字节数限制.当返回值小于指定的字节数时 并不意味着错误;这可能是因为当前可读取的字节数小于指定的 字节数(比如已经接近文件结尾,或
者正在从管道或者终端读取数 据,或者 read()被信号中断). 发生错误时返回-1,并置 errno 为相应值.在这种情况下无法得知文件偏移位置是否有变化.
问题
如果出现了很多的客户端连接,比如1000个,那么应用程序就会启用1000个进程或线程阻塞等待。此时会出现性能问题:

CPU 会不停的切换,造成进程或线程上下文切换开销,实际读取IO的时间占比会下降,造成CPU算力浪费。 因此,推动了 non-blocking I/O 的诞生。
————————————————
版权声明:本文为CSDN博主「Linux服务器开发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

posted @ 2021-03-10 03:31  xialuo  阅读(35)  评论(0)    收藏  举报