文章目錄
- 🌲行程優先級
- 🌴優先級是什么?
- 🌴為什么要有優先級?
- 🌴Linux里行程優先級由誰決定?
- 🌴更改優先級
- 🌵設定nice的值
- 🌴Linux標識用戶
- 🌴行程補充
- 🌲環境變數
- 🌴什么是環境變數?
- 🌴環境變數種類
- 🌴常見的環境變數
- 🌴查看環境變數
- 🌴直接運行可執行程式的辦法(不加./)
- 🌴環境變數具有全域性
- 🌵獲取環境變數
- 🌴補充命令
- 🌲命令列引數
- 🌵示例:計算器功能
🌲行程優先級
🌴優先級和權限的區別
以CPU資源為例,優先級是一定能獲得CPU資源,只是時間的長短
權限則不同,權限不夠就不能獲得資源
🌴優先級是什么?
優先級本質就是獲得資源的先后順序
🌴為什么要有優先級?
CPU的資源有限,所以行程需要根據優先級排隊
🌴Linux里行程優先級由誰決定?
兩個引數:PRI和NI
PRI可看作priority的簡寫,NI指的是nice值(新概念)
更改nice值可以改變優先級
PRI越小,優先級越高,反之越低(一般創建的行程PRI默認是80)
NI的取值范圍是-20到19(把NI設為100等同于設為19 把NI設為-100等同于設為-20),NI的值是可控狀態
ps -al 看到PRI和NI

🌴更改優先級
優先級看PRI的值,PRI的值決定排名,NI的值可以更改PRI,進而影響優先級
PRI(新)=PRI(舊)+NI
注:這個PRI(舊)一般指80(PRI的值默認一般是八十)
設NI的值 PRI(同一個行程) 0 80 10 90 13 93(不會變成103) 連續設定NI的值不會累加,80是一個基準,這是為了防止一個行程的優先級過高或者過低,進而保證CPU資源的公平分配,在設計上也比較簡單
如果可以累加,用戶操作時可能造成一個行程的優先級相當高,而別的行程優先級很低,導致資源的不公平分配,而CPU調度器的原則就是公平,所以過高和過低是不被允許的,正因為如此,NI的值不會被累加,每次調整的基準都是80
🌵設定nice的值
top命令

top -> r選項 ->輸入PID -> 輸入設定的renice (按q退出top)
注:改了兩次NI,但是第二次改變的結果仍然是以80為基準得到的
🌴Linux標識用戶
Linux標識用戶是根據UID來的,而不是根據用戶名
ll-n 可以看到uid
比如qq里標識我們的不是qq名,而是我們的qq號
隨筆記錄計算機善于處理數字資料
🌴行程補充
-
獨立性:每個行程相互獨立
fork創建子行程時,共享代碼,私有資料,就是為了維護行程的獨立性
-
競爭性:資源是有限的,自然就有了競爭,為了高效的完成任務,合理競爭,也就產生了優先級,優先級高的先分配到CPU資源
🌲環境變數
🌴什么是環境變數?
環境變數(environment variables)一般是指在作業系統中用來指定作業系統運行環境的一些引數,如:臨時檔案夾位置和系統檔案夾位置等,—百度百科🛡
例1,如果在Windows下配過Java的環境那肯定見過下面這張圖
例2:C檔案的編譯與鏈接,鏈接時就需要庫的參與,動態庫靜態庫之類的,那編譯器是怎么找到動態庫或靜態庫的?就是借助了環境變數
例3:Linux下有一個名為 test 的可執行檔案, ./test運行程式,其實"./test"也可以看作一條指令,我們為什么要在可執行程式前加 ./ ?(我們不用在ls,ll,pwd等等前面加 ==./==啊)
原因: “./” 可以幫助Linux找到當前的可執行檔案的路徑,Linux在執行可執行檔案時默認在PATH(環境變數)里面去找檔案路徑,找到的第一條將被執行
因為ls,pwd這些命令本就在環境變數設定的目錄下,所以不用加 “./” Linux系統也能找到ls,pwd然后執行
換句話說 ,如果我們在環境變數中移除了 ls,pwd 這些命令所在的目錄,那我們就不能直接用ls,pwd這些命令,因為Linux找不到這些命令就會報錯:-bash: xxx: command not found,此外,路徑名中存在 ‘./’ ,則不搜索$PATH(一種環境變數)
windows默認帶了查找路徑 所以執行可執行檔案不用加./
🌴環境變數種類
本地變數和環境變數

