我读过DOS是单任务操作系统。

但是如果Windows的旧版本(还包括Windows 95?)只是DOS的包装,那么Windows怎么能作为多任务OS运行? >

评论

这称为抢先式多任务处理-support.microsoft.com/kb/117567

您将必须定义比这更好的“旧”字。在这方面,“ 386增强模式”下的DOS + Windows 9x和DOS + Windows 3.x与“标准模式”和“实模式”下的DOS + Windows 3.x / 2.x完全不同。乔伊维蒂(joeqwerty)暗示,合作的多任务处理和前瞻性的合作。整本书都已经写过,所以一个特定的问题更好。

@joeqwerty最令人敬畏的IMO是Microsoft将有关如此古老的软件的文档保持在线状态。甚至有关于旧版MS-DOS上的高级主题的文章...真的很不​​错,可以保持这种状态。

DOS不会给您多任务处理。您仍然可以在没有DOS的帮助下在其之上编写完全多任务的程序,这是早期Windows所做的。 Windows 95当然不仅是DOS的“包装器”。

@NigelNquande我实际上发现MS在维护旧文档方面相当不错。他们大部分已淘汰的KB文章在线(例如,随机的Windows 3.1 KB或Windows 2.1-3.0的打印实用程序上的文档,或MS-DOS 5.0的ansi.sys),即使他们声明了12个月的最终期限,生命宽限期。它不像有效的产品文档那样容易浏览,您必须在搜索中进行具体说明。

#1 楼

Windows 95
Windows 95远远不只是MS-DOS的“包装器”。引用Raymond Chen:

MS-DOS在Windows 95中有两个用途。

它用作引导加载程序。
它用作16位旧式设备。驱动程序层。Windows 95实际上实际上钩住/覆盖了几乎所有的MS-DOS,在进行所有繁重的工作时将其保留为兼容层。它还为32位程序实现了抢先式多任务处理。桥16和32,但在这里我们将忽略它),它们更多地依赖于DOS,并且仅使用协作式多任务处理-这是它们不强制正在运行的程序退出的那一种;他们等待正在运行的程序产生控制权(基本上,通过告诉OS运行正在等待的下一个程序来说“我完成了”)。

多任务协作,就像旧版本的MacOS(尽管与多任务DOS 4.x不同,后者具有抢先式多任务功能)。任务必须屈服于OS才能安排其他任务。收益内置于某些API调用中,尤其是消息处理。只要任务能够及时处理消息,一切就很好。如果任务停止处理消息并忙于执行某些处理循环,则不再需要多任务处理。

Windows 3.x体系结构
关于早期Windows程序如何产生控制权:

Windows 3.1使用协作式多任务处理-意味着正在运行的每个应用程序都被指示定期检查消息队列,以查找是否有其他任何应用程序正在请求使用CPU,如果需要,则对该应用程序进行控制。但是,许多Windows 3.1应用程序只会很少或根本不检查消息队列,并在所需的时间内独占CPU的控制权。像Windows 95这样的抢占式多任务处理系统将把CPU控制权从正在运行的应用程序夺走,并根据系统的需求将其分配给优先级更高的应用程序。

source
所有DOS都会看到该单个应用程序(Windows或其他)正在运行,它将在不退出的情况下传递控制权。从理论上讲,抢占式多任务处理可以通过使用实时时钟和硬件中断在DOS之上实现,以强制将控制权交给调度程序。正如Tonny所说,这实际上是由某些在DOS之上运行的操作系统完成的。
386增强模式?并支持抢先式多任务处理。
这是一个有趣的案例。总结链接的博客文章,386增强模式基本上是运行虚拟机的32位管理程序。在其中一个虚拟机中运行的是Windows 3.x标准模式,它执行上面列出的所有操作。增强模式管理程序将在虚拟机之间共享CPU时间片(其中一个运行正常的3.x,另一个运行MS-DOS),每个VM都将做自己的事情-3.x将协作执行多任务,而MS-DOS将是单任务的。

MS-DOS
DOS本身是单任务的,但是它确实支持TSR程序,该程序将一直在后台运行,直到被硬件中断触发为止。远非真正的多任务处理,但也不是完全单任务处理。

所有这些关于位的话题?我问了多任务处理!
严格来说,位和多任务处理不是相互依赖的。最好以任何位方式实现任何多任务处理模式。但是,从16位处理器升级到32位处理器还引入了其他硬件功能,这些功能可以使抢占式多任务处理更容易实现。
此外,由于32位程序是新的,因此更容易实现当它们被强制关闭时可以正常工作-可能破坏了一些旧的16位程序。
当然,这全都是猜测。如果您真的想知道为什么MS在Windows 3.x中没有实现抢先式多任务处理(尽管有386增强模式),则必须问一个在那里工作的人。
我也想纠正您的假设, Windows 95是DOS的包装;)

评论


非常好的写作。如果我没记错的话(对我来说,OS设计课是很多年前的事情了),Windows 9x钩住了定时器中断来强制执行自己的调度程序,就像您在第二至第二段中所建议的那样。在DOS之上还有其他操作系统也做了相同的事情。我清楚地记得ADOS(用于工业应用程序的实时操作系统)和XINU(用于教育目的的小型Unix / Posix之类的操作系统)都基于DOS。 (AMX也可以直接从EPROM运行裸机。在DOS上运行时,测试/调试要容易得多。避免了每次测试重新刻录EPROMS的麻烦。)

–Tonny
2014年8月8日15:51

@Tonny感谢您确认该方案是可行的(并已在实践中使用)。猜测一下,Windows 1-3不使用抢占式多任务处理的原因并不是很多,他们不能这样做(MS-DOS 4拥有它,尽管尚未发布),但是它与DOS的向后兼容性不兼容。程式。

–鲍勃
2014年8月8日15:58



Mmmmhhh考虑Windows 1-3:这是8086 CPU和更高版本的通用代码库,可能与它有更多关系。只有80286及更高版本才能正确处理ring0-3,而这正是Win9x用于实现多任务处理的方式。 4DOS和其他操作系统已经在DOS上提供了有限的多任务处理(如果我没记错的话,需要80286)。您甚至可以在4DOS中将Win3本身作为单独的进程运行。

–Tonny
2014年8月8日21:41

Xinu确实没有在DOS之上运行。毕竟,它始于LSI-11操作系统。 DOS + Windows 3.x中没有预防性多任务处理的说法是错误的。在386增强模式下,由VMM提供。而且关于4DOS的胡说八道为您提供了一个常见的答案:4DOS不是操作系统。声明它提供多任务处理是完全错误的。

– JdeBP
2014年9月9日在2:45

PDP-8支持抢先式多任务处理,这只是一台12位计算机。

– david25272
2014-03-10 0:47



#2 楼

它连续运行一个程序,称为Windows。那个会在不同程序之间分配CPU时间(和其他资源)。

考虑这个比喻:这个人称为“先生或小姐DOS”。那个人当时在做一件事情。例如。它会给一个人打电话并开始与他/她24/7聊天。

现在您将其替换为秘书先生。 (视窗)。它将给某人打电话并一直与之交谈(仍然是一项任务)。然后一段时间后,另一个人会说:“我到目前为止已经聊够了。去和别人聊天,再给我回电话”。

先生。秘书将呼叫另一个人。与那个人聊天,直到那个人说同样的话。然后它将呼叫下一个人,直到它在与之交谈的人的列表的末尾。届时它将再次从顶部开始。


从技术上讲,这称为协作多任务处理。它要求其他人说他/她有足够的CPU时间。如果不这样做,那么一切都会崩溃。
现代系统要聪明得多。包括抢先式多任务处理。想想秘书设置一个闹钟,并在5分钟后切断另一个人的电话。 “太好了,简。但我现在必须和乔谈谈。我会再打给您。-单击。”

