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事件,从而实现高效的并发处理。

关于异步阻塞模型

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

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

相关推荐
wuqingshun31415914 分钟前
经典算法 约数之和
数据结构·c++·算法·蓝桥杯
溟洵15 分钟前
【C/C++算法】蓝桥杯之递归算法(如何编写想出递归写法)
c语言·c++·算法
老六ip加速器1 小时前
手机改了IP地址,定位位置会改变吗?
网络·tcp/ip·智能手机
十五年专注C++开发1 小时前
QT 中的元对象系统(五):QMetaObject::invokeMethod的使用和实现原理
开发语言·数据结构·c++·qt·设计模式
熬夜学编程的小王1 小时前
【C++初阶篇】C++中c_str函数的全面解析
c语言·c++·c_str
一线灵1 小时前
跨平台游戏引擎 axmol-2.5.0 发布
c++·游戏引擎·wasm·axmol
渴望脱下狼皮的羊2 小时前
C++基础讲解
开发语言·c++·后端
FlyingBuffer5 小时前
Data_Socket和UDP_Socket
网络·网络协议·udp
同勉共进6 小时前
虚函数表里有什么?(二)——普通单继承下的虚函数表
c++·单继承·虚函数表·dynamic_cast·rtii
永恒迷星.by8 小时前
文件操作(c语言)
c语言·c++·算法·文件操作