LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: elephoenix

多个进程同时对一个文件用fwrite,fread读写

[复制链接]
发表于 2005-9-7 11:56:47 | 显示全部楼层
Post by sunmoon1997
fopen 等属于系统调用  是 open 吧。。。
不完成退出的话其它进程根本没机会运行 可抢占内核了?


我说的linux,至少2.6以前是这样,如果进程在系统空间可以被抢占,那linux的就是一个实时的内核。
回复 支持 反对

使用道具 举报

发表于 2005-9-7 12:18:06 | 显示全部楼层
Post by liqinliqin
我说的linux,至少2.6以前是这样,如果进程在系统空间可以被抢占,那linux的就是一个实时的内核。

这与实时内核有什么关系? 另外得出一个结论前可能随便假定吗?
回复 支持 反对

使用道具 举报

发表于 2005-9-8 00:30:24 | 显示全部楼层
Post by liqinliqin
我说的linux,至少2.6以前是这样,如果进程在系统空间可以被抢占,那linux的就是一个实时的内核。


注意你这句话和你的第一句话已经有差别了,先来看你的第一句话
你说
系统调用,不完成退出的话其它进程根本没机会运行


preemption分为两种
user preemption, kernel preemption

userp preemption里的一种情况是
当interrupt handler运行完,返回user space的时候
而且这种情况在2.4内核也是有的,在2.4里如果这个时候task_struct里need_resched被设置,那么scheduler就会被调用

最常见的interrupt就是timer interrupt
它发生的频率一般都是几百上千赫兹
也就是说一秒钟内就有这么次机会有可能发生preemption

你可以想一下
你写个程序,里面用个scanf,运行之后会停在scanf里,等你输入
这个时候实际上是在read()系统调用里
你不按回车read就不返回
但是这个时候,难道就不能做其他事情了么,放的歌会停么,浏览器不能打开网页么

所以2.4内核里你的第一句话也是不成立的

再看你的这句话
Post by liqinliqin
如果进程在系统空间可以被抢占,那linux的就是一个实时的内核。

kernel preemption,2.4内核好像确实是不可以的
但2.6是可以的,不过不是任何时候都可以,可以看看Linux kernel development相关章节
可Linux,至少vanilla source,不是实时内核
kernel preemption只是实时内核的必要条件
回复 支持 反对

使用道具 举报

发表于 2005-9-8 08:30:11 | 显示全部楼层
有些人是内核看多了看呆了。这种问题何必从内核上去理解呢?open(...)本来就可以以共享方式打开文件。根本不要去考虑什么抢断不抢断。
回复 支持 反对

使用道具 举报

发表于 2005-9-8 09:19:26 | 显示全部楼层

欢迎访问我的网站 www.myembed.com

Post by sunmoon1997
你可以想一下
你写个程序,里面用个scanf,运行之后会停在scanf里,等你输入
这个时候实际上是在read()系统调用里
你不按回车read就不返回
但是这个时候,难道就不能做其他事情了么,放的歌会停么,浏览器不能打开网页么

所以2.4内核里你的第一句话也是不成立的

这时read如果是阻塞调用的话,其它进程有机会运行,因为如果read不到输入,输入设备的驱动程序就会把进程状态置成阻塞,当有输入的时候唤醒阻塞进程。这种情况就如你所说的。

如果read是非阻塞调用的话,那其它进程没机会运行,这时浏览器不能打开网页。

所以在写相关设备驱动的时候一定要注意支持阻塞的 read,write.
欢迎访问我的网站 www.myembed.com
回复 支持 反对

使用道具 举报

发表于 2005-9-8 09:42:00 | 显示全部楼层
Post by liqinliqin

如果read是非阻塞调用的话,那其它进程没机会运行,这时浏览器不能打开网页

且不说non-blocking read会立即返回,而从系统调用返回用户空间也是user preemption可能发生的时机
就是在non-blocking read尚未返回的时候,难道就不发生一次timer interrupt么
回复 支持 反对

使用道具 举报

发表于 2005-9-8 09:53:40 | 显示全部楼层
中断如果不关闭肯定发生,但是处理完中断,又在系统空间轮询等待输入,
回复 支持 反对

使用道具 举报

发表于 2005-9-8 09:56:11 | 显示全部楼层
Post by liqinliqin
这时read如果是阻塞调用的话,其它进程有机会运行,因为如果read不到输入,输入设备的驱动程序就会把进程状态置成阻塞,当有输入的时候唤醒阻塞进程。

blocking, non-blocking是I/O相关系统调用的属性
interruptible, uninterruptible是进程状态的属性
不要搞混了

而且看来你还不理解interruptible的含义
只有处于TASK_RUNNING的进程才会被调度器分配到某个CPU上运行
TASK_INTERRUPTIBLE和TASK_UNINTERRUPT的进程是在等待某个I/O操作的完成,再其恢复TASK_RUNNING状态之前根本没有可能运行。系统中这两种状态的进程根本不会影响其他进程的运行,更遑论阻止其他进程的运行?
回复 支持 反对

使用道具 举报

发表于 2005-9-8 10:04:50 | 显示全部楼层
Post by liqinliqin
中断如果不关闭肯定发生,但是处理完中断,又在系统空间轮询等待输入,

我刚才是退一步讲的,前提不要忘了,non-blocking read会立即返回,2.4也是如此

你说的这个,在2.4的时候恐怕是这样
不过2.6里,处理完中断返回内核空间属于kernel preemption可能发生的一种时机,所以如果此时需要调度的话,原进程就只能被preempt掉了
回复 支持 反对

使用道具 举报

发表于 2005-9-8 15:25:57 | 显示全部楼层
你们在讨论什么的呀?!我怎么越看越糊涂呀!

能不能针对楼主提的问题给个较为详细、具体的解决方法和过程呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表