【转帖】从操作系统层面理解Linux下的网络IO模型
从操作系统层面理解Linux下的网络IO模型 https://segmentfault.com/a/1190000021587865 I/O( INPUT OUTPUT),包括文件I/O、网络I/O。 计算机世界里的速度鄙视: 内存读数据:纳秒级别。 千兆网卡读数据:微妙级别。1微秒=1000纳秒,网卡比内存慢了千倍。 磁盘读数据:毫秒级别。1毫秒=10万纳秒 ,硬盘比内存慢了10万倍。 CPU一个时钟周期1纳秒上下,内存算是比较接近CPU的,其他都等不起。 CPU 处理数据的速度远大于I/O准备数据的速度 。 任何编程语言都会遇到这种CPU处理速度和I/O速度不匹配的问题! 在网络编程中如何进行网络I/O优化:怎么高效地利用CPU进行网络数据处理??? 一、相关概念 从操作系统层面怎么理解网络I/O呢?计算机的世界有一套自己定义的概念。如果不明白这些概念,就无法真正明白技术的设计思路和本质。所以在我看来,这些概念是了解技术和计算机世界的基础。 1.1 同步与异步,阻塞与非阻塞 理解网络I/O避不开的话题:同步与异步,阻塞与非阻塞。 拿山治烧水举例来说,(山治的行为好比用户程序,烧水好比内核提供的系统调用),这两组概念翻译成大白话可以这么理解。 同步/异步关注的是水烧开之后需不需要我来处理。 阻塞/非阻塞关注的是在水烧开的这段时间是不是干了其他事。 1.1.1 同步阻塞 点火后