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

时间:2011-12-28 04:49:57

标签: operating-system dos multiprocessing

DOS总是作为单任务操作系统的一个例子给出。但是,当通过命令行发出命令时,控制从shell切换到命令,然后在命令完成时切换回shell。因此,有两个进程同时执行。我的理解有什么不对吗?

3 个答案:

答案 0 :(得分:6)

不,他们没有同时执行。

COMMAND.COM有一个驻留在内存中的部分,并且是一个可以随意丢弃的瞬态部分。

运行程序时,通常会加载它来代替瞬态部分然后运行。当程序退出时,它通过调用驻留部分中的代码来执行此操作,然后在必要时重新加载瞬态部分并继续。

一些代码仍然驻留的事实绝不意味着它“正在运行”。以类似的方式,MS-DOS(内核)的大片内容在内存中持续存在,但它们并非“正在运行”,除非非内核程序明确调用。

现在可以说可以说并发运行的东西,DOS有足够的TSR(终止并保持驻留)程序可以运行,以某种方式挂钩到中断或DOS,然后退出但是留下了一些内存(代码所在的位置)。

然后,为了响应某些事件,将运行该代码。也许其中一个着名的是Borland Sidekick,这是一个个人信息管理员,可以通过按键立即弹出。

答案 1 :(得分:4)

当其他进程正在运行时,命令行处理器未运行:已挂起。 DOS中唯一可用的“多任务”工具是"Terminate and Stay Resident"

答案 2 :(得分: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还活着你每隔几天就会触摸一台dos机器(气泵,atm机器,等等,dos仍然用于x86主板/计算机的开发和测试,没有什么可以与它作为嵌入式x86平台竞争,没有任何东西有dos必须做你想要的,这就是为什么bios升级仍然作为dos程序分发)。中断处理程序将为各种bios处理程序和dos处理程序提供时间片。任务/进程/线程切换不像linux或windows这样的操作系统那样设计或计划,但它就在那里,对于每个版本的dos都有你遵循的规则,你可以切换任务(tsrs是一个流行的术语)。刚谈到软盘,硬盘等,整个过程都涉及到代码,它并没有埋在硬件中,很多东西并行发生。与Linux或Windows等更复杂的硬盘控制器驱动程序没什么区别。至少有一个,也许是一些非微软dos克隆可以多任务。

简短回答,当你有一个调用函数ted()的函数bob()时。

int bob ( int something )
{
...some code
...more code
   ted();
...some code
...more code
}

是bob()还在运行吗?它们是并行运行的吗?不,bob()代码仍然在某处,等待ted()代码完成它正在做的事情并返回。只要ted()没有崩溃,它就会返回并且bob()可以继续执行。在执行ted时bob暂停。与更复杂的操作系统中的shell或命令行没有太大区别。某些功能在某处将程序加载到内存中并调用它,它可能是您运行的命令行的分支或克隆,以便该命令行可以“并行”继续,或者克隆可以并行继续。但概念是一样的。

与上面的一个简单的C程序的不同之处在于上面的代码可以被认为是在编译时被解析,其中加载和运行程序肯定是运行时,基本上是自修改代码,程序修改内存然后跳转到它。当它返回该代码时,根据设计清理,展开并退出或等待另一个命令。 DOS非常简单,一系列系统调用,结合了一堆BIOS调用,以及一个非常简单的命令行,可以加载程序并执行少量其他命令。它没有你无法解决的任何规则(windows是一个dos程序),如果你启动的程序不想返回(你至少可以在当时通过dos中间dos程序启动linux)那么它有点混乱你的问题是程序完成后会发生什么,linux没有返回,它接管了系统。