0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

操作系統(tǒng)方面的相關面試題總結(上)

jf_78858299 ? 來源:阿Q正磚 ? 作者:阿Q正磚 ? 2023-04-06 15:14 ? 次閱讀

1、進程和線程的區(qū)別?

進程和線程都是操作系統(tǒng)中進行任務調度的基本單位,二者之間的主要區(qū)別如下:

  • 資源占用:進程是操作系統(tǒng)資源分配的基本單位,一個進程可以擁有多個線程,而線程是進程中的執(zhí)行單元,是CPU調度的基本單位。每個線程共享所屬進程的資源,如代碼段、數(shù)據(jù)段、打開的文件等。而進程之間互相獨立,互不干擾,每個進程有自己獨立的資源空間,不同進程之間需要通過IPC(進程間通信)來進行通信和數(shù)據(jù)共享。
  • 調度和切換:操作系統(tǒng)在調度和分配CPU時,將進程作為基本的調度和分配單位,即進程擁有自己的調度隊列。而線程是依附于進程而存在的,一個進程中的多個線程共享進程的時間片和資源,因此在調度和切換時,線程切換比進程切換更快,也更加輕量級。
  • 創(chuàng)建和銷毀:進程的創(chuàng)建和銷毀比線程更加復雜,創(chuàng)建一個進程需要為其分配資源、建立PCB(進程控制塊)、建立內核對象等,而銷毀進程需要回收資源、關閉打開的文件等。而線程的創(chuàng)建和銷毀相對簡單,只需要為其分配線程棧、建立TCB(線程控制塊)等即可。
  • 通信和同步:進程之間通過IPC(管道、套接字、消息隊列等)進行通信和數(shù)據(jù)共享,而線程之間可以直接訪問同一進程的共享數(shù)據(jù)區(qū),也可以通過鎖機制實現(xiàn)同步。

綜上所述,進程和線程在資源占用、調度和切換、創(chuàng)建和銷毀、通信和同步等方面有著不同的特點,開發(fā)者在實際編程時需要根據(jù)具體的情況選擇使用進程還是線程來完成任務。

2、協(xié)程與線程的區(qū)別?

協(xié)程和線程都是用于實現(xiàn)多任務的技術,但是它們的實現(xiàn)方式有所不同,具體區(qū)別如下:

  • 調度方式不同:線程由操作系統(tǒng)內核進行調度,而協(xié)程則是在用戶空間中進行調度,不需要切換到內核態(tài)。
  • 并發(fā)性不同:線程是操作系統(tǒng)調度的最小單位,多個線程可以并行執(zhí)行;協(xié)程則是在單線程內部通過協(xié)作式調度實現(xiàn)并發(fā)。
  • 內存使用不同:線程是由操作系統(tǒng)內核創(chuàng)建的,需要占用一定的系統(tǒng)資源,而協(xié)程則是由用戶程序創(chuàng)建,不需要占用額外的系統(tǒng)資源。
  • 上下文切換開銷不同:線程在切換時需要保存和恢復所有的寄存器狀態(tài)和內核堆棧,而協(xié)程只需要保存和恢復少量的寄存器狀態(tài),開銷較小。
  • 編程難度不同:線程的編程難度相對較大,因為多線程之間需要共享資源并進行同步,而協(xié)程則是在單線程內部調度,因此編程難度相對較小。

總之,線程是操作系統(tǒng)內核的調度對象,具有獨立的系統(tǒng)資源,可以并行執(zhí)行多個任務;而協(xié)程是用戶程序的調度對象,不需要占用額外的系統(tǒng)資源,通過協(xié)作式調度實現(xiàn)任務之間的切換。

3、并發(fā)和并行的區(qū)別?

并發(fā)和并行都是指同時處理多個任務的方式,但是它們有不同的含義。

并發(fā)是指一個處理器同時處理多個任務,這些任務通常是通過在不同的時間間隔內交替進行的,這樣在同一時刻可以看到有多個任務在運行。這些任務可以是在同一個程序內的不同線程,也可以是在不同程序之間的交互,例如客戶端與服務器之間的通信。

