題 如果DOS是單任務,那麼在舊版本的Windows中如何實現多任務處理?


我讀到DOS是一個單任務操作系統。

但是,如果舊版本的Windows(也包括Windows 95?)只是DOS的包裝器,那麼Windows如何作為多任務操作系統運行?


114
2018-03-08 14:28


起源


它被稱為搶先式多任務處理 - support.microsoft.com/kb/117567 - joeqwerty
你將不得不比那更好地定義“舊”。 “386增強模式”中的DOS + Windows 9x和DOS + Windows 3.x在這方面與“標準模式”和“實模式”中的DOS + Windows 3.x / 2.x完全不同。正如joeqwerty暗示的那樣,有多種任務和先發製人。已經寫了整本書,所以一個特定的問題更好。 - JdeBP
@joeqwerty最令人敬畏的IMO是微軟在線保存關於如此古老的軟件的文檔。甚至有關於舊版本MS-DOS上的高級主題的文章......真的很好,以保持它活著。 - NothingsImpossible
DOS不會給你多任務處理。你仍然可以在沒有DOS幫助的情況下在其上編寫完全多任務程序,這是早期的Windows所做的。 Windows 95當然不僅僅是DOS的“包裝器”。 - Boann
@NigelNquande我實際上發現MS在維護舊文檔方面相當不錯。他們退休的大多數知識庫文章都是在線的(例如,隨機的 Windows 3.1 KB或者是關於的文檔 print 效用 對於Windows 2.1-3.0,或 ANSI.SYS 來自MS-DOS 5.0),即使在他們規定的12個月的終結寬限期之後。它不像活躍的產品文檔那樣容易瀏覽,您必須在搜索中具體。 - Jason C


答案:


Windows 95

Windows 95 遠不止MS-DOS的“只是一個包裝器”。引用雷蒙德陳:

MS-DOS在Windows 95中有兩個用途。

  • 它充當了引導​​加載程序。
  • 它充當16位傳統設備驅動程序層。

Windows 95實際上只是掛起/覆蓋了所有的MS-DOS,將它作為兼容層保留,同時完成所有繁重的工作。它還為32位程序實現了搶占式多任務處理。


Pre-Windows 95

Windows 3.x和更早版本大多是16位(除了Win32s,一個橋接16和32的有點兼容層,但我們在這裡會忽略它),更依賴於DOS,並且只使用協作式多任務處理 - 這是他們不強迫正在運行的程序切換出來的那個;他們等待正在運行的程序產生控制(基本上,通過告訴操作系統運行下一個等待的程序來說“我已經完成”)。

多任務處理是合作的,就像在舊版本的MacOS中一樣(儘管不同於多任務DOS 4.x,它具有先發製人的多任務處理)。任務必須屈服於操作系統才能安排不同的任務。產量內置於某些API調用中,尤其是消息處理。只要任務及時處理了消息,一切都很棒。如果任務停止處理消息並且正在忙於執行某個處理循環,那麼多任務就不再存在了。

Windows 3.x架構

至於早期的Windows程序如何產生控制權:

Windows 3.1使用協作式多任務處理 - 這意味著正在運行的每個應用程序都被指示定期檢查消息隊列,以確定是否有任何其他應用程序要求使用CPU,如果是,則控制該應用程序。但是,許多Windows 3.1應用程序只會偶爾檢查消息隊列,或者根本不檢查消息隊列,並且會根據需要獨占控制CPU。像Windows 95這樣的搶占式多任務系統將CPU控制遠離正在運行的應用程序,並根據系統的需要將其分配給具有更高優先級的應用程序。

資源

所有DOS都會看到這個單獨的應用程序(Windows或其他)正在運行,它會在不退出的情況下通過控制。從理論上講,無論如何都可以在DOS之上實現搶占式多任務處理,使用實時時鐘和硬件中斷來強制控制調度程序。如 托尼評論道,這實際上是由運行在DOS之上的一些操作系統完成的。

386增強模式?

注意:有一些評論 386增強模式 Windows 3.x是32位,並支持搶占式多任務處理。

這是一個有趣的案例。總結一下這個鏈接 博客文章,386增強模式基本上是一個32位虛擬機管理程序,它運行虛擬機。其中一個虛擬機內部運行Windows 3.x標準模式,該模式執行上面列出的所有內容。

MS-DOS也會在這些虛擬機內部運行,顯然它們是搶占式多任務 - 所以386增強模式虛擬機管理程序似乎將在虛擬機之間共享CPU時間片(其中一個運行正常3.x,其他運行MS -DOS),每個VM都會做自己的事情 - 3.x將協同多任務,而MS-DOS將是單任務的。


