当前位置: 技术问答>linux和unix
sock编程中I/O复用机制
来源: 互联网 发布时间:2016-07-06
本文导语: 最近在编写一些sock程序,客户端和服务端要用到I/O复用机制,但对这个I/O复用不是很明白。 我真心请教各位。特别是这个复用,不是很懂 | 不要从字面上去理解复用, multiplexing的直接翻译意...
最近在编写一些sock程序,客户端和服务端要用到I/O复用机制,但对这个I/O复用不是很明白。
我真心请教各位。特别是这个复用,不是很懂
我真心请教各位。特别是这个复用,不是很懂
|
不要从字面上去理解复用,
multiplexing的直接翻译意为多路技术。
为什么要用select?
因为你需要同时监控多个句柄是否可读或可写,而你又无法预料是哪一个句柄会先可读或可写。
select的机制?
我猜大致如下:
进程会调用select之后,内核会建立一个表,维护这个进程感兴趣的文件句柄,然后把进程置于挂起状态。任何一个句柄状态的变化都会引起一次中断,内核在处理这个中断的时候,就会查询哪个进程对这个句柄状态感兴趣,然后把相应的进程置为就绪态,也就表现为你的select返回了。对超时的处理也大致类似,会有时间中断。
multiplexing的直接翻译意为多路技术。
为什么要用select?
因为你需要同时监控多个句柄是否可读或可写,而你又无法预料是哪一个句柄会先可读或可写。
select的机制?
我猜大致如下:
进程会调用select之后,内核会建立一个表,维护这个进程感兴趣的文件句柄,然后把进程置于挂起状态。任何一个句柄状态的变化都会引起一次中断,内核在处理这个中断的时候,就会查询哪个进程对这个句柄状态感兴趣,然后把相应的进程置为就绪态,也就表现为你的select返回了。对超时的处理也大致类似,会有时间中断。
|
select会循环遍历它所监测的fd_set(一组文件描述符(fd)的集合)内的所有文件描述符对应的驱动程序的poll函数。驱动程序提供的poll函数首先会将调用select的用户进程插入到该设备驱动对应资源的等待队列(如读/写等待队列),然后返回一个bitmask告诉select当前资源哪些可用。当select循环遍历完所有fd_set内指定的文件描述符对应的poll函数后,如果没有一个资源可用(即没有一个文件可供操作),则select让该进程睡眠,一直等到有资源可用为止,进程被唤醒(或者timeout)继续往下执行。
select会遍历所有的fd,但是我不是指它是死循环。遍历是为了给每个fd的poll作排队。
我说的不停扫描是对epoll比较的,select需要扫描所有的fd的poll一遍,而epoll是不需要的。
select会遍历所有的fd,但是我不是指它是死循环。遍历是为了给每个fd的poll作排队。
我说的不停扫描是对epoll比较的,select需要扫描所有的fd的poll一遍,而epoll是不需要的。
|
这个楼主还必须注意一点就是防止sokect通讯失败,因为你频繁创建的时候都是针对一个端口的操作,当上一次的通讯句柄还没有被完全关闭的时候就来下一个sokect通讯,这样会造成有些通讯的失败,所以每次通讯要确保关闭通讯句柄,这样就会保证通讯的质量
|
复用最基本的就是select.
道理就是你socket建立多个连接,自然就有多个fd,select会不停扫描每个fd,发现有可读或者可写,就会进入相应的代码段。
跟switch差不多啦。
自己找个例子来照着用不就知道了。
更优秀的有epoll,不过比select复杂些。
道理就是你socket建立多个连接,自然就有多个fd,select会不停扫描每个fd,发现有可读或者可写,就会进入相应的代码段。
跟switch差不多啦。
自己找个例子来照着用不就知道了。
更优秀的有epoll,不过比select复杂些。
|
如果你是大四的学生,建议你还是打好基础再说,你问的那个已经属于比较高级的技术了,把数据结构和c的基础打好比什么都强。因为你还要考6级嘛。
|
那个REUSED 我看到的主要作用是这样的,比如你开了一个socket,并占用了某个端口。但你关闭连接的时候,那个端口不会马上空闲出来,可能哪个端口号要过一段时间才能够被新的socket来用。如果你setopt设置了端口复用REUSED,那么只要本次连接断开,端口就会马上空闲出来,而不需要等待多长时间才能用。
|
不用阻塞资源的那种模式
|
支持此说法!
|
好比一家10个人就一俩自行车,平时自行车就在那放着,家里有谁要用了,自行车就给谁用
|
学习,帮顶!
|
学习中、、、
|
有点难呀 帮楼主顶下 等牛人给你解答
|
过程大概差不多,linux下是把进程挂在设备对应的等待队列上的。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。