并行是指使用多個處理器同時處理多個任務,這些任務在同一時刻可以看到有多個任務在同時運行。與并發(fā)不同的是,并行需要多個處理器或多個計算核心,而并發(fā)則可以在單個處理器上執(zhí)行多個任務。

簡單來說,并發(fā)是在一個處理器上同時執(zhí)行多個任務,而并行是在多個處理器或計算核心上同時執(zhí)行多個任務。

4、進程與線程的切換流程?

進程與線程的切換流程如下:

  1. 當前進程或線程執(zhí)行到阻塞狀態(tài)(如等待I/O完成)時,觸發(fā)切換操作。
  2. 操作系統(tǒng)內核保存當前進程或線程的上下文(即當前的寄存器值和程序計數(shù)器等信息),并將處理器分配給另一個進程或線程。
  3. 內核從調度隊列中選擇另一個進程或線程,并恢復其保存的上下文信息。
  4. 處理器開始執(zhí)行新的進程或線程,從之前保存的狀態(tài)恢復執(zhí)行。

在進程切換時,需要將整個進程的上下文信息保存下來,包括進程的虛擬內存、全局變量等,切換時還需要進行內存映射,開銷比較大。

在線程切換時,只需要保存當前線程的上下文信息即可,線程共享進程的虛擬內存,切換時不需要進行內存映射,開銷較小。

5、為什么虛擬地址空間切換比較耗時?

虛擬地址空間切換的耗時是因為它涉及到了硬件和操作系統(tǒng)的復雜操作。當進程或線程切換時,需要保存當前的程序狀態(tài)(寄存器值、堆棧指針等)和上下文信息(當前指令位置、程序計數(shù)器等)。然后,內核必須選擇另一個進程或線程,并將它的狀態(tài)和上下文信息裝入內存,這樣才能保證程序能夠繼續(xù)運行。這個過程涉及到多個操作系統(tǒng)的內核和硬件機制,例如上下文切換、內存管理和硬件中斷等。

在這個過程中,為了切換到另一個進程或線程,需要保存和恢復大量的狀態(tài)信息,包括內核上下文和硬件寄存器等。這些操作需要耗費大量的CPU時間和內存帶寬,因此切換過程通常是相對比較耗時的。

6、進程間通信方式有哪些?

進程間通信(IPC,Inter-process Communication)指的是在不同進程之間交換信息的機制和方法。常見的進程間通信方式有以下幾種:

  • 管道(Pipe):管道是一種半雙工的通信方式,只能在具有公共祖先的進程之間使用。管道可以實現(xiàn)進程之間的通信,但只能在父子進程或兄弟進程之間使用,因為管道是單向的,而且只能在具有公共祖先的進程之間使用。
  • 命名管道(Named Pipe):命名管道是一種有名的通信方式,可以實現(xiàn)無關進程之間的通信。它可以在不具有親緣關系的進程之間傳遞數(shù)據(jù),并且可以實現(xiàn)雙向通信。
  • 信號量(Semaphore):信號量是一種計數(shù)器,用于控制多個進程對共享資源的訪問。它可以用來解決進程間的同步和互斥問題。
  • 信號(Signal):信號是一種軟件中斷,用于通知進程發(fā)生了某個事件。它可以用于進程間的通信和同步。
  • 共享內存(Shared Memory):共享內存是一種高效的進程間通信方式,它可以在多個進程之間共享內存區(qū)域,從而實現(xiàn)數(shù)據(jù)的快速交換。
  • 消息隊列(Message Queue):消息隊列是一種進程間通信方式,可以實現(xiàn)不同進程之間的異步通信。
  • 套接字(Socket):套接字是一種網(wǎng)絡通信方式,可以實現(xiàn)不同主機之間的進程間通信。

每種進程間通信方式都有其優(yōu)缺點和適用場景,需要根據(jù)具體的需求進行選擇。