MS-DOS

DOS本身在紙上是單任務,但確實有支持 TSR 程序,在硬件中斷觸發之前保持在後台。遠非真正的多任務處理,但也不是完全單一任務。


所有這些關於比特的話題?我問過多任務處理!

嗯,嚴格來說,bit-ness和multitasking並不是相互依賴的。應該可以在任何位置實現任何多任務模式。但是,從16位處理器遷移到32位處理器還引入了其他硬件功能,這些功能可以使搶先式多任務處理更容易實現。

此外,由於32位程序是新的,當它們被強行切換時更容易讓它們工作 - 這可能會破壞一些傳統的16位程序。

當然,這都是猜測。如果你真的想知道為什麼MS沒有在Windows 3.x中實現搶占式多任務處理(儘管有386增強模式),你將不得不問一個在那里工作的人。

另外,我想糾正你的假設,即Windows 95是jsut DOS的包裝器;)


161
2018-03-08 15:22



非常好的寫作。如果我沒記錯的話(操作系統設計課程在很多年前對我來說)Windows 9x掛鉤了計時器中斷來強制執行它自己的調度程序,就像你在第2到第2段中建議的那樣。在DOS之上還有其他操作系統做同樣的操作。我清楚地記得AMX(工業應用程序的實時操作系統)和XINU(教育目的小型Unix / Posix,如OS),它們都運行在DOS之上。 (AMX也可以直接從EPROM運行裸機。在DOS上運行時測試/調試要容易得多。保存你為每次測試重新燒錄EPROMS。) - Tonny
@Tonny感謝您確認該方案是可行的(並在實踐中使用)。猜測,Windows 1-3沒有使用搶先式多任務的原因並不是他們無法這樣做(MS-DOS 4有它,雖然未發布),但它會破壞與DOS的向後兼容性程式。 - Bob
Mmmmhhh考慮到Windows 1-3:8086 CPU和更高級別的通用代碼庫可能與它有更多關係。只有80286及更高版本才能正確處理ring0-3處理,這就是Win9x用於實現多任務處理的原因。 4DOS和其他人已經在DOS上提供了有限的多任務處理(如果我沒記錯的話,需要80286)。您甚至可以將Win3本身作為4DOS中的單獨進程運行。 - Tonny
辛努真的做到了 不 在DOS之上運行。畢竟,它最初是作為LSI-11操作系統開始的。 DOS + Windows 3.x中沒有prebemptive多任務處理的說法是錯誤的。在386增強模式中,VMM提供了禮貌。關於4DOS的廢話會給你一個經常給出的答案: 4DOS不是操作系統。它提供多任務處理的陳述是完全錯誤的。 - JdeBP
PDP-8支持先發製人的多任務處理,而這只是一台12位計算機。 - david25272


它不斷運行一個程序,一個叫做windows。那個在不同的程序之間傳播CPU時間(和其他資源)。

考慮這個類比:

你有一個辦公室,當時只能有一個人(那個人叫做先生或者是DOS)。那個人當時只做一件事。例如。它打電話給一個人並開始與他/她進行全天候聊天。

現在你用秘書先生取代那個人。 (視窗)。它會給某人打電話並一直與它交談(仍然是一項任務)。然後過了一段時間,另一個人會說“我現在已經說夠了。跟別人說話,然後再回電話給我”。

秘書先生將打電話給另一個人。與那個人聊天,直到那個人說同樣的話。然後它將呼叫下一個人,直到它在與之對話的人員列表的末尾。那時它將再次從頂部開始。

  • 在技​​術方面,這稱為協作式多任務處理。它需要另一個人說他/她有足夠的CPU時間。如果一個人不這樣做,那麼一切都崩潰了。
  • 現代系統更加智能。包括先發製人的多任務處理。想想秘書設置一個鬧鐘並在5分鐘後關閉另一個人。 “這很好。簡。但我現在必須和喬談談。我會稍微給你回電話。 - 點擊。”

如果添加多個處理器,則會變得更加複雜。 :)


26
2018-03-08 14:36



你的第一點不是指合作/非搶占式多任務嗎?另外,有趣的是,Windows 95為32位程序引入了搶占式多任務處理。它不是DOS的包裝器,因為它是一個操作系統,它使用DOS作為引導程序,但替換了它的主要部分(保持足夠的16位/ DOS程序支持)。 - Bob
先生或未命中,為什麼不'博士' DOS? - gtrak
“它不斷運行一個程序......那個程序在不同程序之間傳播CPU時間(以及其他資源)。”關於任何操作系統都不能說?雖然問題暗示MS-DOS不能。在反對技術的技術細節時,我強烈反對類比/隱喻。好的,現在我們知道一些假設的辦公室是如何工作的?這並沒有真正解釋這個問題的答案。 - Celeritas


