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

关于异步阻塞模型

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

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

相关推荐
Smile_2542204182 分钟前
DCS如何通过KepServerEx向InfluxDB写数据
网络·时序数据库
.select.4 分钟前
TCP 5(socket编程)
服务器·网络·tcp/ip
风曦Kisaki5 分钟前
Linux服务Day03:自定义YUM仓库、网络YUM仓库(HTTP/FTP)、MariaDB数据库基础操作
linux·网络·数据库
云栖梦泽10 分钟前
Linux内核与驱动:7.从应用层 lseek() 到驱动层 .llseek,Linux 字符设备偏移控制详解
linux·c++
steins_甲乙18 分钟前
从0做一个小型内存泄露检测器(2): elf文件的动态链接
c++
charlie11451419124 分钟前
通用GUI编程技术——图形渲染实战(二十八)——图像格式与编解码:PNG/JPEG全掌握
开发语言·c++·windows·学习·图形渲染·win32
Ricky_Theseus36 分钟前
C++静态库
开发语言·c++
洛水水38 分钟前
【力扣100题】14.两数相加
c++·算法·leetcode
AlanW39 分钟前
# Vcpkg使用总结2
c++
智擎软件测评小祺44 分钟前
渗透测试报告撰写:漏洞发现到验证流程
网络·渗透测试·测试·cma·第三方检测·cnas·渗透测试报告