7、進程間同步的方式有哪些?

進程間同步是指在多個進程之間進行數(shù)據(jù)交換或共享資源的操作時,為了避免出現(xiàn)競爭和沖突,需要采用某種機制保證操作的正確性和一致性。常見的進程間同步方式有以下幾種:

  • 信號量:使用信號量作為鎖,控制進程對共享資源的訪問。當一個進程要訪問共享資源時,先檢查信號量的值,如果為正,則進程可以訪問資源,并將信號量的值減1;否則,進程必須等待,直到信號量的值為正。當一個進程完成訪問后,需要將信號量的值加1,以便其他進程可以訪問資源。
  • 互斥鎖:使用互斥鎖保護共享資源,同一時刻只能有一個進程訪問資源。當一個進程要訪問共享資源時,需要先獲得互斥鎖,如果鎖已經被其他進程持有,則進程需要等待,直到鎖被釋放為止。當進程完成訪問后,需要釋放互斥鎖,以便其他進程可以訪問資源。
  • 條件變量:使用條件變量實現(xiàn)進程間的通信和同步。當一個進程要訪問共享資源時,如果發(fā)現(xiàn)資源不可用,則進程可以通過條件變量等待,直到資源可用為止。當另一個進程釋放資源時,可以通過條件變量通知等待的進程,以便它們可以訪問資源。
  • 讀寫鎖:讀寫鎖是一種特殊的鎖,可以在多個進程之間共享資源,但是只允許讀操作同時進行,寫操作必須獨占資源。當一個進程要進行讀操作時,需要獲得讀鎖,如果沒有其他進程持有寫鎖,則進程可以獲得鎖并進行讀操作;否則,進程需要等待,直到寫鎖被釋放為止。當一個進程要進行寫操作時,需要獲得寫鎖,此時必須獨占資源,其他進程無法進行讀或寫操作,直到寫鎖被釋放為止。
  • 信號:進程可以通過信號來通知其他進程發(fā)生了某些事件。當一個進程需要通知其他進程時,可以向目標進程發(fā)送信號,目標進程可以根據(jù)信號進行相應的處理。常見的信號包括中斷信號、終止信號、用戶自定義信號等。
  • 共享內存:使用共享內存實現(xiàn)進程間的數(shù)據(jù)共享。多個進程可以共享同一塊內存區(qū)域,可以通過讀寫內存區(qū)域來進行數(shù)據(jù)交換。

8、線程同步的方式有哪些?

線程同步的方式有以下幾種:

  • 互斥量(Mutex):用于保護共享資源,只有一個線程可以獲取到互斥量,其他線程需要等待該線程釋放互斥量后才能繼續(xù)執(zhí)行。
  • 信號量(Semaphore):用于控制訪問一定數(shù)量的共享資源,通過計數(shù)器實現(xiàn)。
  • 事件(Event):用于線程間的通信,一個線程發(fā)起事件后等待其他線程響應該事件。
  • 條件變量(Condition Variable):用于線程間的協(xié)作,允許一個線程等待另一個線程滿足某個條件。
  • 屏障(Barrier):用于多個線程并發(fā)執(zhí)行時,在特定點將線程阻塞,等待所有線程都達到這個點后再一起繼續(xù)執(zhí)行。
  • 讀寫鎖(Reader-Writer Lock):用于在多個線程中共享某些數(shù)據(jù),讀寫鎖允許多個線程同時讀取共享數(shù)據(jù),但只允許一個線程寫入共享數(shù)據(jù)。

在實際的多線程應用中,不同的同步方式有不同的使用場景,需要根據(jù)具體情況選擇合適的方式。

9、線程的分類?

線程可以分為用戶線程和內核線程。

用戶線程是由用戶空間的線程庫(如pthread庫)實現(xiàn)的線程,也稱為輕量級線程。用戶線程的調度和管理由線程庫完成,內核對它們一無所知,因此創(chuàng)建、切換和銷毀用戶線程的開銷很小,但是由于不能直接調用系統(tǒng)調用,當用戶線程被阻塞時,整個進程就會被阻塞,因此用戶線程通常用于不需要頻繁阻塞的場合。

