關於操作系統的幾個常被問的問題

在32位x86體系 32位linux內核下

1.地址映射由誰來完成?
內核(GDT LDT PD PT)-硬件(MMU)
MMU完成從線性地址到物理地址的映射
這裏寫圖片描述
這裏寫圖片描述

2.爲什麼說32位的Linux 的邏輯地址和虛擬地址是一樣的?
邏輯地址 + 段基址 = 虛擬地址
如果一樣的話,那就說明基地址爲0.那麼爲什麼基地址會爲0?原因是在進行地址映射的時候,分頁的效率明顯高於分段,但是由於繼承x86體系,進行假分段,所以需要保存之前的分段,但實質對分段只是進行了從0地址開闢了4G的空間,實質並未完成什麼任務。只要cpu跟內存交互就會進行地址映射。

3.什麼是進程?(進程有什麼?具備了就是進程)
1.進程得有代碼指令(正在運行的程序)
2.PCB(進程控制塊)
3.獨立的用戶空間(佔用資源)
4.獨立的內核棧(調用系統API進行用戶態和內核態的切換時,就是切換的指針,也就是切換內核棧,內核棧不是共享的,內核空間是獨立的)

4.什麼叫做線程?
這裏寫圖片描述
Windows下,線程是進程的執行流,一個進程有一個或多個線程。
沒有內核線程,windows的最小單位是進程。
Linux下,線程和進程之間並無明顯區別,最小單位是任務(task_strut)。線程和進程都各自有獨立的進程控制塊和內核棧。線程沒有獨立的用戶空間則爲內核態線程,如果有獨立的用戶空間,共享別的進程,則是用戶態線程。沒有內核進程,只有內核線程。

5.加速地址映射的方式?
TLB存放最近使用的頁目錄,頁表(深入理解計算機第9章)
離MMU越近,映射速度越快

6.地址映射的方式只有一種?
內核空間的映射方式:虛擬地址 – offset (0x1000)=物理地址
用戶空間的映射方式是頁目錄,頁表的映射
用戶空間和內核空間的地址映射不同

7.32位Linux是如何管理內存的?
每一個頁面 struct _page
頁表中存放物理頁面的序號
頁表中的第0位(present)判斷頁面是活動的還是在swap分區中
這裏寫圖片描述
頁表中的高20位存放物理頁面,低12位均爲0,物理頁面是從0地址開始,物理頁面的地址剛好是頁框號。0 1 2 3 4

6.換頁算法:
LRU (交換的用戶空間)最近最久未使用
髒頁需要被交換,在切換的過程中會產生頁面抖動,但是概率不大,很少有一段代碼佔用兩頁,爲延緩頁面抖動需要建立緩存,
這裏寫圖片描述
所以Linux 中最多有4090個進程

7.進程切換:
這裏寫圖片描述

8.內核中開闢堆內存:kmalloc 和 vmalloc有什麼區別?
1)kmalloc和vmalloc分配的是內核的內存,malloc分配的是用戶的內存
2)kmalloc保證分配的內存在物理上是連續的, kmalloc()分配的內存在0xBFFFFFFF-0xFFFFFFFF以上的內存中,driver一般是用它來完成對DS的分配,更適合於類似設備驅動的程序來使用;
vmalloc保證的是在虛擬地址空間上的連續,vmalloc()則是位於物理地址非連續,虛地址連續區,起始位置由VMALLOL_START來決定,一般作爲交換區、模塊的分配。
3)kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相對較大(因爲vmalloc還可以處理交換空間)。
4)內存只有在要被DMA訪問的時候才需要物理上連續,vmalloc比kmalloc要慢
5)vmalloc使用的正確場合是分配一大塊,連續的,只在軟件中存在的,用於緩衝的內存區域。不能在微處理器之外使用。
6.vmalloc 中調用了 kmalloc (GFP—KERNEL),因此也不能應用於原子上下文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章