“抢先式”任务调度和时间片的问题(100分)

  • 主题发起人 主题发起人 savetime
  • 开始时间 开始时间
S

savetime

Unregistered / Unconfirmed
GUEST, unregistred user!
在 Windows95 之后,操作系统支持 抢先式 进程切换。每个进程以 20 毫秒的时间片运行。<br>我是奇怪操作系统如何能够控制 ring3 级应用程序的执行,并能在一个时间片之后切换。<br>我想像中一个应用程序执行时独占 CPU,并不会主动把控制权交还给操作系统。<br>是不是通过时钟中断进行任务切换的呢?但是时钟中断精度不能达到 20 毫秒。<br><br>谁给说说。
 
谁说时钟中断的精度不能达到20毫秒,<br>实际上可以比1毫秒更高,<br>你可以找一些时钟中断编程的例子看看<br>通常使用端口 0x40 - 0x43 来设定时钟中断频率<br><br>任务抢占调度主要是通过时钟中断来完成的<br>当然也可以由CPU的硬件来完成<br><br>任务切换时,保存一个任务的运行环境,<br>并切换到另一个任务的上下文
 
savetime记错了吧 精度不能达到 20 毫秒的那个是timer 不是时钟中断
 
在一本书上看到“系统的 clock chip 每 54.925 毫秒会对 CPU 做一次中断请求”。<br>还有其他的时钟中断吗?(“是timer 不是时钟中断”,有什么不同?)<br>初学 CPU,请多多指教!
 
时钟中断的频率是可以设置的,<br>你说的那个是最低的频率,理论上最高可以将周期缩短到<br>54.925/65536 毫秒的<br><br>不知道楼主是否明白了?<br><br>可以找一些时钟中断编程的例子看看(x86)<br><br>譬如:清华大学出版的 微机原理
 
楼主研究过RTLINUX吗,如果研究过,就会知道时间中断时可以设置的,并且可以控制的。<br>在WINDOWS系统中,应用程序能用到的时间中断,偶记得是滴答声,也就是NT内核10毫秒一个滴答声。你可以得到更小的滴答声,比如多媒体时钟。<br>但是,WINDOWS系统不是实时操作系统,你无法准确控制时间片,就算你的任务等级最高,WINDOWS也会分配给(渴求CPU时间片的)最低等级任务时间片的(也就是在某一时刻提高它的任务等级)。<br>所以,在WINDOWS操作系统中,如果不借助其它硬件完成,谈时间片是没有什么实际意义的。
 
我没有学过 RTLINUX,正开始学习 CPU 和 Windows 的关系。由于 WinNT 和 Linux<br>都可以运行在多种 CPU,我现在把焦点集中在 i386 上。<br><br>根据上面各位的介绍,我现在有以下判断:<br>时间中断间隔可以设置的(这点比较容易理解)。Windows 在 Ring0 级接管这个中断,<br>然后提供给 Win32 API 使用。<br><br>我比较关心的是:<br>Windows 95 接管了哪个硬件设备的时钟中断,是第几号中断。<br><br>刚才翻书看到以下描述:<br>IC 8253, 08H 中断,间隔 54.925 毫秒<br>IC 8284A,时钟发生器 (8086)<br>80186/80188 中有三个完全可编程的 16 位定时器。<br><br>SetTimer 函数的处理应该是 IC 8253,因为 WM_TIMER 的精度也是 54.925 毫秒;<br>那么对于 Windows 切换进程的时间片计时器是接管了哪个中断,使用哪个硬件呢?<br>
 
对不住,还没写完,不小心发出去了,等我一下。
 
可以看看486工作原理的书籍<br><br>以及保护模式和实模式,还有段页式内存管理<br>以前写过不少键盘中断和时钟中断的程序,<br>具体是几号中断倒是忘了,另外,除了普通的时钟中断外,<br>还有一个实时钟中断,可以控制计算机整点报时,或者定时唤醒
 
刚修改贴子, lich 已经回复了。<br><br>保护模式和实模式、页式内存管理及进程的 memory context,近来都有所了解。<br>既然 lich 已经指出操作系统是通过时钟中断控制时间切片来进行多任务操作,<br>所以我最后十分渴望知道时钟控制的硬件或中断号。
 