內核線程是由操作系統(tǒng)內核實現(xiàn)的線程,也稱為重量級線程。內核線程的調度和管理由操作系統(tǒng)完成,可以直接調用系統(tǒng)調用,因此可以處理更加復雜的任務。內核線程的創(chuàng)建、切換和銷毀開銷較大,但是由于可以使用多核,可以提高系統(tǒng)的并發(fā)度和吞吐量。

在實際應用中,用戶線程和內核線程的使用是根據(jù)具體的情況而定,需要根據(jù)應用的特點進行權衡。

10、什么是臨界區(qū)?怎么解決沖突?

臨界區(qū)是指一段代碼區(qū)域,在并發(fā)情況下被多個線程訪問時,會導致共享數(shù)據(jù)出現(xiàn)沖突的區(qū)域。為了避免并發(fā)訪問帶來的問題,需要采用同步機制來對臨界區(qū)進行保護。

解決臨界區(qū)問題的常用方式有以下幾種:

  • 互斥鎖:利用互斥鎖來保護臨界區(qū)。在進入臨界區(qū)之前,線程必須先獲得互斥鎖的鎖,進入臨界區(qū)后執(zhí)行代碼操作,然后釋放鎖。只有獲得鎖的線程才能進入臨界區(qū)執(zhí)行操作。
  • 讀寫鎖:在多讀少寫的場景中,采用讀寫鎖可以提高并發(fā)效率。讀寫鎖允許多個線程同時讀取共享數(shù)據(jù),但只允許一個線程寫入共享數(shù)據(jù)。在寫入共享數(shù)據(jù)之前,線程必須獲得寫鎖,進入臨界區(qū)后執(zhí)行代碼操作,然后釋放鎖。在讀取共享數(shù)據(jù)之前,線程必須獲得讀鎖,讀取完成后釋放鎖。
  • 條件變量:條件變量是一種線程間的通信機制,用于協(xié)調線程的執(zhí)行。它的使用需要和互斥鎖配合。當一個線程進入臨界區(qū)后,發(fā)現(xiàn)條件不滿足時,會進入等待狀態(tài)。此時,它會釋放互斥鎖并進入等待狀態(tài),等待條件變量被其它線程滿足。當其它線程滿足條件變量后,會通過喚醒等待線程的方式來使其從等待狀態(tài)返回。
  • 原子操作:原子操作是指不能被中斷的操作,可以保證在并發(fā)情況下的數(shù)據(jù)一致性。在需要修改共享數(shù)據(jù)的場景中,可以使用原子操作來保護臨界區(qū)。原子操作的執(zhí)行過程中不會被其它線程中斷,保證了線程安全。

11、什么是死鎖?死鎖產生的條件?

死鎖(Deadlock)指的是在多個進程(線程)中,每個進程(線程)由于等待其他進程(線程)釋放資源而被阻塞,進而導致整個進程(線程)系統(tǒng)無法前進的一種狀態(tài)。

死鎖產生的條件通常有以下四個必要條件:

  • 互斥條件(Mutual exclusion):一個資源每次只能被一個進程(線程)使用,即在一段時間內只有一個進程(線程)能訪問該資源。
  • 請求與保持條件(Hold and wait):一個進程(線程)因請求資源而阻塞時,持有已獲得的資源不放。
  • 不剝奪條件(No preemption):一個進程(線程)已經獲得的資源,在未使用完之前,不能被剝奪,只能在使用完后自己釋放。
  • 環(huán)路等待條件(Circular wait):若干進程(線程)之間形成一種頭尾相接的循環(huán)等待資源關系。

