程式初始(二)——程式優先順序,環境變數

audience_fzn發表於2018-08-10

程式優先順序:

基本概念:

  • 程式在被cpu分配到資源優化才能執行,但是資源是有限的,cpu分配資源的先後順序,就是程式的優先權
  • 優先權(優先執行的權利)和優先順序值不一樣,優先權高的程式有優先執行的權力,配置程式優先權對多工環境的Linux很有用,可以改善系統效能
  • 還可以把程式執行到指定的CPU上,這樣一來,把不重要的程式安排到某個CPU上,可以大大改善系統整體效能

可以使用ps -l檢視輸出如下:

  • UID:執行者的身份
  • PID:程式的代號
  • PPID:父程式的代號
  • PRI:程式可以被執行的優先順序,其值越小越早被執行
  • NI:代表這個程式的nice值

PRI和NI:

  • PRI即程式的優先順序,或者通俗點說就是程式被CPU執行的先後順序,此值越小程式的優先順序別越高
  • NI即nice值,表示程式可被執行的優先順序的修正數,他和優先順序不是一個概念,但是程式的nice值會影響程式的優先順序變化
  • PRI值越小越快被執行,加入nice值之後,將會使得PRI變為:PRI(new)=PRI(old)+nice
  • 當nice值為負值時,那麼該程式將會優先順序值變小,即其優先順序會變高,則其越快被執行
  • 所以,調整程式的優先順序,在Linux下,就是調整程式nice值
  • nice其取值範圍時-20~19,一共40個級別;
  • 優先順序60~99(-20+80,80+19)

為什麼優先順序要有範圍?

因為一個程式長時間得不到資源,就會造成程式飢餓。

修改程式優先順序的命令:

  • nice:開始執行程式時就指定nice值:nice -n -5 ./test
  • renice:調整已存在的nice值:renice -5 -p 5200 //pid為5200的基礎nice設為-5
  • renice -100 -p 6151(nice值雖然被定義為-100,但他的下限是-20,所以他會修改nice值為-20)
  • 用top命令更改已存在程式的nice值
  • top:工作管理員
  • 加入top後按 “r” ——> 輸入程式PID ——>輸入nice值

程式的一些其他概念:

  • 競爭性:系統程式數目眾多,而CPU資源只有少量,甚至一個,所以程式之間時具有競爭屬性的。為了高效完成任務,更合理競爭相關資源,便具有了優先順序
  • 獨立性:多程式執行,需要獨享各種資源,多程式執行期間互不干擾
  • 併發:多個程式在一個CPU下分別採用程式切換的方式,在一段時間之間,讓多個程式都得以推進,稱之為併發
  • 並行:多個程式在多個CPU下分別,同時進行執行,稱之為並行

環境變數:

基本概念:

  • 環境變數一般時在作業系統中用來指定作業系統執行環境的一些引數(例如:在執行c/c++程式碼時,我們不知道所連結的動態庫在哪裡,卻依舊可以連結成功,生成可執行程式,就是因為相應環境變數幫助我們找到動態庫的位置)
  • 環境變數具有某些特殊用途,在系統中通常具有全域性特性,可以被子程式繼承下去
  • 環境變數一般都是以大寫字母加下劃線的形式命名,環境變數相當於一個指標,當我們檢視指標所指向的值的時候需要對其解引用,同樣的我們檢視環境變數的值的時候,也需要在其前面加上$

環境變數相當於給系統或使用者應用程式設定一些引數,Linux時一個多使用者的作業系統,每個使用者登入系統以後都會有一個專門的執行環境,通常每個使用者預設的環境都是相同的,這個預設的環境實際上就是一組環境變數的定義。使用者可以對自己的執行環境執行定製(修改環境變數)。

 

環境變數的種類:

  • 永久的:需要修改配置檔案,變數永久生效
  • 臨時的:使用export命令宣告即可,變數在關閉shell時失效

 

常見的環境變數:

  • PATH:指定命令的搜尋路徑

 (以冒號分隔開的每一個段就是一個路徑,當你敲下命令時,作業系統會依次去每一個區間找當前命令,如果定義了,則執行,如果沒有就返回:commond not found)

  • USER:使用者資訊

  • HOME:指定使用者的主工作目錄(即使用者登入到Linux系統中時,預設的路徑)

  • HISTSIZE:指定儲存歷史命令紀錄的條數

  • SHELL:當前shell,它的值通常時/bin/bash

和環境變數相關的命令:

  • echo $環境變數名稱:檢視某個環境變數的值
  • export:設定一個新的環境變數

  • env:顯示所有環境變數

env:顯示所有環境變數;echo:顯示某個環境變數 

  • unset:清除環境變數

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

測試PATH:

  • 建立一個hello.c檔案
#include<stdio.h>

int mian()
{
    printf("hello world!\n");
    return 0;
}
  • 執行hello.c時要加上./ ——> ./hello.c(./ 是指在當前目錄下)
  • 如果不加 ./ ,直接輸入hello.c 系統會自動在PATH(環境變數)的路徑下去找,然而我們helloc並沒有在PATH的路徑下,而是在當前目錄下,所以會報錯(commond not found)
  • 所以雖然輸入ls 等命令與我們的hello.c是一樣的,都可以稱為指令,但是ls執行時不用帶路徑,而hello.c執行時卻要加上路徑
  • 但是如果我們將hello.c的路徑加入到環境變數中,然後再執行它就不需要帶路徑了
  • PATH = $PATH(原來的路徑):/home/txtt/bit_code/hello(hello的路徑)

 

環境變數的組織方式:

每個程式都會有一張環境表,環境表時一個字元指標陣列,每個指標指向一個以‘\0’結尾的環境變數字串

 

相關文章