進程(二)----環境變量、地址空間訪問

進程優先級:一個進程對與CPU資源獲取的優先權

爲什麼要有優先級?(讓操作系統運行的更加良好)
交互式進程:直接與用戶進行交互的進程,(要求最好能夠更加有限的被CPU處理)。
批處理進程:在後臺默默做循環工作的進程。
環境變量:配置系統運行環境參數的變量。
環境變量優點使系統運行環境配置更加簡單靈活,可以通過設置環境變量給一個進程傳遞參數信息。(不用再去修改配置文件,重新加載配置文件,而是直接設置直接生效)

環境變量的操作

查看環境變量:env/set(查看所有變量,包含環境變量)/echo直接打印某一環境變量
設置環境變量:export
刪除環境變量:unset
環境變量是具有繼承性的:子進程也擁有父進程的環境變量
典型:PATH- - - - -系統命令程序的默認搜索路徑

代碼中環境變量的操作

  • main函數的第三個參數 int main(int argc,char *argv[ ],char *env[ ])…env保存環境變量
  • 通過一個全局變量eexern char **environ;…environ保存環境變量
  • char *getenv(const char *name);…通過環境變量名稱獲取一個指定環境變量的數據

變量的聲明:就是告訴編譯器,有這個變量的存在(但是這個變量不一定是我們自己定義的,這個聲明使用的變量通常是一個本文件之外的全局變量 a.c / b.c)
變量的定義:告訴編譯器這個變量是什麼樣子的
exetrn char **enciron;在本文件中聲明有這個變量/然而這個變量的具體內容實際上是外部的,是標準庫中存的。

程序地址空間

地址:對內存單元的編號
程序時不佔用內存的,運行起來的程序被加載到內存,纔會佔有內存。

  • 進程地址空間- - - -一個全局變量,在子進程中修改後,打印100,但父進程中依然打印1, 數據不同,表示肯定沒有使用同一塊內存空間(一塊內存空間不可能存儲兩個數據),父子進程打印的數據不同但是地址卻是相同的- - - - - 矛盾
  • 實際上進程中訪問的地址都是虛擬地址,而我們所說的程序地址空間實際上是一個進程的虛擬地址空間;
    虛擬一個地址空間:其實就是一個結構體 mm_struct;- - - - - 是一個對內存空間的描述- - - - -通過這個描述向進程虛擬出一個完整的、連續的內存空間;爲了能夠直接訪問物理內存
    size :示內存大小
    code_start/code_end:描述代碼段的起始與結束,通過這兩個信息就可以描述一塊空間。

進程直接訪問物理內存:

  • 1、進程中的代碼使用都是連續的地址,若直接使用連續的物理內存會造成內存的浪費;
  • 2、直接訪問物理內存會因爲缺乏內存訪問控制導致進程的不安全。
    在這裏插入圖片描述

如何通過虛擬地址訪問物理內存?

  • 操作系統爲進程創建mm_struct虛擬地址空間的同時,也創建了一個頁表用於映射虛擬地址與物理地址的關係;
  • 進程使用虛擬地址空間,通過頁表映射物理內存,可以實現進程中數據在物理內存上的離散式存儲,通過這種方式提高內存的利用率;
  • 在頁表中可以直接針對某個地址設置,這個地址的訪問權限(這個地址是隻讀的),通過這種方式實現內存訪問控制

爲什麼要使用虛擬地址空間?

  • 這些虛擬地址最終通過頁表映射到物理內存上實現數據離散式存儲(提高內存訪問率);
  • 在頁表中實現內存的訪問控制。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章