|面试官问我Linux的网络IO模式怎么办?


并发 , 顾名思义就是多个程序一起运行 。 运行在哪里呢?当然是cpu
所以并发就是多个程序一起运行在cpu上咯?
no no no!就单个cpu而言 , 一次只能处理一个程序 , 之所以能够看起来「一起运行」 , 是因为操作系统采用了分时系统 , 什么时间片 , 调度算法啦 , 让程序交替式的在cpu上运行 , 看起来好像是一起运行一样(这里不展开了 , 后面再更新给大家)
所以这就是并发的全部意义吗?就是多个程序通过操作系统的调度交替运行 , 看起来像一起运行 , 所以称为并发?
当然不是 , 之所以称为并发编程 , 是因为它们有真正同时运行的地方 。
回顾一下操作系统的基础知识 。 我们知道 , 操作系统是采用虚拟存储的 , 它的核心是内核 , 为了保护内核的安全 , 操作系统把虚拟空间划分成两部分 , 一部分是内核空间 , 一部分是用户空间 , 就像星空战舰上的指挥室一样 。
|面试官问我Linux的网络IO模式怎么办?
本文插图

这时候聪明的的你肯定就会发现一个问题
cpu运算的结果是放在内核空间的 , 而我们读取结果却是在用户空间 , 这就有一个数据从内核空间到用户空间的过程
没错 , 从操作系统层看程序运行时的数据流的话 , 是有「等待数据 --- 数据拷贝到内核空间 --- cpu运算 --- 数据从内核空间拷贝到用户空间」 这几个过程的
|面试官问我Linux的网络IO模式怎么办?
本文插图

程序运行时的数据流动过程
并发 , 就发生在这几个过程中 。
来一张经典的示意图
|面试官问我Linux的网络IO模式怎么办?
本文插图

中间的部分就是并发的部分 , 只要保证cpu运算的过程是串行的 , 其他过程都可以并发执行 。
我们把数据从「等待」到「拷贝到用户空间」称作一次IO操作
其中 , 「等待数据 --- 数据拷贝到内核空间 --- cpu运算」叫做数据准备阶段 , 「数据从内核空间拷贝到用户空间」叫做数据拷贝阶段
|面试官问我Linux的网络IO模式怎么办?
本文插图

Linux的网络I/O模式
没有实际应用的知识是没有灵魂的 , 同样 , 没有被面试官问起的知识点都是孤独的..
当我们兴高采烈地聊到这里时 , 面试官会笑眯眯的问你
好的 , 你来讲一下linux中有哪些网络io模式吧?
|面试官问我Linux的网络IO模式怎么办?
本文插图

好吧算你狠 。
Linux中有五种网络io模式 , 分别是

  • 阻塞 I/O
  • 非阻塞 I/O
  • I/O 多路复用
  • 信号驱动 I/O
  • 异步 I/O
其中因为 信号驱动 I/O 不常用 , 所以一般只要了解其他四种 I/O 模式
【|面试官问我Linux的网络IO模式怎么办?】当我们掰着指头好不容易数出这五种模式时 , 刚才还昏昏欲睡的面试官突然眼睛一亮 , 皮笑肉不笑地对你说
不错嘛 , 那你来说说 阻塞/非阻塞 IO 和同步/异步 IO的区别吧?
搞我是吧 , 但既然人家问 , 咱也只能准备 。 要分清这四个概念 , 就要牢牢记住之前数据流动的过程
(再放一遍)
|面试官问我Linux的网络IO模式怎么办?
本文插图

阻塞 I/O
用户空间因为不能直接访问内核空间 , 当他想要结果时需要发起一个read调用
但数据的准备和计算是需要一个过程的 。 比如我们进行网络请求的时 , 数据还没有返回 , 这个过程需要等待 , 当数据返回后被拷贝到内核空间 , 经过一系列运算 , 最终拷贝到用户空间 。


推荐阅读