首先我們需要解決的問題是操作系統(tǒng)是什么,其本質(zhì)上就是一段計(jì)算機(jī)程序溃槐,用于管理計(jì)算機(jī)的硬件和軟件資源,操作系統(tǒng)需要處理很多事務(wù),如管理與配置內(nèi)存嗤练、決定系統(tǒng)資源的優(yōu)先次序诺舔、控制I/O設(shè)備等械馆。一個(gè)計(jì)算機(jī)系統(tǒng)可以分成三層师坎,如下圖所示:
我們將計(jì)算機(jī)操作系統(tǒng)的特征分為四個(gè)方面,下面將通過幾段程序榕栏,依次進(jìn)行說明畔勤。
一、CPU的虛擬化
編寫如下的c程序
cpu.c的功能是打印你輸入的字符串臼膏,然后在一個(gè)無限循環(huán)的函數(shù)里spin一秒鐘硼被,這里提一下在運(yùn)行了上述的函數(shù)之后,需要使用指令
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? killall cpu
來終止整個(gè)程序的運(yùn)行渗磅,cpu是指生成的可執(zhí)行文件的名字嚷硫。我們觀察結(jié)果會(huì)發(fā)現(xiàn)雖然我們同時(shí)運(yùn)行了多個(gè)程序检访,但是所有程序都會(huì)輸出結(jié)果,結(jié)果是cabcabcab....這樣子的無限字符串序列仔掸。即使我們只有一個(gè)物理cpu脆贵,這種現(xiàn)象依然存在,即說明操作系統(tǒng)通過某種機(jī)制令每個(gè)應(yīng)用程序都感覺自已擁有整個(gè)cpu起暮,會(huì)直接執(zhí)行卖氨。
二、內(nèi)存的虛擬化
編寫如下的程序负懦,
輸出結(jié)果中的pid表示進(jìn)程的id筒捺,在操作系統(tǒng)中每個(gè)進(jìn)程都有系統(tǒng)分配的獨(dú)一無二的id來做相互之間的區(qū)分,從上圖的結(jié)果我們可以發(fā)現(xiàn)二者是并行實(shí)現(xiàn)的纸厉,而且二者被分配了同樣的地址系吭!是不是很神奇!這說明cpu通過某種機(jī)制讓應(yīng)用有完整的虛擬地址空間颗品。
三肯尺、并發(fā)性
程序如下,
在threads.c中我們創(chuàng)造了兩個(gè)子線程躯枢,每一個(gè)線程都對(duì)一個(gè)共享的全局變量做設(shè)定次數(shù)的 ++ 操作则吟,但是我們發(fā)現(xiàn)這個(gè)結(jié)果是不確定的,這說明這兩個(gè)線程的執(zhí)行并不是嚴(yán)格并發(fā)的锄蹂,操作系統(tǒng)需要去控制線程的并發(fā)氓仲。
四、持久性
程序如下:
io.c創(chuàng)建了一個(gè)文本文檔败匹,并且在里面存儲(chǔ)了字符串寨昙,無論我們用什么物理存儲(chǔ)裝置,我們都可以訪問到這個(gè)路徑以及里面的文件掀亩,這說明操作系統(tǒng)提供了文件系統(tǒng)來做一個(gè)持久性的存儲(chǔ)。