第三章 Linux基礎知識

3.1 程序的組成與執行過程

3.1.1 三種編程接口

 在前面幾章我們已經粗略的說過,面向計算機通常有三種編程接口,分別是:

  a) 硬件規格

  b) 系統調用

  c) 庫調用

  每個CPU的生產廠商在生產一個計算芯片時,這個芯片本身有其內置的指令集,所以有一部分人在編程時直接面向這些指令集進行,這類編程方式就是面向硬件規格編程。

3.1.2 程序執行過程

  前面我們說過,Intel x86系列的CPU,通常由外而內,指令集是分佈在4個環上的,環0上的是特權指令,只能由操作系統執行,環3上的是普通指令,可以由程序執行也可以由操作系統執行。那麼程序的執行過程到底怎樣?這裏舉個例子說明一下:

  比如我們要計算1+1,計算1+1這條指令並不需要什麼特權,程序可以直接執行,但是需要注意的是,要執行1+1需要在內存中取得加數、被加數與加號“+”,而應用程序是無法與內存直接交互的。此時就需要執行系統調用了,第一次系統調用在內存中取出加數,第二次系統調用在內存中取出被加數,第三次系統調用取出加號“+”,剩餘的運算纔不需要特權指令,纔不需要系統調用參與而直接由應用程序執行。

  一個程序的運行大多有一部分是普通指令,由內核分配給cpu運行,還有一部分是特權指令,由程序向操作系統發起系統調用,最後由操作系統完成操作並返回結果給程序。一個程序的運行過程大體就是這樣,下圖是程序運行過程的一張圖,可以參考參考。

wKiom1i34MORSRqlAABapzk03Cg902.jpg

3.1.3 程序運行模式

  如圖1所示,因爲一個程序的執行大多有兩部分組成(特權指令與普通指令),所以一個程序的運行大體分爲兩個模式,分別是用戶模式與內核模式,也稱作用戶空間(User Space,簡稱us)和內核空間(System space)

  並非系統調用在每個時刻都會發生,因爲程序的普通指令是允許直接在CPU上運行的,但特權指令是不允許程序直接在CPU上運行的,必須由操作系統來代理完成。因爲現代操作系統一般都是多用戶多任務的,CPU只有一個,同一時間只能由一個程序執行,程序1佔據了CPU程序2就無法執行,所以爲了防止此類現象的發生,纔有了內核,由內核來指揮程序運行,而所有的特權指令由操作系統(內核)自己來代理完成。

3.1.4 程序的組成

  程序一般由指令+數據組成,其中指令就是cpu內置的指令,它是不可變化的。而數據是由用戶提供的,是指令加工的對象,數據是可讀寫的。

  從另一個角度來說,程序是由算法+數據結構組成的。寫程序無非是設計數據結構,並設計算法對數據進行加工。算法其實就是CPU的內置指令按照一定的邏輯去運行。


3.2 可移植操作系統規範POSIX

  由於直接面向系統調用進行編程過於底層,使編程難度極大增加,於是就有人將這些非常底層與原始的系統調用再次向上抽象了一層,也就是我們所說的庫調用。現在的程序員一般大多數情況下是基於庫調用和一部分系統調用來研發的,無論是windows還是linux大多數都是基於C語言研發的,所以其庫一般都是C庫。無論是windows還是linux系統都提供了庫,如果兩者的庫不兼容,會導致在windows上寫的程序在linux上沒法用,於是國際電子電氣工程師協會IEEE(Institute of Electrical and Electronics Engineers)對庫的標準定義了一種規範,也就是這節我們要說的可移植操作系統規範POS(Portable Operating System)。有了POS以後,無論在任何平臺下寫程序,只要程序遵循POS規範,那麼其源碼在不同平臺下是可以兼容的。但是POS這個名字跟約定俗成的Unix、Linux不太像,後來就把POS給改成了POSIX。

  事實上,從windows server 2003以後的windows版本和絕大多數的linux、unix版本,其庫均是遵循POSIX規範的。


3.3 操作系統程序的接口格式

3.3.1 程序的運行格式

  Windows:EXE

  Linux:ELF

3.3.2 庫格式

  Windows:dll(dynamic link library)

  Linux:so(share object)


3.4 垃圾回收機制GC(Garbage collection)

3.4.1 C語言特性

  C語言允許程序使用指針,可以直接操作內存空間,申請內存和釋放內存都是由程序員手動進行的。

  malloc():這是一個申請內存的系統調用

  free():這是一個釋放內存的系統調用

3.4.2 垃圾回收機制背景

  讓我們來想一個問題,如果A程序運行中free了其他程序的內存空間會怎麼樣呢?如果程序多次申請內存空間,但是都不釋放呢?這些都是不被允許的。因此C語言要求程序員必須精心設計內存的申請和回收,一旦設計有一點點不當,就可能導致程序出錯,使程序間互相干擾。緩衝區溢出就是使用這種方式來實現的。

  C語言雖然是高級語言,但是其兼具一些低級語言的特性。C語言適用於寫操作系統層級的程序和一些對性能要求非常高的程序,如Mysql。