解決死鎖的方法有以下幾種:

  • 預防死鎖:通過破壞死鎖產生的四個必要條件之一,來避免死鎖的產生。
  • 避免死鎖:通過動態(tài)地分配資源來避免死鎖的產生,需要預知每個進程對資源的最大需求量和系統(tǒng)可用資源數(shù)。
  • 檢測死鎖:通過檢測系統(tǒng)中是否存在死鎖,以及哪些進程或線程陷入了死鎖狀態(tài),然后采取相應的措施來解除死鎖。
  • 解除死鎖:通過剝奪進程或線程的某些資源來解除死鎖,以恢復進程或線程的正常執(zhí)行。

12、進程調度策略有哪幾種?

在操作系統(tǒng)中,進程調度是指操作系統(tǒng)通過一定的調度策略來選擇下一個需要執(zhí)行的進程。下面是常見的進程調度策略:

  • 先來先服務調度(First-Come, First-Served,F(xiàn)CFS):按照進程到達的先后順序進行調度,先到先服務,無法解決短作業(yè)等待時間長的問題。
  • 短作業(yè)優(yōu)先調度(Shortest-Job-First,SJF):按照進程需要執(zhí)行的時間長短進行排序,優(yōu)先選擇執(zhí)行時間最短的進程,可以減少平均等待時間,但是需要預知每個進程的執(zhí)行時間。
  • 優(yōu)先級調度(Priority Scheduling):按照進程的優(yōu)先級進行調度,高優(yōu)先級進程先執(zhí)行,可以根據(jù)進程的重要程度進行調度,但是可能會導致低優(yōu)先級進程長時間等待。
  • 時間片輪轉調度(Round-Robin,RR):每個進程被分配一個時間片,當時間片用完時,操作系統(tǒng)會調度下一個進程,并把當前進程加入到隊列的末尾,可以保證公平性,但是當時間片過長或過短時,可能會影響進程的響應時間和吞吐量。
  • 多級反饋隊列調度(Multilevel Feedback Queue,MLFQ):將進程隊列分成多個級別,每個級別都有不同的優(yōu)先級和時間片大小,根據(jù)進程的運行情況動態(tài)調整進程的優(yōu)先級和時間片大小,可以兼顧短進程和長進程的執(zhí)行,但是需要復雜的算法參數(shù)調整。

13、什么是緩沖區(qū)溢出?有什么危害?原因是什么?

緩沖區(qū)溢出(Buffer Overflow)是指程序嘗試將數(shù)據(jù)寫入超出預先分配的緩沖區(qū)的范圍之外,導致數(shù)據(jù)覆蓋了相鄰的內存空間,可能會導致程序崩潰、數(shù)據(jù)損壞、系統(tǒng)崩潰、安全漏洞等問題。

緩沖區(qū)溢出通常是由于編程錯誤、缺陷或惡意攻擊者利用程序漏洞而引起的。程序在處理輸入數(shù)據(jù)時,如果沒有對輸入進行充分的檢查和驗證,就容易發(fā)生緩沖區(qū)溢出漏洞。攻擊者可以通過利用這種漏洞,將有害代碼注入程序,執(zhí)行惡意操作,例如竊取敏感信息、執(zhí)行未授權的操作或者引起拒絕服務攻擊等。

緩沖區(qū)溢出是計算機系統(tǒng)中最常見的安全漏洞之一,因此在軟件開發(fā)過程中,應該采取預防措施,例如輸入驗證、使用安全的編程語言和庫、限制輸入大小、使用防御性編程技術等,以減少緩沖區(qū)溢出的發(fā)生。同時,定期進行安全評估和測試,發(fā)現(xiàn)和修復漏洞,也是保障系統(tǒng)安全的重要措施。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19118

    瀏覽量

    228867
  • 服務器
    +關注

    關注

    12

    文章

    8979

    瀏覽量

    85100
  • 操作系統(tǒng)

    關注

    37

    文章

    6698

    瀏覽量

    123147
  • 并發(fā)
    +關注

    關注

    0

    文章

    7

    瀏覽量

    2475
