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

Operating system DOS如何同时执行多个进程?,operating-system,dos,multiprocessing,Operating System,Dos,Multiprocessing,DOS总是作为单任务操作系统的一个例子。但是,当通过命令行发出命令时,控制从shell切换到命令,然后在命令完成时切换回shell。因此,有两个进程同时执行。我的理解有问题吗?当另一个进程正在运行时,命令行处理器没有运行:它被挂起。DOS中唯一可用的“多任务”功能是。不,它们不是同时执行的 COMMAND.COM有一个常驻部分一直在内存中,还有一个临时部分可以随意扔掉 当您运行一个程序时,它通常被加载以代替瞬态部分,然后运行。当程序退出时,它通过调用驻留部分中的代码来完成,然后在必要时重新加载临

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

当另一个进程正在运行时,命令行处理器没有运行:它被挂起。DOS中唯一可用的“多任务”功能是。

不,它们不是同时执行的

COMMAND.COM
有一个常驻部分一直在内存中,还有一个临时部分可以随意扔掉

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

有些代码仍然驻留在本地,这一事实并不意味着它正在“运行”。以类似的方式,大量的MS-DOS(内核)一直保留在内存中,但它们没有“运行”,除非由非内核程序显式调用

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


然后,为了响应某些事件,将运行该代码。也许其中一个著名的是Borland Sidekick,它是一个个人信息管理器,只需按一下键就可以立即弹出。

无论您是在该处理器上运行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,都有您遵循的规则,您可以切换任务(TSR是一个流行的术语)。就拿软盘、硬盘等来说,整个过程都涉及到代码,它并没有被埋入硬件,很多事情是并行发生的。与linux或windows等更复杂的系统中的硬盘控制器驱动程序没有什么不同。至少有一个,也许是一些,非微软dos克隆可以同时执行多任务

简单的回答是,当您有一个调用函数ted()的函数bob()时

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

与上面的普通C程序不同的是,上面的代码可以被认为是在编译时解析的,在编译时加载和运行程序肯定是运行时的,基本上是自修改代码,程序修改内存然后跳转到它。当它返回该代码时,根据设计进行清理、展开和退出,或等待另一个命令。DOS非常简单,一系列系统调用,再加上一系列BIO
int bob ( int something )
{
...some code
...more code
   ted();
...some code
...more code
}