面試總結------操作系統

1. 操作系統特點

  • 併發性、共享性、虛擬性、不確定性。

2.  什麼是進程

  1. 進程是指在系統中正在運行的一個應用程序程序一旦運行就是進程;
  2. 進程可以認爲是程序執行的一個實例,進程是系統進行資源分配的最小單位,且每個進程擁有獨立的地址空間
  3. 一個進程無法直接訪問另一個進程的變量和數據結構,如果希望一個進程去訪問另一個進程的資源,需要使用進程間的通信,比如:管道、消息隊列等
  4. 線程是進程的一個實體,是進程的一條執行路徑;比進程更小的獨立運行的基本單位,線程也被稱爲輕量級進程,一個程序至少有一個進程,一個進程至少有一個線程;

3.  進程

  1. 進程是程序的一次執行,該程序可以與其他程序併發執行;

  2. 進程有運行、阻塞、就緒三個基本狀態;

  3. 進程調度算法:先來先服務調度算法、短作業優先調度算法、非搶佔式優先級調度算法、搶佔式優先級調度算法、高響應比優先調度算法、時間片輪轉法調度算法;

4. 進程與線程的區別

  1. 同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間;
  2. 同一進程內的線程共享本進程的資源,但是進程之間的資源是獨立的;
  3. 一個進程崩潰後,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程崩潰,所以多進程比多線程健壯
  4. 進程切換,消耗的資源大。所以涉及到頻繁的切換,使用線程要好於進程;
  5. 兩者均可併發執行;
  6. 每個獨立的進程有一個程序的入口、程序出口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。

5.  進程狀態轉換圖

  1. 新狀態:進程已經創建
  2. 就緒態:進程做好了準備,準備執行,等待分配處理機
  3. 執行態:該進程正在執行;
  4. 阻塞態:等待某事件發生才能執行,如等待I/O完成;
  5. 終止狀態

6. 進程的創建過程?需要哪些函數?需要哪些數據結構?

  1. ​​​​​​​
  2. fork函數創造的子進程是父進程的完整副本,複製了父親進程的資源,包括內存的內容task_struct內容;
  3. vfork創建的子進程與父進程共享數據段,而且由vfork創建的子進程將先於父進程運行;
  4. linux上創建線程一般使用的是pthread庫,實際上linux也給我們提供了創建線程的系統調用,就是clone;

7. ​​​​​​​子進程和父進程怎麼通信?

  1. 在Linux系統中實現父子進程的通信可以採用pipe()和fork()函數進行實現;
  2. 對於父子進程,在程序運行時首先進入的是父進程,其次是子進程,在此我個人認爲,在創建父子進程的時候程序是先運行創建的程序,其次在複製父進程創建子進程。fork()函數主要是以父進程爲藍本複製一個進程,其ID號和父進程的ID號不同。對於結果fork出來的子進程的父進程ID是執行fork()函數的進程的ID號。
  3. 管道:是指用於連接一個讀進程和一個寫進程,以實現它們之間通信的共享文件,又稱pipe文件。
  4. 寫進程在管道的尾端寫入數據,讀進程在管道的首端讀出數據。

8. ​​​​​​​ 進程和作業的區別?

  1. 進程是程序的一次動態執行,屬於動態概念;
  2. 一個進程可以執行一個或幾個程序,同一個程序可由幾個進程執行
  3. 程序可以作爲一種軟件資源長期保留,而進程是程序的一次執行
  4. 進程具有併發性,能與其他進程併發執行;
  5. 進程是一個獨立的運行單位

