Linux面試專題

問題一:

絕對路徑用什麼符號表示?當前目錄、上層目錄用什麼表示?主目錄用什麼表示? 切換目錄用什麼命令?
答案:
絕對路徑:如/etc/init.d
當前目錄和上層目錄:./ …/
主目錄:~/
切換目錄:cd

問題二:

怎麼查看當前進程?怎麼執行退出?怎麼查看當前路徑?
答案:
查看當前進程:ps
執行退出:exit
查看當前路徑:pwd

問題三:

怎麼清屏?怎麼退出當前命令?怎麼執行睡眠?怎麼查看當前用戶 id?查看指定幫助用什麼命令?
答案:
清屏:clear
退出當前命令:ctrl+c 徹底退出
執行睡眠 :ctrl+z 掛起當前進程fg 恢復後臺
查看當前用戶 id:”id“:查看顯示目前登陸賬戶的 uid 和 gid 及所屬分組及用戶名
查看指定幫助:如 man adduser 這個很全 而且有例子;adduser --help 這個告訴你一些常用參數;info adduesr;

問題四:

Ls 命令執行什麼功能?可以帶哪些參數,有什麼區別?
答案:
ls 執行的功能:列出指定目錄中的目錄,以及文件
哪些參數以及區別:
a 所有文件l 詳細信息,包括大小字節數,可讀可寫可執行的權限等

問題五:

建立軟鏈接(快捷方式),以及硬鏈接的命令。
答案:
軟鏈接:ln -s slink source
硬鏈接:ln link source

問題六:

目錄創建用什麼命令?創建文件用什麼命令?複製文件用什麼命令?
答案:
創建目錄:mkdir
創建文件:典型的如 touch,vi 也可以創建文件,其實只要向一個不存在的文件輸出,都會創建文件
複製文件:cp 7. 文件權限修改用什麼命令?格式是怎麼樣的?
文件權限修改:chmod
格式如下:
$ chmod u+x file 給 file 的屬主增加執行權限
$ chmod 751 file 給 file 的屬主分配讀、寫、執行(7)的權限,給 file 的所在組分配讀、執行(5)的權限,給其他用戶分配執行(1)的權限
$ chmod u=rwx,g=rx,o=x file 上例的另一種形式
$ chmod =r file 爲所有用戶分配讀權限
$ chmod 444 file 同上例
$ chmod a-wx,a+r file 同上例
$ chmod -R u+r directory 遞歸地給 directory 目錄下所有文件和子目錄的屬主分配讀的權限

問題八:

查看文件內容有哪些命令可以使用?
答案:
vi 文件名 #編輯方式查看,可修改
cat 文件名 #顯示全部文件內容
more 文件名 #分頁顯示文件內容
less 文件名 #與 more 相似,更好的是可以往前翻頁
tail 文件名 #僅查看尾部,還可以指定行數
head 文件名 #僅查看頭部,還可以指定行數

問題九:

隨意寫文件命令?怎麼向屏幕輸出帶空格的字符串,比如”hello world”?
答案:
寫文件命令:vi
向屏幕輸出帶空格的字符串:echo hello world

問題十:

終端是哪個文件夾下的哪個文件?黑洞文件是哪個文件夾下的哪個命令?
答案:
終端 /dev/tty
黑洞文件 /dev/null

問題十一:

移動文件用哪個命令?改名用哪個命令?
答案:
mv mv

問題十二:

[root@localhost ~]# whatis zcat
zcat [gzip] (1) – compress or expand files

問題十三:

使用哪一個命令可以查看自己文件系統的磁盤空間配額呢?
答案:
使用命令repquota 能夠顯示出一個文件系統的配額信息

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) Linux 虛擬文件系統的關鍵數據結構有哪些?(至少寫出四個)

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

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

struct file_operations

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

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

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

clone(),fork(),vfork();系統調用服務例程:sys_clone,sys_fork,sys_vfork;
10) 調用 schedule()進行進程切換的方式有幾種?
1.系統調用 do_fork();
2.定時中斷 do_timer();
3.喚醒進程 wake_up_process
4.改變進程的調度策略 setscheduler();
5.系統調用禮讓 sys_sched_yield();

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

