DOS如何同时执行多个进程?

9

DOS经常被用作单任务操作系统的例子。然而,当通过命令行发出命令时,控制从shell切换到命令,完成后又切换回shell。因此,存在两个同时执行的进程。请问我的理解有什么问题吗?

3个回答

7
不,它们并不是同时执行的。 COMMAND.COM有一个常驻部分一直在内存中,并且有一个可以随时丢弃的短暂部分。
当你运行一个程序时,它通常会被加载到短暂部分的位置并运行。当程序退出时,它会调用常驻部分中的代码来重新加载必要的短暂部分并继续执行。
一些代码保留在内存中并不意味着它们正在“运行”。同样地,许多MS-DOS(内核)保持在内存中,但它们并没有“运行”,除非被非内核程序显式调用。
现在有一些东西可以说是并发运行的,在DOS中有大量的TSR(terminate and stay resident)程序,它们会运行,挂接到某个中断或以某种方式挂接到DOS,然后退出,但保留了一些内存(存放其代码的地方)。
然后,对于某些事件,该代码将被运行。也许最著名的之一是Borland Sidekick,这是一个个人信息管理器,只需按下一个键即可立即弹出。

5

当其他进程正在运行时,命令行处理器不会运行:它是被挂起的。在DOS中唯一可用的“多任务处理”设施是“终止并驻留”


1
实际上,把它们描述为“进程”甚至都不正确。一个进程必须拥有执行上下文。(而DOS最接近的多处理技术是其后台打印功能。) - David Schwartz

2
无论你在那个处理器上运行DOS、Windows、Linux、BSD或其他操作系统,都一样。在讨论的这个时期,你只有一个执行单元,一个核心执行指令,大部分按顺序执行。这些指令无论是DOS、Linux还是Windows的名称都没有区别,都只是指令。
就像现在与过去一样,当Windows程序决定终止时,它会尝试使用某种退出调用以正常方式结束。当Linux程序终止时,它会尝试使用某种系统退出调用以正常方式结束。而当DOS程序终止时,它也会尝试使用某种系统退出调用以正常方式结束。在shell、命令提示符等中,Linux、Windows、DOS的shell程序本身会加载并跳转到您加载的程序,您的程序运行一段时间,并如上所述尝试以某种退出方式返回到先前的程序。就像运行的shell程序希望在完成运行时正常返回时一样。
与Linux或Windows一样,很容易看到,您不会同时运行任何东西或以“并行”的方式运行,每次只有一个指令流。 (今天我们有设计为每个执行单元和/或核心各自执行某些并行任务的多个执行单元和/或核心,因此今天实际上可以说“并行”)您想切换“任务”或“线程”或“进程”,您需要一个中断,这将切换到不同的代码,即中断处理程序,并且该处理程序可以返回到中断的同一程序或切换到另一个程序。无论您给它起什么名字,这就是使事物看起来像同时运行的方式。DOS、Linux、Windows等通常是如何从一个“程序”或一些代码切换到另一个的。Linux和Windows有其内核和操作系统,在中断期间被调用,DOS也有(DOS现在仍然存在,您几乎每天都会接触到DOS机器(加油站、ATM机等),DOS还用于开发和测试x86主板/计算机,没有任何东西能够与嵌入式x86平台使用的自由相匹配,这就是为什么BIOS升级仍被分发为DOS程序)。中断处理程序会向各种BIOS处理程序和DOS处理程序分配时间片。任务/进程/线程切换并没有像Linux或Windows这样的操作系统设计或计划得那么好,但它确实存在,对于每个DOS版本,都有一些规则需要遵循,您可以切换任务(tsr是一个流行的术语)。只是与软件更复杂的Linux或Windows中的硬盘控制器驱动程序没有什么区别。 至少有一个,也许有一些非微软的DOS克隆版可以进行多任务处理。
简短的回答是当您有一个调用函数ted()的函数bob()时。
int bob ( int something )
{
...some code
...more code
   ted();
...some code
...more code
}
is bob() still running? Are they running in parallel? 不是的,bob()代码仍然在那里等待ted()完成并返回。只要ted()不崩溃,它将返回并且bob()可以继续执行。bob被挂起,而ted执行。在更复杂的操作系统中,使用shell或命令行也没有太大的区别。在某个函数中,将程序加载到内存中并调用它,可能是您正在运行的命令行的fork或clone,以便该命令行可以“并行”运行,或者克隆可以并行运行。但是概念是相同的。 上述代码与一个简单的C程序的不同之处在于,可以将上述代码视为在编译时解析,而加载和运行程序肯定是在运行时进行的,基本上是自修改代码,程序修改内存,然后跳转到它。当它返回该代码时,清除,展开并退出自己或根据设计等待另一个命令。DOS非常简单,一堆系统调用结合一堆BIOS调用和一个非常简单的命令行,可以加载程序并执行少量其他命令。它没有任何规则,你无法绕过(Windows是一个DOS程序),如果启动的程序不想返回(至少在当时可以通过一个中间的dos程序从dos启动linux),那么它会有点混乱,您的问题是当程序完成时会发生什么,好吧,Linux没有返回,它接管了系统。

2
DOS有一个信息表来了解正在运行的内容,如果你想要同时运行多个程序,你基本上需要拥有自己的操作系统,这个操作系统需要处理中断并在程序之间进行切换,通过交换DOS用来跟踪它认为是唯一正在运行的程序的表格。通常被称为终止和驻留(TSR)。 - old_timer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接