具有代表性的并发服务器端实现模型和方法:
多进程服务器:通过创建多个进程提供服务。
多路复用服务器:通过捆绑并统一管理I/O对象提供服务。✔
多线程服务器:通过生成与客户端等量的线程提供服务。
目录
1. I/O复用
“在一个通信频道中传递多个数据(信号)的技术。”
“为了提高物理设备的效率,用最少的物理要素传递最多数据时使用的技术。”
举个例子,某个教师里有10名学生,1位老师,这10名学生都非等闲之辈,他们会不停的提问,所以学校没有办法,只能给他们每个人都配一个老师,这样这个教师就有10个老师,10个学生,但这样的话,以后每当有一个新学生进来,就要增加一个新老师,这样下去也不是办法。这时,学校来了个贼牛的老师,他一个人就可以应对所有学生的提问,而且速度很快,所以学校就把其他老师给转移到了其他班。并且,现在学生提问必须举手,老师确认学生的提问再回答问题。现在,这间教师就是以I/O复用方式运行的。
如图是I/O复用在服务端的模型。
2. select函数
#include<sys/select.h>
#include<sys/time.h>
int select(
int maxfd, //监视对象文件描述符数量
fd_set* readset, //将所有关注"是否存在待读取数据"的文件描述符注册到fd_set型
//变量,并传递其地址值
fd_set* writeset, //将所有关注"是否可传输无阻塞数据"的文件描述符注册到fd_set型
//变量,并传递其地址值
fd_set* exceptset, //将所有关注"是否发生异常"的文件描述符注册到fd_set型变量,
//并传递其地址值
const struct timeval* timeout //调用select函数后,为防止进入无限阻塞状态,传递超时信息
);
成功返回>0的值,表示发生上述事件的文件描述符
超时返回0
失败返回-1
struct timeval
{
long tv_sec; //seconds
long tv_usec; //microseonds
}
2.1 select函数的作用
作用:将多个文件描述符集中到一起统一监视。获取发生监视事件的文件描述符,从而与这个文件描述符指定的套接字进行通信。
监视事件:
1.是否存在套接字接收数据(read)
2.无需阻塞传输数据的套接字有哪些(write)
3.哪些套接字有异常(except)