沒有操作系統,程序可以運行起來嗎?
大家好,我是小風哥。
現在的程序員對操作系統已經習以為常了,但是你有沒有想過,如果沒有操作系統的話我們可以讓程序運行起來嗎?
先說答案,當然是可以的,而且必須是可以的。你可以從這個角度來思考,操作系統本身就是一個程序,這個程序的運行沒有依賴任何其它“操作系統”,注意,這不是套娃。實際上在計算機歷史早期,或者說上古時期,計算機上根本就沒有什么操作系統之說,這一時期的程序的確是在沒有操作系統的情況下編寫和運行的。
要想寫個能直接在計算機上運行的程序可不簡單,想一想這種不依賴操作系統系統的程序該怎樣運行起來?
啟動是個問題
我們面臨的第一個問題就是:此時計算機上沒有任何程序,你該怎樣讓計算機啟動起來呢?換句話說加電后CPU該干啥?啊哈,沒想到吧,第一個問題就不好解決,要想讓計算機運行你的程序至少要把計算機啟動起來吧。
所謂的計算機啟動起來無非就是讓CPU加電后開始執行一段初始化代碼,為你真正的程序運行鋪路,這一大段代碼就是所謂的內核,kernel,實際上你可以讓計算機加電后執行任何代碼,也就是實現你自己的內核,當然你也可以沒有這樣的內核,直接運行你的程序,關于計算機的啟動你可以參考這篇文章《操作系統是如何啟動起來的?》但這依然會有問題。
運行時問題
第一個要面臨的是內存問題,你的程序要被加載到內存的哪個位置呢?顯然這就是涉及到內存管理問題。第二個問題是你沒有辦法充分利用計算機。想一想,在這種情況下,你只有啟動的時候才可以開始執行一個全新的程序,想執行第二個程序就需要關機,在存儲設備中刷入新的程序然后再開機,這是不是讓人抓狂。這還不算完,如果你的程序有bug,那么不好意思,你可能需要重啟計算機了,你能想象程序出點問題就要重啟計算機嗎?想一邊運行文本編輯程序一邊運行音樂程序?門都沒有,要想實現,自己寫個多任務(Multitask)管理系統吧,你至少要把運行的程序管理起來吧,想一想是不是就必須用到進程這樣的抽象啦,還覺得這些概念沒有用嗎?
就算你有多任務系統,如果一個程序有問題把另一個程序的內存刷掉了,這是不是就一石二鳥了,一個bug導致兩個程序崩潰,你是不是得有進程隔離機制?此外,如果你的程序需要使用I/O設備那就更有酸爽啦,沒有驅動你怎樣控制這些設備、怎樣使用鼠標鍵盤顯示器,你的程序是不是要鏈接一大堆驅動,想想是不是就已經頭痛了。而且你還要高效的利用計算機資源,當搞定這一切后你會發現自己實際上已經寫出了一個操作系統。還覺得操作系統沒有用嗎?操作系統把這些臟活累活統統攬下,程序員只需要專注寫bug就可以了。說了這么多缺點,但沒有操作系統的還是有一個有趣的優點的,那就是你可以獨掌大權。
程序員也是獨裁者
說來有趣,盡管現在你可以花上幾千塊錢買一臺計算機,但是你(程序員)幾乎沒有辦法繞開操作系統隨意讀寫你的內存、讓CPU執行任何指令,因為你的Windows/Linux/MacOS會直接將你kill掉。
有意思的是明明是你自己花錢買的計算機硬件、花錢買的操作系統,理論上這是個人財產,但是你花錢買來的操作系統竟然不受你控制(大神除外),反而禁止你干這干那,就好比你買來一頭牛,結果這頭牛不受控,自己想干啥干啥,如果真的買了這樣一頭牛相信你早就忍不了了,但是你花大價錢買來的計算機、智能手機根本不受你的掌控,大家竟然對此沒什么感覺,認為這很正常,想想也是有夠魔幻的。扯遠了,在早期的計算機上普通程序員(應用程序)可以徹底控制計算機,可謂獨掌大權,實際上在現代計算機系統上你也可以在沒有操作系統的支持下寫程序,這就是所謂的Bare-Metal Programming,嵌入式同學對此應該不陌生。
好啦,關于操作系統與程序運行這個話題就到這里,總之操作系統并不是計算機執行程序的一個必須組件,沒有操作系統我們一樣可以讓程序運行起來。