sock编程中I/O复用机制

huangqinqin 2009-09-25 11:20:52
最近在编写一些sock程序,客户端和服务端要用到I/O复用机制,但对这个I/O复用不是很明白。
我真心请教各位。特别是这个复用,不是很懂
...全文
297 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
netxuning 2009-10-09
  • 打赏
  • 举报
回复
学习,帮顶!
wen287877566 2009-10-03
  • 打赏
  • 举报
回复
这个楼主还必须注意一点就是防止sokect通讯失败,因为你频繁创建的时候都是针对一个端口的操作,当上一次的通讯句柄还没有被完全关闭的时候就来下一个sokect通讯,这样会造成有些通讯的失败,所以每次通讯要确保关闭通讯句柄,这样就会保证通讯的质量
  • 打赏
  • 举报
回复
select会循环遍历它所监测的fd_set(一组文件描述符(fd)的集合)内的所有文件描述符对应的驱动程序的poll函数。驱动程序提供的poll函数首先会将调用select的用户进程插入到该设备驱动对应资源的等待队列(如读/写等待队列),然后返回一个bitmask告诉select当前资源哪些可用。当select循环遍历完所有fd_set内指定的文件描述符对应的poll函数后,如果没有一个资源可用(即没有一个文件可供操作),则select让该进程睡眠,一直等到有资源可用为止,进程被唤醒(或者timeout)继续往下执行。


select会遍历所有的fd,但是我不是指它是死循环。遍历是为了给每个fd的poll作排队。
我说的不停扫描是对epoll比较的,select需要扫描所有的fd的poll一遍,而epoll是不需要的。
csan 2009-09-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 guosha 的回复:]
不要从字面上去理解复用,
multiplexing的直接翻译意为多路技术。

为什么要用select?
因为你需要同时监控多个句柄是否可读或可写,而你又无法预料是哪一个句柄会先可读或可写。

select的机制?
我猜大致如下:
进程会调用select之后,内核会建立一个表,维护这个进程感兴趣的文件句柄,然后把进程置于挂起状态。任何一个句柄状态的变化都会引起一次中断,内核在处理这个中断的时候,就会查询哪个进程对这个句柄状态感兴趣,然后把相应的进程置为就绪态,也就表现为你的select返回了。对超时的处理也大致类似,会有时间中断。
[/Quote]

支持此说法!
rockefeller8 2009-09-30
  • 打赏
  • 举报
回复
不用阻塞资源的那种模式
windriver3 2009-09-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 guosha 的回复:]
不要从字面上去理解复用,
multiplexing的直接翻译意为多路技术。

为什么要用select?
因为你需要同时监控多个句柄是否可读或可写,而你又无法预料是哪一个句柄会先可读或可写。

select的机制?
我猜大致如下:
进程会调用select之后,内核会建立一个表,维护这个进程感兴趣的文件句柄,然后把进程置于挂起状态。任何一个句柄状态的变化都会引起一次中断,内核在处理这个中断的时候,就会查询哪个进程对这个句柄状态感兴趣,然后把相应的进程置为就绪态,也就表现为你的select返回了。对超时的处理也大致类似,会有时间中断。
[/Quote]过程大概差不多,linux下是把进程挂在设备对应的等待队列上的。
ruifengzhangyi2 2009-09-27
  • 打赏
  • 举报
回复
如果你是大四的学生,建议你还是打好基础再说,你问的那个已经属于比较高级的技术了,把数据结构和c的基础打好比什么都强。因为你还要考6级嘛。
HULIHONG 2009-09-27
  • 打赏
  • 举报
回复
顶一下,顺便学习。
wangzhanchuan 2009-09-27
  • 打赏
  • 举报
回复
如果一个或多个I/O条件满足(例如,输入已准备好被读,或者描述字可以承接更多的输出时)时,我们就被通知到,这个能力被称为I/O复用。
rzsheng 2009-09-27
  • 打赏
  • 举报
回复
来学习的
快乐田伯光 2009-09-27
  • 打赏
  • 举报
回复
不要从字面上去理解复用,
multiplexing的直接翻译意为多路技术。

为什么要用select?
因为你需要同时监控多个句柄是否可读或可写,而你又无法预料是哪一个句柄会先可读或可写。

select的机制?
我猜大致如下:
进程会调用select之后,内核会建立一个表,维护这个进程感兴趣的文件句柄,然后把进程置于挂起状态。任何一个句柄状态的变化都会引起一次中断,内核在处理这个中断的时候,就会查询哪个进程对这个句柄状态感兴趣,然后把相应的进程置为就绪态,也就表现为你的select返回了。对超时的处理也大致类似,会有时间中断。
huangqinqin 2009-09-27
  • 打赏
  • 举报
回复
那I/0 复用也就是:通过select决定谁用I/O 这个意思吗?
小菜_默 2009-09-26
  • 打赏
  • 举报
回复
学习中、、、
  • 打赏
  • 举报
回复
那个REUSED 我看到的主要作用是这样的,比如你开了一个socket,并占用了某个端口。但你关闭连接的时候,那个端口不会马上空闲出来,可能哪个端口号要过一段时间才能够被新的socket来用。如果你setopt设置了端口复用REUSED,那么只要本次连接断开,端口就会马上空闲出来,而不需要等待多长时间才能用。
yuelijun922 2009-09-26
  • 打赏
  • 举报
回复
好比一家10个人就一俩自行车,平时自行车就在那放着,家里有谁要用了,自行车就给谁用
快乐田伯光 2009-09-26
  • 打赏
  • 举报
回复
select肯定不是去不停的扫描啦,如果是不停的扫描跟死循环有什么差别?

[Quote=引用 3 楼 hairetz 的回复:]
复用最基本的就是select.
道理就是你socket建立多个连接,自然就有多个fd,select会不停扫描每个fd,发现有可读或者可写,就会进入相应的代码段。
跟switch差不多啦。

自己找个例子来照着用不就知道了。

更优秀的有epoll,不过比select复杂些。
[/Quote]
  • 打赏
  • 举报
回复
复用最基本的就是select.
道理就是你socket建立多个连接,自然就有多个fd,select会不停扫描每个fd,发现有可读或者可写,就会进入相应的代码段。
跟switch差不多啦。

自己找个例子来照着用不就知道了。

更优秀的有epoll,不过比select复杂些。
steptodream 2009-09-26
  • 打赏
  • 举报
回复
有点难呀 帮楼主顶下 等牛人给你解答

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