如何一探究竟:select、epoll等五大IO模型的前世今生?

2026-04-27 21:5971阅读0评论建站教程
  • 内容介绍
  • 文章标签
  • 相关推荐

展开全文存储的概念由来已久。很早之前,计算机之父--冯·诺依曼在提出计算机模型的五大部分中就提到存储器。可以说,没有存储器,计算机也是不完整的。 按照电源关断后数据是否依旧被保存,可以划分为非易失性存储器和易失性存储器两大类。以前买CPU时都说缓存,还分一级缓存和二级缓存,其实缓存就是SRAM。 太硬核了。 然后才说到内存,内存就是DRAM。当然SRAM除了在电脑里用,还在很多的电路设计里都要用到,作为地址码或临时数据存储用,所以很多代工厂都会提供SRAM给客户。

从速度上讲SRAM最快,接下来是DRAM,再到硬盘。哎,想想以前的机械硬盘,启动一个程序那叫一个慢啊!现在固态硬盘多好,起飞的感觉!不过话说回来这些底层硬件知识跟我们今天要聊的IO模型有什么关系呢?关系大了去了!主要原因是IO模型的设计很大程度上是为了更好地利用这些硬件资源,减少等待时间嘛,拜托大家...。

一文读懂五大 IO 模型的前世今生( select、epoll、epoll)

阻塞IO:老古董,但简单粗暴

拭目以待。 先说说最原始的阻塞IO吧。这玩意儿就像你排队点餐,得等到前面的人点完、做完、吃完你才能轮到你。代码实现起来特别简单:

listenfd = socket; // 打开一个网络通信套接字
bind; // 绑定
listen; // 监听
while {
  connfd = accept; // 阻塞 等待建立连接
  int n = read; // 阻塞 读数据
  doSomeThing; // 处理数据
  close; // 关闭连接
}

换言之... 看起来挺直白吧?问题也显而易见:一个线程处理一个连接,如果客户端请求很多怎么办?线程数量多了就吃内存啊!而且线程切换也浪费CPU资源。哎,想想就头大……不过话说回来这种方式实现起来最简单粗暴。

非阻塞IO:想摆脱阻塞, 后来啊更糟

为了解决阻塞的问题,出现了非阻塞IO。

阅读全文

展开全文存储的概念由来已久。很早之前,计算机之父--冯·诺依曼在提出计算机模型的五大部分中就提到存储器。可以说,没有存储器,计算机也是不完整的。 按照电源关断后数据是否依旧被保存,可以划分为非易失性存储器和易失性存储器两大类。以前买CPU时都说缓存,还分一级缓存和二级缓存,其实缓存就是SRAM。 太硬核了。 然后才说到内存,内存就是DRAM。当然SRAM除了在电脑里用,还在很多的电路设计里都要用到,作为地址码或临时数据存储用,所以很多代工厂都会提供SRAM给客户。

从速度上讲SRAM最快,接下来是DRAM,再到硬盘。哎,想想以前的机械硬盘,启动一个程序那叫一个慢啊!现在固态硬盘多好,起飞的感觉!不过话说回来这些底层硬件知识跟我们今天要聊的IO模型有什么关系呢?关系大了去了!主要原因是IO模型的设计很大程度上是为了更好地利用这些硬件资源,减少等待时间嘛,拜托大家...。

一文读懂五大 IO 模型的前世今生( select、epoll、epoll)

阻塞IO:老古董,但简单粗暴

拭目以待。 先说说最原始的阻塞IO吧。这玩意儿就像你排队点餐,得等到前面的人点完、做完、吃完你才能轮到你。代码实现起来特别简单:

listenfd = socket; // 打开一个网络通信套接字
bind; // 绑定
listen; // 监听
while {
  connfd = accept; // 阻塞 等待建立连接
  int n = read; // 阻塞 读数据
  doSomeThing; // 处理数据
  close; // 关闭连接
}

换言之... 看起来挺直白吧?问题也显而易见:一个线程处理一个连接,如果客户端请求很多怎么办?线程数量多了就吃内存啊!而且线程切换也浪费CPU资源。哎,想想就头大……不过话说回来这种方式实现起来最简单粗暴。

非阻塞IO:想摆脱阻塞, 后来啊更糟

为了解决阻塞的问题,出现了非阻塞IO。

阅读全文