本地變數只能在shell內訪問,不能被子行程繼承
🌴常見的環境變數
-
PATH:指定命令的搜索路徑
PATH:輔助系統進行命令查找
PATH下的路徑以 :(冒號) 做分隔符
-
HOME:用戶的作業目錄
用戶通過登錄 進入系統時所在的目錄
-
SHELL:當前Shell
-
HISTSIZE:保存歷史命令的數目
history命令可以看到自己敲過的指令,一般是默認保存最近的3000條
HISTSIZE的值默認就是3000

🌴查看環境變數
- echo $變數名
如
echo $PATH
echo $HOME
echo $SHELL
echo $HISTSIZE
-
env
可以看到所有的環境變數

-
set
顯示或設定shell特性及shell變數

🌴直接運行可執行程式的辦法(不加./)
- 檔案拷貝至PATH下

注:檔案名別取test,不然會失敗(我一開始檔案名取了test,在PATH下的目錄里面也能找到test,但是不能直接運行)
- 把當前目錄添加到PATH下
PATH=$PATH:路徑
$PATH代表原路徑

關掉重啟后環境變數又會恢復默認
記錄PATH:
怕玩崩了/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ck/.local/bin:/home/ck/bin
🌴環境變數具有全域性
全域屬性:可以被子行程繼承
🌵獲取環境變數
通過全域屬性 我們可以通過子行程獲取父行程的環境變數(因為子行程繼承了父行程的環境變數,所以父子的環境變數一樣)
- 通過C語言 getenv(變數名) 函式

test.c
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("PATH:%s\n",getenv("PATH")); //得到當前的PATH
printf("HOME:%s\n",getenv("HOME"));
printf("SHELL:%s\n",getenv("SHELL"));
return 0;
}
運行:

這個C程式加載到記憶體就是個行程,它的父行程就是bash(前面的Linux筆記有講過,可以翻一下)
在命令列運行的大部分的指令,它的父行程都是bash,也即bash創建子行程,子行程執行你的指令
前面提過本地變數只能在shell內訪問,不能被子行程繼承
假定本地變數MY_VAL=15
C代碼:getenv(“MY_VAL”);這種寫法就是錯誤的,因為在子行程無法訪問到本地變數
如何訪問在子行程里訪問本地變數?
加export
利用set測驗
利用getenv函式測驗
隨筆小結:env只能看到環境變數 而set都可以看 可以利用這點來判斷是否是環境變數
echo set env 等為內建命令,是shell程式內部函式 父行程不是bash
🌴補充命令
unset: 取消環境變數
如 unset MY_VAL
🌲命令列引數
test.c
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char* argv[])
{
for(int i=0;i<argc;i++)
//i<argc可以寫成argv[i],因為argv陣列最后一個元素為NULL
{
printf("argv[%d]:%s\n",i,argv[i]);
}
return 0;
}
上面的agrc,argv就是命令列引數
注:運行時得用C99標準 即 gcc -o test test.c -std=c99
運行:
此外main函式還有第三個引數 env ,可以通過env來獲取當前環境
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char* argv[],char* env[])
{
for(int i=0;env[i];i++)
//env里放的就是env命令獲取的內容
{
printf("env[%d]:%s\n",i,env[i]);
}
return 0;
}

getenv()這個函式就是對env陣列進行了資訊篩選
上面程式等價于
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char* argv[])
{
extern char** environ; //二級指標
for(int i=0;environ[i];i++)//env里放的就是env命令獲取的內容
{
printf("env[%d]:%s\n",i,environ[i]);
}
return 0;
}
environ是一個全域的外部變數 ,可以通過extern宣告
這個變數在unistd.h中 所以也可以包含頭檔案使用
為什么要有命令列引數?
讓一個程式可以實作不同功能
🌵示例:計算器功能

計算器原始碼:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[] )
{
int num1=atoi(argv[2]);
int num2=atoi(argv[3]);
if(argc!=4)
{
printf("Usage:./cal -a(s) num num\n");
}
if(strcmp(argv[1],"-a")&&strcmp(argv[1],"-s"))
{
printf("Usage:./cal -a(s) num num\n");
}
else if(!strcmp(argv[1],"-a"))
{
printf("%d+%d=%d\n",num1,num2,num1+num2);
}
else
{
printf("%d-%d=%d\n",num1,num2,num1-num2);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/413420.html
標籤:其他










