計(jì)算機(jī)結(jié)構(gòu)
宏觀來(lái)看,計(jì)算機(jī)是由硬件+軟件構(gòu)成.
硬件為整個(gè)計(jì)算機(jī)豐富功能提供物理支撐,軟件直接面向用戶提供服務(wù).
計(jì)算機(jī)硬件組成及工作機(jī)制
計(jì)算機(jī)的硬件從結(jié)構(gòu)上看大致可以分類CPU,內(nèi)存,IO設(shè)備.這三個(gè)部分在內(nèi)部通過(guò)總線進(jìn)行信號(hào)(電信號(hào))的交互.
各硬件模塊之間彼此交互的是信號(hào),而且是電信號(hào),無(wú)論是CPU,內(nèi)存還是IO設(shè)備,硬件實(shí)現(xiàn)上都是一些二極管,三極管和一些線性元器件的組合電路,這些小東西只認(rèn)識(shí)電信號(hào)(電流或電壓).現(xiàn)在大多數(shù)電子設(shè)備都是數(shù)字信號(hào),計(jì)算機(jī)硬件同樣如此,(模擬)電信號(hào)又被進(jìn)一步處理成數(shù)字信號(hào)(模數(shù)轉(zhuǎn)換或稱為調(diào)制).
不難發(fā)現(xiàn)CPU Memory和IO設(shè)備組成的計(jì)算機(jī),也只認(rèn)識(shí)數(shù)字信號(hào)(電信號(hào)).顯然,想要用計(jì)算機(jī)做點(diǎn)什么,通常需要給它提供一些數(shù)字信號(hào),我們通常認(rèn)為這些數(shù)字信號(hào)只有兩種:開(kāi)或關(guān),抽象到數(shù)學(xué)表達(dá)上就是1或0.如果我們?cè)噲D將
一些有意義的文件或者圖片抽象成01的數(shù)字串,我們幾乎完成了一次與計(jì)算機(jī)硬件的單向交互.進(jìn)而若能收到對(duì)文件01串的回應(yīng),便完成了雙向交互.
我們將向硬件發(fā)送數(shù)據(jù)的提供者稱作是程序,將計(jì)算機(jī)根據(jù)程序的要求進(jìn)行具體操作稱為指令,用戶傳遞和接收的01串稱為數(shù)據(jù).
數(shù)據(jù)+指令都由程序負(fù)責(zé)管理,到達(dá)電路中它們都是01串,計(jì)算機(jī)在內(nèi)存中存儲(chǔ)它們.
有趣的是,現(xiàn)代計(jì)算機(jī)所具有的一切諸如播放視頻,玩網(wǎng)絡(luò)游戲等功能都是在用戶與底層硬件之間不停的往返發(fā)送01串而已.
最重要的軟件---操作系統(tǒng)
盡管計(jì)算機(jī)工作起來(lái)看似十分簡(jiǎn)單,實(shí)際讓它按人類的意志工作還需要有軟件支持,保證01串的交互更人性化,更易于控制.
一臺(tái)計(jì)算機(jī)上的軟件成千上萬(wàn),最關(guān)鍵的軟件就是操作系統(tǒng).操作系統(tǒng)在計(jì)算機(jī)硬件之上向用戶提供可操作的接口.
操作系統(tǒng)有著名的Windows, Mac OS, GNU/Linux三大類.
Windows為計(jì)算機(jī)的普及做了不可小覷的貢獻(xiàn).
Mac OS刷新了廣大中國(guó)人民對(duì)于美的認(rèn)識(shí).
GNU/Linux為中國(guó)互聯(lián)網(wǎng)的發(fā)展做出了杰出的貢獻(xiàn),其用戶仍在不斷增長(zhǎng)中.
GNU/LINUX操作系統(tǒng)
如果扔掉GNU只談LINUX,指的是計(jì)算機(jī)內(nèi)核(KERNEL).通常眾談?wù)摰腖inux都是指內(nèi)核.
那么一臺(tái)計(jì)算機(jī)自上電啟動(dòng)后做了什么,能讓用戶看到桌面呢?
Linux是這么做的.計(jì)算機(jī)硬件上電后,進(jìn)行上電自檢(電信檢查CPU,MEMORY,IO設(shè)備是否都正常),一切正常后將寄存器(在CPU內(nèi))中的一BIOS程序加載到內(nèi)存中,BIOS啟動(dòng)后開(kāi)始讀MBR(512Bytes),目的是找到Bootloader程序并將其加載到內(nèi)存中啟動(dòng)它,Bootloader啟動(dòng)以啟動(dòng)grub程序加載內(nèi)核,grub負(fù)責(zé)在內(nèi)存中注冊(cè)文件系統(tǒng),為所有IO設(shè)備在內(nèi)存中注冊(cè)等.自此Linux內(nèi)核才正式啟動(dòng),為了向用戶提供操作接口,Linux會(huì)在加載成功后運(yùn)行/sbin/init程序,以啟動(dòng)外殼程序.
這個(gè)過(guò)程如可以用圖形表示如下:
外殼程序有兩種:CLI(Command Line Interface)和GUI(Graphical User Interface).Linux系統(tǒng)中常用的兩種外殼是:
- CLI:
- Bash
- csh
- zsh
- ksh
- tcsh #功能最強(qiáng)大的是zsh.
- GUI:
- Gnome
- KDE
Linux系統(tǒng)計(jì)算機(jī)如何工作
Linux這個(gè)超級(jí)程序(軟件)在運(yùn)行時(shí)分為用戶空間和內(nèi)核空間.兩個(gè)空間彼此之間有嚴(yán)格的界限,用戶空間的程序不能隨意控制內(nèi)核空間的資源.
內(nèi)核空間的底層是計(jì)算機(jī)硬件,因此內(nèi)核負(fù)責(zé)對(duì)硬件的管理,權(quán)限很大,可以直接操作硬件,大致包括文件系統(tǒng)管理,進(jìn)程管理,內(nèi)存管理,網(wǎng)絡(luò)棧,時(shí)間片的調(diào)度?等.
用戶空間在內(nèi)核之上,用戶的一切行為都發(fā)生在這一層.比如:敲擊鍵盤,點(diǎn)擊鼠標(biāo),觀看視頻,運(yùn)行一段自己的小程序,向顯示器打印一句hello world.通常這個(gè)打印語(yǔ)句會(huì)寫成下面這樣.
printf("hello world!\n");
或
System.out.println("Hello world!");
無(wú)論printf還是println都不是程序員自己寫代碼實(shí)現(xiàn)的功能,其實(shí)是內(nèi)核向用戶提供的API.在Linux下可以用命令查看所有的API.
有時(shí)內(nèi)核提供的API無(wú)法滿足用戶的要求,仍然有和底層交互的需求,內(nèi)核提供的系統(tǒng)調(diào)用的方式,以保護(hù)硬件系統(tǒng).用戶可以在shell中敲入命令查看Linux提供的所有系統(tǒng)調(diào)用.
于是我們發(fā)現(xiàn)在用戶空間和內(nèi)核空間的中間有一層非常薄的API和系統(tǒng)調(diào)用.
總結(jié)
終上所述,一臺(tái)裝有Linux內(nèi)核的計(jì)算機(jī)結(jié)構(gòu)應(yīng)該可以抽象成下圖.