websevere服务器从零搭建到上线(二)|Linux上的五种IO模型

文章目录

  • [阻塞 blocking](#阻塞 blocking)
  • [非阻塞 non-blocking](#非阻塞 non-blocking)
  • [IO复用 IO multiplexing](#IO复用 IO multiplexing)
  • [信号驱动 signal-driven](#信号驱动 signal-driven)
  • [异步 asynchronous](#异步 asynchronous)
  • 拓展知识

看过上篇文章英国基本能理解本文五张图的内容websevere服务器从零搭建到上线(一)|阻塞、非阻塞、同步、异步

本文要能够在纸上默写并且阐明工作原理,八股就到位了

阻塞 blocking

非阻塞 non-blocking

非阻塞IO真的好吗,既然数据没有准备好,我们还要把宝贵的CPU资源浪费在不断询问内核是否准备好数据,这是没有必要的,所以这里我们应该写成事件驱动型的非阻塞IO,即非阻塞IO与IO多路复用一起使用

所以当我们谈到non-blocking,一般都是说的non-blocking + IO-multiplexing,单用其中任何一个都没有办法很好的实现功能

IO复用 IO multiplexing

IO多路复用默认的是一个阻塞的sockfd,一个select\poll\epoll会同时监听多个套接字,如果工作在阻塞模式下,如果某个socketfd读缓冲区就绪,我们就会阻塞在这里一直读,我们一直阻塞在某一个socketfd上后,一直没有机会再回到epoll_wait取监听别的套接字了,所以事件驱动的no-blocking IO+IO multiplexing才是正解!

信号驱动 signal-driven

内核在第一个阶段是异步,在第二个阶段是同步;与非阻塞IO的区别在于它提供了消息通知机制,不需 要用户进程不断的轮询检查,减少了系统API的调用次数,提高了效率。

异步 asynchronous

拓展知识

关于异步非阻塞模型:

在网络模型中,异步非阻塞是一种处理I/O操作的方式。异步指的是程序在执行I/O操作时可以同时进行其他任务,而不必等待I/O操作完成。

在异步非阻塞模型中,通常会使用事件驱动的方式来管理I/O操作。当一个I/O操作完成时,系统会通知程序,程序可以在合适的时机处理这个事件。这种模型通常会配合使用回调函数或者事件循环来处理I/O事件,从而实现高效的并发处理。

关于异步阻塞模型

异步通常与非阻塞相对应。但是,有时候在特定的场景中,"异步" 用来表示操作可以在后台进行,而 "阻塞" 则表示操作需要等待直到完成。
在某些情况下,异步操作可能是阻塞的,这意味着虽然操作在后台(操作系统)执行,但程序仍然需要等待其完成才能继续执行其他任务。这通常发生在某些异步操作的结果对程序的后续执行是必需的情况下,程序会在启动异步操作后被阻塞直到操作完成。

例如,在异步文件读取的情况下,虽然读取操作是异步的(即文件读取在后台进行),但程序可能需要等待读取操作完成并且数据可用才能继续执行后续操作。在这种情况下,虽然操作是异步的,但程序仍然会被阻塞,直到异步操作完成。

相关推荐
Brilliantwxx19 小时前
【C++】 继承与多态(中)
开发语言·c++·笔记·算法
青瓦梦滋1 天前
C++的IO流与STL的空间配置器
开发语言·c++
鱼很腾apoc1 天前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程
Yang96111 天前
无损精准查缆:鼎讯 G-340A 在铁路高速场景的应用
网络·信息与通信
不吃土豆的马铃薯1 天前
4.SGI STL 二级空间配置器 allocate 与_S_refill 源码解析
c语言·开发语言·c++·dreamweaver·内存池
开开心心就好1 天前
免费流畅的远程控制实用工具
linux·运维·服务器·网络·智能手机·excel
fufu03111 天前
vscode配置C/C++环境,用GDB调试简单程序分享
开发语言·c++
水云桐程序员1 天前
C++变量的概念及用法
开发语言·c++
yyuuuzz1 天前
aws的核心概念与常见使用场景
运维·服务器·网络·云计算·aws
水饺编程1 天前
第5章,[Win32 章节] :几种典型的颜色
c语言·c++·windows·visual studio