2011-12-28 51 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