返回信息流☆─────────────────────────────────────☆
wei04 (ldw04) 于 (Mon Mar 9 21:04:21 2009) 提到:
在ldd3,poll函数编写那块,遇到一个问题:
如果两个不同的线程分别对同样一个设备(通过不同文件描述符)进行poll操作,如果线程A在poll返回后,说明可读(可写),然后调用 read(write)调用,那么此时I/O操作不会阻塞,但是假设就在poll与read这段空隙内,线程B也开始对设备进行poll操作(此时线程A 的poll函数已经释放锁),然后进入I/O操作,这时无论A和B线程哪个先进行,如果耗尽了设备的缓冲,那么必然还是会导致其中一个线程的I/O阻塞,这样POLL的作用就等于没有了。。。(我理解的是poll的作用是让后续的I/O函数能够无阻塞运行)。
不知道我理解的对不对,请大家指点一下。[em17]
☆─────────────────────────────────────☆
windam (棒棒糖) 于 (Mon Mar 9 21:40:21 2009) 提到:
如果你的设备是独占的,这样也不会出什么问题啊。
等B读完了,A自然就被唤醒了啊。
☆─────────────────────────────────────☆
wei04 (ldw04) 于 (Mon Mar 9 23:23:16 2009) 提到:
这是通用的,不是独占的
【 在 windam 的大作中提到: 】
: 如果你的设备是独占的,这样也不会出什么问题啊。
: 等B读完了,A自然就被唤醒了啊。
☆─────────────────────────────────────☆
CNLAS (愛すべきもの) 于 (Wed Mar 11 01:12:53 2009) 提到:
首先...lz看的是ldd3,ldd3是教你怎么自己去实现一个驱动的poll的...
ldd是让你写驱动支持poll然后由上层调用,
所有的锁机制实现是在上层的select() poll()里实现的
举例很简单的例子,
你完全可以在用户态起两个进程在不加锁的情况下去同时读写一个文件,根据缓冲区大小不同,可能出现也可能不出现写入的顺序是乱的。
select/poll模式是为了多I/O复用设计的,所以常用用法还是会在底层阻塞,只不过这个阻塞是有timeout时间限制的,当有传入的fd_set有可用fd的时候就唤醒,但是标准中并没有给出是一次只唤醒一个进程还是唤醒等待队列中全部进程,不同的系统有着不同的实现。
(全部唤醒的方式叫thundering herd)
当timeout=0时的立即返回模式只是检查了一次状态,是不加入等待队列的,出现lz说的情况概率就更大了...
这个地方的锁从概念上说也是上层的锁,和驱动没有关系,是上层在读写这个设备时出现的冲突,而不是我这个设备在访问其他I/O的时候出现的冲突,所以锁管理交给上层。
当然这个冲突只存在于你设计的这个设备驱动是非独占的。
如果是独占的那么必然要在设备里做锁了。
这是一条镜像帖。来源:北邮人论坛 / soft-design / #34893同步于 2009/6/11
SoftDesign机器人发帖
[合集] 关于内核的poll函数的编写,有些地方不明白
FadeToBlack
2009/6/11镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。