日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的,LINUX内核面试题...

發布時間:2024/7/23 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的,LINUX内核面试题... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

該鏈接有每個題詳細的答案講解http://www.docin.com/p-442803876.html 以下答案可能不是很詳細。 1) Linux中主要有哪幾種內核鎖? Linux的同步機制從2.0到2.6以來不斷發展完善。從最初的原子操作,到后來的信號量,從大內核鎖到今天的自旋鎖。這些同步機制的

該鏈接有每個題詳細的答案講解http://www.docin.com/p-442803876.html

以下答案可能不是很詳細。

1) Linux中主要有哪幾種內核鎖?

Linux的同步機制從2.0到2.6以來不斷發展完善。從最初的原子操作,到后來的信號量,從大內核鎖到今天的自旋鎖。這些同步機制的發展伴隨Linux從單處理器到對稱多處理器的過渡;

伴隨著從非搶占內核到搶占內核的過度。Linux的鎖機制越來越有效,也越來越復雜。

Linux的內核鎖主要是自旋鎖和信號量。

自旋鎖最多只能被一個可執行線程持有,如果一個執行線程試圖請求一個已被爭用(已經被持有)的自旋鎖,那么這個線程就會一直進行忙循環——旋轉——等待鎖重新可用。要是鎖未被爭用,請求它的執行線程便能立刻得到它并且繼續進行。自旋鎖可以在任何時刻防止多于一個的執行線程同時進入臨界區。

Linux中的信號量是一種睡眠鎖。如果有一個任務試圖獲得一個已被持有的信號量時,信號量會將其推入等待隊列,然后讓其睡眠。這時處理器獲得自由去執行其它代碼。當持有信號量的進程將信號量釋放后,在等待隊列中的一個任務將被喚醒,從而便可以獲得這個信號量。

信號量的睡眠特性,使得信號量適用于鎖會被長時間持有的情況;只能在進程上下文中使用,因為中斷上下文中是不能被調度的;另外當代碼持有信號量時,不可以再持有自旋鎖。

Linux 內核中的同步機制:原子操作、信號量、讀寫信號量和自旋鎖的API,另外一些同步機制,包括大內核鎖、讀寫鎖、大讀者鎖、RCU (Read-Copy Update,顧名思義就是讀-拷貝修改),和順序鎖。

2) Linux中的用戶模式和內核模式是什么含意?

MS-DOS等操作系統在單一的CPU模式下運行,但是一些類Unix的操作系統則使用了雙模式,可以有效地實現時間共享。在Linux機器上,CPU要么處于受信任的內核模式,要么處于受限制的用戶模式。除了內核本身處于內核模式以外,所有的用戶進程都運行在用戶模式之中。

內核模式的代碼可以無限制地訪問所有處理器指令集以及全部內存和I/O空間。如果用戶模式的進程要享有此特權,它必須通過系統調用向設備驅動程序或其他內核模式的代碼發出請求。另外,用戶模式的代碼允許發生缺頁,而內核模式的代碼則不允許。

在2.4和更早的內核中,僅僅用戶模式的進程可以被上下文切換出局,由其他進程搶占。除非發生以下兩種情況,否則內核模式代碼可以一直獨占CPU:

(1) 它自愿放棄CPU;

(2) 發生中斷或異常。

2.6內核引入了內核搶占,大多數內核模式的代碼也可以被搶占。

3) 怎樣申請大塊內核內存?

在Linux內核環境下,申請大塊內存的成功率隨著系統運行時間的增加而減少,雖然可以通過vmalloc系列調用申請物理不連續但虛擬地址連續的內存,但畢竟其使用效率不高且在32位系統上vmalloc的內存地址空間有限。所以,一般的建議是在系統啟動階段申請大塊內存,但是其成功的概率也只是比較高而已,而不是100%。如果程序真的比較在意這個申請的成功與否,只能退用“啟動內存”(Boot

Memory)。下面就是申請并導出啟動內存的一段示例代碼:

void* x_bootmem = NULL;

EXPORT_SYMBOL(x_bootmem);

unsigned long x_bootmem_size = 0;

EXPORT_SYMBOL(x_bootmem_size);

static int __init x_bootmem_setup(char *str)

{

x_bootmem_size = memparse(str, &str);

x_bootmem = alloc_bootmem(x_bootmem_size);

printk(“Reserved %lu bytes from %p for x\n”, x_bootmem_size, x_bootmem);

return 1;

}

__setup(“x-bootmem=”, x_bootmem_setup);

可見其應用還是比較簡單的,不過利弊總是共生的,它不可避免也有其自身的限制:

內存申請代碼只能連接進內核,不能在模塊中使用。

被申請的內存不會被頁分配器和slab分配器所使用和統計,也就是說它處于系統的可見內存之外,即使在將來的某個地方你釋放了它。

一般用戶只會申請一大塊內存,如果需要在其上實現復雜的內存管理則需要自己實現。

在不允許內存分配失敗的場合,通過啟動內存預留內存空間將是我們唯一的選擇。

4) 用戶進程間通信主要哪幾種方式?

(1)管道(Pipe):管道可用于具有親緣關系進程間的通信,允許一個進程和另一個與它有共同祖先的進程之間進行通信。

(2)命名管道(named pipe):命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信。命名管道在文件系統中有對應的文件名。命名管道通過命令mkfifo或系統調用mkfifo來創建。

(3)信號(Signal):信號是比較復雜的通信方式,用于通知接受進程有某種事件發生,除了用于進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基于BSD的,BSD為了實現可靠信號機制,又能夠統一對外接口,用sigaction函數重新實現了signal函數)。

(4)消息(Message)隊列:消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠權限的進程可以向隊列中添加消息,被賦予讀權限的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節流以及緩沖區大小受限等缺

