linux程序概念2

2021-10-04 04:41:19 字數 3956 閱讀 6654

書接上文,在這篇部落格中介紹一下程序狀態。

乙個程序可以有幾個狀態:

r執行狀態(running): 並不意味著程序一定在執行中,它表明程序要麼是在執行中要麼在執行佇列裡。

s睡眠狀態(sleeping): 意味著程序在等待事件完成(這裡的睡眠有時候也叫做可中斷睡眠(interruptible sleep))。

d磁碟休眠狀態(disk sleep)有時候也叫不可中斷睡眠狀(uninterruptible sleep),在這個狀態的程序通常會等待io的結束。

t停止狀態(stopped): 可以通過傳送 sigstop 訊號給程序來停止(t)程序。這個被暫停的程序可以通過傳送 sigcont 訊號讓程序繼續執行。

x死亡狀態(dead):這個狀態只是乙個返回狀態,你不會在任務列表裡看到這個狀態。

那麼在lunix中該如何檢視程序狀態呢?

採用ps aux / ps axj 命令就好了。

下面介紹幾個特殊的程序。

z(zombie)-殭屍程序

僵死狀態(zombies)是乙個比較特殊的狀態。當程序退出並且父程序沒有讀取到子程序退出的返回**時就會產生僵死(屍)程序僵死程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態**。所以,只要子程序退出,父程序還在執行,但父程序沒有讀取子程序狀態,子程序進入z狀態。

殭屍程序危害

程序的退出狀態必須被維持下去,因為他要告訴關心它的程序(父程序),你交給我的任務,我辦的怎麼樣了。可父程序如果一直不讀取,那子程序就一直處於z狀態?是的!維護退出狀態本身就是要用資料維護,也屬於程序基本資訊,所以儲存在task_struct(pcb)中,換句話說,z狀態一直不退出,pcb一直都要維護?是的!那乙個父程序建立了很多子程序,就是不**,是不是就會造成記憶體資源的浪費?是的!因為資料結構物件本身就要占用記憶體,想想c中定義乙個結構體變數(物件),是要在記憶體的某個位置進行開闢空間!記憶體洩漏?是的!

孤兒程序

父程序如果提前退出,那麼子程序後退出,進入z之後,那該如何處理呢?父程序先退出,子程序就稱之為「孤兒程序孤兒程序被1號init程序領養,當然要有init程序**嘍。在這裡注意一下如果父程序退出的話,沒有程序去**子程序,那麼就會有乙個孤兒院長---->1號程序。來進行子程序的**工作。

#include

#include

#include

intmain()

else

if(id ==0)

else

return0;

}

上面介紹了程序狀態,下面來簡單介紹一下環境變數,這個我們可能平常聽說過這個東西,但是從概念角度上來說這個是什麼呢?

基本概念

環境變數(environment variables)一般是指在作業系統中用來指定作業系統執行環境的一些引數如:我們在編寫c/c++**的時候,在鏈結的時候,從來不知道我們的所鏈結的動態靜態庫在**,但是照樣可以鏈結成功,生成可執行程式,原因就是有相關環境變數幫助編譯器進行查詢。環境變數通常具有某些特殊用途,還有在系統當中通常具有全域性特性。

常見的環境變數:

path : 指定命令的搜尋路徑

home : 指定使用者的主工作目錄(即使用者登陸到linux系統中時,預設的目錄)

shell : 當前shell,它的值通常是/bin/bash。

和環境變數相關的命令

echo: 顯示某個環境變數值

export: 設定乙個新的環境變數

env: 顯示所有環境變數

unset: 清除環境變數

set: 顯示本地定義的shell變數和環境變數

通過**如何獲取環境變數

//命令列第三個引數

#include

intmain

(int argc,

char

*ar**,

char

*env)

return0;

}//通過第三方變數environ獲取

#include

intmain

(int argc,

char

*ar**)

return0;

}//通過系統呼叫獲取或設定環境變數

#include

#include

intmain()

環境變數通常是具有全域性屬性