如果添加多个处理器,它将变得更加复杂。 :)

评论


您的意思不是说合作/非抢占式多任务处理吗?同样,有趣的是,Windows 95引入了针对32位程序的抢占式多任务处理。它不是DOS的包装器,而是一个使用DOS作为引导加载程序但替换了它的主要部分的操作系统(保留足够的空间来支持16位/ DOS程序)。

–鲍勃
2014年8月8日14:52

先生或小姐,为什么不选“博士” DOS?

–gtrak
2014年3月10日20:25

“它连续运行一个程序……该程序分散了不同程序之间的CPU时间(和其他资源)。”不能说任何操作系统吗?尽管该问题暗示MS-DOS无法。在废弃技术的技术细节时,我强烈反对类比/隐喻。好了,现在我们知道一些假设的办公室如何运作了?这并不能真正解释问题的答案。

– Celeletas
2014年3月12日上午8:32

#3 楼

在现代操作系统中,操作系统控制所有硬件资源,并且正在运行的应用程序保存在沙箱中。不允许应用程序访问操作系统尚未分配给该应用程序的内存,并且该应用程序不能直接访问计算机中的硬件设备。如果需要硬件访问,则应用程序必须通过设备驱动程序进行通信。

OS可以强制执行此控制,因为它会强制CPU进入保护模式。另一方面,DOS永远不会进入保护模式,而是保持在实模式*。在实模式下,正在运行的应用程序可以执行其想要执行的任何操作,例如直接访问硬件。但是,以实模式运行的应用程序也可以告诉CPU进入保护模式。

最后一部分允许Windows 95之类的应用程序启动多线程环境,即使它们基本上是从DOS启动的。 br />
DOS(磁盘操作系统),afaik,只不过是文件管理系统而已。它提供了一个文件系统,用于导航文件系统的机制,一些工具以及启动应用程序的可能性。它还确实允许某些应用程序保持常驻状态,例如鼠标驱动程序和EMM模拟器。但是它并没有像现代OS那样尝试控制计算机中的硬件。直到80年代中期的80286处理器才成为保护模式的一部分。

评论


请注意,当时CPU还没有保护模式之类的东西。

– jwenting
2014年3月11日10:21

@jwenting-好的,我添加了一条注释

– Pete
2014年3月11日上午10:54

#4 楼

在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的干预;其他所有内容将合并到下一个计时器刻度。

相比之下,虚拟化图形模式将要求DeskView捕获每个单独的写操作以显示内存或I / O寄存器。考虑到这将使内存写入速度降低大约100倍,并且图形程序必须比文本程序写入更多的数据,因此大多数图形软件的实时虚拟化是不切实际的。取而代之的是,通过使任何试图使图形停止运行的非前台应用程序暂停,直到它成为前台应用程序,然后完全控制屏幕,来处理图形。当控制切换到另一个应用程序时,DesqView将尝试复制所有图形寄存器的状态,然后进行切换。切换回图形应用程序后,DesqView将恢复保存的状态。

在某种程度上,多任务非图形DOS应用程序比多任务Windows应用程序更容易,因为共享资源很少,并且应用程序之间无需交互。相比之下,在Windows中,有必要处理诸如剪贴板之类的东西,或者一个程序的窗口可能以掩盖另一个程序的方式移动的可能性。 Windows 95是Windows的第一个版本,它可以通过包含诸如窗口系统之类的东西来克服这些限制,该窗口系统可以容纳在代码尝试绘制到屏幕区域时不可用的屏幕区域(其结果是图形将被屏蔽掉)。

评论


感谢您提醒我有关DesqView的信息。我曾经一直使用它,但是完全忘记了它。

– Emet
2014年3月11日19:19

#5 楼

