① 什麼是shell命令語言shell命令語言有什麼作用
Shell本身是一個用C語言編寫的程序,它是用戶使用Unix/linux的橋梁,用戶的大部分工作都是通過Shell完成的。Shell既是一種命令語言,又是一種程序設計語言。作為命令語言,它互動式地解釋和執行用戶輸入的命令;作為程序設計語言,它定義了各種變數和參數,並提供了許多在高級語言中才具有的控制結構,包括循環和分支。
它雖然不是Unix/Linux系統內核的一部分,但它調用了系統核心的大部分功能來執行程序、建立文件並以並行的方式協調各個程序的運行。因此,對於用戶來說,shell是最重要的實用程序,深入了解和熟練掌握shell的特性極其使用方法,是用好Unix/Linux系統的關鍵。
可以說,shell使用的熟練程度反映了用戶對Unix/Linux使用的熟練程度。
注意:單獨地學習 Shell 是沒有意義的,請先參考Unix/Linux入門教程,了解 Unix/Linux 基礎。
Shell有兩種執行命令的方式:
互動式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。
批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有很多條命令,讓Shell一次把這些命令執行完,而不必一條一條地敲命令。
Shell腳本和編程語言很相似,也有變數和流程式控制制語句,但Shell腳本是解釋執行的,不需要編譯,Shell程序從腳本中一行一行讀取並執行這些命令,相當於一個用戶把腳本中的命令一行一行敲到Shell提示符下執行。
Shell初學者請注意,在平常應用中,建議不要用 root 帳號運行 Shell 。作為普通用戶,不管您有意還是無意,都無法破壞系統;但如果是 root,那就不同了,只要敲幾個字母,就可能導致災難性後果。
上面提到過,Shell是一種腳本語言,那麼,就必須有解釋器來執行這些腳本。
Unix/Linux上常見的Shell腳本解釋器有bash、sh、csh、ksh等,習慣上把它們稱作一種Shell。我們常說有多少種Shell,其實說的是Shell腳本解釋器。
bash
bash是Linux標准默認的shell,本教程也基於bash講解。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個。
Linux使用它作為默認的shell是因為它有諸如以下的特色:
可以使用類似DOS下面的doskey的功能,用方向鍵查閱和快速輸入並修改命令。
自動通過查找匹配的方式給出以某字元串開頭的命令。
包含了自身的幫助功能,你只要在提示符下面鍵入help就可以得到相關的幫助。
sh
sh 由Steve Bourne開發,是Bourne Shell的縮寫,sh 是Unix 標准默認的shell。
ash
ash shell 是由Kenneth Almquist編寫的,Linux中佔用系統資源最少的一個小shell,它只包含24個內部命令,因而使用起來很不方便。
csh
csh 是Linux比較大的內核,它由以William Joy為代表的共計47位作者編成,共有52個內部命令。該shell其實是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh。
ksh
ksh 是Korn shell的縮寫,由Eric Gisin編寫,共有42條內部命令。該shell最大的優點是幾乎和商業發行版的ksh完全兼容,這樣就可以在不用花錢購買商業版本的情況下嘗試商業版本的性能了。
注意:bash是 Bourne Again Shell 的縮寫,是linux標準的默認shell ,它基於Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是說,用sh寫的腳本可以不加修改的在bash中執行。
大體上,可以將程序設計語言可以分為兩類:編譯型語言和解釋型語言。
編譯型語言
很多傳統的程序設計語言,例如Fortran、Ada、Pascal、C、C++和Java,都是編譯型語言。這類語言需要預先將我們寫好的源代碼(source code)轉換成目標代碼(object code),這個過程被稱作「編譯」。
運行程序時,直接讀取目標代碼(object code)。由於編譯後的目標代碼(object code)非常接近計算機底層,因此執行效率很高,這是編譯型語言的優點。
但是,由於編譯型語言多半運作於底層,所處理的是位元組、整數、浮點數或是其他機器層級的對象,往往實現一個簡單的功能需要大量復雜的代碼。例如,在C++里,就很難進行「將一個目錄里所有的文件復制到另一個目錄中」之類的簡單操作。
解釋型語言
解釋型語言也被稱作「腳本語言」。執行這類程序時,解釋器(interpreter)需要讀取我們編寫的源代碼(source code),並將其轉換成目標代碼(object code),再由計算機運行。因為每次執行程序都多了編譯的過程,因此效率有所下降。
使用腳本編程語言的好處是,它們多半運行在比編譯型語言還高的層級,能夠輕易處理文件與目錄之類的對象;缺點是它們的效率通常不如編譯型語言。不過權衡之下,通常使用腳本編程還是值得的:花一個小時寫成的簡單腳本,同樣的功能用C或C++來編寫實現,可能需要兩天,而且一般來說,腳本執行的速度已經夠快了,快到足以讓人忽略它性能上的問題。腳本編程語言的例子有awk、Perl、Python、Ruby與Shell。因為Shell似乎是各UNIX系統之間通用的功能,並且經過了POSIX的標准化。因此,Shell腳本只要「用心寫」一次,即可應用到很多系統上。因此,之所以要使用Shell腳本是基於:
簡單性:Shell是一個高級語言;通過它,你可以簡潔地表達復雜的操作。
可移植性:使用POSIX所定義的功能,可以做到腳本無須修改就可在不同的系統上執行。
開發容易:可以在短時間內完成一個功能強大又妤用的腳本。
但是,考慮到Shell腳本的命令限制和效率問題,下列情況一般不使用Shell:
資源密集型的任務,尤其在需要考慮效率時(比如,排序,hash等等)。
需要處理大任務的數學操作,尤其是浮點運算,精確運算,或者復雜的算術運算(這種情況一般使用C++或FORTRAN 來處理)。
有跨平台(操作系統)移植需求(一般使用C 或Java)。
復雜的應用,在必須使用結構化編程的時候(需要變數的類型檢查,函數原型,等等)。
對於影響系統全局性的關鍵任務應用。
對於安全有很高要求的任務,比如你需要一個健壯的系統來防止入侵、破解、惡意破壞等等。
項目由連串的依賴的各個部分組成。
需要大規模的文件操作。
需要多維數組的支持。
需要數據結構的支持,比如鏈表或數等數據結構。
需要產生或操作圖形化界面 GUI。
需要直接操作系統硬體。
需要 I/O 或socket 介面。
需要使用庫或者遺留下來的老代碼的介面。
私人的、閉源的應用(shell 腳本把代碼就放在文本文件中,全世界都能看到)。
如果你的應用符合上邊的任意一條,那麼就考慮一下更強大的語言吧——或許是Perl、Tcl、Python、Ruby——或者是更高層次的編譯語言比如C/C++,或者是Java。即使如此,你會發現,使用shell來原型開發你的應用,在開發步驟中也是非常有用的。
② LINUX快速入門第八章:Shell基礎
我們平時所說的 Shell 可以理解為 Linux 系統提供給用戶的使用界面。Shell 為用戶提供了輸入命令和參數並可得到命令執行結果的環境。當一個用戶登錄 Linux 之後,系統初始化程序 init 就根據 /etc/passwd 文件中的設定,為每個用戶運行一個被稱為 Shell(外殼)的程序。
確切地說,Shell 是一個命令行解釋器,它為用戶提供了一個向 Linux 內核發送請求以便運行程序的界面系統級程序,用戶可以用 Shell 來啟動、掛起、停止甚至編寫一些程序。
Shell 處在內核與外層應用程序之間,起著協調用戶與系統的一致性、在用戶與系統之間進行交互的作用。圖 1 是 Linux 系統層次結構圖,Shell 接收用戶輸入的命令,並把用戶的命令從類似 abed 的 ASCII 碼解釋為類似 0101 的機器語言,然後把命令提交到系統內核處理;當內核處理完畢之後,把處理結果再通過 Shell 返回給用戶。
換句話說:
Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言,又是一種程序設計語言。
Shell 是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。
Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一個典型的圖形界面 Shell。
Shell 與其他 Linux 命令一樣,都是實用程序,但它們之間還是有區別的。一旦用戶注冊到系統後,Shell 就被系統裝入內存並一直運行到用戶退出系統為止;而一般命令僅當被調用時,才由系統裝入內存執行。
與一般命令相比,Shell 除了是一個命令行解釋器,同時還是一門功能強大的編程語言,易編寫,易調試,靈活性較強。作為一種命令級語言,Shell 是解釋性的,組合功能很強,與操作系統有密切的關系,可以在 Shell 腳本中直接使用系統命令。大多數 Linux 系統的啟動相關文件(一般在 /etc/rc.d 目錄下)都是使用 Shell 腳本編寫的。
同傳統的編程語言一樣,Shell 提供了很多特性,這些特性可以使 Shell 腳本編程更為有用,如數據變數、參數傳遞、判斷、流程式控制制、數據輸入和輸出、子程序及中斷處理等。
說了這么多,其實我們在 Linux 中操作的命令行界面就是 Linux 的 Shell,也就是 Bash,但是我們的圖形界面是 Shell 嗎?其實從廣義講,圖形界面當然也是 Shell,因為它同樣用來接收用戶的操作,並傳遞到內核進行處理。不過,這里的 Shell 主要指的是 Bash。
Shell 腳本
Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。
業界所說的 shell 通常都是指 shell 腳本,但讀者朋友要知道,shell 和 shell script 是兩個不同的概念。
由於習慣的原因,簡潔起見,本文出現的 "shell編程" 都是指 shell 腳本編程,不是指開發 shell 自身。
Shell的分類
目前 Shell 的版本有很多種,如 Bourne Shell、C Shell、Bash、ksh、tcsh 等,它們各有特點,下面簡要介紹一下。
最重要的 Shell 是 Bourne Shell,這個命名是為了紀念此 Shell 的發明者 Steven Bourne。從 1979 年起,UNIX 就開始使用 Boume Shell。Bourne Shell 的主文件名為 sh,開發人員便以 sh 作為 Bourne Shell 的主要識別名稱。
雖然 Linux 與 UNIX 一樣,可以支持多種 Shell,但 Boume Shell 的重要地位至今仍然沒有改變,許多 UNIX 系統中仍然使用 sh 作為重要的管理工具。它的工作從開機到關機,幾乎無所不包。在 Linux 中,用戶 Shell 主要是 Bash,但在啟動腳本、編輯等很多工作中仍然使用 Bourne Shell。
C Shell 是廣為流行的 Shell 變種。C Shell 主要在 BSD 版的 UNIX 系統中使用,發明者是柏克萊大學的 Bill Joy。C Shell 因為其語法和 C 語言類似而得名,這也使得 UNIX 的系統工程師在學習 C Shell 時感到相當方便。
Bourne Shell 和 C Shell 形成了 Shell 的兩大主流派別,後來的變種大都吸取這兩種 Shell 的特點,如 Korn、 tcsh 及 Bash。
Bash Shell 是 GNU 計劃的重要工具之一,也是 GNU 系統中標準的 Shell。Bash 與 sh 兼容,所以許多早期開發出來的 Bourne Shell 程序都可以繼續在 Bash 中運行。現在使用的 Linux 就使用 Bash 作為用戶的基本 Shell。
Bash 於 1988 年發布,並在 1995-1996年推出Bash 2.0。在這之前,廣為使用的版本是1.14,Bash 2.0增加了許多新的功能,以及具備更好的兼容性。表 2 中詳細列出了各版本的具體情況。
注意,Shell 的兩種主要語法類型有 Bourne 和 C,這兩種語法彼此不兼容。Boume 家族主要包括 sh、ksh、Bash、psh、zsh;C 家族主要包括 csh、tcsh(Bash 和 zsh 在不同程序上支持 csh 的語法)。
本章講述的腳本編程就是在 Bash 環境中進行的。不過,在 Linux 中除了可以支持 Bash,還可以支持很多其他的 Shell。我們可以通過 /etc/shells 文件來査詢 Linux 支持的 Shell。命令如下:
在 Linux 中,這些 Shell 是可以任意切換的,命令如下:
用戶信息文件 /etc/passwd 的最後一列就是這個用戶的登錄 Shell。命令如下:
大家可以看到,root 用戶和其他可以登錄系統的普通用戶的登錄 Shell 都是 /bin/bash,也就是 Linux 的標准 Shell,所以這些用戶登錄之後可以執行許可權允許范圍內的所有命令。不過,所有的系統用戶(偽用戶)因為登錄 Shell 是 /sbin/ndogin,所以不能登錄系統。
筆記:
sh/bash/csh/Tcsh/ksh/pdksh等shell的區別
③ 指令是一種命令語言,它用來規定cpu執行什麼操作以及操作對象所在的位置
CPU從存儲器或高速緩沖存儲器中取出指令,放入指令寄存器,並對指令解碼。它把指令分解成一系列的微操作,然後發出各種控制命令,執行微操作系列,從而完成一條指令的執行。指令是計算機規定執行操作的類型和操作數的基本命令。指令是由一個位元組或者多個位元組組成,其中包括操作碼欄位、一個或多個有關操作數地址的欄位以及一些表徵機器狀態的狀態字以及特徵碼。有的指令中也直接包含操作數本身。提取第一階段,提取,從存儲器或高速緩沖存儲器中檢索指令(為數值或一系列數值)。由程序計數器(ProgramCounter)指定存儲器的位置,程序計數器保存供識別目前程序位置的數值。換言之,程序計數器記錄了CPU在目前程序里的蹤跡。提取指令之後,程序計數器根據指令長度增加存儲器單元。指令的提取必須常常從相對較慢的存儲器尋找,因此導致CPU等候指令的送入。這個問題主要被論及在現代處理器的快取和管線化架構。解碼CPU根據存儲器提取到的指令來決定其執行行為。在解碼階段,指令被拆解為有意義的片斷。根據CPU的指令集架構(ISA)定義將數值解譯為指令。一部分的指令數值為運算碼(Opcode),其指示要進行哪些運算。其它的數值通常供給指令必要的信息,諸如一個加法(Addition)運算的運算目標。這樣的運算目標也許提供一個常數值(即立即值),或是一個空間的定址值:暫存器或存儲器位址,以定址模式決定。在舊的設計中,CPU里的指令解碼部分是無法改變的硬體設備。不過在眾多抽象且復雜的CPU和指令集架構中,一個微程序時常用來幫助轉換指令為各種形態的訊號。這些微程序在已成品的CPU中往往可以重寫,方便變更解碼指令。執行在提取和解碼階段之後,接著進入執行階段。該階段中,連接到各種能夠進行所需運算的CPU部件。例如,要求一個加法運算,算數邏輯單元(ALU,ArithmeticLogicUnit)將會連接到一組輸入和一組輸出。輸入提供了要相加的數值,而輸出將含有總和的結果。ALU內含電路系統,易於輸出端完成簡單的普通運算和邏輯運算(比如加法和位元運算)。如果加法運算產生一個對該CPU處理而言過大的結果,在標志暫存器里,運算溢出(ArithmeticOverflow)標志可能會被設置。寫回最終階段,寫回,以一定格式將執行階段的結果簡單的寫回。運算結果經常被寫進CPU內部的暫存器,以供隨後指令快速存取。在其它案例中,運算結果可能寫進速度較慢,但容量較大且較便宜的主記憶體中。某些類型的指令會操作程序計數器,而不直接產生結果。這些一般稱作「跳轉」(Jumps),並在程式中帶來循環行為、條件性執行(透過條件跳轉)和函式。許多指令也會改變標志暫存器的狀態位元。這些標志可用來影響程式行為,緣由於它們時常顯出各種運算結果。例如,以一個「比較」指令判斷兩個值的大小,根據比較結果在標志暫存器上設置一個數值。這個標志可藉由隨後的跳轉指令來決定程式動向。在執行指令並寫回結果之後,程序計數器的值會遞增,反覆整個過程,下一個指令周期正常的提取下一個順序指令。如果完成的是跳轉指令,程序計數器將會修改成跳轉到的指令位址,且程序繼續正常執行。許多復雜的CPU可以一次提取多個指令、解碼,並且同時執行。這個部分一般涉及「經典RISC管線」,那些實際上是在眾多使用簡單CPU的電子裝置中快速普及(常稱為微控制(Microcontrollers))。編輯本段基本結構CPU包括運算邏輯部件、寄存器部件和控制部件等。運算邏輯部件運算邏輯部件,可以執行定點或浮點的算術運算操作、移位操作以及邏輯操作,也可執行地址的運算和轉換。寄存器部件寄存器部件,包括通用寄存器、專用寄存器和控制寄存器。32位CPU的寄存器通用寄存器又可分定點數和浮點數兩類,它們用來保存指令中的寄存器操作數和操作結果。通用寄存器是中央處理器的重要組成部分,大多數指令都要訪問到通用寄存器。通用寄存器的寬度決定計算機內部的數據通路寬度,其埠數目往往可影響內部操作的並行性。專用寄存器是為了執行一些特殊操作所需用的寄存器。控制寄存器通常用來指示機器執行的狀態,或者保持某些指針,有處理狀態寄存器、地址轉換目錄的基地址寄存器、特權狀態寄存器、條件碼寄存器、處理異常事故寄存器以及檢錯寄存器等。有的時候,中央處理器中還有一些緩存,用來暫時存放一些數據指令,緩存越大,說明CPU的運算速度越快,目前市場上的中高端中央處理器都有2M左右的二級緩存,高端中央處理器有4M左右的二級緩存。控制部件控制部件,主要負責對指令解碼,並且發出為完成每條指令所要執行的各個操作的控制信號。其結構有兩種:一種是以微存儲為核心的微程序控制方式;一種是以邏輯硬布線結構為主的控制方式。微存儲中保持微碼,每一個微碼對應於一個最基本的微操作,又稱微指令;各條指令是由不同序列的微碼組成,這種微碼序列構成微程序。中央處理器在對指令解碼以後,即發出一定時序的控制信號,按給定序列的順序以微周期為節拍執行由這些微碼確定的若干個微操作,即可完成某條指令的執行。簡單指令是由(3~5)個微操作組成,復雜指令則要由幾十個微操作甚至幾百個微操作組成。邏輯硬布線控制器則完全是由隨機邏輯組成。指令解碼後,控制器通過不同的邏輯門的組合,發出不同序列的控制時序信號,直接去執行一條指令中的各個操作。編輯本段發展歷史CPU這個名稱,早期是對一系列可以執行復雜的計算機程序或電腦程式的邏輯機器的描述。這個空泛的定義很容易在「CPU」這個名稱被普遍使用之前將計算機本身也包括在內。誕生中央處理器(Intel)但從20世紀70年代開始,由於集成電路的大規模使用,把本來需要由數個獨立單元構成的CPU集成為一塊微小但功能空前強大的微處理器時。這個名稱及其縮寫才真正在電子計算機產業中得到廣泛應用。盡管與早期相比,CPU在物理形態、設計製造和具體任務的執行上都有了戲劇性的發展,但是其基本的操作原理一直沒有改變。1971年,當時還處在發展階段的Intel公司推出了世界上第一台真正的微處理器--4004。這不但是第一個用於計算器的4位微處理器,也是第一款個人有能力買得起的電腦處理器!4004含有2300個晶體管,功能相當有限,而且速度還很慢,被當時的藍色巨人IBM以及大部分商業用戶不屑一顧,但是它畢竟是劃時代的產品,從此以後,Intel公司便與微處理器結下了不解之緣。可以這么說,CPU的歷史發展歷程其實也就是Intel公司X86系列CPU的發展歷程,就通過它來的「CPU歷史之旅」。起步的角逐中央處理器(Intel)1978年,Intel公司再次領導潮流,首次生產出16位的微處理器,並命名為i8086,同時還生產出與之相配合的數學協處理器i8087,這兩種晶元使用相互兼容的指令集,但在i8087指令集中增加了一些專門用於對數、指數和三角函數等數學計算的指令。由於這些指令集應用於i8086和i8087,所以人們也把這些指令集中統一稱之為X86指令集。雖然以後Intel公司又陸續生產出第二代、第三代等更先進和更快的新型CPU,但都仍然兼容原來的X86指令,而且Intel公司在後續CPU的命名上沿用了原先的X86序列,直到後來因商標注冊問題,才放棄了繼續用阿拉伯數字命名。至於在後來發展壯大的其他公司,例如AMD和Cyrix等,在486以前(包括486)的CPU都是按Intel的命名方式為自己的X86系列CPU命名,但到了586時代,市場競爭越來越厲害了,由於商標注冊問題,它們已經無法繼續使用與Intel的X86系列相同或相似的命名,只好另外為自己的586.686兼容CPU命名了。1979年,Intel公司推出了8088晶元,它仍舊是屬於16位微處理器,內含29000個晶體管,時鍾頻率為4.77MHz,地址匯流排為20位,可使用1MB內存。8088內部數據匯流排都是16位,外部數據匯流排是8位,而它的兄弟8086是16位。微機時代的來臨中央處理器(概念圖)1981年,8088晶元首次用於IBM的PC(個人電腦PersonalComputer)機中,開創了全新的微機時代。也正是從8088開始,PC的概念開始在全世界范圍內發展起來。早期的CPU通常是為大型及特定應用的計算機而訂制。但是,這種昂貴為特定應用定製CPU的方法很大程度上已經讓位於開發便宜、標准化、適用於一個或多個目的的處理器類。這個標准化趨勢始於由單個晶體管組成的大型機和微機年代,隨著集成電路的出現而加速。集成電路使得更為復雜的CPU可以在很小的空間中設計和製造出來(在微米的量級)。1982年,許多年輕的讀者尚在襁褓之中的時候,Intel公司已經推出了劃時代的最新產品80286晶元,該晶元比8086和8088都有了飛躍的發展,雖然它仍舊是16位結構,但是在CPU的內部含有13.4萬個晶體管,時鍾頻率由最初的6MHz逐步提高到20MHz。其內部和外部數據匯流排皆為16位,地址匯流排24位,可定址16MB內存。從80286開始,CPU的工作方式也演變出兩種來:實模式和保護模式。中央處理器(AMD速龍64FX概念圖)1985年,Intel公司推出了80386晶元,它是80X86系列中的第一種32位微處理器,而且製造工藝也有了很大的進步,與80286相比,80386內部內含27.5萬個晶體管,時鍾頻率為12.5MHz,後提高到20MHz、25MHz、33MHz。80386的內部和外部數據匯流排都是32位,地址匯流排也是32位,可定址高達4GB內存。它除具有實模式和保護模式外,還增加了一種叫虛擬86的工作方式,可以通過同時模擬多個8086處理器來提供多任務能力。除了標準的80386晶元,也就是經常說的80386DX外,出於不同的市場和應用考慮,Intel又陸續推出了一些其它類型的80386晶元:80386SX、80386SL、80386DL等。1988年,Intel推出的80386SX是市場定位在80286和80386DX之間的一種晶元,其與80386DX的不同在於外部數據匯流排和地址匯流排皆與80286相同,分別是16位和24位(即定址能力為16MB)。高速CPU時代的騰飛1990年,Intel公司推出的80386SL和80386DL都是低功耗、節能型晶元,主要用於便攜機和節能型台式機。80386SL與80386DL的不同在於前者是基於80386SX的,後者是基於80386DX的,但兩者皆增加了一種新的工作方式:系統管理方式。當進入系統管理方式後,CPU就自動降低運行速度、控制顯示屏和硬碟等其它部件暫停工作,甚至停止運行,進入「休眠」狀態,以達到節能目的。1989年,大家耳熟能詳的80486晶元由Intel公司推出,這種晶元的偉大之處就在於它突破了100萬個晶體管的界限,集成了120萬個晶體管。80486的時鍾頻率從25MHz逐步提高到了33MHz、50MHz。80486是將80386和數學協處理器80387以及一個8KB的高速緩存集成在一個晶元內,並且在80X86系列中首次採用了RISC(精簡指令集)技術,可以在一個時鍾周期內執行一條指令。它還採用了突發匯流排方式,大大提高了與內存的數據交換速度。由於這些改進,80486的性能比帶有80387數學協處理器的80386DX提高了4倍。80486和80386一樣,也陸續出現了幾種類型。上面介紹的最初類型是80486DX。1990年,Intel公司推出了80486SX,它是486類型中的一種低價格機型,其與80486DX的區別在於它沒有數學協處理器。80486DX2由於用了時鍾倍頻技術,也就是說晶元內部的運行速度是外部匯流排運行速度的兩倍,即晶元內部以2倍於系統時鍾的速度運行,但仍以原有時鍾速度與外界通訊。80486DX2的內部時鍾頻率主要有40MHz、50MHz、66MHz等。80486DX4也是採用了時鍾倍頻技術的晶元,它允許其內部單元以2倍或3倍於外部匯流排的速度運行。為了支持這種提高了的內部工作頻率,它的片內高速緩存擴大到16KB。80486DX4的時鍾頻率為100MHz,其運行速度比66MHz的80486DX2快40%。80486也有SL增強類型,其具有系統管理方式,用於便攜機或節能型台式機。CPU的標准化和小型化都使得這一類數字設備(香港譯為「電子零件」)在現代生活中中央處理器(Intel)的出現頻率遠遠超過有限應用專用的計算機。現代微處理器出現在包括從汽車到手機到兒童玩具在內的各種物品中。編輯本段性能指標主頻主頻也叫時鍾頻率,單位是兆赫(MHz)或千兆赫(GHz),用來表示CPU的運算、處理數據的速度。CPU的主頻=外頻×倍頻系數。主頻和實際的運算速度存在一定的關系,但並不是一個簡單的線性關系。所以,CPU的主頻與CPU實際的運算能力是沒有直接關系的,主頻表示在CPU內數字脈沖信號震盪的速度。在Intel的處理器產品中,也可以看到這樣的例子:1GHzItanium晶元能夠表現得差不多跟2.66GHz至強(Xeon)/Opteron一樣快,或是1.5GHzItanium2大約跟4GHzXeon/Opteron一樣快。CPU的運算速度還要看CPU的流水線、匯流排等等各方面的性能指標。外頻外頻是CPU的基準頻率,單位是MHz。CPU的外頻決定著整塊主板的運行速度。通俗地說,在台式機中,所說的超頻,都是超CPU的外頻(當然一般情況下,CPU的倍頻都是被鎖住的)相信這點是很好理解的。但對於伺服器CPU來講,超頻是絕對不允許的。前面說到CPU決定著主板的運行速度,兩者是同步運行的,如果把伺服器CPU超頻了,改變了外頻,會產生非同步運行,(台式機很多主板都支持非同步運行)這樣會造成整個伺服器系統的不穩定。目前的絕大部分電腦系統中外頻與主板前端匯流排不是同步速度的,而外頻與前端匯流排(FSB)頻率又很容易被混為一談。前端匯流排(FSB)頻率前端匯流排(FSB)頻率(即匯流排頻率)是直接影響CPU與內存直接數據交換速度。有一條公式可以計算,即數據帶寬=(匯流排頻率×數據位寬)/8,數據傳輸最大帶寬取決於所有同時傳輸的數據的寬度和傳輸頻率。比方,現在的支持64位的至強Nocona,前端匯流排是800MHz,按照公式,它的數據傳輸最大帶寬是6.4GB/秒。中央處理器(Intel)外頻與前端匯流排(FSB)頻率的區別:前端匯流排的速度指的是數據傳輸的速度,外頻是CPU與主板之間同步運行的速度。也就是說,100MHz外頻特指數字脈沖信號在每秒鍾震盪一億次;而100MHz前端匯流排指的是每秒鍾CPU可接受的數據傳輸量是100MHz×64bit÷8bit/Byte=800MB/s。其實現在「HyperTransport」構架的出現,讓這種實際意義上的前端匯流排(FSB)頻率發生了變化。IA-32架構必須有三大重要的構件:內存控制器Hub(MCH),I/O控制器Hub和PCIHub,像Intel很典型的晶元組Intel7501.Intel7505晶元組,為雙至強處理器量身定做的,它們所包含的MCH為CPU提供了頻率為533MHz的前端匯流排,配合DDR內存,前端匯流排帶寬可達到4.3GB/秒。但隨著處理器性能不斷提高同時給系統架構帶來了很多問題。而「HyperTransport」構架不但解決了問題,而且更有效地提高了匯流排帶寬,比方AMDOpteron處理器,靈活的HyperTransportI/O匯流排體系結構讓它整合了內存控制器,使處理器不通過系統匯流排傳給晶元組而直接和內存交換數據。這樣的話,前端匯流排(FSB)頻率在AMDOpteron處理器就不知道從何談起了。CPU的位和字長中央處理器(德州儀器)位:在數字電路和電腦技術中採用二進制,代碼只有「0」和「1」,其中無論是「0」或是「1」在CPU中都是一「位」。字長:電腦技術中對CPU在單位時間內(同一時間)能一次處理的二進制數的位數叫字長。所以能處理字長為8位數據的CPU通常就叫8位的CPU。同理32位的CPU就能在單位時間內處理字長為32位的二進制數據。位元組和字長的區別:由於常用的英文字元用8位二進制就可以表示,所以通常就將8位稱為一個位元組。字長的長度是不固定的,對於不同的CPU、字長的長度也不一樣。8位的CPU一次只能處理一個位元組,而32位的CPU一次就能處理4個位元組,同理字長為64位的CPU一次可以處理8個位元組。倍頻系數倍頻系數是指CPU主頻與外頻之間的相對比例關系。在相同的外頻下,倍頻越高CPU的頻率也越高。但實際上,在相同外頻的前提下,高倍頻的CPU本身意義並不大。這是因為CPU與系統之間數據傳輸速度是有限的,一味追求高主頻而得到高倍頻的CPU就會出現明顯的「瓶頸」效應-CPU從系統中得到數據的極限速度不能夠滿足CPU運算的速度。一般除了工程樣版的Intel的CPU都是鎖了倍頻的,少量的如Intel酷睿2核心的奔騰雙核E6500K和一些至尊版的CPU不鎖倍頻,而AMD之前都沒有鎖,現在AMD推出了黑盒版CPU(即不鎖倍頻版本,用戶可以自由調節倍頻,調節倍頻的超頻方式比調節外頻穩定得多)。緩存緩存大小也是CPU的重要指標之一,而且緩存的結構和大小對CPU速度的影響非常大,CPU內緩存的運行頻率極高,一般是和處理器同頻運作,工作效率遠遠大於系統內存和硬碟。實際工作時,CPU往往需要重復讀取同樣的數據塊,而緩存容量的增大,可以大幅度提升CPU內部讀取數據的命中率,而不用再到內存或者硬碟上尋找,以此提高系統性能。但是由於CPU晶元面積和成本的因素來考慮,緩存都很小。L1Cache(一級緩存)是CPU第一層高速緩存,分為數據緩存和指令緩存。內置的L1高速緩存的容量和結構對CPU的性能影響較大,不過高速緩沖存儲器均由靜態RAM組成,結構較復雜,在CPU管芯面積不能太大的情況下,L1級高速緩存的容量不可能做得太大。一般伺服器CPU的L1緩存的容量通常在32-256KB。L2Cache(二級緩存)是CPU的第二層高速緩存,分內部和外部兩種晶元。內部的晶元二級緩存運行速度與主頻相同,而外部的二級緩存則只有主頻的一半。L2高速緩存容量也會影響CPU的性能,原則是越大越好,以前家庭用CPU容量最大的是512KB,現在筆記本電腦中也可以達到2M,而伺服器和工作站上用CPU的L2高速緩存更高,可以達到8M以上。L3Cache(三級緩存),分為兩種,早期的是外置,現在的都是內置的。而它的實際作用即是,L3緩存的應用可以進一步降低內存延遲,同時提升大數據量計算時處理器的性能。降低內存延遲和提升大數據量計算能力對游戲都很有幫助。而在伺服器領域增加L3緩存在性能方面仍然有顯著的提升。比方具有較大L3緩存的配置利用物理內存會更有效,故它比較慢的磁碟I/O子系統可以處理的數據請求。具有較大L3緩存的處理器提供更有效的文件系統緩存行為及較短消息和處理器隊列長度。其實最早的L3緩存被應用在AMD發布的K6-III處理器上,當時的L3緩存受限於製造工藝,並沒有被集成進晶元內部,而是集成在主板上。在只能夠和系統匯流排頻率同步的L3緩存同主內存其實差不了多少。後來使用L3緩存的是英特爾為伺服器市場所推出的Itanium處理器。接著就是P4EE和至強MP。Intel還打算推出一款9MBL3緩存的Itanium2處理器,和以後24MBL3緩存的雙核心Itanium2處理器。但基本上L3緩存對處理器的性能提高顯得不是很重要,比方配備1MBL3緩存的XeonMP處理器卻仍然不是Opteron的對手,由此可見前端匯流排的增加,要比緩存增加帶來更有效的性能提升。CPU擴展指令集CPU依靠指令來自計算和控制系統,每款CPU在設計時就規定了一系列與其硬體電路相配合的指令系統。指令的強弱也是CPU的重要指標,指令集是提高微處理器效率的最有效工具之一。從現階段的主流體系結構講,指令集可分為復雜指令集和精簡指令集兩部分(指令集共有四個種類),而從具體運用看,如Intel的MMX(MultiMediaExtended,此為AMD猜測的全稱,Intel並沒有說明詞源)、SSE、SSE2(Streaming-Singleinstructionmultipledata-Extensions2)、SSE3、SSE4系列和AMD的3DNow!等都是CPU的擴展指令集,分別增強了CPU的多媒體、圖形圖象和Internet等的處理能力。通常會把CPU的擴展指令集稱為」CPU的指令集」。SSE3指令集也是目前規模最小的指令集,此前MMX包含有57條命令,SSE包含有50條命令,SSE2包含有144條命令,SSE3包含有13條命令。CPU內核和I/O工作電壓從586CPU開始,CPU的工作電壓分為內核電壓和I/O電壓兩種,通常CPU的核心電壓小於等於I/O電壓。其中內核電壓的大小是根據CPU的生產工藝而定,一般製作工藝越小,內核工作電壓越低;I/O電壓一般都在1.6~5V。低電壓能解決耗電過大和發熱過高的問題。
④ Shell腳本的概念區別
給腳本加上執行許可權chmod
u+x
a.sh,
而後就可以直接用全路徑來執行腳本了,比如當前文件夾下用./a.sh,如果如果腳本所在目錄在path環境變數之中,
則直接用a.sh即可(這和運行我們自己編寫的程序是一個道理)sh/bash
./a.sh
這種情況不需要腳本具有執行許可權以上兩種執行方式都是在子shell中執行的,也就是說當前shell需要啟動另外一個shell,用來執行a.sh內的命令source
./a.sh
.
./a.sh(注意前面的
.
)以上兩種執行方式是在當前shell下執行,並不需要建立子shellsource和
.
命令的作用:用來執行一個腳本
前兩種方式和後兩種方式的另外區別:如果你在一個腳本里export
$kkk=111
,如果你用./a.sh執行該腳本,執行完畢後,你運行
echo
$kkk
,發現沒有值,如果你用source來執行
,然後再echo
,就會發現kkk=111。因為調用./a.sh來執行shell是在一個子shell里運行的,所以執行後,結構並沒有反應到父shell里,但是
source不同它就是在本shell中執行的,所以可以看到結果。