目录
1.概念
使用select模型的步骤
select模型特点:
Windows 和Linux 有什么区别?
为什么要引入select模型呢 同步阻塞问题我们可以利用多线程 或者把socket改成非阻塞 当我们要接受数据的时候我们要来回查看接受缓冲区有没有数据这样我们就要来回切换用户和内核浪费时间降低效率 所以我们让一个把所有的socket的有无数据都看了呢
1.概念
select 模型是Winsock中最常见的I/0模型,核心是利用select函数,实现对I/O的管理。利用select函数来判断某socket上是否有数据可读,或者能否向一个套接字写入数据,防止程序在socket处于阻塞模式中,在一次I/0调用过程中(send,recv,accept),被迫进入锁定状态:可以同时等待多个套接字,当某个或者多个套接字满足可读写条件时通知应用程序调用输入或者输出函数进行读写。
使用select模型的步骤
1) 使用FDZERO宏,初始化一个fdset对象;
2) 使用FDSET宏,将套接字句柄加入到fdset集合中;
3) 调用 select 函数,等待其返回……select 完成后,会返回在所有 fdset 集 合中设置的套接字句柄总数,并对每个集合进行相应的更新。
4) 根据 select的返回值和 FDISSET宏,对 fdset 集合进行检查。
5) 知道了每个集合中“待决”的 I/O操作之后,对 I/O进行处理,然后返回步骤 1 ),继续进行 select 处理。
select模型特点:
select :单线程处理多个客户端
1.跨平台windows linux
2.简单 方便
3.个数限制 windows 默认64 最大1024
4.阻塞(查看)没有解决将数据从内核拷贝到用户区的阻塞问题
Windows 和Linux 有什么区别?
select
模型在Windows和Linux系统中都有应用,但两者在实现细节、行为表现以及性能方面存在一些差异
1)在windows上,对select函数的第一个参数传入任意值都可以,Windows本身不使用这个值,只是为了兼容才保留这个参数,但实际开发中为了兼容跨平台代码,也会按照惯例将这个值设置为需要检测事件所有fd中的最大值+1
typedef struct {long int _fds_bits[16] }fd_set;
2) 在Linux上,向fd_set集合中添加新的fd时,决定这个fd在_fds_bits 数组的位置的实现使用的是位图法(bitmap);
在windows上添加fd至fd_set的实现则是依次从数组的第0个位置开始向后递增。
3)select模型在Windows平台下,默认限制是64个socket,最大限制是1024
Linux平台下,默认限制是1024个文件描述符