linux程序和計劃

leikj發表於2024-04-17

程式

1.程式是一組計算機能識別和執行的指令,執行與電子計算機上,滿足人們某種需求的資訊化工具
2.用於描述程序要完成的功能,是控制程序執行的指令集

程序

執行中的程式的一個副本,是被載入記憶體的一個指令集合,是資源分配的單位

  • 程序ID(Process ID,PID)號碼被用來標記各個程序
  • UID、GID語境決定對檔案系統的存取和訪問許可權
  • 通常從執行程序的使用者來繼承
  • 存在生命週期
  • 都由其父程序建立

程序建立:

  • init:第一個程序,從 CentOS7 以後為systemd

  • 程序:都由其父程序建立,fork(),父子關係,CoW:Copy On Write 寫實更新,有資料寫入子程序需要新的記憶體空間

程式在硬碟裡,程序在記憶體裡

  • 程序具有的特徵:

  • 動態性:程序是程式的一次執行過程,是臨時的,有生命期的,是動態產生,動態消亡的;

  • 併發性:任何程序都可以同其他程序一起併發執行;

  • 獨立性:程序是系統進行資源分配和排程的一個獨立單位;

  • 結構性:程序由程式、資料和程序控制塊三部分組成

程序與執行緒的區別
執行緒是程式執行的最小單位,而程序是作業系統分配資源的最小單位;
一個程序由一個或多個執行緒組成,執行緒是一個程序中程式碼的不同執行路線;
程序之間相互獨立,但同一程序下的各個執行緒之間共享程式的記憶體空間(包括程式碼段、資料集、堆等)及一些進
程級的資源(如開啟檔案和訊號),某程序內的執行緒在其它程序不可見;
排程和切換:執行緒上下文切換比程序上下文切換要快得多。

如何確定一個程式 是多執行緒 還是 單執行緒?
pstree

grep -i threads /proc/程序的PID/status

prtstat 程序pid號

程序狀態


程序的基本狀態

  • 建立狀態:程序在建立時需要申請一個空白PCB(process control block程序控制塊),向其中填寫控制和管理程序的資訊,完成資源分配。如果建立工作無法完成,比如資源無法滿足,就無法被排程執行,把此時程序所處狀態稱為建立狀態
  • 就緒狀態:程序已準備好,已分配到所需資源,只要分配到CPU就能夠立即執行
  • 執行狀態:程序處於就緒狀態被排程後,程序進入執行狀態
  • 阻塞狀態:正在執行的程序由於某些事件(I/O請求,申請快取區失敗)而暫時無法執行,程序受到阻塞。在滿足請求時進入就緒狀態等待系統呼叫
  • 終止狀態:程序結束,或出現錯誤,或被系統終止,進入終止狀態。無法再執行

程序更多的狀態:

  • 執行態:running
  • 就緒態:ready
  • 睡眠態:分為兩種,可中斷:interruptable,不可中斷:uninterruptable
  • 停止態:stopped,暫停於記憶體,但不會被排程,除非手動啟動
  • 殭屍態:zombie,殭屍態,結束程序,父程序結束前,子程序不關閉,殺死父程序可以關閉僵死態 的子程序

解決殭屍態問題
方法1:恢復父程序
[root@centos8 ~]#kill -18 1436
方法2:殺死父程序
[root@centos8 ~]#kill -9 1436

程序的優先順序 os

程序優先順序調整

  • 靜態優先順序:100-139
  • 程序預設啟動時的nice值為0,優先順序為120
  • 只有根使用者才能降低nice值(提高優先性
    例:

作業系統分類:

  • 協作式多工:早期 windows 系統使用,即一個任務得到了 CPU 時間,除非它自己放棄使用CPU ,否則將完全霸佔 CPU ,所以任務之間需要協作——使用一段時間的 CPU ,主動放棄使用
  • 搶佔式多工:Linux核心,CPU的總控制權在作業系統手中,作業系統會輪流詢問每一個任務是否需要使用 CPU ,需要使用的話就讓它用,不過在一定時間後,作業系統會剝奪當前任務的 CPU 使用權,把它排在詢問佇列的最後,再去詢問下一個任務

程序型別:

  • 守護程序: daemon,在系統引導過程中啟動的程序,和終端無關程序
  • 前臺程序:跟終端相關,透過終端啟動的程序

注意:兩者可相互轉化

按程序資源使用的分類:

  • CPU-Bound:CPU 密集型,非互動
  • IO-Bound:IO 密集型,互動

程序管理相關命令

程序的管理主要是指程序的關閉與重啟。我們一般關閉或重啟軟體,都是關閉或重啟它的程式,而不是直接操作程序的。比如,要重啟 apache 服務,一般使用命令"service httpd restart"重啟 apache的程式。systemctl httpd start

那麼,可以透過直接管理程序來關閉或重啟 apache 嗎?答案是肯定的,這時就要依賴程序的訊號(Signal)了。我們需要給予該程序 訊號,告訴程序我們想要讓它做什麼。

系統中可以識別的訊號較多,我們可以使用命令"kill -l"或"man 7 signal"來查詢

號代號 訊號名稱 說 明
1 SIGHUP 該訊號讓程序立即關閉.然後重新讀取配置檔案之後重啟
2 SIGINT 程式中止訊號,用於中止前臺程序。相當於輸出 Ctrl+C 快捷鍵
3 SIGQUIT 退出
8 SIGFPE 在發生致命的算術運算錯誤時發出。不僅包括浮點運算錯誤,還包括溢位及除數為 0 等其他所有的算術運算錯誤
9 SIGKILL 用來立即結束程式的執行。本訊號不能被阻塞、處理和忽略。般用於強制中止程序
14 SIGALRM 時鐘定時訊號,計算的是實際的時間或時鐘時間。alarm 函式使用該訊號
15 SIGTERM 正常結束程序的訊號,kill 命令的預設訊號。如果程序已經發生了問題,那麼這 個訊號是無法正常中止程序的,這時我們才會嘗試 SIGKILL 訊號,也就是訊號 9
18 SIGCONT 該訊號可以讓暫停的程序恢復執行。本訊號不能被阻斷
19 SIGSTOP 該訊號可以暫停前臺程序,相當於輸入 Ctrl+Z 快捷鍵。本訊號不能被阻斷

ps命令
ps即process state,可以檢視程序當前狀態的快照,預設顯示當前終端中的程序,Linux系統各程序的相關資訊均儲存在/proc數字目錄/status下的檔案中
支援三種選項:
UNIX選項如:-A -e
GNU選項如:--help
BSD選項如:a
檢視靜態的程序統計資訊
“ps aux”可以檢視系統中所有的程序
“ps -le”可以檢視系統中所有的程序,而且還能看到程序的父程序的PID和程序優先順序
“ps -l”只能看到當前Shell產生的程序
例:


常用選項

  • a:顯示當前終端下的所有程序資訊,包括其他使用者的程序。與“x”選項結合時將示系統中所有的程序資訊。
  • u:使用以使用者為主的格式輸出程序資訊。
  • x:顯示當前使用者在所有終端下的程序資訊。
  • -e:顯示系統內的所有程序資訊。
  • -l:使用長(Long)格式顯示程序資訊。
  • -f:使用完整的(Full)格式顯示程序信
  • k|--sort 屬性 對屬性排序,屬性前加 - 表示倒序 ps aux k -%cpu
  • o 屬性… 選項顯示定製的資訊 pid、cmd、%cpu、%mem

相關文章