关于Linux非实时进程执行机会的疑问
本帖最后由 _nosay 于 2015-12-17 15:45 编辑《Linux内核源代码情景分析》“4.6进程的调度与切换”一节,对于进程的调度策略,有如下疑问,希望好心人帮助解答:
1. 《Linux内核源代码情景分析》372页:“由于实时进程的权值有个很大的基数,当有实时进程就绪时非实时进程是没有机会运行的”。
这样的话,如果系统中一直有实时进程在运行,那非实时进程不就“卡死”了吗?虽然对非实时进程的时间要求不高,但至少可以结束呀。是我对“实时”这个概念理解的不对吗{:yxh6:} ?
《深入理解linux内核》(第三中文版)里面举了例子:
交互式进程:shell、文本编辑程序、图形应用程序;
批处理进程:编译器程序、数据库搜索引擎及科学计算;
实时进程:音频/视频应用程序、机器人控制程序、数据采集程序。
这里的交互式进程、批处理进程、实时进程,应该会分别使用 SCHED_FIFO、SCHED_OTHER、SCHED_RR 调度策略吧?那我如果正在听歌,想编译个程序,就必须把音乐播放器关掉吗(你不会真的回答这个问题吧{:yxh97:} ),请问编译器为什么就非实时了,那又如何理解“当有实时进程就绪时非实时进程是没有机会运行的”?
2. SCHED_OTHER、SCHED_FIFO、SCHED_RR 判别
Linux2.4.0的代码中,只搜索到md_thread()函数中有一行“current->policy = SCHED_OTHER”,并没有搜到“current->policy = SCHED_RR”、“current->policy = SCHED_FIFO”,那调度策略不是内核自己判别的吗?
虽然内核提供了sched_setscheduler()系统调用,用户进程可以设置自己的调度策略,那平时自己写代码,以及网上那么多开源代码,几乎不调用这个函数呀,大多数用户程序开发程序员,可能听都没听说过“调度策略”,内核如果自己不判断,怎么保证进程使用合适的调度策略,怎么能合理调度?另外,这个函数的实现在哪?只在syscall.S的系统调用表里搜到“ENTRY_SAME(sched_setscheduler)” {:yxh22:} 。
总结:
1. 适合进程的调度策略,内核是否可以判别,如何判别?
2. 死循环的高优先级进程,是否会导致低优先级进程“卡死”?
http: //blog.chinaunix.net/uid-24774106-id-3372932.html
http: //blog.chinaunix.net/uid-24774106-id-3379478.html 如果只有一个core,如果有rt实时进程在run,根本就没有机会在shell里启动新的普通进程。
不过高版本的内核调度器里有个参数,可以限定rt进程的运行时间,不至于完全挤压非rt进程。 本帖最后由 _nosay 于 2015-12-15 09:12 编辑
nswcfd 发表于 2015-12-14 17:27 static/image/common/back.gif
如果只有一个core,如果有rt实时进程在run,根本就没有机会在shell里启动新的普通进程。
不过高版本的内 ...
一个进程到底是用户交互进程,还是批处理进程,还是实时进程,不是内核动态判断出来的吗?虽然内核提供了设置调度策略的系统调用,但平时我们写程序,也不怎么用呀。
《深入理解linux内核》(第三中文版)里面举了例子:
交互式进程:shell、文本编辑程序、图形应用程序;
批处理进程:编译程序、数据库搜索引擎及科学计算;
实时进程:音频/视频应用程序、机器人控制程序、数据采集程序。
为什么编译程序运行之后属于批处理进程?那为什么我平时一边听歌,一边可以编译程序?按道理在实时进程结束之前,批处理进程优先级低,是没有机会得到执行的呀 {:yxh22:} 。
页:
[1]