从0开始回顾操作系统---系列六

简介: IO多路复用1、讲一讲IO多路复用?IO多路复用模型指的是:使用单个进程/线程同时处理多个网络连接IO,他的原理就是select、poll、epoll 不断轮询所负责的所有 socket,当某个socket有数据到达了,就通知用户进程。该模型的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。 2、select、poll 和 epoll 之间的区别1. select:时间复杂度 O(n)● select 仅仅知道有 I/O 事件发生,但并不知道是哪几个流,所以只能无差别轮询所有流,找出能读出数据或者写入数据的流,并对其进行操作。所以 select 具有 O(n) 的无差

IO多路复用

1、讲一讲IO多路复用?

IO多路复用模型指的是使用单个进程/线程同时处理多个网络连接IO,他的原理就是select、poll、epoll 不断轮询所负责的所有 socket,当某个socket有数据到达了,就通知用户进程。该模型的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。

2、select、poll 和 epoll 之间的区别

  1. select:时间复杂度 O(n)
  • select 仅仅知道有 I/O 事件发生,但并不知道是哪几个流,所以只能无差别轮询所有流,找出能读出数据或者写入数据的流,并对其进行操作。所以 select 具有 O(n) 的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
  1. poll:时间复杂度 O(n)
  • poll 本质上和 select 没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个 fd(文件描述符) 对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的。
  1. epoll:时间复杂度 O(1)
  • epoll 可以理解为 event poll,不同于忙轮询和无差别轮询,epoll 会把哪个流发生了怎样的 I/O 事件通知我们。所以说 epoll 实际上是事件驱动(每个事件关联上 fd)的。

总结:

  • select,poll,epoll 都是 IO 多路复用的机制。
  • I/O 多路复用就是通过一种机制监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),就通知程序进行相应的读写操作。
  • 但 select,poll,epoll 本质上都是同步 I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步 I/O 则无需自己负责进行读写,异步 I/O 的实现会负责把数据从内核拷贝到用户空间。

3、讲一讲IO模型的分类?

IO模型大致可分为四类:

  • 同步阻塞IO(Blocking IO)
  • 同步非阻塞 IO(Non-blocking IO)
  • IO 多路复用(IO Multiplexing)
  • 异步 IO(Asynchronous IO)。

4、BIO,NIO,AIO的区别?

  1. BIO:同步并阻塞
  • 在服务器中实现的模式为一个连接一个线程。也就是说,客户端有连接请求的时候,服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然这也可以通过线程池机制改善。
  • BIO一般适用于连接数目小且固定的架构,这种方式对于服务器资源要求比较高,而且并发局限于应用中,是JDK1.4之前的唯一选择,但好在程序直观简单,易理解。
  1. NIO:同步并非阻塞
  • 在服务器中实现的模式为一个请求一个线程,也就是说,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到有连接IO请求时才会启动一个线程进行处理。
  • NIO一般适用于连接数目多且连接比较短(轻操作)的架构,并发局限于应用中,编程比较复杂,从JDK1.4开始支持。
  1. AIO:异步并非阻塞
  • 在服务器中实现的模式为一个有效请求一个线程,也就是说,客户端的IO请求都是通过操作系统先完成之后,再通知服务器应用去启动线程进行处理。
  • AIO一般适用于连接数目多且连接比较长(重操作)的架构,充分调用操作系统参与并发操作,编程比较复杂,从JDK1.7开始支持。
相关文章
|
开发框架 供应链 搜索推荐
计算机毕业设计源码整合大全_kaic
计算机毕业设计源码整合大全_kaic
|
10月前
|
自然语言处理 前端开发 网络协议
用 Qwen2.5-Coder 开发一个网页应用,完全0基础,已部署上线,代码开源!
利用Qwen2.5-Coder成功开发了一个简洁实用的网页应用,该应用能够在浏览器Tab标题中显示北京时间,并在页面中集成了实时时间显示和番茄时钟功能。通过Qwen2.5-Coder的强大代码生成能力,从零基础开始,仅需简单提示便完成了HTML、CSS和JavaScript的编写。经过几次优化调整,最终实现了美观且功能完善的网页应用,并顺利部署至Vercel平台,满足了作者在全屏模式下查看时间的需求。
用 Qwen2.5-Coder 开发一个网页应用,完全0基础,已部署上线,代码开源!
|
前端开发 Java
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
文章通过一个表白墙/留言墙的初级SpringBoot项目实例,详细讲解了如何进行前后端开发,包括定义前后端交互接口、创建SpringBoot项目、编写前端页面、后端代码逻辑及实体类封装的全过程。
332 3
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
992 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
11月前
|
前端开发 持续交付 开发工具
理解前端开发中的 Git - Rebase
Git Rebase 是前端开发中常用的一种版本控制操作,用于将一个分支的更改整合到另一个分支。与合并(Merge)不同,Rebase 可以使提交历史更加线性整洁,有助于保持代码库的清晰和可维护性。通过 Rebase,开发者可以将特性分支的改动应用到主分支上,同时保留或重写提交记录。
|
Java Maven Spring
【操作宝典】IntelliJ IDEA新建maven项目详细教程
【操作宝典】IntelliJ IDEA新建maven项目详细教程
732 1
|
存储 缓存 安全
(八)深入并发之Runnable、Callable、FutureTask及CompletableFuture原理分析
关于Runnable、Callable接口大家可能在最开始学习Java多线程编程时,都曾学习过一个概念:在Java中创建多线程的方式有三种:继承Thread类、实现Runnable接口以及实现Callable接口。但是实则不然,真正创建多线程的方式只有一种:继承Thread类,因为只有`new Thread().start()`这种方式才能真正的映射一条OS的内核线程执行,而关于实现Runnable接口以及实现Callable接口创建出的Runnable、Callable对象在我看来只能姑且被称为“多线程任务”,因为无论是Runnable对象还是Callable对象,最终执行都要交由Threa
422 1
|
设计模式 SQL 安全
单例模式大全:细说七种线程安全的Java单例实现,及数种打破单例的手段!
设计模式,这是编程中的灵魂,用好不同的设计模式,能使你的代码更优雅/健壮、维护性更强、灵活性更高,而众多设计模式中最出名、最广为人知的就是Singleton Pattern单例模式。通过单例模式,我们就可以避免由于多个实例的创建和销毁带来的额外开销,本文就来一起聊聊单例模式。
265 0
|
关系型数据库 MySQL 数据库
【MySQL】-多表设计(一对多、一对一、多对多)
设计数据库时,不同类型的关系需要谨慎考虑,以反映实际需求并优化性能。查询设计良好的数据库通常会更高效,并有助于减少数据冗余和维护成本。同时,确保外键索引的正确使用,可以显著提升查询效率和数据一致性。通过这些原则和技巧的应用,我们可以在遵循数据库设计的最佳实践的同时,确保数据的可扩展性和可维护性。
1215 4
|
SQL Oracle 关系型数据库
关系型数据库直接查看日志文件
【6月更文挑战第10天】
282 3