程式
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