9. ​​​​​​​死鎖是什麼?必要條件?如何解決?

  • 所謂死鎖,是指多個進程循環等待它方佔有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那麼死鎖涉及到的各個進程都將永遠處於封鎖狀態。當兩個或兩個以上的進程同時對多個互斥資源提出使用要求時,有可能導致死鎖。
  1. 互斥條件。即某個資源在一段時間內只能由一個進程佔有,不能同時被兩個或兩個以上的進程佔有。這種獨佔資源如CD-ROM驅動器,打印機等等,必須在佔有該資源的進程主動釋放它之後,其它進程才能佔有該資源。這是由資源本身的屬性所決定的。如獨木橋就是一種獨佔資源,兩方的人不能同時過橋。
  2. 不可搶佔條件。進程所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取資源,而只能由該資源的佔有者進程自行釋放。如過獨木橋的人不能強迫對方後退,也不能非法地將對方推下橋,必須是橋上的人自己過橋後空出橋面(即主動釋放佔有資源),對方的人才能過橋。
  3. 佔有且申請條件。進程至少已經佔有一個資源,但又申請新的資源;由於該資源已被另外進程佔有,此時該進程阻塞;但是,它在等待新資源之時,仍繼續佔用已佔有的資源。還以過獨木橋爲例,甲乙兩人在橋上相遇。甲走過一段橋面(即佔有了一些資源),還需要走其餘的橋面(申請新的資源),但那部分橋面被乙佔有(乙走過一段橋面)。甲過不去,前進不能,又不後退;乙也處於同樣的狀況。
  4. 循環等待條件。存在一個進程等待序列{P1,P2,...,Pn},其中P1等待P2所佔有的某一資源,P2等待P3所佔有的某一源,......,而Pn等待P1所佔有的的某一資源,形成一個進程循環等待環。就像前面的過獨木橋問題,甲等待乙佔有的橋面,而乙又等待甲佔有的橋面,從而彼此循環等待。
  • 死鎖的預防是保證系統不進入死鎖狀態的一種策略。它的基本思想是要求進程申請資源時遵循某種協議,從而打破產生死鎖的四個必要條件中的一個或幾個,保證系統不會進入死鎖狀態。
  1. 打破互斥條件。即允許進程同時訪問某些資源。但是,有的資源是不允許被同時訪問的,像打印機等等,這是由資源本身的屬性所決定的。所以,這種辦法並無實用價值。

  2. 打破不可搶佔條件。即允許進程強行從佔有者那裏奪取某些資源。就是說,當一個進程已佔有了某些資源,它又申請新的資源,但不能立即被滿足時,它必須釋放所佔有的全部資源,以後再重新申請。它所釋放的資源可以分配給其它進程。這就相當於該進程佔有的資源被隱蔽地強佔了。這種預防死鎖的方法實現起來困難,會降低系統性能。    

  3. 打破佔有且申請條件。可以實行資源預先分配策略。即進程在運行前一次性地向系統申請它所需要的全部資源。如果某個進程所需的全部資源得不到滿足,則不分配任何資源,此進程暫不運行。只有當系統能夠滿足當前進程的全部資源需求時,才一次性地將所申請的資源全部分配給該進程。由於運行的進程已佔有了它所需的全部資源,所以不會發生佔有資源又申請資源的現象,因此不會發生死鎖。

  4. 打破循環等待條件,實行資源有序分配策略。採用這種策略,即把資源事先分類編號,按號分配,使進程在申請,佔用資源時不會形成環路。所有進程對資源的請求必須嚴格按資源序號遞增的順序提出。進程佔用了小號資源,才能申請大號資源,就不會產生環路,從而預防了死鎖。

  • 死鎖避免:銀行家算法

10. 鴕鳥策略

  • ​​​​​​​假設的前提是,這樣的問題出現的概率很低。比如,在操作系統中,爲應對死鎖問題,可以採用這樣的一種辦法。當系統發生死鎖不會對用戶造成多大影響,或系統很少發生死鎖的場合採用允許死鎖發生的鴕鳥算法,這樣一來可能開銷比不允許發生死鎖及檢測和解除死鎖的小。如果死鎖很長時間才發生一次,而系統每週都會因硬件故障、編譯器錯誤或操作系統錯誤而崩潰一次,那麼大多數工程師不會以性能損失或者易用性損失的代價來設計較爲複雜的死鎖解決策略,來消除死鎖。
  • 鴕鳥策略的實質:出現死鎖的概率很小,並且出現之後處理死鎖會花費很大的代價,還不如不做處理,OS中這種置之不理的策略稱之爲鴕鳥策略(也叫鴕鳥算法)。

