
如上圖所示,從宏觀上來看,Linux操作系統(tǒng)的體系架構(gòu)分為用戶態(tài)和內(nèi)核態(tài)(或者用戶空間和內(nèi)核)。
內(nèi)核從本質(zhì)上看是一種軟件:控制計算機的硬件資源,并提供上層應(yīng)用程序運行的環(huán)境。用戶態(tài)即上層應(yīng)用程序的活動空間,應(yīng)用程序的執(zhí)行必須依托于內(nèi)核提供的資源,包括CPU資源、存儲資源、I/O資源等。為了使上層應(yīng)用能夠訪問到這些資源,內(nèi)核必須為上層應(yīng)用提供訪問的接口:即系統(tǒng)調(diào)用。
系統(tǒng)調(diào)用是操作系統(tǒng)的最小功能單位,這些系統(tǒng)調(diào)用根據(jù)不同的應(yīng)用場景可以進行擴展和裁剪,現(xiàn)在各種版本的Unix實現(xiàn)都提供了不同數(shù)量的系統(tǒng)調(diào)用,如Linux的不同版本提供了240-260個系統(tǒng)調(diào)用,F(xiàn)reeBSD大約提供了320個(reference:UNIX環(huán)境高級編程)。我們可以把系統(tǒng)調(diào)用看成是一種不能再化簡的操作(類似于原子操作,但是不同概念),有人把它比作一個漢字的一個“筆畫”,而一個“漢字”就代表一個上層應(yīng)用,我覺得這個比喻非常貼切。因此,有時候如果要實現(xiàn)一個完整的漢字(給某個變量分配內(nèi)存空間),就必須調(diào)用很多的系統(tǒng)調(diào)用。如果從實現(xiàn)者(程序員)的角度來看,這勢必會加重程序員的負擔(dān),良好的程序設(shè)計方法是:重視上層的業(yè)務(wù)邏輯操作,而盡可能避免底層復(fù)雜的實現(xiàn)細節(jié)。庫函數(shù)正是為了將程序員從復(fù)雜的細節(jié)中解脫出來而提出的一種有效方法。它實現(xiàn)對系統(tǒng)調(diào)用的封裝,將簡單的業(yè)務(wù)邏輯接口呈現(xiàn)給用戶,方便用戶調(diào)用,從這個角度上看,庫函數(shù)就像是組成漢字的“偏旁”。這樣的一種組成方式極大增強了程序設(shè)計的靈活性,對于簡單的操作,我們可以直接調(diào)用系統(tǒng)調(diào)用來訪問資源,如“人”,對于復(fù)雜操作,我們借助于庫函數(shù)來實現(xiàn),如“仁”。顯然,這樣的庫函數(shù)依據(jù)不同的標(biāo)準(zhǔn)也可以有不同的實現(xiàn)版本,如ISO C 標(biāo)準(zhǔn)庫,POSIX標(biāo)準(zhǔn)庫等。
Shell是一個特殊的應(yīng)用程序,俗稱命令行,本質(zhì)上是一個命令解釋器,它下通系統(tǒng)調(diào)用,上通各種應(yīng)用,通常充當(dāng)著一種“膠水”的角色,來連接各個小功能程序,讓不同程序能夠以一個清晰的接口協(xié)同工作,從而增強各個程序的功能。同時,Shell是可編程的,它可以執(zhí)行符合Shell語法的文本,這樣的文本稱為Shell腳本,通常短短的幾行Shell腳本就可以實現(xiàn)一個非常大的功能,原因就是這些Shell語句通常都對系統(tǒng)調(diào)用做了一層封裝。為了方便用戶和系統(tǒng)交互,一般,一個Shell對應(yīng)一個終端,終端是一個硬件設(shè)備,呈現(xiàn)給用戶的是一個圖形化窗口。我們可以通過這個窗口輸入或者輸出文本。這個文本直接傳遞給shell進行分析解釋,然后執(zhí)行。
參考:https://www.cnblogs.com/bakari/p/5520860.html
??? ?;?