首页 > 试题广场 >

说一说 select 的原理以及缺点

[问答题]
select 是 一种 IO 多路复用技术,它的原理是: 1. 构造列表 首先要构造一个关于文件描述符的列表(需要监听的),列表数据类型为 fd_set,它是一个整型数组,总共是 1024 个比特位,每一个比特位代表一个文件描述符的状态。 2. 检测事件 调用 select() :监听该列表中的文件描述符的事件,函数返回并修改文件描述符的列表中对应的值,0 表示没有检测到该事件,1 表示检测到该事件。检测的操作是由内核完成的。 3. 进行I/O 操作 select() 返回时告诉进程有多少描述符要进行 I/O 操作,接下来遍历文件描述符的列表进行 I/O 操作。 select 的缺点: 1. 开销大 调用select,需要把 fd 集合从用户态拷贝到内核态,需要在内核遍历传递进来的所有 fd,这个开销在 fd 很多时很大; 2.支持数量少 select 支持的文件描述符数量太小了,默认是 1024(由 fd_set 决定); 3. 文件描述符集合不能重用,因为内核每次检测到事件都会修改,所以每次都需要重置; ***定位不深 每次 select 返回后,只能知道有几个 fd 发生了事件,但是具体哪几个还需要遍历文件描述符集合进一步判断。
发表于 2022-08-31 06:38:49 回复(0)
select原理: select是一种IO多路(多个TCP连接)复用技术,具体实现原理是—— 1.select会维护一个文件描述符列表fd_set,用来存放需要监听的文件描述符fd,其本质是一个1024bit的bitmap数组,1代表需要检测的fd,0代表不需要检测的fd,初始时bitmap的元素全为1; 2.调用select开始对fd_set进行轮询,轮询操作需要将fd集合从用户态拷贝到内核态,因为检测一个fd是否有IO事件发生是由内核完成的。同时select会阻塞其他进程,直到检测到有事件发生才会返回事件个数,并修改fd_set对应的值,0表示无事件发生。由于select返回的只是事件发生的个数,所以要知道具体是哪一个fd有IO事件,还需要再次对fd_set进行轮询一遍。 缺点: 1.每次调用select都需要将文件描述符集合从用户态拷贝到内核态; 2.select只能返回事件发生的个数,而不知晓具体哪个fd发生了IO事件,所以还需要轮询一遍; 3.select可监听的文件描述符有限,只有1024个,但可以通过FD_SETSIZE函数进行修改 4.文件描述符集合不能重用,因为每次监听都会对该集合进行修改 5.轮询机制过于耗时,尤其是当fd数量很多时
发表于 2023-03-14 09:54:30 回复(1)
elect 是 一种 IO 多路复用技术
发表于 2022-07-05 16:40:37 回复(0)
1、select用数组,poll用链表,epoll用红黑数和链表
发表于 2022-12-08 12:16:57 回复(1)
每次调用select都需要把fd集合从用户态复制到内核态 每次检测都要遍历所有位置 fd太小,只支持1024 fd不能复用,因此每次都需要重置 返回后只知道有几个事件就绪,需要遍历
发表于 2022-07-27 10:56:58 回复(0)
select是用数组去找
编辑于 2024-04-25 14:09:09 回复(0)
它是一种多路IO复用技术它的原理是: 先创建一个关于文件描述的列表,这个文件是储存文件描述符状态的类型是fd_set 是一个整形数组,在32位机器下是1024位,每一位代表这个文件描述符的状态,如果为一就是检测对应的文件描述符事件,为0就代表不检测;返回的是有多少个需要检测的文件描述符; 缺点:每次调用都要把fd集合从用户态拷贝到内核态;每次调用select都需要在内核遍历传递进来的所有fd开销会很大;select支持的文件描述符数量太小了;
发表于 2024-03-24 14:09:28 回复(0)
在用户空间定义好要监听的是否可读文件描述符集合、是否可写的文件描述符集合、是否出现异常的文件描述符集合,用FD_SET将一个要监听的文件描述符绑定到fd_set结构体上(本质上是一个位图),然后将它们复制到内核空间,让系统帮忙监听;如果监听的文件描述符可操作了,就返回可以操作的文件描述符状态,用户遍历监听的文件描述符数组看看哪个文件符被系统标记了,标记了就是可操作。 三个问题:描述符集合复制需要很大开销、每次只要有一个就绪就全部返回,而且用户不知道哪个可操作只能全遍历一遍,耗时
编辑于 2024-03-21 15:31:10 回复(0)
依据fd对输入信号进行处理,缺点是可能会被频繁调用
发表于 2024-03-12 18:53:18 回复(0)
select是一种IO多路复用技术,他的原理是将需要监听的文件描述符的放入一个列表,这个列表有maxfd来标识数量,最大监听数量为1024。 调用select会对这个列表进行轮询,将文件描述符的集合从用户态拷贝到内核态,由内核来检测一个文件描述符有没有IO事件产生,同时阻塞其他进程。当检测完后会返回事件个数,并且修改fd_set的值,由于返回的只是事件的个数,所以要知道是哪个文件描述符产生了IO事件,还需要再次对fd_set轮询一遍 缺点:1、每次调用时都要将文件描述符集合从用户态拷贝到内核态,开销大 2、只能知道有多少事件,不知道具体哪个fd产生事件,所以还需要再轮询拷贝一遍 3、只能监听1024个文件描述符 4、fd_set不能重复使用,每次监听时都会对该集合进行修改 5、轮询机制过于耗时,尤其是fd数量多的时候
编辑于 2024-02-28 23:59:33 回复(0)
select是一种io多路复用技术: 1、构造列表,首先要构造一个关于文件描述符的列表,列表数据类型为fd_set,它是一个整型数组,总共是1024个比特位,每一个比特位代表一个文件描述符的状态。 2、监测事件,调用select,监听该列表中的文件描述符中的事件,函数返回并修改文件买描述符的列表中对应的值,0表示没有监测到该事件,1表示监测到了,检测的工作是由内核完成的。 3、进行文件io操作,使用遍历到的文件描述符进行io操作 缺点: 1、开销大 2、支持数量少 3、文件描述符集合不能重用 4定位不深,只知道有几个文件描述符发生了事件,具体是哪个事件还需要进一步进行定位 (抄评论区的,打字是为了加深印象)
发表于 2023-11-21 21:22:21 回复(0)
select 是io多路复用技术,默认上线有1024个文件描述符。 检查机制是轮询机制,轮询操作是将 文件描述 集合从用户态拷贝到内核,拷贝是非常吃资源的操作,select 会阻塞其他进程,一旦有请求到达,会轮询检查每一个fd,直到检查到有 新数据 得fd
发表于 2023-11-09 21:49:44 回复(0)
1. select是一种IO多路复用, select首先把所有待监听的socket文件描述符加入到一个文件描述符集合中,然后调用select函数将这个文件描述符集合拷贝到内核,在内核会采用遍历的方式检查对应socket上是否有事件发生,然后再将整个文件描述符集合拷贝回用户区,在用户区再次采用遍历的方式来检查哪些socket有事件发生。 2. select需要2次拷贝和2次遍历,需要在内核和用户区之间拷贝较多的数据,因此效率较低。另外, select最多只支持1024个文件描述符。
发表于 2023-10-22 20:02:00 回复(0)
select是多路复用的一种方式,通过描述符fd_set 是一个整型数组,通过select监听文件文件描述符的事件,select返回告诉进程多少描述符进行io操作,遍历文件描述符的列表进行io操作。缺点是开销大,每次都要重用,只能知道几个fd发生事件,具体要遍历才知道哪几个
发表于 2023-10-20 10:14:01 回复(0)
原理:1.创建一个文件描述符列表,数据类型是fd_set类型,总共有1024个比特位,每一个比特位表示一个文件描述符的状态。2.调用select函数,监听列表中的文件描述符事件,函数返回病修改文件描述符的列表对应的值,0代表没有检测到该事件,1代表检测到该事件.3.进行I/O操作,select函数返回时告诉进程有多少个文件描述符要进行I/O操作,接下来遍历文件描述符列表进行I/O操作。缺点:1.开销大,每次调用select函数都需要将文件描述符列表从用户态拷贝到内核态;2.select只能返回事件发生的个数,而不知道具体是那个文件描述符事件发生,因此需要遍历;3.最只支持1024个文件描述符。
发表于 2023-09-21 17:06:55 回复(0)
得分点 fd_set、select、用户态和内核态切换及数据拷贝、支持的文件描述符数为1024、遍历 标准回答 select 是 一种 IO 多路复用技术,它的主旨思想是: 1. 首先要构造一个关于文件描述符的列表,将要监听的文件描述符添加到该列表中,这个文件描述符的列表数据类型为 fd_set,它是一个整型数组,总共是 1024 个比特位,每一个比特位代表一个文件描述符的状态。比如当需要 select 检测时,这一位为 0 就表示不检测对应的文件描述符的事件,为 1 表示检测对应的文件描述符的事件。 2. 调用 select() 系统调用,监听该列表中的文件描述符的事件,这个函数是阻塞的,直到这些描述符中的一个或者多个进行 I/O 操作时,该函数才返回,并修改文件描述符的列表中对应的值,0 表示没有检测到该事件,1 表示检测到该事件。函数对文件描述符的检测的操作是由内核完成的。 3. select() 返回时,会告诉进程有多少描述符要进行 I/O 操作,接下来遍历文件描述符的列表进行 I/O 操作。 select 的缺点: 1. 每次调用select,都需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很多时会很大; 2. 同时每次调用 select 都需要在内核遍历传递进来的所有 fd,这个开销在 fd 很多时也很大; 3. select 支持的文件描述符数量太小了,默认是 1024(由 fd_set 决定); 4. 文件描述符集合不能重用,因为内核每次检测到事件都会修改,所以每次都需要重置; 5. 每次 select 返回后,只能知道有几个 fd 发生了事件,但是具体哪几个还需要遍历文件描述符集合进一步判断。
发表于 2023-08-19 12:42:00 回复(0)
select是一种I/O多路复用技术,它的主旨思想是: 1. 首先要构造一个关于文件描述符的列表,将要监听的文件描述符添加到该列表中,这个文件描述符的列表数据类型为 fd_set,它是一个整型数组,总共是 1024 个比特位,每一个比特位代表一个文件描述符的状态。比如当需要 select 检测时,这一位为0就表示不检测对应的文件描述符的事件,为 1 表示检测对应的文件描述符的事件。 2. 调用 select() 系统调用,监听该列表中的文件描述符的事件,这个函数是阻塞的,直到这些描述符中的一个或者多个进行 I/O 操作时,该函数才返回,并修改文件描述符的列表中对应的值,0 表示没有检测到该事件,1表示检测到该事件。函数对文件描述符的检测操作是由内核完成的。 3. select() 返回时,会告诉进程由多少描述符要进行I/O操作,接下来遍历文件描述符的列表进行 I/O操作。 select的缺点: 1.
发表于 2023-08-02 16:47:33 回复(0)
select是IO多路复用的技术,原理是: 1. 构造一个关于文件描述符的列表,将要监听的文件描述符添加到列表中。 2. 检测事件,调用select(),监听列表中的文件描述符的事件,函数返回并修改文件描述符列表中对应的值。 a.阻塞的,直到由文件描述符由IO操作时返回 b.检测由内核完成 3.返回有多少文件描述符有IO操作 缺点: 1.开销大,fd集合要从用户区拷贝到内核区,检测完后要返回内核区 2.支持数量少,1024 3.文件描述符每次都要重置 4.每次select只知道几个fd发生变化了,但具体哪几个还需要遍历,耗时。
发表于 2023-07-25 15:52:38 回复(0)
selec是一种IO复用技术 原理: 1、首先需要构建一个储存文件描述符状态的整数数组,整数类型是fd_set,大小是1024个比特位,每个比特位储存的是该文件描述符的状态,0表示不需要检测,1表示需要检测该文件描述符是否有事件发生。 2、调用select()函数,监听该数组中的文件描述符的状态,如果有一个或多个文件描述符进行了IO操作,那么这个函数将阻塞,文件描述符的检测是有内核来完成的。 3、返回后,将告诉进程有几个文件描述符进行了IO操作。 缺点: 1、select函数调用检测fd是由内核来完成的,所以有用户态和内核态的来回切换,如果有大量的文件描述符需要检测时对内核来说开销是非常的大。 2、同样如果有大量的文件描述符需要检测,内核需要对其全部遍历一次,这样开销也非常大 3、selectIO复用技术的大小有限,默认是1024比特位 4、在内核检测完并回到用户态之后,其改变的文件描述符的状态需要重置。 5、每次调用select之后返回的只是有多少个文件描述符发生了事件,并没有告诉进程具体的信息。
发表于 2023-06-13 18:28:18 回复(0)
1.select是一种IO复用机制 2.相对于epoll来说效率比较低,因为其管理文件描述符的数据结构是数组,所以在增删改查文件描述符时耗时,而且select不会返回具体是哪个fd发生了事件,需要自己遍历数组去查找。
发表于 2023-02-22 13:48:51 回复(0)