日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1) linux 中主要有哪幾種內(nèi)核鎖?

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

伴隨著從非搶占內(nèi)核到搶占內(nèi)核的過度。Linux 的鎖機(jī)制越來越有效,也越來越復(fù)雜。Linux 的內(nèi)核鎖主要是自旋鎖和信號量。自旋鎖最多只能被一個可執(zhí)行線程持有,如果一個執(zhí)行線程試圖請求一個已被爭用(已經(jīng)被持有)的自旋鎖,那么這個線程就會一直進(jìn)行慢循環(huán)——旋轉(zhuǎn)——等待鎖重新可用。要是說未被爭用,請求它的執(zhí)行線程便能立刻得到它并且繼續(xù)進(jìn)行。自旋鎖可以在任何時刻防止多于一個的執(zhí)行線程同時進(jìn)入臨界區(qū)。

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

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

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

Linux面試專題及答案,學(xué)完時候就可以出師了

 

2) Linux 中的用戶模式和內(nèi)核模式是什么含義?

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

內(nèi)核模式的代碼可以無限制地訪問所有處理器指令集以及全部內(nèi)存和 I/O 空間。如果用戶模式的進(jìn)程要享有此特權(quán),它必須通過系統(tǒng)調(diào)用向設(shè)備驅(qū)動程序或其他內(nèi)核模式的代碼發(fā)出請求。另外,用戶模式的代碼允許發(fā)生缺頁,而內(nèi)核模式的代碼則不允許。

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

(1) 它自愿放棄 CPU;

(2) 發(fā)生中斷或異常。

2.6 內(nèi)核引入了內(nèi)核搶占,大多數(shù)內(nèi)核模式的代碼也可以被搶占。

3) 怎樣申請大塊內(nèi)核內(nèi)存?

在 Linux 內(nèi)核環(huán)境下,申請大塊內(nèi)存的成功率隨著系統(tǒng)運行時間的增加而減少,雖然可以通過vmalloc 系列調(diào)用申請物理不連續(xù)但虛擬地址連續(xù)的內(nèi)存,但畢竟其使用效率不高且在 32 位系統(tǒng)上 vmalloc 的內(nèi)存地址空間有限。所以,一般的建議是在系統(tǒng)啟動階段申請大塊內(nèi)存,但是其成功的概率也只是比較高而已,而不是 100%。如果程序真的比較在意這個申請的成功與否,只能退用“啟動內(nèi)存”(Boot Memory)。下面就是申請并導(dǎo)出啟動內(nèi)存的一段示例代碼:

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 xn”, x_bootmem_size, x_bootmem);
return 1;
}
__setup(“x-bootmem=”, x_bootmem_setup);

可見其應(yīng)用還是比較簡單的,不過利弊總是共生的,它不可避免也有其自身的限制:內(nèi)存申請代碼只能連接進(jìn)內(nèi)核,不能在模塊中使用。

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

一般用戶只會申請一大塊內(nèi)存,如果需要在其上實現(xiàn)復(fù)雜的內(nèi)存管理則需要自己實現(xiàn)。在不允許內(nèi)存分配失敗的場合,通過啟動內(nèi)存預(yù)留內(nèi)存空間將是我們唯一的選擇。

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

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

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

(3)信號(Signal):信號是比較復(fù)雜的通信方式,用于通知接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外,進(jìn)程還可以發(fā)送信號給進(jìn)程本身;linux 除了支持 Unix 早期信號語義函數(shù) sigal外,還支持語義符合 Posix.1 標(biāo)準(zhǔn)的信號函數(shù) sigaction(實際上,該函數(shù)是基于 BSD 的,BSD為了實現(xiàn)可靠信號機(jī)制,又能夠統(tǒng)一對外接口,用 sigaction 函數(shù)重新實現(xiàn)了 signal 函數(shù))。(4)消息(Message)隊列:消息隊列是消息的連接表,包括 Posix 消息隊列 system V 消息隊列。有足夠權(quán)限的進(jìn)程可以向隊列中添加消息,被賦予讀權(quán)限的進(jìn)程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺

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

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

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

5) 通過伙伴系統(tǒng)申請內(nèi)核內(nèi)存的函數(shù)有哪些?

在物理頁面管理上實現(xiàn)了基于區(qū)的伙伴系統(tǒng)(zone based buddy system)。對不同區(qū)的內(nèi)存使用單獨的伙伴系統(tǒng)(buddy system)管理,而且獨立地監(jiān)控空閑頁。相應(yīng)接口alloc_pages(gfp_mask, order),_ _get_free_pages(gfp_mask, order)等。

6) Linux 虛擬文件系統(tǒng)的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)有哪些?(至少寫出四個)

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

7) 對文件或設(shè)備的操作函數(shù)保存在哪個數(shù)據(jù)結(jié)構(gòu)中?

struct file_operations

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

執(zhí)行文件,普通文件,目錄文件,鏈接文件和設(shè)備文件,管道文件。

9) 創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用有哪些?

clone(),fork(),vfork();系統(tǒng)調(diào)用服務(wù)例程:sys_clone,sys_fork,sys_vfork;

10) 調(diào)用 schedule()進(jìn)行進(jìn)程切換的方式有幾種?

1.系統(tǒng)調(diào)用 do_fork();

2.定時中斷 do_timer();

3.喚醒進(jìn)程 wake_up_process

4.改變進(jìn)程的調(diào)度策略 setscheduler();

5.系統(tǒng)調(diào)用禮讓 sys_sched_yield();