11. ​​​​​​​銀行家算法

  1. 在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統性能。在該方法中把系統的狀態分爲安全狀態和不安全狀態,只要能使系統始終都處於安全狀態,便可以避免發生死鎖

  2. 銀行家算法的基本思想是分配資源之前,判斷系統是否是安全的;若是,才分配。它是最具有代表性的避免死鎖的算法。

12. ​​​​​​​ 進程間通信方式有幾種,他們之間的區別是什麼?

  1. 管道(pipe)

    管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關係的進程間使用。進程的親緣關係通常是指父子進程關係。

    有名管道 (namedpipe)

    有名管道也是半雙工的通信方式,但是它允許無親緣關係進程間的通信。

    信號量(semaphore)

    信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段。

    消息隊列(messagequeue)

    消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。

    信號 (sinal)

    信號是一種比較複雜的通信方式,用於通知接收進程某個事件已經發生。

    共享內存(shared memory)

    共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。

    套接字(socket)

    套接口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同設備及其間的進程通信。

13. ​​​​​​​頁和段的區別?

  1. 頁是信息的物理單位,分頁是由於系統管理的需要。段是信息的邏輯單位,分段是爲了滿足用戶的要求
  2. 頁的大小固定且由系統決定,段的長度不固定,決定於用戶所編寫的程序,通常由編譯程序在對源程序緊進行編譯時,根據信息的性質來劃分。
  3. 分頁的作業的地址空間是一維的,程序員只需要利用一個記憶符,即可表示一個地址。分段的作業地址空間則是二維的,程序員在標識一個地址時,既需要給出段名,又需要給出段的地址值

14. ​​​​​​​ 線程和進程的區別?線程共享的資源是什麼?

  1. 一個程序至少有一個進程,一個進程至少有一個線程
  2. 線程的劃分尺度小於進程,使得多線程程序的併發性高
  3. 進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率
  4. 每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制
  5. 多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。
  6. 一個進程中的所有線程共享該進程的地址空間,但它們有各自獨立的(/私有的)棧(stack),Windows線程的缺省堆棧大小爲1M。堆(heap)的分配與棧有所不同,一般是一個進程有一個C運行時堆,這個堆爲本進程中所有線程共享,windows進程還有所謂進程默認堆,用戶也可以創建自己的堆。
  • ​​​​​​​
  • 線程私有:線程棧,寄存器,程序寄存器
  • 共享:堆,地址空間,全局變量,靜態變量
  • 進程私有:地址空間,堆,全局變量,棧,寄存器
  • 共享:代碼段,公共數據,進程目錄,進程

15. 進程、線程、協程的區別

  1. 進程:進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。
  • 進程的概念主要有兩點:第一,進程是一個實體。每一個進程都有它自己的地址空間,一般情況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。
  • 第二,進程是一個“執行中的程序”。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操作系統執行之),它才能成爲一個活動的實體,我們稱其爲進程
  1. 線程:線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。線程間通信主要通過共享內存,上下文切換很快,資源開銷較少,但相比進程不夠穩定容易丟失數據。

  2. 協程是一種用戶態的輕量級線程,協程的調度完全由用戶控制。協程擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操作棧則基本沒有內核切換的開銷,可以不加鎖的訪問全局變量,所以上下文的切換非常快。

  • 進程、線程共同點

    它們都能提高程序的併發度,提高程序運行效率和響應時間。線程和進程在使用上各有優缺點。 線程執行開銷比較小,但不利於資源的管理和保護,而進程相反。同時,線程適合在SMP機器上運行,而進程可以跨機器遷移。

  • 進程、線程不同點

    多進程中每個進程有自己的地址空間,線程則共享地址空間。

    所有其他區別都是因爲這個區別產生的。比如說:

    1) 地址空間:線程是進程內的一個執行單元,進程內至少有一個線程,它們共享進程的地址空間,而進程有自己獨立的地址空間
    2) 資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
    3) 線程是處理器調度的基本單位,但進程不是
    4) 二者均可併發執行

    5) 每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口,但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制

    1. 速度。線程產生的速度快,通訊快,切換快,因爲他們處於同一地址空間。 
    2. 線程的資源利用率好。 
    3. 線程使用公共變量或者內存的時候需要同步機制,但進程不用。

    而他們通信方式的差異也仍然是由於這個根本原因造成的。