//環境變數通常具有全域性屬性,可以被子程序繼承下去

#include

#include

intmain()

return0;

}

mmstruct

1.在c語言階段稱之為程式位址空間,在linux中稱之為程序位址空間

在pcb程序控制塊中,struct mm_struct mm(記憶體指標)指向程序位址空間(以32位作業系統來參照,這樣記憶體最大為4g),它有4g空間,但是有乙個g為核心空間,給作業系統使用。核心空間和使用者使用的使用者分界線

程序位址空間為虛擬位址空間,這也意味著是人為規定的,不能儲存資料。

儲存資料依靠介質,指的是物理記憶體。在虛擬位址空間中位址對映在真實的實體地址

邏輯位址對映為實體地址用的是什麼方法呢?

寫時拷貝

通過頁表這個結構,這個結構也會fork到子程序中,意思是這個頁表也被複製了。頁表中的邏輯位址和實體地址也被複製了。在進行修改操作時,在使用者空間中會額外開闢乙個位址,這個空間的位址指向被複製頁表的實體地址,所以值被修改。但是邏輯位址沒有修改。所以會出現父子程序的位址一樣值卻不一樣的情況。(改變子程序的對映情況)

這樣做的好處:

節省空間

效率比較高

基本概念

cpu資源分配的先後順序,就是指程序的優先權(priority)。

優先權高的程序有優先執行權利。配置程序優先權對多工環境的linux很有用,可以改善系統效能。

還可以把程序執行到指定的cpu上,這樣一來,把不重要的程序安排到某個cpu,可以大大改善系統整體效能。

檢視系統程序

在linux或者unix系統中,用ps –l命令則會類似輸出以下幾個內容:

用紅框框起來是什麼意思呢?

uid : 代表執行者的身份

pid : 代表這個程序的代號

ppid :代表這個程序是由哪個程序發展衍生而來的,亦即父程序的代號

pri :代表這個程序可被執行的優先順序,其值越小越早被執行

ni :代表這個程序的nice值

pri and ni

pri也還是比較好理解的,即程序的優先順序,或者通俗點說就是程式被cpu執行的先後順序,此值越小程序的優先級別越高

那ni呢?就是我們所要說的nice值了,其表示程序可被執行的優先順序的修正數值

pri值越小越快被執行,那麼加入nice值後,將會使得pri變為:pri(new)=pri(old)+nice

這樣,當nice值為負值的時候,那麼該程式將會優先順序值將變小,即其優先順序會變高,則其越快被執行

所以,調整程序優先順序,在linux下,就是調整程序nice值

nice其取值範圍是-20至19,共40個級別。

pri vs ni

需要強調一點的是,程序的nice值不是程序的優先順序,他們不是乙個概念,但是程序nice值會影響到程序的優先順序變化。可以理解nice值是程序優先順序的修正資料。

上面就是這篇部落格的內容,希望能對大家有所幫助。

Linux 程序的概念2

include include int main 以上述 為例 pid t pid fork pid t其實就是乙個int型別的變數,用來表示程序的id,fork 返回乙個程序id,這個程序id賦值給pid 這個語句複製呼叫程序 父程序 建立了乙個新的程序 子程序 父程序在建立子程序成功後,程式計數...

Linux 程序概念

任何計算機系統都包含乙個基本的程式集合,成為作業系統 os 它包括 作業系統是管管理的軟體 使用者操作 使用者操作介面 shell,lib,指令等 作業系統 驅動程式 硬體 作業系統管理硬體 系統呼叫 在開發者角度,作業系統會對外表現為乙個整體,但是會暴露自己的一部分介面供上層開發者使用,這部分由作...

Linux 程序概念

程序排程演算法 在早期作業系統的排程方式大多數是非剝奪的,這是由於早期的應用一般是科學計算或事務處理,不太把人機互動的響應時間指標放在首要位置。在這種情況下,正在執行的程序可一直占用cpu直到程序阻塞或終止。這種方式的排程演算法可以很簡單,且比較適用對於響應時間不關心或者關心甚少的批處理科學計算或事...