Linux IO模型

用户态和核心态


Linux系统中分为核心态和用户态,CPU会在两个状态中切换

用户态和核心态的切换

进程切换


为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因此可以说,任何进程都是在操作系统下运行的,是和内核紧密相关的。从一个进程的运行转到另一个进程上运行,这个过程会经历下面的变化

文件描述符


FD用于描述指向文件的引用的抽象化概念。实际上,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

缓存IO


缓存IO又被称作标准IO,大多数文件系统的默认IO操作都是缓存IO。在Linux的缓存IO机制中,操作系统会将IO的数据缓存在文件系统的页缓存中,也就是说,数据先会被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序地址空间
缺点:    数据在传输过程中需要在应用程序地址空间和内核之间进行多次数据拷贝操作,这些数据拷贝操作所带来的CPU及内存开销是比较大的

同步与异步、阻塞与非阻塞


同步与异步关注的是消息通知机制(synchronous communication /asynchronous communication)。      所谓同步就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。调用者需要一直去等待调用结果    异步则是调用发出之后,这个调用就返回了。等到执行完成,被调用者会通过状态来通知调用者、或者通过回调函数来处理这个调用阻塞与非阻塞关注的是程序在等待调用结果时的状态      阻塞是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。      非阻塞调用是指不能立即得到结果之前,该调用不会阻塞当前线程

Linux下的五种IO模型

image.png

image.png

image.png

image.png

IO复用之Select、Poll、Epoll

select

select是通过设置或检查存放fd标志位的数据结构来进行下一步处理
缺点

poll

poll本质和select相同,将用户传入的数据拷贝到内核空间,然后查询每个fd对应的设备状态,如过设备就绪则在设备等待队列加入一项并继续等待,如果遍历所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或主动超时,被唤醒后又要继续遍历fd。
没有最大连接数的限制,因为是基于链表来存储的
缺点