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