条件有问题吧,时钟中断的间隔是10ms,那么如果进程A在开始运行后的10ms时间内,CPU除了运行A进程之外在这段时间内什么都不会做,因为系统没有更小的时间粒度了。所以条件中的A进程开始执行后的6ms这个时间点,对这个系统来说是不存在的。
guocslock 发表于 2011-06-24 17:40
可抢占时OS可以强行切换进程;协作时,除非进程自愿放弃CPU,不然可以一直执行到底。可抢占时,进程切换契机一般是中断返回时,不一定非是时钟中断。至于具体细节,那就依赖于实现了。最简单的实现:所有中断返回时执行同一段代码,代码扫描所有存在的进程描述符,如果找到比当前进程优先级更高的进程,切换之。
tempname2 发表于 2011-06-24 23:00
我能想到的一个进程从挂起(阻塞,睡眠等等)变成就绪可能有两种情况:1)A创建了B;2)B等待的资源被释放了。
第一种情况,内核肯定知道B被创建了而且优先级高于A。那么问题其实就不存在了。
第二种情况,由于这个时候cpu一直是被A占用,所以要么是A释放了资源了,要么是硬件释放了资源(中断)。这时问题就变为在释放资源的时候是否要进行一次调度,如果调度就是方案1,如果不调度就是方案2.所以问题也就不存在了
为什么删我贴 发表于 2011-06-30 12:06
你觉得?你觉得进程 A 不通过内核怎么有能力自己创建进程 B?这是不是最基本
的常识?既然创建进程需要通过内核,如果新创建的进程优先级更高,内核怎么会
不知道?事实上,Linux 进程模型的实现是把子进程挂在父进程所在优先级的 run
queue 上,代码调用的层次大概是:do_fork() 先调用 copy_process() 复制一份
进程描述子为子,进行一系列初始化之后,最终会调到 wake_up_new_task(),这
个函数负责把子进程挂到适当的 run queue 上。
vupiggy 发表于 2011-07-03 02:08
你认为?认为个屁。如果您肯屈尊区读一下 Linux 的代码就知道,如果不复制 VM,
内核让子进程先运行,为了避免可能不必要的 Copy On Write。看函数
wake_up_new_task():
vupiggy 发表于 2011-07-03 02:08
释放?你确信你了解``释放''的含义?你以为进程访问完资源以后悄无声息地离开
就叫做释放?如果这事儿真发生鸟,只能说明这部分负责共享资源的同步代码有大
虫子了。释放必然伴随一个唤醒过程,或唤醒一个指定(阻塞在该资源上的)进程,
或唤醒一整个 wait queue。阻塞的进程一般都是通过将进程状态指定为
TASK_INTERRUPTIBLE 或 TASK_UNINTERRUPTIBLE,然后调 schedule(),在这个函数
里进程被从 run queue 上拎走,如果没有其它代码显式地唤醒它重新把它挂入
run queue,这个进程就不可能再有任何机会运行了。
vupiggy 发表于 2011-07-03 02:08
Read The Fxxking Code!而不是在脑袋里玩弄那些含混不清的概念,还觉得自
己理解得挺透彻。从那个自旋锁的帖子就可以看出来,你根本就不爱读代码理解代码,
叫别人怎么跟你讨论?
vupiggy 发表于 2011-07-03 02:08
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |