嵌入式 操作系统(五)

目录:

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使用了SelectorChannelBuffer等关键类来实现非阻塞IO。NIO通过一个线程不断的轮询每个IO状态,看看是否有IO状态发生了改变,从而进行下一步动作。

BIO 和 NIO 的区别

模型类型

阻塞IO(同步阻塞)

非阻塞IO(同步非阻塞)

线程管理

每个IO操作一个线程,线程阻塞

多个IO操作通过一个线程处理,线程不会阻塞

IO操作的阻塞

阻塞,直到IO操作完成

非阻塞,立即返回,操作系统通知数据是否准备好

性能

对高并发性能差,消耗大量系统资源

高效,支持大规模并发连接,减少资源消耗

复杂度

编程简单

编程复杂,需使用SelectorChannel

适用场景

低并发、小规模应用

高并发、大规模应用,如Web服务器、聊天服务器

3.Reactor、Proactor模式是什么?有什么区别?

Reactor模式

Reactor模式是一个同步的IO多路复用模式,它通过事件驱动和IO复用机制来处理多个并发的IO事件。Reactor模式的核心是使用一个事件循环来等待和分发事件,通常使用selectpollepoll等系统调用。

实现的 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/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务