16. ​​​​​​​線程比進程具有哪些優勢?

  1. 線程在程序中是獨立的,併發的執行流,但是,進程中的線程之間的隔離程度要小
  2. 線程比進程更具有更高的性能,這是由於同一個進程中的線程都有共性:多個線程共享同一個進程虛擬空間;
  3. 當操作系統創建一個進程時,必須爲進程分配獨立的內存空間,並分配大量相關資源;

17. ​​​​​​​ 什麼時候用多進程?什麼時候用多線程?

  1. 需要頻繁創建銷燬的優先用線程;
  2. 需要進行大量計算的優先使用線程;
  3. 強相關的處理用線程,弱相關的處理用進程;
  4. 可能要擴展到多機分佈的用進程,多核分佈的用線程;

18. ​​​​​​​協程是什麼?

  1. 是一種比線程更加輕量級的存在。正如一個進程可以擁有多個線程一樣,一個線程可以擁有多個協程;協程不是被操作系統內核管理,而完全是由程序所控制
  2. 協程的開銷遠遠小於線程;
  3. 協程擁有自己寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切換回來的時候,恢復先前保存的寄存器上下文和棧。
  4. 每個協程表示一個執行單元,有自己的本地數據,與其他協程共享全局數據和其他資源。
  5. 跨平臺、跨體系架構、無需線程上下文切換的開銷、方便切換控制流,簡化編程模型;
  6. 協程又稱爲微線程,協程的完成主要靠yeild關鍵字,協程執行過程中,在子程序內部可中斷,然後轉而執行別的子程序,在適當的時候再返回來接着執行;
  7. 協程極高的執行效率,和多線程相比,線程數量越多,協程的性能優勢就越明顯;
  8. 不需要多線程的鎖機制;

19. ​​​​​​​用戶態到內核態的轉化原理?

  • 系統調用

  1. 這是用戶進程主動要求切換到內核態的一種方式,用戶進程通過系統調用申請操作系

  2. 統提供的服務程序完成工作。而系統調用的機制其核心還是使用了操作系統爲用戶特

  3. 別開放的一箇中斷來實現,例如Linux的ine 80h中斷。

  • 異常

     當CPU在執行運行在用戶態的程序時,發現了某些事件不可知的異常,這是會觸發由
     當前運行進程切換到處理此。異常的內核相關程序中,也就到了內核態,比如缺頁異常。

 

  • 外圍設備的中斷

     當外圍設備完成用戶請求的操作之後,會向CPU發出相應的中斷信號,這時CPU會暫
     停執行下一條將要執行的指令,轉而去執行中斷信號的處理程序,如果先執行的指令
     是用戶態下的程序,那麼這個轉換的過程自然也就發生了有用戶態到內核態的切換。
     比如硬盤讀寫操作完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操作等。

2)切換操作

    從出發方式看,可以在認爲存在前述3種不同的類型,但是從最終實際完成由用戶態到
    內核態的切換操作上來說,涉及的關鍵步驟是完全一樣的,沒有任何區別,都相當於執
    行了一箇中斷響應的過程,因爲系統調用實際上最終是中斷機制實現的,而異常和中斷
    處理機制基本上是一樣的,用戶態切換到內核態的步驟主要包括:

   1、從當前進程的描述符中提取其內核棧的ss0及esp0信息。

   2、使用ss0和esp0指向的內核棧將當前進程的cs,eip,eflags,ss,esp信息保存起來,
         這個過程也完成了由用戶棧找到內核棧的切換過程,同時保存了被暫停執行的程序的
        下一條指令。

   3、將先前由中斷向量檢索得到的中斷處理程序的cs,eip信息裝入相應的寄存器,開
         始執行中斷處理程序,這時就轉到了內核態的程序執行了。

