Linux 學習筆記--程式

WormOfTime發表於2020-04-12

程式

Linux 中也難免遇到某個程式無響應的情況,可以通過一些命令來幫助我們讓系統能夠更流暢的執行。那麼什麼是程式?什麼是程式?什麼是執行緒?

程式(procedure):不太精確地說,程式就是執行一系列有邏輯、有順序結構的指令,幫我們達成某個結果。

程式(process):程式是程式在一個資料集合上的一次執行過程,在早期的 UNIX、Linux 2.4 及更早的版本中,它是系統進行資源分配和排程的獨立基本單位。

執行緒(thread)是作業系統能夠進行運算排程的最小單位。它被包含在程式之中,是程式中的實際運作單位。一條執行緒指的是程式中一個單一順序的控制流,一個程式中可以併發多個執行緒,每條執行緒並行執行不同的任務。因為執行緒中幾乎不包含系統資源,所以執行更快、更有效率。

簡單來說,程式是為了完成某種任務而設計的軟體,比如 vim 是程式。什麼是程式呢?程式就是執行中的程式。執行緒的劃分尺度小於程式,使得多執行緒程式的併發性高。程式在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。

一個程式至少有一個程式,一個程式至少有一個執行緒

程式只是一些列指令的集合,是一個靜止的實體,而程式不同,程式有以下的特性:

  • 動態性:程式的實質是一次程式執行的過程,有建立、撤銷等狀態的變化。而程式是一個靜態的實體。
  • 併發性:程式可以做到在一個時間段內,有多個程式在執行中。程式只是靜態的實體,所以不存在併發性。
  • 獨立性:程式可以獨立分配資源,獨立接受排程,獨立地執行。
  • 非同步性:程式以不可預知的速度向前推進。
  • 結構性:程式擁有程式碼段、資料段、PCB(程式控制塊,程式存在的唯一標誌)。也正是因為有結構性,程式才可以做到獨立地執行。

有人可能將併發與並行混淆,其實兩者是有區別的。

併發:在一個時間段內,巨集觀來看有多個程式都在活動,有條不紊的執行(每一瞬間只有一個在執行,只是在一段時間有多個程式都執行過)

並行:在每一個瞬間,都有多個程式都在同時執行,這個必須有多個 CPU 才行

分類

程式可以從兩個角度來分:

  • 以程式的功能與服務的物件來分;
  • 以應用程式的服務型別來分;

第一個角度來看,我們可以分為使用者程式與系統程式:

  • 使用者程式:通過執行使用者程式、應用程式或稱之為核心之外的系統程式而產生的程式,此類程式可以在使用者的控制下執行或關閉。
  • 系統程式:通過執行系統核心程式而產生的程式,比如可以執行記憶體資源分配和程式切換等相對底層的工作;而且該程式的執行不受使用者的干預,即使是 root 使用者也不能干預系統程式的執行。

第二角度來看,我們可以將程式分為互動程式、批處理程式、守護程式

  • 互動程式:由一個 shell 終端啟動的程式,在執行過程中,需要與使用者進行互動操作,可以執行於前臺,也可以執行在後臺。
  • 批處理程式:該程式是一個程式集合,負責按順序啟動其他的程式。
  • 守護程式:守護程式是一直執行的一種程式,在 Linux 系統啟動時啟動,在系統關閉時終止。它們獨立於控制終端並且週期性的執行某種任務或等待處理某些發生的事件。例如 httpd 程式,一直處於執行狀態,等待使用者的訪問。還有經常用的 cron(在 centOS 系列為 crond)程式,這個程式為 crontab 的守護程式,可以週期性的執行使用者設定的某些任務。

程式組與Sessions

每一個程式都會是一個程式組的成員,而且這個程式組是唯一存在的,他們是依靠 PGID(process group ID)來區別的,而每當一個程式被建立的時候,它便會成為其父程式所在組中的一員。

與程式組類似,每當一個程式被建立的時候,它便會成為其父程式所在 Session 中的一員,每一個程式組都會在一個 Session 中,並且這個 Session 是唯一存在的,

Session 主要是針對一個 tty 建立,Session 中的每個程式都稱為一個工作(job)。

工作管理

bash(Bourne-Again shell)支援工作控制(job control),而 sh(Bourne shell)並不支援。

我們通過 & 來讓命令在後臺執行

圖中所顯示的 [1] 207分別是該 job 的 job number 與該程式的 PID,而最後一行的 Done 表示該命令已經在後臺執行完畢。

我們還可以通過 ctrl + z 使我們的當前工作停止並丟到後臺中去。然後可以通過 jobs 來檢視被停止丟到後臺的工作。

我們可以通過這樣的一個命令將後臺的工作拿到前臺來

#後面不加引數提取預設工作,加引數提取指定工作的編號
#ubuntu 在 zsh 中需要 %,在 bash 中不需要 %
$ fg [%jobnumber]

之前我們通過 ctrl + z 使得工作停止放置在後臺,若是我們想讓其在後臺運作我們就使用這樣一個命令

#與fg類似,加參則指定,不加參則取預設
$ bg [%jobnumber]

如果我們想刪除或者重啟一個任務,可以使用kill命令

#kill的使用格式如下
$ kill -signal %jobnumber

#signal從1-64個訊號值可以選擇,可以這樣檢視
$ kill -l

其中常用的有這些訊號值

訊號值 作用
-1 重新讀取引數執行,類似與 restart
-2 如同 ctrl+c 的操作退出
-9 強制終止該任務
-15 正常的方式終止該任務

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章