多任务仅是同时运行应用程序的错觉。它被认为是在您端同时执行,但实际上进程A,B和C按以下顺序共享CPU时间:A,B,C,A,B,C,A,B ...它们只是打开并起飞很快。实际上,没有两个进程同时运行。首先,跳回到第一个,依此类推。

多任务只是当CPU开始足够快地保持这些进程的旋转速度并使其在最终用户看来是同步的时候开发的一项巧妙功能。

对于那些记得的人,由于Windows太慢了,游戏仍在DOS4GW上运行。

评论


到目前为止,在大多数情况下,这仍然是操作系统中工作的方式。例如,这就是为什么您可以在4核CPU上“同时”运行10件事的原因。

– jwenting
2014年11月11日10:22

并不是说“ CPU开始足够快”。可以在286上运行多用户多任务操作系统(例如Mark Williams Company的Coherent,这是1983年引入PC的高级OS)。直到(甚至包括)“ Millenium”之前的MS-DOS和Windows(非NT)版本确实对任何客观标准(甚至是当时的技术标准)都表现不佳,但是一旦IBM将MS-DOS确立为PC标准,微软的营销和发展势头(更不用说滥用其垄断权的行为了)在很长一段时间内实际上排除了更好的竞争。

– Emet
2014年11月11日19:33

“当CPU开始足够快时,多任务只是一项聪明的功能……”您的意思是像Apollo制导计算机是一种多任务设计一样吗?

–用户
2014年3月13日上午10:50

当我说“ CPU”时,是指批量生产的处理器;当我说“多任务”时,是指PC应用程序的多任务。最后,“最终用户”是指PC背后的孩子,而不是宇航员。尽管如此,还是对有趣的评论表示敬意。

–丹·霍瓦特(Dan Horvat)
2014年3月13日14:18



#6 楼

即使它只能专注于一项任务,它所要做的只是一个快速地从一项转到另一项的简单步骤。这样看来,它是多任务的,但实际上,它只关注1,然后关注另一个,然后关注另一个,等等。

评论


您正在将多任务与多处理器计算混为一谈。在计算机世界中,在多个任务之间快速切换是多任务处理。通常的定义不需要并行执行。各种“旧版本的Windows”在执行多任务处理时的方式有所不同,具体取决于哪个版本的Windows,运行哪种模式以及首先是否基于DOS。 (Windows NT 3.1比DOS + Windows 95早,并且可以执行SMP。)正如我在另一条评论中指出的那样,整本书都已写过。那确实不是最好的两句话总结。

– JdeBP
2014年9月9日,3:12

@JdeBP ...我知道多任务和多处理器之间的区别,因为我主要还是使用单核处理器!计算机串行工作。真正的并行只能在量子计算中看到。

–牙齿
2014年3月25日6:09

#7 楼

我在这里没有提到的一件事很有趣:

Windows 3.0不是抢先式多任务处理系统,它像Mac OS之前的所有版本一样可以协同工作,直到OS X –一个应用程序

评论员提醒我,DOS应用程序的任务很多。这是因为它们不是写给“协作地”执行多任务的(必须始终将其内置到使用它的系统中)。

当时有称为TSR(永久居留)的程序。取代了当今的设备驱动程序。这些驱动程序将独立运行-通常通过将自己插入操作系统的事件处理程序之一来在自己的线程上运行。 Windows通常不了解它们,它们的运行级别较低。驱动程序等。虽然Windows 3.1是多任务处理,但DOS不是,但Windows 3.1只是将dos推开了,并在启动时接管了(回头时,您通常从DOS提示符)。

评论


在386或更高版本的处理器上运行时,Windows 3.0支持DOS应用程序的抢先式多任务处理。只有Windows应用程序可以协同执行多任务。

–法律
2014年3月11日17:33

哦,是的,我当时在编写Windows应用程序的代码,却没有真正考虑过DOS。它确实以不同的方式对待DOS应用程序-感谢您指出这一点。

– Bill K
14 Mar 12 '14 at 0:33