Liunx 調度程序是根據根據進程的動態優先級來調度進程的,但是動態優先級又是根據靜態 優先級根據算法計算出來的,兩者是兩個相關聯的值。因爲高優先級的進程總是比低優先級的進程先被調度,爲防止多個高優先級的進程佔用 CPU 資源,導致其他進程不能佔有 CPU, 所以引用動態優先級概念
12) 進程調度的核心數據結構是哪個?
struct runqueue
13) 如何加載、卸載一個模塊?
insmod 加載,rmmod 卸載
14) 模塊和應用程序分別運行在什麼空間?
模塊運行在內核空間,應用程序運行在用戶空間

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

應用程序實現,Linux 中的浮點運算是利用數學庫函數實現的,庫函數能夠被應用程序鏈接後 調用,不能被內核鏈接調用。這些運算是在應用程序中運行的,然後再把結果反饋給系統。 Linux 內核如果一定要進行浮點運算,需要在建立內核時選上 math-emu,使用軟件模擬計算 浮點運算,據說這樣做的代價有兩個:用戶在安裝驅動時需要重建內核,可能會影響到其他的 應用程序,使得這些應用程序在做浮點運算的時候也使用 math-emu,大大的降低了效率。
16) 模塊程序能否使用可鏈接的庫函數?
模塊程序運行在內核空間,不能鏈接庫函數。
17) TLB 中緩存的是什麼內容?
TLB,頁表緩存,當線性地址被第一次轉換成物理地址的時候,將線性地址和物理地址的對應 放到 TLB 中,用於下次訪問這個線性地址時,加快轉換速度。
18) Linux 中有哪幾種設備?
字符設備和塊設備。網卡是例外,他不直接與設備文件對應,mknod 系統調用用來創建設備 文件。
19) 字符設備驅動程序的關鍵數據結構是哪個?
字符設備描述符 struct cdev,cdev_alloc()用於動態的分配 cdev 描述符,cdev_add()用於注 冊一個 cdev 描述符,cdev 包含一個 struct kobject 類型的數據結構它是核心的數據結構
20) 設備驅動程序包括哪些功能函數?
open(),read(),write(),llseek(),realse();
21) 如何唯一標識一個設備?
Linux 使用一個設備編號來唯一的標示一個設備,設備編號分爲:主設備號和次設備號,一般主 設備號標示設備對應的驅動程序,次設備號對應設備文件指向的設備,在內核中使用 dev_t 來 表示設備編號,一般它是 32 位長度,其中 12 位用於表示主設備號,20 位用於表示次設備號, 利用 MKDEV(int major,int minor);用於生成一個 dev_t 類型的對象。
22) Linux 通過什麼方式實現系統調用?
靠軟件中斷實現的,首先,用戶程序爲系統調用設置參數,其中一個編號是系統調用編號,參數 設置完成後,程序執行系統調用指令,x86 上的軟中斷是有 int 產生的,這個指令會導致一個異 常,產生一個事件,這個事件會導致處理器跳轉到內核態並跳轉到一個新的地址。並開始處 理那裏的異常處理程序,此時的異常處理就是系統調用程序。

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

Linux 中的軟中斷和工作隊列是中斷處理。
1.軟中斷一般是“可延遲函數”的總稱,它不能睡眠,不能阻塞,它處於中斷上下文,不能進城切 換,軟中斷不能被自己打斷,只能被硬件中斷打斷(上半部),可以併發的運行在多個 CPU 上。 所以軟中斷必須設計成可重入的函數,因此也需要自旋鎖來保護其數據結構。
2.工作隊列中的函數處在進程上下文中,它可以睡眠,也能被阻塞,能夠在不同的進程間切 換。已完成不同的工作。 可延遲函數和工作隊列都不能訪問用戶的進程空間,可延時函數在執行時不可能有任何正在 運行的進程,工作隊列的函數有內核進程執行,他不能訪問用戶空間地址。

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