嵌入式 操作系统(五)
目录:
1.你了解IO模型吗?请你介绍一下?
2.BIO、NIO有什么区别?
3.Reactor、Proactor模式是什么?有什么区别?
4.你了解socket中select、epoll吗?请你说说区别?
5.linux零拷贝的原理?
内容:
1.你了解IO模型吗?请你介绍一下?
阻塞IO:
- 调用IO操作时,程序会阻塞(即等待),调用者期间什么 也不做,不停检查这个函数有没有返回,必须等待这个函数返回后才能进行下一个动作。
- 但可能导致程序在等待IO操作时效率低下。
非阻塞IO:
- IO操作会立即返回,如果数据不可用,程序会继续执行,不会等待。
- 程序可以通过轮询来检查IO操作是否完成,但需要手动管理数据的状态和进程调度。
IO多路复用:
- 通过调用select、poll等系统调用,程序可以同时等待多个IO事件的发生,直到某些事件准备好。
- 可以同时读操作、写操作的IO函数进行检查。知道有数据可读或者可写时,才真正调用IO操作函数。
信号驱动IO:
- linux用套接口进行信号驱动IO,操作系统会在IO事件完成时通过信号通知应用程序,应用程序可以在收到信号后继续处理IO操作。
异步IO:
- 在linux中通过调用aio_read函数告诉内核描述字缓冲区指针和缓冲区大小、文件偏移等,IO操作会异步执行,程序不会被阻塞,系统会在IO操作完成时通知程序。
注意:
- 阻塞IO、非阻塞IO、多路复用IO和信号驱动IO都属于同步模式
- 只有异步IO模型真正的实现IO操作的异步性。
- 异步是内核将数据拷贝到用户区,不需要用户再自己接收数据,直接使用就可以了。
- 同步是内核通知用户数据到了,用户自己调用相应函数去接收数据。
2.BIO、NIO有什么区别?
BIO
即阻塞IO,是最传统的IO模型,其工作原理是,当程序发起IO操作时(如读写文件或网络数据),线程会被阻塞,直到IO操作完成。这意味着,程序会等待IO操作完成后才能继续执行后续任务。
NIO
即非阻塞IO,是一种更先进的IO模型,NIO使用了Selector
、Channel
和Buffer
等关键类来实现非阻塞IO。NIO通过一个线程不断的轮询每个IO状态,看看是否有IO状态发生了改变,从而进行下一步动作。
BIO 和 NIO 的区别
模型类型 |
阻塞IO(同步阻塞) |
非阻塞IO(同步非阻塞) |
线程管理 |
每个IO操作一个线程,线程阻塞 |
多个IO操作通过一个线程处理,线程不会阻塞 |
IO操作的阻塞 |
阻塞,直到IO操作完成 |
非阻塞,立即返回,操作系统通知数据是否准备好 |
性能 |
对高并发性能差,消耗大量系统资源 |
高效,支持大规模并发连接,减少资源消耗 |
复杂度 |
编程简单 |
编程复杂,需使用 |
适用场景 |
低并发、小规模应用 |
高并发、大规模应用,如Web服务器、聊天服务器 |
3.Reactor、Proactor模式是什么?有什么区别?
Reactor模式
Reactor模式是一个同步的IO多路复用模式,它通过事件驱动和IO复用机制来处理多个并发的IO事件。Reactor模式的核心是使用一个事件循环来等待和分发事件,通常使用select
、poll
、epoll
等系统调用。
实现的 Reactor 模式的工作流程:
- 主线程注册读就需要事件和相关联的事件处理器。
- 事件分离器等待事件发生。主线程调用命令,等待数据可读。
- 当发生读时,事件分离器调用第一步注册的事件处理器。主线程则将可读事件放入请求队列。
- 事件处理器首先执行实际的读操作,然后根据读取到的内容进行进一步的处理。
优点:
- 能够在一个线程中管理多个IO操作,避免了线程上下文切换的开销。
- 系统能够高效地响应并处理IO事件,而不需要轮询或等待。
- Reactor模式适合处理大量并发连接(例如Web服务器、代理服务器等)。
缺点:
- 程序逻辑相对复杂,需要管理事件分发、回调等。
- 每个IO事件处理器在执行时仍然是同步的,可能会影响效率。
Proactor模式
Proactor模式(主动反应模式)是一个异步的IO多路复用模式,与Reactor模式不同,Proactor模式依赖于操作系统或IO库主动完成IO操作后才通知应用程序,而不是应用程序主动等待和检查IO操作的完成。
- 主线程调用函数,然后注册一个相应时间处理器,并告诉内核用户读缓冲区的位置,此时不关注读取就绪事件,而是关注读取完成事件。
- 事件分离器等待读取操作完成事件。
- 读取操作完成后,操作系统调用内核完成读取操作,并将读取的内容放入用户传递过来的缓冲区。
- 当 数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以通知应用程序数据已经可用。
- 事件分离器捕获到读取事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据。
- 当用户缓冲区的数据被写入 之后,内核将向应用程序发送一个信号,以通知应用程序数据已经发送完毕。
优点:
- 应用程序不需要阻塞等待IO完成,可以高效地处理多个IO操作。
- 由于IO操作由操作系统或库主动完成,程序响应时间通常更短。
- 避免了线程不断轮询IO事件,节省了CPU资源。
缺点:
- 实现Proactor模式需要支持异步IO操作的操作系统或库,这使得在一些环境下实现较为困难。
- Proactor模式依赖于操作系统的异步IO支持,在一些平台上可能不如Reactor模式通用。
Reactor模式与Proactor模式的区别
IO操作的方式 |
同步:IO操作由应用程序主动发起并等待完成,应用程序需要自己读取或者写入数据。 |
异步:IO操作由操作系统主动完成,并通知应用程序。不需要用户自己再接收数据,操作系统会将数据拷贝到用户区。 |
事件处理 |
程序等待IO事件并处理,处理时仍可能是阻塞的。 |
操作系统或库处理IO,完成后通知应用程序进行处理。 |
阻塞与非阻塞 |
阻塞IO操作,线程等待直到数据准备好。 |
非阻塞 |
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新