2011-12-28 49 views
7

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

+0

+1很好的问题! – Mehrdad 2011-12-28 04:53:00

回答

6

不,他们没有同时执行。

COMMAND.COM有一个常驻在记忆中的部分和一个可以随意丢弃的暂时部分。

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

事实上,一些代码仍然驻留在任何地方都意味着它“运行”。以类似的方式,大量的MS-DOS(内核)一直保留在内存中,但除非被非内核程序显式调用,否则它们不会“运行”。

现在有事情可以说是并发运行,DOS有足够的TSR(终止并保持驻留)程序将运行,以某种方式挂钩到中断或DOS,然后退出但留下一些内存分配(代码在哪里)。

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

4

当另一个进程正在运行时,命令行处理器未运行:它是中止。 DOS中唯一的“多任务”工具是"Terminate and Stay Resident"

+0

事实上,将它们描述为“过程”甚至是不正确的。一个进程必须有一个执行上下文。 (并且最近的DOS曾经来过多处理,它的[后台打印]功能(http://www.computerhope.com/printhlp.htm)。) – 2011-12-28 05:11:23

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平台竞争,没有任何东西可以自由地做你想做的事情,这就是为什么BIOS升级仍然是作为dos程序分发)。中断处理程序会给各个bios处理程序和dos处理程序提供时间片。任务/进程/线程切换并不像Linux或Windows这样的操作系统设计或计划,但它在那里,每个DOS版本都有你遵循的规则,你可以切换任务(tsrs是一个流行术语)。只是谈及软盘,硬盘等,整个过程中都涉及代码,它并没有埋入硬件中,很多事情并行发生。与Linux或Windows等更复杂的硬盘控制器驱动程序没有区别。至少有一个,也许有些非微软的dos克隆可以同时进行多任务处理。

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

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

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

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

+2

较短的答案。 Dos有一张信息表来告诉你正在运行什么,你想要一次运行多个程序,你必须基本拥有自己的操作系统,一些处理中断并在程序间切换的操作系统,通过交换dos用于跟踪它认为是唯一正在运行的程序的表格。一般称为终止和居留,tsr。 – 2012-03-03 04:19:06