在現代操作系統中,操作系統控制所有硬件資源,並且正在運行的應用程序保存在沙箱中。不允許應用程序訪問操作系統尚未分配給該應用程序的內存,也不能直接訪問計算機中的硬件設備。如果需要硬件訪問,則應用程序必須通過設備驅動程序進行通信

操作系統可以強制執行此控制,因為它會強制CPU進入 保護模式

另一方面,DOS從不進入保護模式,但保持在 實模式 *。在實模式中,正在運行的應用程序可以執行它想要的任何操作,例如,直接訪問硬件。但是以實模式運行的應用程序也可以告訴CPU進入保護模式。

最後一部分允許像Windows 95這樣的應用程序啟動多線程環境,即使它們基本上是從DOS啟動的。

DOS(磁盤操作系統)是afaik,並不比文件管理系統多。它提供了一個文件系統,用於導航文件系統的機制,一些工具以及啟動應用程序的可能性。它還允許一些應用程序保持居住,例如鼠標驅動程序和EMM模擬器。但它並沒有像現代操作系統那樣試圖控制計算機中的硬件。

*當在70年代首次創建DOS時,CPU中不存在保護模式。直到80年代中期的80286處理器,保護模式才成為CPU的一部分。


13
2018-03-08 17:11



請注意,當時CPU沒有保護模式這樣的東西。 - jwenting
@jwenting - 好點,我添加了一個關於它的說明 - Pete


在Windows 3.x之前,它是多任務DOS應用程序的第一個版本,有一些程序,如DesqView,也可以這樣做。如果一個是例如一次運行三個DOS會話,然後DesqView將創建四個虛擬機。三個DOS會話都會認為它們“擁有”整個機器,除了它們都不會實際執行文件I / O.相反,將修補每個會話中運行的DOS版本,以便將任何文件I / O請求轉發到專用於此目的的特殊會話。由於PC的文本模式硬件會連續地將內存區域的內容顯示為字符; DesqView可以通過將每個會話的0xB8000-0xB9FFF範圍映射到其自己的RAM區域,並定期將當前應用程序的區域複製到物理屏幕緩衝區,讓每個會話都有自己的虛擬屏幕。圖形支持要困難得多,因為顯示板上的256K RAM是使用64K的地址空間,一些I / O寄存器和一些“有趣”的硬件來控制的,這些硬件需要以某些特定的順序讀取和寫入。在文本模式下,當應用程序向文本緩衝區寫入內容時,DesqView可以設置一個標誌,指示它應該在下一個計時器滴答時復製到顯示器上;只有在給定時間內對文本緩衝區的第一次寫入才需要DesqView的干預;所有其他人將合併到下一個計時器滴答。

相比之下,虛擬化圖形模式需要DeskView將每個單獨的寫入捕獲到顯示內存或I / O寄存器。鑑於這會使內存寫入速度減慢約100倍,並且圖形程序必須編寫比文本程序更多的數據,大多數圖形軟件的實時虛擬化並不實用。相反,圖形是通過讓任何非前台應用程序嘗試進行圖形暫停直到它成為前台應用程序,然後讓它完全控制屏幕來處理的。當控制切換到不同的應用程序時,DesqView會嘗試複製所有圖形寄存器的狀態然後切換。切換回圖形應用程序後,DesqView將恢復已保存的狀態。

在某種程度上,多任務非圖形DOS應用程序比多任務Windows應用程序更容易,因為共享資源非常少,並且應用程序不必相互交互。相比之下,在Windows中,有必要處理剪貼板之類的事情,或者一個程序的窗口可能以一種模糊另一個程序的方式移動的可能性。 Windows 95是Windows的第一個版本,可以通過包含諸如窗口系統之類的東西來克服這些限制,窗口系統可以容納在代碼試圖繪製時屏幕區域變得不可用(效果是繪圖將被屏蔽掉) )。


6
2018-03-09 00:33



感謝您提醒我DesqView。我曾經一直使用它,但完全忘記了它。 - Emmet


多任務處理只不過是同時運行應用程序的錯覺。它被認為是你的同時執行,但實際上進程A,B和C按以下順序共享CPU時間:A,B,C,A,B,C,A,B ......它們只是打開並且很快就離開了。實際上沒有兩個進程同時運行。

