目錄
1.并行與并發
2. 環境變量
2.1 舉例子
2.2 命令行參數
2.3 環境變量
?
1.并行與并發
并行:多個進程在多個CPU下分別、同時運行,稱為并行
并發:多個進程在一個CPU下采用進程切換的方式,在一時間段內,多個進程同時推進,稱為并發
有這樣一個問題
int get_value()
{int x = 42; return x;
}int main()
{int ret = get_value();cout << ret << endl;return 0;
}
為什么函數的返回值,會被外部拿到呢?
????????通過CPU寄存器,編譯器將return x轉化成了mov eax 10,eax是CPU中的寄存器,函數直接將x的值放入了寄存器,x自己銷毀并不影響這個寄存器,調用方仍可以拿到。
既然進程在一直切換,每個進程就執行時間片的時間,系統如何得知某個進程上次執行到哪行代碼了?
??????? 有一個程序計數器eip,存儲當前執行指令下一條指令的地址。
CPU中有很多寄存器,扮演什么角色?
??????? 提高運行效率,進程的高頻數據放入寄存器中。因為進程相關的數據需要隨時被訪問或者修改,所以要放到CPU的寄存器中。
所以CPU寄存器中保存的是進程的臨時數據,也就是進程的上下文。進程在從CPU上離開的時候,要將自己的上下文數據保存好,甚至帶走,這個保存的目的就是為了恢復。
進程在被切換的時候:保存上下文;進程回來運行時,恢復上下文。
上下文信息就當保存到進程的PCB中,PCB有一個寄存器結構體,專門存每個寄存器中的這些信息
2. 環境變量
直接講概念有些晦澀,先舉幾個環境變量出來認識一下。
2.1 舉例子
1. 我們想執行自己寫的程序就得指明路徑:./mycode,那系統怎么知道 ls、pwd 等指令執行時去哪里找呢?怎么知道這些指令程序在哪里呢?
??????? OS在執行命令時,shell會在PATH中的路徑下一個一個去找。
PATH:Linux系統的指令搜索路徑,以:進行分割
也可以添加其他目錄到PATH中,重登Xshell就重置了。
2. 當我們登入時,它怎么知道一上來就在家目錄下呢?而不是什么其他的目錄呢?
HOME:登入時會執行類似cd &HOME 這樣的命令,直接跳到家目錄下。
PWD:會記錄當前目錄的環境變量
有了環境變量的存在,我們的系統就具備了認識用戶是誰的能力,只要能認識用戶是誰,就能把文件擁有者和權限做對比,從而判斷出用戶有無讀寫權限。
2.2 命令行參數
ls是命令,后面的-l就是命令行參數
對這個代碼進行下面這樣的調用產生了命令行參數類型的結果:
這個程序很好的模擬了命令行參數的實現過程,argv[0]就是命令本身,后面的可變參數列表存儲命令行參數。
我們輸入的其實是字符串,bash將其打散成 "./mycmd"、"-a"、"b"、"c"。
所以在真正執行main函數之前,操作系統已經干了很多事情了。
為什么要傳給main參數呢?為指令、工具、軟件等提供命令行選項的支持。
這個代碼更能詳細的說明命令行參數的作用
可以發現系統自己的命令其實就是類似這么實現的,異曲同工
我們可以發現,main函數也是函數,是操作系統來給它傳參,調用它。
2.3 環境變量
但main函數不只這兩個參數,還有第三個 env
env代表環境變量表,前面的argv代表命令行參數表
這個程序可以打印出所有環境變量:
我們所運行的進程,都是bash的子進程,bash本身在啟動的時候,會從操作系統的配置文件中讀取環境變量信息,子進程會繼承父進程交給它的環境變量,所以環境變量會被所有子進程繼承下去,環境變量具有全局屬性!
怎么證明被繼承了?
我們自己搞一個環境變量,看看它會不會被繼承。
我們可以看到,在命令行中直接定義,在env中是找不到的,這時這個變量叫做本地變量,怎么變成環境變量呢?下一行:export,此時就可以找到我們自己定義的環境變量了。
./mycmd 也是能拿到這個環境變量的
本地變量只會在本bash內有效,不會被繼承,而echo是沒有創建子進程的,所以echo是能打印這個本地變量的。?
這也說明了:命令不一定全都會創建子進程,很有把握的就直接操作了,不用擔心會影響bash。
所以命令有兩種:
- 常規命令:通過創建子進程去完成的
- 內建命令:bash不創建子進程,而是由自己親自執行,類似于bash調用了自己寫的、或者系統提供的函數(cd 也是典型的內建命令)
取消環境變量:
環境變量就是在操作系統中用來指定操作系統運行環境的一些參數。
int main()
{printf("%S\n", getenv("PATH"));return 0;
}
這樣也是可以獲得環境變量的