20. ​​​​​​​系統中斷是什麼,用戶態和內核態的區別

  1. 內核態與用戶態是操作系統的兩種運行級別,當程序運行在3級特權級上時,就可以稱之爲運行在用戶態,因爲這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;反之,當程序運行在0級特權級上時,就可以稱之爲運行在內核態。運行在用戶態下的程序不能直接訪問操作系統內核數據結構和程序。當我們在系統中執行一個程序時,大部分時間是運行在用戶態下的,在其需要操作系統幫助完成某些它沒有權力和能力完成的工作時就會切換到內核態。 
  2. 這兩種狀態的主要差別是: 處於用戶態執行時,進程所能訪問的內存空間對象受到限制,其所處於佔有的處理機是可被搶佔的 ; 而處於核心態執行中的進程,則能訪問所有的內存空間和對象,且所佔有的處理機是不允許被搶佔的。 

21. ​​​​​​​虛擬內存?使用虛擬內存的優點?什麼是虛擬地址空間?

  1. 虛擬內存,虛擬內存是一種內存管理技術,它會使程序自己認爲自己擁有一塊很大且連續的內存,然而,這個程序在內存中不是連續的,並且有些還會在磁盤上,在需要時進行數據交換;
  2. 優點:可以彌補物理內存大小的不足;一定程度的提高反應速度;減少對物理內存的讀取從而保護內存延長內存使用壽命;
  3. 缺點:佔用一定的物理硬盤空間;加大了對硬盤的讀寫;設置不得當會影響整機穩定性與速度。
  4. 虛擬地址空間是對於一個單一進程的概念,這個進程看到的將是地址從0000開始的整個內存空間。虛擬存儲器是一個抽象概念,它爲每一個進程提供了一個假象,好像每一個進程都在獨佔的使用主存。每個進程看到的存儲器都是一致的,稱爲虛擬地址空間。從最低的地址看起:程序代碼和數據,堆,共享庫,棧,內核虛擬存儲器。大多數計算機的字長都是32位,這就限制了虛擬地址空間爲4GB。

22. ​​​​​​​ 線程安全?如何實現?

  1. 如果你的代碼所在的進程有多個線程同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。
  2. 線程安全問題都是由全局變量靜態變量引起的。
  3. 若每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執行寫操作,一般都需要考慮線程同步,否則的話就可能影響線程安全。
  • 對於線程不安全的對象我們可以通過如下方法來實現線程安全:
  1. 加鎖 利用Synchronized或者ReenTrantLock來對不安全對象進行加鎖,來實現線程執行的串行化,從而保證多線程同時操作對象的安全性,一個是語法層面的互斥鎖,一個是API層面的互斥鎖.
  2. 非阻塞同步來實現線程安全。原理就是:通俗點講,就是先進性操作,如果沒有其他線程爭用共享數據,那操作就成功了;如果共享數據有爭用,產生衝突,那就再採取其他措施(最常見的措施就是不斷地重試,知道成功爲止)。這種方法需要硬件的支持,因爲我們需要操作和衝突檢測這兩個步驟具備原子性。通常這種指令包括CAS SC,FAI TAS等。
  3. 線程本地化,一種無同步的方案,就是利用Threadlocal來爲每一個線程創造一個共享變量的副本來(副本之間是無關的)避免幾個線程同時操作一個對象時發生線程安全問題。

23. ​​​​​​​linux文件系統

  • 層次分析
  1. 用戶層,日常使用的各種程序,需要的接口主要是文件的創建、刪除、讀、寫、關閉等;
  2. VFS層,文件相關的操作都有對應的System Call函數接口,接口調用VFS對應的函數;
  3. 文件系統層,用戶的操作通過VFS轉到各種文件系統。文件系統把文件讀寫命令轉化爲對磁盤LBA的操作,起了一個翻譯和磁盤管理的工作;
  4. 緩存層;
  5. 塊設備層,塊設備接口Block Device是用來訪問磁盤LBA的層級,讀寫命令組合之後插入到命令隊列,磁盤的驅動從隊列讀命令執行;
  6. 磁盤驅動層;
  7. 磁盤物理層;
  • 讀取文件過程
  1. 根據文件所在目錄的inode信息,找到目錄文件對應數據塊;
  2. 根據文件名從數據塊中找到對應的inode節點信息;
  3. 從文件inode節點信息中找到文件內容所在數據塊塊號;
  4. 讀取數據塊內容

