我读到DOS是一个单任务操作系统。
但是,如果旧版本的Windows(还包括Windows 95?)仅仅是DOS的包装,那么Windows如何作为多任务OS运行?
print
实用程序文档,或MS-DOS 5.0的ansi.sys),即使在声明了12个月的终止日期之后生活宽限期。它不像有效的产品文档那样容易浏览,您必须在搜索中进行特定说明。
我读到DOS是一个单任务操作系统。
但是,如果旧版本的Windows(还包括Windows 95?)仅仅是DOS的包装,那么Windows如何作为多任务OS运行?
print
实用程序文档,或MS-DOS 5.0的ansi.sys),即使在声明了12个月的终止日期之后生活宽限期。它不像有效的产品文档那样容易浏览,您必须在搜索中进行特定说明。
Answers:
Windows 95 远远不只是MS-DOS的“包装”。引用雷蒙·陈:
MS-DOS在Windows 95中有两个作用。
- 它充当了引导加载程序。
- 它充当16位旧式设备驱动程序层。
Windows 95实际上几乎钩住/覆盖了所有MS-DOS,在进行所有繁重的工作时将其保留为兼容层。它还为32位程序实现了抢占式多任务处理。
Windows 3.x和更早的版本大多是16位的(Win32s除外,后者是将16和32桥接在一起的一种兼容层,但在这里我们将忽略它),它们更多地依赖于DOS,并且仅使用协作式多任务处理-他们不强迫正在运行的程序退出的程序;他们等待正在运行的程序产生控制权(基本上,通过告诉OS运行正在等待的下一个程序来说“我完成了”)。
多任务处理是协作的,就像在旧版本的MacOS中一样(尽管与多任务DOS 4.x不同,后者具有抢先式多任务处理)。一项任务必须让给OS,以便安排其他任务。收益内置于某些API调用中,尤其是消息处理。只要任务能够及时处理消息,一切就很好。如果任务停止处理消息并忙于执行某个处理循环,则不再需要多任务处理。
至于早期的Windows程序如何产生控制权:
Windows 3.1使用协作式多任务处理-意味着正在运行的每个应用程序都被指示定期检查消息队列,以查找是否有其他应用程序正在请求使用CPU,如果有,则请求对该应用程序进行控制。但是,许多Windows 3.1应用程序只会很少或根本不检查消息队列,并在所需的时间内独占CPU的控制权。像Windows 95这样的抢占式多任务处理系统将使CPU失去对正在运行的应用程序的控制,并根据系统需求将其分配给优先级更高的应用程序。
DOS只会看到此单个应用程序(Windows或其他)正在运行,它将在不退出的情况下传递控制权。从理论上讲,抢占式多任务处理可以通过使用实时时钟和硬件中断在DOS之上实现,以强制将控制权交给调度程序。正如Tonny所言,这实际上是由在DOS之上运行的某些操作系统完成的。
注意:关于Windows 3.x的386增强模式(32位并支持抢先式多任务处理)已有一些评论。
这是一个有趣的案例。总结链接的博客文章,386增强模式基本上是运行虚拟机的32位管理程序。在其中一个虚拟机中运行Windows 3.x标准模式,该模式执行上述所有操作。
MS-DOS也将在这些虚拟机中运行,并且显然它们是抢先式多任务处理-因此,似乎386增强模式虚拟机监控程序将在虚拟机之间共享CPU时间片(其中一个运行正常的3.x,另一个运行MS。 -DOS),每个VM都会做自己的事情-3.x将协同执行多任务,而MS-DOS将是单任务。
DOS本身是单任务的,但是它确实支持TSR程序,该程序将一直在后台运行,直到被硬件中断触发为止。远非真正的多任务处理,但也不是完全单任务处理。
好吧,严格来说,位和多任务并不相互依赖。顶部应该以任何位方式实现任何多任务处理模式。但是,从16位处理器升级到32位处理器还引入了其他硬件功能,这些功能可以使抢先式多任务处理更易于实现。
另外,由于32位程序是新的,因此在强制退出时更容易使它们工作-这可能会破坏某些旧的16位程序。
当然,这全是猜测。如果您真的想知道为什么MS在Windows 3.x中没有实现抢占式多任务处理(尽管有386增强模式),则必须问一个在那里工作的人。
此外,我想更正您的假设Windows 95是DOS的包装;)
它连续运行一个程序,称为Windows。那分散了不同程序之间的CPU时间(和其他资源)。
考虑这个比喻:
您有一个办公室,当时只能有一个人(该人称为“先生或小姐DOS”)。那个人当时在做一件事情。例如,它给一个人打电话并开始与他/她24/7聊天。
现在,您将其替换为秘书先生。(视窗)。它会给某人打电话并一直与之交谈(仍然是一项任务)。然后,一段时间后,另一个人会说:“我到目前为止已经聊够了。去和别人聊天,然后再打给我”。
秘书先生将呼叫另一个人。与那个人聊天,直到那个人说同样的话。然后它将呼叫下一个人,直到它在与之交谈的人的列表的末尾。届时它将再次从顶部开始。
如果添加多个处理器,它将变得更加复杂。:)
在现代操作系统中,操作系统控制所有硬件资源,并且正在运行的应用程序保存在沙箱中。不允许应用程序访问操作系统尚未分配给该应用程序的内存,并且该应用程序不能直接访问计算机中的硬件设备。如果需要硬件访问,则应用程序必须通过设备驱动程序进行通信。
操作系统可以强制执行此控制,因为它可以强制CPU进入保护模式。
另一方面,DOS永远不会进入保护模式,而是保持在实模式 *。在实模式下,正在运行的应用程序可以执行其想要执行的任何操作,例如,直接访问硬件。但是,以实模式运行的应用程序也可以告诉CPU进入保护模式。
最后一部分允许Windows 95之类的应用程序启动多线程环境,即使它们基本上是从DOS启动的也是如此。
DOS(磁盘操作系统)的功能远不止于文件管理系统。它提供了文件系统,导航文件系统的机制,一些工具以及启动应用程序的可能性。它的确也允许某些应用程序驻留,例如鼠标驱动程序和EMM仿真器。但是,它没有像现代OS那样尝试控制计算机中的硬件。
*在70年代首次创建DOS时,CPU中不存在保护模式。直到80年代中期的80286处理器才成为保护模式的一部分。
在Windows 3.x(它是多任务DOS应用程序的第一个版本)之前,有DesqView之类的程序也可以这样做。如果其中一个例如一次运行三个DOS会话,则DesqView将创建四个虚拟机。三个DOS会话各自认为它们“拥有”了整个计算机,除了它们中的任何一个都不实际执行文件I / O。相反,将修补在每个会话中运行的DOS版本,以便它将对文件I / O的任何请求转发到专用于此目的的特殊会话。由于PC的文本模式硬件将连续以字符形式显示内存区域的内容;因此,通过将每个会话的0xB8000-0xB9FFF范围映射到自己的RAM区域,DesqView可以让每个会话拥有自己的虚拟屏幕,并定期将当前应用程序的区域复制到物理屏幕缓冲区。图形支持要困难得多,因为显示板上的256K RAM是使用64K的地址空间,一些I / O寄存器和一些“有趣的”硬件控制的,这些硬件需要按特定的特定顺序进行读写。在文本模式下,当应用程序向文本缓冲区中写入内容时,DesqView可以设置一个标志,指示应在下一个计时器刻度时将其复制到显示中;在给定的时间间隔内,只有第一次写入文本缓冲区才需要DesqView的干预;所有其他将合并到下一个计时器刻度。因为显示板上的256K RAM是使用64K的地址空间,一些I / O寄存器和一些“有趣的”硬件控制的,这些硬件需要按特定的特定顺序进行读写。在文本模式下,当应用程序向文本缓冲区中写入内容时,DesqView可以设置一个标志,指示应在下一个计时器刻度时将其复制到显示中;在给定的时间间隔内,只有第一次写入文本缓冲区才需要DesqView的干预;所有其他将合并到下一个计时器刻度。因为显示板上的256K RAM是使用64K的地址空间,一些I / O寄存器和一些“有趣的”硬件控制的,这些硬件需要按特定的特定顺序进行读写。在文本模式下,当应用程序向文本缓冲区中写入内容时,DesqView可以设置一个标志,指示应在下一个计时器刻度时将其复制到显示中;在给定的时间间隔内,只有第一次写入文本缓冲区才需要DesqView的干预;所有其他将合并到下一个计时器刻度。DesqView可以设置一个标志,指示应在下一个计时器刻度时将其复制到显示器上。在给定的时间间隔内,只有第一次写入文本缓冲区才需要DesqView的干预;所有其他将合并到下一个计时器刻度。DesqView可以设置一个标志,指示应在下一个计时器刻度时将其复制到显示器上。在给定的时间间隔内,只有第一次写入文本缓冲区才需要DesqView的干预;所有其他将合并到下一个计时器刻度。
相比之下,虚拟化图形模式将要求DeskView捕获每个单独的写操作以显示内存或I / O寄存器。鉴于这将使内存写入速度降低大约100倍,并且图形程序必须比文本程序写入更多的数据,因此大多数图形软件的实时虚拟化是不切实际的。取而代之的是,通过使任何试图使图形停止运行的非前台应用程序暂停,直到它成为前台应用程序,然后完全控制屏幕来处理图形。当控制切换到其他应用程序时,DesqView将尝试复制所有图形寄存器的状态,然后进行切换。切换回图形应用程序后,DesqView将恢复保存的状态。
从某种意义上说,多任务非图形DOS应用程序比多任务Windows应用程序容易,因为共享资源很少,而且应用程序之间不必交互。相比之下,在Windows中,有必要处理诸如剪贴板之类的东西,或者一个程序的窗口可能以掩盖另一个程序的方式移动的可能性。Windows 95是Windows的第一个版本,可以通过包含诸如窗口系统之类的东西来克服这种限制,该窗口系统可以容纳在代码尝试绘制时无法显示屏幕区域的情况(其结果是图形被掩盖了) )。
多任务仅是同时运行应用程序的错觉。它被认为是在您端同时执行,但实际上进程A,B和C按以下顺序共享CPU时间:A,B,C,A,B,C,A,B ...它们只是打开并起飞很快。实际上没有两个进程同时运行。
因此,通过使其暂停一个进程,在短时间内运行下一个进程,暂停该进程,跳回到第一个进程,等等,来使MS-DOS多任务成为可能。
当CPU开始足够快以能够在这些进程中不断旋转并使最终用户看起来同时运行时,多任务只是一项聪明的功能。
对于那些记得的人来说,由于Windows太慢,因此仍在DOS4GW上运行游戏。
即使它只能专注于一项任务,它所要做的只是一个快速地从一项转到另一项的简单步骤。这样看来,它是多任务的,但实际上它只关注于1,然后关注于另一个,然后关注于另一个,等等。
我在这里没有提到的一件事很有趣:
Windows 3.0并非抢先式多任务处理系统,它像MacOS的所有版本一样可以协同工作,直到OS X为止-一个应用程序必须从通话中返回,然后其他任何应用程序才能采取任何措施。
正如评论员提醒我的那样,DOS应用程序的任务多种多样。这是因为没有将它们写入“合作地”多任务(必须始终将其内置到使用它的系统中)。
当时有称为TSR(永久居留)的程序代替了当今的设备驱动程序。这些驱动程序将独立运行-通常通过将自身插入操作系统的事件处理程序之一来在自己的线程上运行。Windows通常不了解它们,它们在较低级别运行。
这些并不是真正的Windows应用程序,而是所有线程活动在Windows 3.1之前发生的方式,例如打印机驱动程序,COM驱动程序等。
尽管Windows 3.1是多任务的,但DOS不是,但Windows 3.1只是将dos推开了,并在启动时接管了(然后,您通常从DOS提示符下启动Windows)。