Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1113814
  • 博文数量: 175
  • 博客积分: 2743
  • 博客等级: 少校
  • 技术积分: 4024
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-30 01:41
文章分类

全部博文(175)

文章存档

2015年(1)

2013年(53)

2012年(71)

2011年(50)

分类: LINUX

2013-04-18 11:00:02

Linux 时间片调度

Linux 时间片调度

时间片,简单来说就是CPU分配给各个程序的时间,使各个程序从表面上看是同时进行的,而不会造成CPU资源浪费
在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但是在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。
在谈到时间片时用到最多概念是时间片轮转,时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法是时间片调度。每个进程被分配一个时间段,称作它 的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU 当即进行切换。调度程序所要做的就是维护一张就绪进程列表,,当进程用完它的时间片后,它被移到队列的末尾。
  时间片轮转调度中唯一有趣的一点是时间片的长度。从一个进程切换到另一个进程是需要一定时间的--保存和装入寄存器值及内存映像,更新各种表格和队列 等。假如进程切换(process switch) - 有时称为上下文切换(context switch),需要5毫秒,再假设时间片设为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费 在了管理开销上。
  为了提高CPU效率,我们可以将时间片设为500毫秒。这时浪费的时间只有1%。但考虑在一个分时系统中,如果有十个交互用户几乎同时按下回车键,将 发生什么情况?假设所有其他进程都用足它们的时间片的话,最后一个不幸的进程不得不等待5秒钟才获得运行机会。多数用户无法忍受一条简短命令要5秒钟才能 做出响应。同样的问题在一台支持多道程序的个人计算机上也会发生。
从这我们可以看出,时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。将时间片设为100毫秒通常是一个比较合理的折衷。
在linux内核中,最接近实际用户的明显抽象是文件系统,我们很容易能够利用 open() 等几个系统调用编写一段程序打开一个文件并将它的内容拷贝到标准输出。内核通过这些系统调用为用户提供了一个文件的 " 错觉 " ,而实际上它不过是一堆数据有了个名字,这样一来就不必去与硬件底层的堆栈、分区和指针等交涉,这也就是我们经常所说的抽象 (abstraction) ,将底层的东西以更易懂的方式表达出来。
文件系统是内核提供的比较明显的一种抽象,我们可以说它是位于台前的,而相对还有一些是位于幕后的,比如进程调度。在 linux 上,任何 一个时间,都可能有好几个进程或者程序等待着运行。内核的时间调度给每个进程分配 CPU 时间,所以就一段时间内来说,我们会有种错觉:电脑同一时间运行好几个程序。
再比如另外一个位于幕后的内存管理,幕后到应用开发者都不易察觉的地步。每个程序运行得都好像它有个自己的地址空间来调用一样,实际上它跟其他进程一样共 享计算机的物理存储。内存管理的另外一个方面是防止一个进程访问其他进程的地址空间 —— 对于多进程操作系统来说这是很必要的一个防范措施。
当然位于台前幕后的还有其他的角色,比如网络等。
linux下的时间片是固定的,大约200ms,所有线程形成一个队列,一个线程的时间片用完了就到队尾再排队(默认相同优先级的情况)。
我想知道的是当一个线程在调用函数过程中(有些是实时的函数),如果时间片用完了
2.4内核中,内核无法抢占,只有在用户空间高优先级任务可以抢占低优先级任务(给当前任务设置need_resched标志),而抢占时机只会发生在中 断处理程序或系统调用后返回用户空间时。而发生最频繁的时间中断每10ms一次(100Hz),因此理想情况下,2.4内核中任务响应时间最高可以快到 10ms内(这种情况要求任务仅仅在用户空间运行,没有不希望的中断打断任务,没有运行内核程序,如系统调用等);在优先级相同的情况下,新任务需要等到 当前进程时间片用尽后才能被调度,而一般进程的时间片为20个时钟节拍(210ms)左右,因此这时的响应时间大致需要200ms左右。 
    到了2.6内核后,系统允许内核抢占。抢占时机为从中断处理程序返回内核空间的时候(注意,2.4版本是返回用户空间时),而且因为时钟中断频率提到到 1000Hz,所以多数任务的响应时间可以接近1ms,不管任务此刻运行在哪个空间。 这样一来,似的任务的普遍响应时间都缩短了数倍,因此2.6内核相比以前具有更高的响应速度。 
    注意上面谈到的响应时间多数指理想情况下的估算值,对于Linux这种非确定系统来说,实际的响应时间往往取决很多环境因素,至于如何提高响应时间或保证响应时间的确定性,请看有关实时的文章。...

阅读(6480) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~