OS的编写必须要有硬件的紧密结合,否则毫无效率可言。<br>任务之间时间片切换,主要靠X86芯片硬件电路完成,OS提供算法和管理。windows的源代码很多核心就是intel公司提供的。我们一般所说的“时钟”,只不过是CMOS下的那个靠纽扣电池供电的石英钟,而CPU是靠时钟脉冲发生器芯片+倍频发生器来驱动的,两码事!!
 
to masm<br>我也觉得Windows在586以上是通过CPU的硬件功能来实现定时任务切换的<br>但没有看到这方面的文章,所以我还是倾向于使用时钟中断定时控制<br><br>你说的"时钟",是没有问题的,<br>操作系统用来定时中断的那个时钟并不是你说的那个时钟<br><br>除了普通的时钟中断之外,<br>你说的那个时钟是实时钟<br>它占有另外的中断号
 
必须用硬件电路来完成任务的切换,否则,光现场保护、恢复现场就得消耗很多代码和资源!cmos中的那个时钟主要是用来获取日常时间,系统应当不会用精度和效率这么差的时钟,CPU内部还有极高精度的“时钟脉冲”。有空去看看《保护模式下386/486系统汇编》这本书。
 
&gt;&gt;windows的源代码很多核心就是intel公司提供的<br>&gt;&gt;而CPU是靠时钟脉冲发生器芯片+倍频发生器来驱动的<br>&gt;&gt;CPU内部还有极高精度的“时钟脉冲”<br><br>那么 Linux 是如何实现时间片的分配的?<br>CPU 的 时钟脉冲 和 Windows 操作系统之间的接口是什么?
 
请教savetime :<br>如果我想让我的程序独占CPU该怎么处理?<br>也就是在指定的时间段内只有我的程序处于执行状态,知道我自己释放?
 
&gt;&gt; 独占CPU <br>哈,我也是刚学操作系统,不懂才在这里提问。<br>恐怕只有操作系统在 Ring0 级有这个能力吧。这正和我提的问题原理上差不多。<br>请知道的同志解惑。
 
你把进程优先级设置为最高,就可以独占CPU了,<br>只要你运行一个死循环,就死机了
 
如果设置为 REALTIME 的进程完全独占 CPU,那么为什么在进入死循环之前<br>仍然可以被操作系统切换至其他进程?<br><br>我一开始怀疑是应用程序中存在消息循环的原因,以为调用 PeekMessage 之后操<br>作系统可以判断应用程序需要的时间片,而进入死循环后 PeekMessage 就不能被<br>调用,所以死机。<br><br>但经过测试发现不是这样,我测试的循环段是这样的:<br>&nbsp; while True do<br>&nbsp; begin<br>&nbsp; &nbsp; Application.ProcessMessages;<br>&nbsp; &nbsp; Form1.Canvas.Brush.Color := Random(RGB(255, 255, 255));<br>&nbsp; &nbsp; Form1.Canvas.Rectangle(Random(100),Random(100),Random(100),Random(100));<br>&nbsp; end;<br><br>没有通过 API 进入 REALTIME,而是用命令行启动: start /realtime project1.exe<br>测试环境是 WindowsXP。<br><br>这究竟是什么原因?
 
大家有一个误解:Linux是免费的。其实大错特错!!Linux的核心部分不是免费的,系统外围才是免费的、开放源代码的!!!只占系统的一小部分。<br>Linux的核心照样也要Intel或IBM、SUN等芯片厂商的参与。照样收取费用!
 
&gt;&gt;Linux的核心部分不是免费的,系统外围才是免费的、开放源代码的!!!<br>Linux 的核心当然是免费而且开放源代码的。随便买一张 Linux CD 或从<br>www.kernel.org 都可以找到。<br><br>&gt;&gt;Linux的核心照样也要Intel或IBM、SUN等芯片厂商的参与。照样收取费用!<br>应该是 Intel/IBM/Sun 愿意参与到针对 Linux 的开发。<br><br>看过 Linux 发展史的人应该明白 Linux Kernel 确实是 Linus 从头在 i386sx<br>电脑上开发的,我不太相信 Linux 使用了一些特别(秘密)的 CPU 技术。
 
后退
顶部