在沒有GUI的時代(只有一個文本界面),人們是怎麼運行多個程序的?
不是只有一個文本界面嗎?
延伸一下,現在人們遠程伺服器如果是文本界面,該如何運行多個程序?
你把「文本界面」和「支持分時復用的多進程操作系統」混淆了。
先說文本界面。
不光Linux,windows的cmd、powershell等等,都是文本界面。
但文本界面並不等於「單進程」。
比如,Linux下,你完全可以在一個命令後跟一個,把它置於後台:
wget https://www.zhihu.com/...../xxx.avi
甚至於,你還可以定義一個shell 函數,這個函數通過啟動自己的兩份拷貝……這就是著名的fork bomb:
:(){ :|: };:
這是個故意寫的讓人不好懂的最簡版本。寫成這樣就好懂多了:
fun() { fun | fun }; fun
你可以在shell裡面啟動一堆進程,然後通過fg命令+作業編號把它調到前台。
事實上,Linux提供了一整套的作業控制命令,使得你可以同時啟動很多程序,並指定任意一個在前台顯示或將其置於後台:jobs、bg、fg 作業控制命令
如果你稍微學過點編程入門,那麼應該知道標準輸入stdin和標準輸出stdout。
實質上,作業控制就是一個控制開關,可以隨時指定哪個程序可以和當前終端通訊而已。
當然,你還可以通過ssh或telnet之類協議登陸遠程計算機。這樣一台Linux機器就完全可以同時支持你們全班幾十人的編程作業了。
另外,事實上在Linux啟動時,就為你一口氣啟動了7個終端;當你不小心把某個終端搞鎖住、或者執行了太多任務不太好控制時,你可以按ctrl+alt+F1~F7組合鍵切換終端(視版本不同,F5/F7還可能是圖形終端:當圖形界面死掉時,你甚至可以切換到文本終端殺死圖形管理器然後重啟該終端的x服務)。所有終端裡面跑的程序是相互獨立的。
事實上,程序並不一定要讓你看見。
比如很多服務程序就一直默默無聞的在後台幹活,絕大多數人完全不知道它的存在——你可以打開windows的任務管理器,看看裡面有多少你不知道是什麼的進程。
Linux的服務程序(守護進程)必須明確放棄終端控制權:linux 守護進程編寫 - zg_hover的專欄 - CSDN博客
總之,文本/命令行界面並不天然排斥多進程。
但是,DOS是一個單任務操作系統。
所謂單任務操作系統,是一種壓根沒有任務調度的「殘疾」操作系統。
你可以認為,DOS是一個簡單的程序;這個程序啟動後,就「懸掛」在「等待終端輸入」這個函數里;當你從鍵盤敲入字元後,它會解析你敲入的命令、然後讓你指定的程序代替它的執行。
因為不存在任務調度,因此DOS無法支持多個進程同時執行。
想執行多個任務,就只能等前一個進程退出、然後再載入一個新的進程。
但有的時候,比如我們需要中文支持;同時又需要執行諸如TC之類程序;怎麼辦呢?
答案很簡單:我們自己為DOS寫一個簡陋的多進程管理系統!
怎麼寫呢?
我們知道,用戶敲鍵盤、時鐘走過一段時間或者其他硬體發出中斷信號,CPU都會自動跳轉到相應的「中斷服務程序」中,以儘快處理突發任務。
CPU是如何知道「中斷服務程序」在哪呢?
很簡單,它約定了一組「中斷號」,比如3號中斷就是單步執行,比如10H中斷的13號子功能用來顯示字元串,等等。
當中斷髮生時,根據中斷號,CPU會從「中斷向量表」首項+(中斷號乘以4)個位元組的位置讀入4個位元組的數據,這個數據就是中斷服務程序所在的地址——或者叫函數指針。
因此,只要我們自己寫一個中斷服務程序,在內存中分配一塊空間,把這個中斷服務程序的機器碼填入;然後把我們自己的中斷服務程序的起始地址寫到中斷向量表的合適位置——那麼,我們就動態替代了DOS提供的某些功能。
然後,哪怕我們的程序已經退出;但只要中斷髮生,CPU還是會乖乖執行我們剛剛安插進去的「姦細代碼」。
這就叫TSR技術。
通過這種技術,我們就在DOS上實現了「多任務」——我們的程序藏在後台,為其他人寫的程序提供服務。
當然,TSR的「多任務」是假的。如果兩個程序都要TSR、而且又都看中了同一個中斷……
因此,那時寫程序是非常依賴「自覺」的。哪個中斷已經被DOS佔了、哪個中斷又被UCDOS改寫了,那麼我們再寫程序時,就最好不要再改寫這個中斷了——萬一非改寫不可,那麼最好記住人家寫入的中斷服務程序地址,在執行完我們的程序後,別忘了調一下人家的中斷服務程序。
但萬一我們改完了人家以為自己駐留沒成功再改一次……
顯然,可憐的DOS系統就要被玩壞了。
不僅如此,可憐巴巴的一小段中斷服務程序往往不足以容納太過複雜的內容;但為了提供足夠的功能,我們又需要載入大量的代碼……
於是,就連動態載入/卸載程序代碼也必須我們自己寫。總之麻煩的很,又特別容易出錯。
後來,微軟自己搞了Windows 3.x;它終於有了一個真正的進程調度器,終於真正支持了多進程。
——這大概就是題主等很多人把文本界面默認為「單進程」、圖形界面默認為多進程的原因吧。
——其實圖形界面也完全可以是單進程的,比如圖形化的bios設置界面。
Windows 3.x是非搶奪式多進程,一個程序執行一會兒,需要等磁碟等網路等鍵盤輸入了,就主動放棄控制權,讓別人也跑一會兒;但如果一個進程不自覺,就是霸著CPU不讓開……
到了Windows 95,這才有了依時間片分配執行時間的搶奪式多進程。到這時,它才終於稱得上一個現代化的、真正支持多任務的操作系統。
這個話題其實挺有意思的,樓主肯定對計算機的歷史沒有了解,以為字元界面就沒有辦法運行多個程序。首先糾正一下這個觀念,說一個事實,Linus當年還是學生的時候,就是用字元終端連接到學校的伺服器上學習的,學校的Unix伺服器支持很多用戶同時使用,這就是同時支持多個程序了。
同時,Unix下完全可以在字元界面運行多個程序,具體可以了解一下現在的Linux相關機制,具體內容太多了一下說不完,但是你明白其實這套在字元終端下運行、切換、打開關閉多個程序是有一套成熟機制的就好,甚至這套機制比圖形GUI用戶界面更久遠,非常成熟。
但是你說到了DOS,這又需要單獨拿出來,因為DOS是一個單任務實時操作系統,理念上和Unix這類多任務多用戶分時操作系統不同,它天生是不支持同時運行多個程序的。但是因為DOS中後期的計算機硬體已經非常強大,而當年DOS的機制非常簡單透明,所以有很多第三方軟體可以做到類似多任務的方式,具體有以下兩種:
一種叫tsr程序,不管叫啥,它的原理就是樓上某位同學說的,修改系統的中斷,中斷是分時的機制,簡單可以理解成計算機雖然只能在一個時間內只干一件事,但是因為處理速度太快了,所以可以在你察覺不到的時候偷偷花極短的時間干別的事情去了,然後再切換回來,但是太快了你根本感覺不到。所以那個時代光碟讀不出來,硬碟有壞道反覆嘗試讀取會導致系統整個卡住完全沒法動彈。扯遠了,扯遠了。tsr一般不會執行太複雜的任務,頂多就是播放下音樂什麼的,主流的方式還是監控鍵盤快捷鍵組合,因為中斷可能每秒鐘要執行很多次,所以干監控這個很方便,按下鍵後就可以保存當前程序狀態,彈出個查詢窗口讓你查查字典什麼的。
而這套保存當前程序狀態切換執行其他程序,就是DOS下執行多個任務的主流辦法,有極多的軟體都是這個機制,常見的有gb4遊戲剋星和fpe遊戲修改大師這類的,甚至有軟體可以做管理在多個程序之間切來切去,但是因為DOS本身的機制,同時只能跑一個程序,所以只有當前在前面的程序在跑,其他的都後台軟體都是停止的。
DOS時代用的是實模式,翻譯成人話就是OS並不比程序享有更高的優先順序,內存也是公開的,沒有任何保護。極端點說,應用程序甚至可以把OS殺掉,騰出內存來做別的事情。程序退出之後也就死機了:沒有OS接管後面的事情了。
這個時代運行多個程序的辦法是程序駐留內存,然後退出,並將控制器還給OS,讓OS啟動其他的程序。
而駐留在內存里的程序用一些其他的辦法激活。
最常用的辦法是中斷,如字面意思,就是打斷CPU當前的工作,讓CPU干點別的。
中斷有很多種,比如時間中斷。每過一段時間,就會觸發這個中斷。CPU會放下當前的工作去執行指定位置的代碼,執行完了再繼續當前的工作。
具體做什麼可以自己寫代碼。
其他常用的還有鍵盤中斷和調試中斷。鍵盤好理解,每次你按鍵盤,CPU都會停下手頭的工作去處理一下你按了什麼。調試中斷則是執行到指定位置之後會停下來,用於調試程序。
比如那個時代的遊戲修改器都是用鍵盤中斷,在遊戲中按指定的熱鍵激活。
問題是實模式下眾生平等,中斷像量表誰都可以改,這塊高地誰都想占,結果打來打去誰也不服誰。運行多個程序是可以的,但大家要謙讓:比如都是自家兄弟。
一個程序造次,哪怕不是故意造次只是不配合,都會導致各種各樣的問題,所以體驗自然不會太好。
Win3.x比DOS強,但也是多任務靠自覺。
95/98時代好一些,只要不是故意造次的程序,OS還是可以收回控制權的。
到了XP時代OS才算徹底用上了保護模式。OS才可以完美的調度多個程序。
至於多任務跟黑窗口沒啥直接關係。
你去銀行辦事,就看見辦事窗口一個職員而已,所以你覺得銀行里就一個工作人員?人家大樓里恐怕蹲著幾百號人,只不過沒啥必要出來讓你一一見見而已。
我把Linux相關的兩個標籤去掉了,因為這題目和它沒關係。
當年dos系統上,運行多個程序其實是不方便的,大部分場合是使用完一個程序後關閉,再打開另一個程序。比如你在聽歌時是不能打開第二種程序的,不然那個音樂播放器會停止運行,表現起來就是聲音消失。
但有三種方式是例外。
1、中文平台:
英文dos+英文程序→顯示正常;
英文dos+大部分中文程序→亂碼;
英文dos+中文平台+中文程序→顯示正常
國內流行的中文平台,包括UCDOS、天匯、國喬等等。
2、使用TSR技術的新軟體:
所謂的「內存駐留程序」,運行後保持在後台運行,通過快捷鍵隨時喚出。「新dos時代」這網站介紹了很多此類軟體,它們都比較新,出現時多半已經不再是是dos時代了。
3、一個程序包含多種功能:
比如文件管理器Dos Navigator,它具備CD播放的功能,使用它來放音樂,即使你屏幕上是文件列表,音樂播放組件在「後台」,也不怕音樂停止播放。
著重提一下第三種。有人認為Windows1、2、3和Windows 9X不算是獨立的操作系統,而只是運行在dos上面的大型的、圖形界面的、具備多種功能的程序,這種想法就是從第三種例外方式引申出來的。畢竟,除了這幾種「操作系統」外,也有seal、WinTix、OpenGEM這樣的程序,具備圖形界面和多種功能,至少在界面上看起來和早期Windows沒多少差別。
根據本題下一些程序員角度的回答,我也發現到自己的不足。我原文中分了三種,但實質上還是「程序自己提供多進程管理」這一種了。此外Windows 3X和9X看來也不能一概而論。
如果說是真正的「dos時代」,
dos本身沒有調度器,也不使用保護模式,所以也就沒有進程和線程的概念,需要運行後台的程序會將自己複製到安全的位置,然後監聽(劫持)特定的中斷來提供服務。
當然這樣很蠢,因為沒有保護模式的原因很容易會被其他軟體修改,而且你改寫的中斷向量很容易被其他軟體再次改寫。
至於後面那個問題……不想回答。
推薦閱讀: