深入聊聊Linux 五种IO模型

一般聊到所线程或者并发网络上面的知识面试官都会延伸到此知识点哦!!!
一、相关概念讲解1、同步与异步同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列 。要么成功都成功,失败都失败,两个任务的状态可以保持一致 。
异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了 。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列 。
2、堵塞与非堵塞阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关 。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的 。
 
阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务 。函数只有在得到结果之后才会返回 。
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回 。虽然表面上看非阻塞的方式可以明显的提高CPU的利用率,但是也带了另外一种后果就是系统的线程切换增加 。增加的CPU执行时间能不能补偿系统的切换成本需要好好评估 。
 
(a) 如果这个线程在等待当前函数返回时,仍在执行其他消息处理,那这种情况就叫做同步非阻塞;
(b) 如果这个线程在等待当前函数返回时,没有执行其他消息处理,而是处于挂起等待状态,那这种情况就叫做同步阻塞;
同步/异步关注的是消息通知的机制,而阻塞/非阻塞关注的是程序(线程)等待消息通知时的状态 。
3、用户空间与内核空间现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方) 。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限 。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间 。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间 。
4、进程切换为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行 。这种行为被称为进程切换 。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的 。
从一个进程的运行转到另一个进程上运行,这个过程中经过下面这些变化:
1、保存处理机上下文,包括程序计数器和其他寄存器 。
2、更新PCB信息 。
3、把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列 。
4、选择另一个进程执行,并更新其PCB 。
5、更新内存管理的数据结构 。
6、恢复处理机上下文 。
注:总而言之就是很耗资源
5、进程的堵塞正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态 。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态 。当进程进入阻塞状态,是不占用CPU资源的 。
6、文件描述符文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念 。
文件描述符在形式上是一个非负整数 。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表 。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符 。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开 。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统 。
7、缓存缓存 IO 又被称作标准 IO,大多数文件系统的默认 IO 操作都是缓存 IO 。在 Linux 的缓存 IO 机制中,操作系统会将 IO 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间 。


推荐阅读