24. ​​​​​​​常見的IO模型,五種?異步IO應用場景?有什麼缺點?

  1. 同步
  • 就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回也就是必須一件一件事做,等前一件做完了才能做下一件事。就是我調用一個功能,該功能沒有結束前,我死等結果。

  1. 異步
  • 當一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。就是我調用一個功能,不需要知道該功能結果,該功能有結果後通知我(回調通知)

  1. 阻塞
  • 阻塞調用是指調用結果返回之前當前線程會被掛起(線程進入非可執行狀態,在這個狀態下,cpu不會給線程分配時間片,即線程暫停運行)。函數只有在得到結果之後纔會返回。對於同步調用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回而已。 就是調用我(函數),我(函數)沒有接收完數據或者沒有得到結果之前,我不會返回。

 

​​​​​​​非阻塞指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。就是調用我(函數),我(函數)立即返回,通過select通知調用

25. ​​​Linux是如何避免內存碎片的

  1. 固定式分區分配中, 爲將一個用戶作業裝入內存, 內存分配程序從系統分區表中找出一個能滿足作業要求的空閒分區分配給作業, 由於一個作業的大小並不一定與分區大小相等, 因此, 分區中有一部分存儲空間浪費掉了. 由此可知, 固定式分區分配中存在內碎片.

  2. 可變式分區分配中, 爲把一個作業裝入內存, 應按照一定的分配算法從系統中找出一個能滿足作業需求的空閒分區分配給作業, 如果這個空閒分區的容量比作業申請的空間容量要大, 則將該分區一分爲二, 一部分分配給作業, 剩下的部分仍然留作系統的空閒分區。由此可知,可變式分區分配中存在外碎片.

  3. 夥伴系統

  4. 據可移動性組織頁避免內存碎片

26.  ​​​​​計一個線程池,內存池

  1. 爲什麼需要線程池

  • 大多數的網絡服務器,包括Web服務器都具有一個特點,就是單位時間內必須處理數目巨大的連接請求,但是處理時間卻是比較短的。在傳統的多線程服務器模型中是這樣實現的:一旦有個請求到達,就創建一個新的線程,由該線程執行任務,任務執行完畢之後,線程就退出。這就是”即時創建,即時銷燬的策略。儘管與創建進程相比,創建線程的時間已經大大的縮短,但是如果提交給線程的任務是執行時間較短,而且執行次數非常頻繁,那麼服務器就將處於一個不停的創建線程和銷燬線程的狀態。這筆開銷是不可忽略的,尤其是線程執行的時間非常非常短的情況。

  1. 線程池原理
  • 應用程序啓動之後,就馬上創建一定數量的線程,放入空閒的隊列中。這些線程都是處於阻塞狀態,這些線程只佔一點內存,不佔用CPU。當任務到來後,線程池將選擇一個空閒的線程,將任務傳入此線程中運行。當所有的線程都處在處理任務的時候,線程池將自動創建一定的數量的新線程,用於處理更多的任務。執行任務完成之後線程並不退出,而是繼續在線程池中等待下一次任務。當大部分線程處於阻塞狀態時,線程池將自動銷燬一部分的線程,回收系統資源。
  1. 線程池的作用
  • 需要大量線程來完成任務,且完成任務的時間比較短;對性能要求苛刻的應用;對性能要求苛刻的應用
  1. 內存池的原理
  • 在軟件開發中,有些對象使用非常頻繁,那麼我們可以預先在堆中實例化一些對象,我們把維護這些對象的結構叫“內存池”。在需要用的時候直接從內存池中拿,而不用從新實例化,在要銷燬的時候,不是直接free/delete,而是返還給內存池。把那些常用的對象存在內存池中,就不用頻繁的分配/回收內存,可以相對減少內存碎片,更重要的是實例化這樣的對象更快,回收也更快。當內存池中的對象不夠用的時候就擴容。
  1. 內存池的優缺點
  • 內存池對象不是線程安全的,在多線程編程中,創建一個對象時必須加鎖。​​​​​​​

 

 

 

​​​​​​​

 

 

 

 

 

 

 

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