11) Linux 調(diào)度程序是根據(jù)進(jìn)程的動態(tài)優(yōu)先級還是靜態(tài)優(yōu)先級來調(diào)度進(jìn)程的?

Liunx 調(diào)度程序是根據(jù)根據(jù)進(jìn)程的動態(tài)優(yōu)先級來調(diào)度進(jìn)程的,但是動態(tài)優(yōu)先級又是根據(jù)靜態(tài)

優(yōu)先級根據(jù)算法計算出來的,兩者是兩個相關(guān)聯(lián)的值。因為高優(yōu)先級的進(jìn)程總是比低優(yōu)先級的進(jìn)程先被調(diào)度,為防止多個高優(yōu)先級的進(jìn)程占用 CPU 資源,導(dǎo)致其他進(jìn)程不能占有 CPU,所以引用動態(tài)優(yōu)先級概念

12) 進(jìn)程調(diào)度的核心數(shù)據(jù)結(jié)構(gòu)是哪個?

struct runqueue

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

insmod 加載,rmmod 卸載

14) 模塊和應(yīng)用程序分別運行在什么空間?

模塊運行在內(nèi)核空間,應(yīng)用程序運行在用戶空間

15) Linux 中的浮點運算由應(yīng)用程序?qū)崿F(xiàn)還是內(nèi)核實現(xiàn)?

應(yīng)用程序?qū)崿F(xiàn),Linux 中的浮點運算是利用數(shù)學(xué)庫函數(shù)實現(xiàn)的,庫函數(shù)能夠被應(yīng)用程序鏈接后調(diào)用,不能被內(nèi)核鏈接調(diào)用。這些運算是在應(yīng)用程序中運行的,然后再把結(jié)果反饋給系統(tǒng)。Linux 內(nèi)核如果一定要進(jìn)行浮點運算,需要在建立內(nèi)核時選上 math-emu,使用軟件模擬計算浮點運算,據(jù)說這樣做的代價有兩個:用戶在安裝驅(qū)動時需要重建內(nèi)核,可能會影響到其他的應(yīng)用程序,使得這些應(yīng)用程序在做浮點運算的時候也使用 math-emu,大大的降低了效率。

16) 模塊程序能否使用可鏈接的庫函數(shù)?

模塊程序運行在內(nèi)核空間,不能連接庫函數(shù)。

17) TLB 中緩存的是什么內(nèi)容?

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

18) Linux 中有哪幾種設(shè)備?

字符設(shè)備和塊設(shè)備。網(wǎng)卡是例外,它不直接與設(shè)備文件對應(yīng),mknod 系統(tǒng)調(diào)用用來創(chuàng)建設(shè)備文件。

19) 字符設(shè)備驅(qū)動程序的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)是哪個?

字符設(shè)備描述符 struct cdev,cdev_alloc()用于動態(tài)的分配 cdev 描述符,cdev_add()用于注冊一個 cdev 描述符,cdev 包含一個 struct kobject 類型的數(shù)據(jù)結(jié)構(gòu)它是核心的數(shù)據(jù)結(jié)構(gòu)

20) 設(shè)備驅(qū)動程序包括哪些功能函數(shù)?

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

21) 如何唯一標(biāo)識一個設(shè)備?

Linux 使用一個設(shè)備編號來唯一的標(biāo)示一個設(shè)備,設(shè)備編號分為:主設(shè)備號和次設(shè)備號,一般主設(shè)備號標(biāo)示設(shè)備對應(yīng)的驅(qū)動程序,此設(shè)備號對應(yīng)設(shè)備文件指向的設(shè)備,在內(nèi)核中使用 dev_t 來表示設(shè)備編號,一般它是 32 位長度,其中 12 位用于表示主設(shè)備號,20 位用于表示此設(shè)備號,利用 MKDEV(int major,int minor);用于生成一個 dev_t 類型的對象。

22) Linux 通過什么方式實現(xiàn)系統(tǒng)調(diào)用?

靠軟件中斷實現(xiàn)的,首先,用戶程序為系統(tǒng)調(diào)用設(shè)置參數(shù),其中一個編號是系統(tǒng)調(diào)用編號,參數(shù)設(shè)置完成后,程序執(zhí)行系統(tǒng)調(diào)用指令,x86 上的軟中斷是有 int 產(chǎn)生的,這個指令會導(dǎo)致一個異常,產(chǎn)生一個事件,這個事件會導(dǎo)致處理器跳轉(zhuǎn)到內(nèi)核態(tài)并跳轉(zhuǎn)到一個新的地址。并開始處理那里的異常處理程序,此時的異常處理就是系統(tǒng)調(diào)用程序。

 

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

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

1.軟中斷一般是“可延遲函數(shù)”的總稱,它不能睡眠,不能阻塞,它處于中斷上下文,不能進(jìn)城切換,軟中斷不能被自己打斷,只能被硬件中斷打斷(上半部),可以并發(fā)的運行在多個 CPU 上。

所以軟中斷必須設(shè)計成可重入的函數(shù),因此也需要自旋鎖來保護(hù)其數(shù)據(jù)結(jié)構(gòu)。

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

可延遲函數(shù)和工作隊列都不能訪問用戶的進(jìn)程空間,可延遲函數(shù)在執(zhí)行時不可能有任何正在運行的進(jìn)程,工作隊列的函數(shù)有內(nèi)核進(jìn)程執(zhí)行,它不能訪問用戶空間地址。

分享到:
標(biāo)簽:面試題 Linux
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定