(5)共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。

(6)信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。

(7)套接字(Socket):更為一般的進程間通信機制,可用于不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。

5) 通過伙伴系統申請內核內存的函數有哪些?

在物理頁面管理上實現了基于區的伙伴系統(zone based buddy system)。對不同區的內存使用單獨的伙伴系統(buddy system)管理,而且獨立地監控空閑頁。相應接口alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。

6) 通過slab分配器申請內核內存的函數有?

7) Linux的內核空間和用戶空間是如何劃分的(以32位系統為例)?

8) vmalloc()申請的內存有什么特點?

9) 用戶程序使用malloc()申請到的內存空間在什么范圍?

10) 在支持并使能MMU的系統中,Linux內核和用戶程序分別運行在物理地址模式還是虛擬地址模式?

11) ARM處理器是通過幾級也表進行存儲空間映射的?

12) Linux是通過什么組件來實現支持多種文件系通的?

13) Linux虛擬文件系統的關鍵數據結構有哪些?(至少寫出四個)

struct super_block,struct inode,struct file,struct dentry;

14) 對文件或設備的操作函數保存在那個數據結構中?

struct file_operations

15) Linux中的文件包括哪些?

執行文件,普通文件,目錄文件,鏈接文件和設備文件,管道文件。

16) 創建進程的系統調用有那些?

clone(),fork(),vfork();系統調用服務例程:sys_clone,sys_fork,sys_vfork;

17) 調用schedule()進行進程切換的方式有幾種?

1.系統調用 do_fork();

2.定時中斷 do_timer();

3.喚醒進程 wake_up_process

4.改變進程的調度策略 setscheduler();

5.系統調用禮讓 sys_sched_yield();

18) Linux調度程序是根據進程的動態優先級還是靜態優先級來調度進程的?

Liunx調度程序是根據根據進程的動態優先級來調度進程的,但是動態優先級又是根據靜態優先級根據算法計算出來的,兩者是兩個相關聯的值。因為高優先級的進程總是比低優先級的進程先被調度,為防止多個高優先級的進程占用CPU資源,導致其他進程不能占有CPU,所以引用動態優先級概念

19) 進程調度的核心數據結構是哪個?

struct runqueue

20) 如何加載、卸載一個模塊?

insmod加載,rmmod卸載

21) 模塊和應用程序分別運行在什么空間?

模塊運行在內核空間,應用程序運行在用戶空間

22) Linux中的浮點運算由應用程序實現還是內核實現?

應用程序實現,Linux中的浮點運算是利用數學庫函數實現的,庫函數能夠被應用程序鏈接后調用,不能被內核鏈接調用。這些運算是在應用程序中運行的,然后再把結果反饋給系統。Linux內核如果一定要進行浮點運算,需要在建立內核時選上math-emu,使用軟件模擬計算浮點運算,據說這樣做的代價有兩個:用戶在安裝驅動時需要重建內核,可能會影響到其他的應用程序,使得這些應用程序在做浮點運算的時候也使用math-emu,大大的降低了效率。

23) 模塊程序能否使用可鏈接的庫函數?

模塊程序運行在內核空間,不能鏈接庫函數。

24) TLB中緩存的是什么內容?

TLB,頁表緩存,當線性地址被第一次轉換成物理地址的時候,將線性地址和物理地址的對應放到TLB中,用于下次訪問這個線性地址時,加快轉換速度。

25) Linux中有哪幾種設備?

字符設備和塊設備。網卡是例外,他不直接與設備文件對應,mknod系統調用用來創建設備文件。

26) 字符設備驅動程序的關鍵數據結構是哪個?

字符設備描述符struct cdev,cdev_alloc()用于動態的分配cdev描述符,cdev_add()用于注冊一個cdev描述符,cdev包含一個struct kobject 類型的數據結構它是核心的數據結構

27) 設備驅動程序包括哪些功能函數?

open(),read(),write(),llseek(),realse();

28) 如何唯一標識一個設備?

Linux使用一個設備編號來唯一的標示一個設備,設備編號分為:主設備號和次設備號,一般主設備號標示設備對應的驅動程序,次設備號對應設備文件指向的設備,在內核中使用dev_t來表示設備編號,一般它是32位長度,其中12位用于表示主設備號,20位用于表示次設備號,利用MKDEV(int

major,int minor);用于生成一個dev_t類型的對象。

29) Linux通過什么方式實現系統調用?

靠軟件中斷實現的,首先,用戶程序為系統調用設置參數,其中一個編號是系統調用編號,參數設置完成后,程序執行系統調用指令,x86上的軟中斷是有int產生的,這個指令會導致一個異常,產生一個事件,這個事件會導致處理器跳轉到內核態并跳轉到一個新的地址。并開始處理那里的異常處理程序,此時的異常處理就是系統調用程序。

30) Linux軟中斷和工作隊列的作用是什么?

Linux中的軟中斷和工作隊列是中斷處理。

1.軟中斷一般是“可延遲函數”的總稱,它不能睡眠,不能阻塞,它處于中斷上下文,不能進城切換,軟中斷不能被自己打斷,只能被硬件中斷打斷(上半部),可以并發的運行在多個CPU上。所以軟中斷必須設計成可重入的函數,因此也需要自旋鎖來保護其數據結構。

2.工作隊列中的函數處在進程上下文中,它可以睡眠,也能被阻塞,能夠在不同的進程間切換。已完成不同的工作。

可延遲函數和工作隊列都不能訪問用戶的進程空間,可延時函數在執行時不可能有任何正在運行的進程,工作隊列的函數有內核進程執行,他不能訪問用戶空間地址。

總結

以上是生活随笔為你收集整理的linux调度程序是根据进程的动态优先级还是静态优先级来调度进程的,LINUX内核面试题...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。