因此,完全有可能通過使一個進程暫停,在短時間內運行下一個進程,暫停一個進程,跳回第一個進程等來進行MS-DOS多任務處理。

多任務只是一個聰明的功能,當CPU開始足夠快以通過這些過程保持旋轉並使其看起來與最終用戶同時發展時,這是一個聰明的功能。

對於那些記得的人來說,遊戲仍然在DOS4GW上運行,因為Windows太慢了。


3
2018-03-10 21:34



在大多數情況下,直到今天,這仍然是操作系統中的工作方式。這就是為什麼你可以在4核CPU上“同時”運行10件事的原因。 - jwenting
實際上並不是“CPU開始足夠快”。可以在'286上運行多用戶多任務操作系統(例如The Mark Williams Company 相干,1983年推出的一款優秀操作系統。 MS-DOS和Windows(不包括NT)版本(包括)“Millenium”真的是任何客觀標準,甚至是當時的技術標準,但是一旦MS-DOS成為IBM的PC標準,微軟的營銷和動力(更不用說濫用其壟斷力量)有效地排除了很長一段時間內更好的競爭。 - Emmet
“當CPU開始足夠快時,多任務處理就是一個聰明的功能......” 你的意思是如何 阿波羅指導計算機是一種多任務設計? - α CVn
當我說“CPU”時,我指的是批量生產的,當我說“多任務處理”時,我的意思是PC應用程序的多任務處理。最後,由“最終用戶”我指的是PC背後的孩子,而不是宇航員。不過,感謝有趣的評論。 - Dan Horvat


儘管它只能專注於一項任務,但它能做的只是一個快速從一個任務到另一個任務的簡單步驟。這樣看起來它是多任務處理,但實際上它只關注1,然後關注另一個,然後關注另一個,等等。


0
2018-03-08 19:33



你在混淆 多任務處理 同 多處理器計算 那裡。在計算機世界中,非常快速地在多個任務之間切換是多任務的。通常的定義不是 需求 並行執行。各種“舊版本的Windows”以不同的方式執行多任務處理,取決於Windows的版本,運行的模式,以及它是否首先是基於DOS的。 (Windows NT 3.1比DOS + Windows 95舊,可以做SMP。)正如我在另一篇評論中指出的那樣,整本書都寫在這上面。這真的不是最好的2句總結。 - JdeBP
@JdeBP ...我知道多任務處理和多處理器之間的區別,因為我主要使用單核處理器!計算機連續工作。真正的並行只會出現在量子計算中。 - Thoth


我在這裡沒有看到提到的一件有趣的事情:

Windows 3.0並不是一個先發製人的多任務處理系統,它像Mac OS的所有版本一樣合作,直到OS X - 一個應用程序必須在任何其他應用程序採取任何行動之前從通話中返回。

然而,作為一個評論者提醒我,DOS應用程序是多任務的。這是因為它們沒有寫入“合作”多任務(這必須始終構建在使用它的系統中)。

當時有一些稱為TSR(終止居住)的程序取代了今天的設備驅動程序。這些驅動程序將獨立運行 - 通常在自己的線程上運行,將自己插入到OS的一個事件處理程序中。 Windows通常不了解它們,它們運行在較低級別。

這些不是真正的Windows應用程序,但它們是在Windows 3.1之前發生的所有線程活動,如打印機驅動程序,com驅動程序等。

雖然Windows 3.1是多任務的,但DOS不是,但是Windows 3.1只是將dos推開並在它啟動時接管(當時你經常從DOS提示啟動Windows)。


0
2018-03-10 20:39



在386或更高版本的處理器上運行時,Windows 3.0支持DOS應用程序的搶占式多任務處理。只有Windows應用程序才能進行多任務協作。 - Jules
哦,這是正確的 - 我當時正在編寫Windows應用程序,並沒有真正考慮DOS。它確實以不同的方式對待DOS應用程序 - 感謝您指出這一點。 - Bill K


好問題。在MS-DOS中,內核是單片的,這意味著它只能一次處理一個任務,而不是在Windows 9x和當前版本中實現的新的現代內核。你可以看看更多 這裡


-8
2018-03-08 17:43



-1你建議單一操作系統不能多任務 - 這是錯誤的。 linux是著名的monothithic內核(linus torvalds和andrew tanenbaum之間有一場著名的爭論)但linux顯然可以完成多任務。這裡有一個鏈接,告訴你linux是單片的 stackoverflow.com/questions/1806585/... - barlop
單片並不意味著你的想法。 - Thorbjørn Ravn Andersen