文章目录
- [阻塞 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事件,从而实现高效的并发处理。
关于异步阻塞模型:
异步通常与非阻塞相对应。但是,有时候在特定的场景中,"异步" 用来表示操作可以在后台进行,而 "阻塞" 则表示操作需要等待直到完成。
在某些情况下,异步操作可能是阻塞的,这意味着虽然操作在后台(操作系统)执行,但程序仍然需要等待其完成才能继续执行其他任务。这通常发生在某些异步操作的结果对程序的后续执行是必需的情况下,程序会在启动异步操作后被阻塞直到操作完成。
例如,在异步文件读取的情况下,虽然读取操作是异步的(即文件读取在后台进行),但程序可能需要等待读取操作完成并且数据可用才能继续执行后续操作。在这种情况下,虽然操作是异步的,但程序仍然会被阻塞,直到异步操作完成。