内核和用户进程协作之阻塞方式

同步阻塞网络习惯称为BIO,优点是使用起来特别方便,但缺点就是性能非常差。

从用户进程创建socket,到一个网络包抵达网卡被用户进程接收,同步阻塞IO总体上的流程是:

1、等待接收消息

socket()函数进入内核态创建必要的内核对象。recv()函数在进入内核态后负责查看接收队列,以及在没有数据可处理时候把当前进程阻塞掉,让出CPU

2、软中断

硬中断和软中断上下文将包处理完后放到socket接收队列中。然后根据socket内核对象找到正在阻塞的进程,把它唤醒。

同步阻塞总体流程: 每一个进程专门为了等一个socket上的数据就被CPU上拿下来,然后换上另一个进程,等数据准备好,睡眠进程又会被唤醒,总共产生两次进程上下文切换。

对于网络密集型IO的应用CPU就会被迫不停的做进程切换这种无用功。

总结

这种模式在客户端角色上,现在还存在使用情形,因为你的进程可能确实要等待MySQL的数据返回之后才能渲染页面。

不过一些封装的好的网络框架,Golang的net包或者swoole 在网络客户端也摒弃了这种低效的模式

在服务端角色上这种模式则完全没办法使用。因此它有个别名叫做 单路不复用。那么有没有更高效的网络IO模型呢? 当然有,那就是你熟知的select,pool和epool了。俗称: 多路复用三剑客

版权声明:
作者:jeristiano
链接:https://www.jeristiano.win/archives/638.html
来源:光合盐
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录