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