Linux网络编程之IO复用学习笔记

1.什么是IO复用

    我们都知道socket编程,最基本的socket编程无非是创建一个socket,bind,listen,recv,当我们使用recv的时候就会变成进程阻塞,进程由运行态变成阻塞态,所以如果我们还用最基本的socket编程,我们每创建一个socket就要创建一个进程,这无疑是对计算机巨大的损耗,所以操作系统给我们提供了几种模型,select,poll,epoll.

2.select

   select是最原始的IO复用技术,他的工作原理也很简单,创建一个需要监视的列表,开启select进入阻塞态,若来了一个socket请求,则唤醒进程,用循环遍历这个列表,看那个socket变成就绪态,若变成就绪态就把他加进去运行队列,但这有一个巨大的问题,就是select根本不知道那个socket被唤醒,他只能去遍历,所以他默认大小为1024,而且他每次被唤醒后,下一次还要把新的等待列表传入select,但他因为存在时间足够长,所以每一个操作系统都支持,而且如果是一个socket数量不多的场景,我觉得还是可以用的。

3.epoll

  epoll的出现就是为了弥补select的不足,主要有2个地方,第一把等待列表的加入和进入阻塞状态分为2个函数,因为我们常常需要监视的socket是不变的,这样我们每次重新处理的时间就不需要重新构建等待列表,第二加入了一个就绪列表,我们都知道,一个程序有运行,就绪,阻塞三个状态,select每次就是查看等待列表中有那些是进入就绪态的,从而把他加进去运行列表,我们现在直接创建一个就绪列表,这样只要一个被监视的socket被唤醒,他就会直接加进去就绪列表里面,当我们调用wait的时候,若就绪列表里不为空,这样我们就可以直接遍历就绪列表,不用再去遍历等待列表

发布了133 篇原创文章 · 获赞 8 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/fbher/article/details/99727204