wKiom1i34WaDWP4EAAAlgd9-SHw946.jpg

  基於C語言的特性,有人就把庫調用又向上抽象了一層,就是高級語言的解釋器或虛擬機,如python的命令行界面、java的jvm。這一層已經與操作系統內核沒有任何關係了。在這一層寫的程序需要用內存時只需要申請分配即可,用完不需要手動進行釋放,虛擬機會自動監視程序使用內存的情況,發現有程序用完了的內存就收到一個垃圾桶裏,等垃圾桶滿了再統一釋放。這個過程就是垃圾回收機制,此垃圾回收機制在python和java中都是通用的。

3.4.3 垃圾回收機制的缺陷

  有了垃圾回收機制以後,程序員寫程序只需要申請分配內存,而無需手動釋放內存,由虛擬機自動釋放內存。如此一來就很難出現前面所說的一個程序覆蓋其他程序的內存的情況了。

  垃圾回收機制大大的解放了程序員的精力,但是其也有其缺陷。由於虛擬機很難猜測程序申請的內存什麼時候不需要使用了,而且程序很可能申請了衆多內存空間並且用完以後不再用了。爲了完成垃圾回收,垃圾收集器就必須定期、週期性的掃描內存空間,看哪些內存已經沒有被使用了,將其標記爲垃圾,達到一定閥值以後(比如內存只有100M,當垃圾達到40M時)再統一回收。而垃圾回收是非常佔資源的,因爲在進行垃圾回收時,其他程序的運行過程就被打斷了。這也就是Android手機用起來卡的原因,因爲Android手機就是運行在一個java虛擬機中的。


3.5 自由軟件

  自由軟件的特點:

  a) 可以自由使用(學習和修改)

  b) 可以自由分發

  c) 可以自由創建衍生版


3.6 Linux的哲學思想

  a) 一切皆文件(把幾乎所有資源,包括硬件設備都組織爲文件格式)

  b) 由目的單一的小程序組成,一個程序只實現一個功能,組合小程序完成複雜任務

  c) 儘量避免捕獲用戶接口(爲實現腳本編程打下了基礎,可以自動完成某些功能)

  d) 配置文件保存爲純文本格式(用文本編輯器即可完成系統配置工作)


3.7 獲取發行版的方式

  a) http://mirrors.aliyun.com

  b) http://mirrors.sohu.com

  c) http://mirrors.163.com


3.8 終端與交互式接口

3.8.1 終端

  終端是用戶與主機交互必然要用到的設備。

  終端分爲以下幾類:

  a) 物理終端:直接接入本機的顯示器和鍵盤設備,也稱作控制檯console

  b) 虛擬命令行終端:附加在物理終端之上的、以軟件方式虛擬實現的終端。Centos 6默認啓動6個虛擬終端

    可以用Ctrl+Alt+Fn(F1-F6)進行虛擬命令行終端間的切換

    設備文件路徑:/dev/tty#

  c) 圖形終端:附加在物理終端之上的、以軟件方式虛擬實現的終端。但額外會提供桌面環境。

    圖形終端是虛擬終端的一種,可以在啓動過圖形終端的情況下使用Ctrl+Alt+F7在虛擬命令行終端與圖形終端間切換

  d) 模擬終端:附加在圖形終端或遠程終端下,純軟件實現的終端

    圖形界面下打開的命令行接口,基於SSH協議或telnet協議等遠程打開的界面

    設備文件路徑:/dev/pts/#

  查看當前的終端設備命令:tty

3.8.2 交互式接口

  交互式接口是啓動終端後,在終端設備附加的一個交互式應用程序

  交互式接口主要分爲2種:圖形用戶終端與命令行終端

  GUI:

    X protocol,window manager,desktop

    Desktop:

      GNOME(C,gtk)

      KDE(C++,qt)

      XFCE(輕量級桌面)

  CLI:

    shell程序:

      sh(作者:bourn)

      csh

      tcsh:csh的升級版

      ksh(作者:korn):商業版,閉源的應用程序

      bash(bourn again shell):遵循GPL的開源應用程序,Linux領域目前最流行,各發行版的標準shell

      zsh

    顯示當前使用的shell命令:

echo $SHELL

    顯示當前系統支持使用的所有shell:

cat /etc/shells


3.9 命令

  輸入命令,回車意味着什麼?

    提請shell程序找到鍵入命令所對應的可執行程序或代碼,並由其分析後提交給內核分配資源將其運行起來。運行起來以後表現爲一個或多個進程。

  在shell中可執行的命令有兩類:

  a) 內建命令:由shell自帶的,通過某命令形式提供

  b) 外部命令:在當前系統的鞭文件系統路徑下有對應的可執行程序文件。可使用which或whereis查詢可執行程序文件的位置

    區別內部或外部命令:

type COMMAND

  運行命令:

    命令格式:

COMMAND [OPTIONS...] [ARGUMENTS...]
  選項(OPTIONS):用於啓用或關閉命令的某個或某些功能
  參數(ARGUMENTS):命令的作用對象,向命令提供數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章