程序(procedure):不太精確地說,程序就是執行一系列有邏輯、有順序結構的指令,幫我們達成某個結果。就如我們去餐館,給服務員說我要牛肉蓋澆飯,
她執行了做牛肉蓋澆飯這么一個程序,最后我們得到了這么一盤牛肉蓋澆飯。它需要去執行,不然它就像一本武功秘籍,放在那里等人翻看。
進程(process):進程是程序在一個數據集合上的一次執行過程,在早期的UNIX、Linux 2.4及更早的版本中,它是系統進行資源分配和調度的獨立基本單位。
同上一個例子,就如我們去了餐館,給服務員說我要牛肉蓋澆飯,她執行了做牛肉蓋澆飯這么一個程序,而里面做飯的是一個進程,做牛肉湯汁的是一個進程,
把牛肉湯汁與飯混合在一起的是一個進程,把飯端上桌的是一個進程。它就像是我們在看武功秘籍這么一個過程,然后一個篇章一個篇章地去練。
簡單來說,程序是為了完成某種任務而設計的軟件,比如 vim 是程序。什么是進程呢?進程就是運行中的程序。
程序只是一些列指令的集合,是一個靜止的實體,而進程不同,進程有以下的特性:
- 動態性:進程的實質是一次程序執行的過程,有創建、撤銷等狀態的變化。而程序是一個靜態的實體。
- 並發性:進程可以做到在一個時間段內,有多個程序在運行中。程序只是靜態的實體,所以不存在並發性。
- 獨立性:進程可以獨立分配資源,獨立接受調度,獨立地運行。
- 異步性:進程以不可預知的速度向前推進。
- 結構性:進程擁有代碼段、數據段、PCB(進程控制塊,進程存在的唯一標志)。也正是因為有結構性,進程才可以做到獨立地運行
並發:在一個時間段內,宏觀來看有多個程序都在活動,有條不紊的執行(每一瞬間只有一個在執行,只是在一段時間有多個程序都執行過)
並行:在每一個瞬間,都有多個程序都在同時執行,這個必須有多個 CPU 才行
線程(thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,
每條線程並行執行不同的任務。因為線程中幾乎不包含系統資源,所以執行更快、更有效率。
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程。線程的划分尺度小於進程,使得多線程程序的並發性高。另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。就如下圖所示:
進程管理:
top
工具是我們常用的一個查看工具,能實時的查看我們系統的一些關鍵信息的變化,top 是一個在前台執行的程序,所以執行后便進入到這樣的一個交互界面,
正是因為交互界面我們才可以實時的獲取到系統與進程的信息。在交互界面中我們可以通過一些指令來操作和篩選。
ps 也是我們最常用的查看進程的工具之一,我們通過這樣的一個命令來了解一下,他能給我帶來哪些信息
內容 | 解釋 |
---|---|
F | 進程的標志(process flags),當 flags 值為 1 則表示此子程序只是 fork 但沒有執行 exec,為 4 表示此程序使用超級管理員 root 權限 |
USER | 進程的擁有用戶 |
PID | 進程的 ID |
PPID | 其父進程的 PID |
SID | session 的 ID |
TPGID | 前台進程組的 ID |
%CPU | 進程占用的 CPU 百分比 |
%MEM | 占用內存的百分比 |
NI | 進程的 NICE 值 |
VSZ | 進程使用虛擬內存大小 |
RSS | 駐留內存中頁的大小 |
TTY | 終端 ID |
S or STAT | 進程狀態 |
WCHAN | 正在等待的進程資源 |
START | 啟動進程的時間 |
TIME | 進程消耗CPU的時間 |
COMMAND | 命令的名稱和參數 |
狀態 | 解釋 |
---|---|
R | Running.運行中 |
S | Interruptible Sleep.等待調用 |
D | Uninterruptible Sleep.不可中斷睡眠 |
T | Stoped.暫停或者跟蹤狀態 |
X | Dead.即將被撤銷 |
Z | Zombie.僵屍進程 |
W | Paging.內存交換 |
N | 優先級低的進程 |
< | 優先級高的進程 |
s | 進程的領導者 |
L | 鎖定狀態 |
l | 多線程狀態 |
+ | 前台進程 |
通過 pstree 可以很直接的看到相同的進程數量,最主要的還是我們可以看到所有進程之間的相關性。
當然就是靠該進程的優先級值來判定進程調度的優先級,而優先級的值就是上文所提到的 PR 與 nice 來控制與體現了
而 nice 的值我們是可以通過 nice 命令來修改的,而需要注意的是 nice 值可以調整的范圍是 -20 ~ 19,其中 root 有着至高無上的權力,既可以調整自己的進程也可以調整其他用戶的程序,
並且是所有的值都可以用,而普通用戶只可以調制屬於自己的進程,並且其使用的范圍只能是 0 ~ 19,因為系統為了避免一般用戶搶占系統資源而設置的一個限制,用 renice 來修改已經存在的進程的優先級
日志系統:
日志數據可以是有價值的信息寶庫,也可以是毫無價值的數據泥潭。它可以記錄下系統產生的所有行為,並按照某種規范表達出來。我們可以使用日志系統所記錄的信息為系統進行排錯,優化系統的性能,
或者根據這些信息調整系統的行為。收集你想要的數據,分析出有價值的信息,可以提高系統、產品的安全性,還可以幫助開發完善代碼,優化產品。日志會成為在事故發生后查明“發生了什么”的一個很好的“取證”信息來源。
日志可以為審計進行審計跟蹤。
在 Linux 中大部分的發行版都內置使用 syslog 系統日志,那么通過前期的課程我們了解到常見的日志一般存放在 /var/log
中。
日志名稱 | 記錄信息 |
---|---|
alternatives.log | 系統的一些更新替代信息記錄 |
apport.log | 應用程序崩潰信息記錄 |
apt/history.log | 使用 apt-get 安裝卸載軟件的信息記錄 |
apt/term.log | 使用 apt-get 時的具體操作,如 package 的下載、打開等 |
auth.log | 登錄認證的信息記錄 |
boot.log | 系統啟動時的程序服務的日志信息 |
btmp | 錯誤的信息記錄 |
Consolekit/history | 控制台的信息記錄 |
dist-upgrade | dist-upgrade 這種更新方式的信息記錄 |
dmesg | 啟動時,顯示屏幕上內核緩沖信息,與硬件有關的信息 |
dpkg.log | dpkg 命令管理包的日志。 |
faillog | 用戶登錄失敗詳細信息記錄 |
fontconfig.log | 與字體配置有關的信息記錄 |
kern.log | 內核產生的信息記錄,在自己修改內核時有很大幫助 |
lastlog | 用戶的最近信息記錄 |
wtmp | 登錄信息的記錄。wtmp可以找出誰正在進入系統,誰使用命令顯示這個文件或信息等 |
syslog | 系統信息記錄 |
日志的產生實現可以通過兩種方式:
- 一種是由軟件開發商自己來自定義日志格式然后指定輸出日志位置;
- 一種方式就是 Linux 提供的日志服務程序,而我們這里系統日志是通過 syslog 來實現,提供日志管理服務。
首先我們來看 rsyslog 的配置文件是什么樣子的,而 rsyslog 的配置文件有兩個,
- 一個是
/etc/rsyslog.conf
- 一個是
/etc/rsyslog.d/50-default.conf
。
第一個主要是配置的環境,也就是 rsyslog 加載什么模塊,文件的所屬者等;而第二個主要是配置的 Filter Conditions