收藏 人收藏

    評論

    相關推薦

    常見的嵌入式C語言面試題

    數(shù)組是最基本的數(shù)據(jù)結構,關于數(shù)組的面試題也屢見不鮮,本文羅列了一些常見的面試題,僅供參考。目前有以下18道題目。
    發(fā)表于 07-18 10:46 ?801次閱讀

    java基礎練習、面試題

    java基礎練習、面試題整理了java私塾教材的課后作業(yè),基礎部分,面試中也常常遇到的基礎問題,趕緊下載了。下載: [hide][/hide]
    發(fā)表于 07-16 14:02

    java經典面試題深度解析

    免費視頻教程:java經典面試題深度解析對于很多初學者來說,學好java在后期面試的階段都沒什么經驗,為了讓大家更好的了解面試相關知識,今天在這里給大家分享了一個java經典
    發(fā)表于 06-20 15:16

    c語言面試題,c++面試題下載

    c語言面試題,c++面試題1. static有什么用途?(請至少說明兩種) 1) 限制變量的作用域 2) 設置變量的存儲域 2. 引用與指針有什么區(qū)別?  1) 引用必須被初
    發(fā)表于 10-22 11:19 ?5次下載

    c語言面試題

    c語言面試題集(單片機)C language problem(20151125084232)
    發(fā)表于 12-18 14:05 ?9次下載

    c語言面試題

    c語言面試題
    發(fā)表于 11-05 16:48 ?0次下載

    C語言經典面試題

    面試題
    發(fā)表于 12-20 22:41 ?0次下載

    C語言經典面試題

    C語言 經典面試題
    發(fā)表于 01-05 11:27 ?0次下載

    經典硬件面試題精選及解答

    經典硬件面試題精選及解答
    發(fā)表于 11-29 18:02 ?1次下載

    廣西電網(wǎng)招聘面試題目講解

    廣西電網(wǎng)的相關資料,廣西電網(wǎng)招聘面試題目講解。
    發(fā)表于 12-19 15:31 ?2次下載

    Java的經典面試題和答案詳細說明

    發(fā)現(xiàn)網(wǎng)上很多Java面試題都沒有答案,所以花了很長時間搜集整理出來了這套Java面試題大全,希望對大家有幫助哈~ 博主已將以下這些面試題整理成了一個Java面試手冊,題型非常全面附帶答
    發(fā)表于 09-07 08:00 ?0次下載
    Java的經典<b class='flag-5'>面試題</b>和答案詳細說明

    常見的MySQL高頻面試題

    在各類技術崗位面試中,似乎 MySQL 相關問題經常被問到。無論你面試開發(fā)崗位或運維崗位,總會問幾道數(shù)據(jù)庫問題。經常有小伙伴私信我,詢問如何應對 MySQL 面試題。其實很多
    的頭像 發(fā)表于 02-08 16:05 ?2350次閱讀

    操作系統(tǒng)的四十多道題面試題

    ? 我之前匯總了一下關于操作系統(tǒng)面試題,最近又重新翻閱了一下發(fā)現(xiàn)不是很全,現(xiàn)在也到了面試季了,所以我又花了一周的時間修訂整理了一下這份面試題,這份
    的頭像 發(fā)表于 03-10 10:17 ?3173次閱讀
    <b class='flag-5'>操作系統(tǒng)</b>的四十多道題<b class='flag-5'>面試題</b>

    關于數(shù)組常見的面試題

    數(shù)組是最基本的數(shù)據(jù)結構,關于數(shù)組的面試題也屢見不鮮,本文羅列了一些常見的面試題,僅供參考。目前有以下18道題目。
    的頭像 發(fā)表于 08-17 09:25 ?1609次閱讀

    操作系統(tǒng)方面的相關面試題總結(中)

    內存保護:操作系統(tǒng)需要保護應用程序不受其他程序或操作系統(tǒng)本身的干擾。內存保護機制包括權限管理、虛擬內存等。 * 內存映射:內存映射是將文件映射到內存空間的一種技術,使得應用程序可以直接訪問文件的內容,而不需要通過文件 I/O 操作
    的頭像 發(fā)表于 04-06 15:14 ?635次閱讀