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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

操作系统面试

發(fā)布時(shí)間:2023/12/31 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统面试 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 操作系統(tǒng)
    • 一 操作系統(tǒng)基礎(chǔ)
      • 1.1 什么是操作系統(tǒng)?
      • 1.2 系統(tǒng)調(diào)用
    • 二 進(jìn)程和線程
      • 2.1 進(jìn)程和線程的區(qū)別
      • 2.2 進(jìn)程有哪幾種狀態(tài)?
      • 2.3 進(jìn)程間的通信方式
      • 2.4 線程間的同步的方式
      • 2.5 進(jìn)程的調(diào)度算法
    • 頁(yè)面置換算法
    • fork子進(jìn)程發(fā)生什么
    • 僵尸進(jìn)程和孤兒進(jìn)程
      • 死鎖相關(guān)
    • 存儲(chǔ)器層次化結(jié)構(gòu)
      • 程序訪問(wèn)的局部性
      • 高速緩存Cache原理
      • Cache和內(nèi)存映射方式
        • 直接映射
        • 全相聯(lián)映射
        • 組相聯(lián)映射
      • Cache的替換算法
      • Cache的一致性問(wèn)題
        • 全寫(xiě)法
        • 回寫(xiě)法
      • 影響Cache的性能因素
      • 總結(jié)
      • 補(bǔ)充
        • 什么是用戶態(tài)和內(nèi)核態(tài)?
        • **進(jìn)程的PCB包含哪些信息**
          • 進(jìn)程控制塊PCB的作用:
          • 進(jìn)程控制塊中的信息:
    • 哪些時(shí)線程共享的,哪些是線程私有的

操作系統(tǒng)

一 操作系統(tǒng)基礎(chǔ)

1.1 什么是操作系統(tǒng)?

  • 操作系統(tǒng)(Operating System,簡(jiǎn)稱 OS)是管理計(jì)算機(jī)硬件與軟件資源的程序,是計(jì)算機(jī)的基石。
  • 操作系統(tǒng)本質(zhì)上是一個(gè)運(yùn)行在計(jì)算機(jī)上的軟件程序 ,用于管理計(jì)算機(jī)硬件和軟件資源。 舉例:運(yùn)行在你電腦上的所有應(yīng)用程序都通過(guò)操作系統(tǒng)來(lái)調(diào)用系統(tǒng)內(nèi)存以及磁盤(pán)等等硬件。
  • 操作系統(tǒng)存在屏蔽了硬件層的復(fù)雜性。 操作系統(tǒng)就像是硬件使用的負(fù)責(zé)人,統(tǒng)籌著各種相關(guān)事項(xiàng)。
  • 操作系統(tǒng)的內(nèi)核(Kernel)是操作系統(tǒng)的核心部分,它負(fù)責(zé)系統(tǒng)的內(nèi)存管理,硬件設(shè)備的管理,文件系統(tǒng)的管理以及應(yīng)用程序的管理。 內(nèi)核是連接應(yīng)用程序和硬件的橋梁,決定著系統(tǒng)的性能和穩(wěn)定性。
  • [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-trsvy1Ab-1658936354687)(C:\Users\18458\Desktop\Kernel_Layout.png)]

    1.2 系統(tǒng)調(diào)用

    首先根據(jù)進(jìn)程訪問(wèn)資源的特點(diǎn),可以把進(jìn)程在系統(tǒng)上的運(yùn)行分為兩個(gè)級(jí)別用戶態(tài)和系統(tǒng)態(tài):

  • 用戶態(tài)(user mode) : 用戶態(tài)運(yùn)行的進(jìn)程可以直接讀取用戶程序的數(shù)據(jù)。
  • 系統(tǒng)態(tài)(kernel mode):可以簡(jiǎn)單的理解系統(tǒng)態(tài)運(yùn)行的進(jìn)程或程序幾乎可以訪問(wèn)計(jì)算機(jī)的任何資源,不受限制。
  • 我們運(yùn)行的程序基本都是運(yùn)行在用戶態(tài),如果調(diào)用操作系統(tǒng)提供的系統(tǒng)態(tài)級(jí)別的子功能,那就需要系統(tǒng)調(diào)用了!

    也就是說(shuō)在運(yùn)行的用戶程序中,凡是與系統(tǒng)態(tài)級(jí)別的資源有關(guān)的操作(如文件管理、進(jìn)程控制、內(nèi)存管理等),都必須通過(guò)系統(tǒng)調(diào)用方式向操作系統(tǒng)提出服務(wù)請(qǐng)求,并由操作系統(tǒng)代為完成。

    這些系統(tǒng)調(diào)用按功能大致可分為如下幾類:

    • 設(shè)備管理。完成設(shè)備的請(qǐng)求或釋放,以及設(shè)備啟動(dòng)等功能。
    • 文件管理。完成文件的讀、寫(xiě)、創(chuàng)建及刪除等功能。
    • 進(jìn)程控制。完成進(jìn)程的創(chuàng)建、撤銷(xiāo)、阻塞及喚醒等功能。
    • 進(jìn)程通信。完成進(jìn)程之間的消息傳遞或信號(hào)傳遞等功能。
    • 內(nèi)存管理。完成內(nèi)存的分配、回收以及獲取作業(yè)占用內(nèi)存區(qū)大小及地址等功能。

    二 進(jìn)程和線程

    2.1 進(jìn)程和線程的區(qū)別

    從 JVM 的角度來(lái)說(shuō)一下線程和進(jìn)程之間的關(guān)系!一個(gè)進(jìn)程中可以有多個(gè)線程,多個(gè)線程共享進(jìn)程的和**方法區(qū) (JDK1.8 之后的元空間)*資源,但是每個(gè)線程有自己的*程序計(jì)數(shù)器、虛擬機(jī)棧本地方法棧

    總結(jié): 線程是進(jìn)程劃分成的更小的運(yùn)行單位,一個(gè)進(jìn)程在其執(zhí)行的過(guò)程中可以產(chǎn)生多個(gè)線程。線程和進(jìn)程最大的不同在于基本上各進(jìn)程是獨(dú)立的,而各線程則不一定,因?yàn)橥贿M(jìn)程中的線程極有可能會(huì)相互影響。線程執(zhí)行開(kāi)銷(xiāo)小,但不利于資源的管理和保護(hù);而進(jìn)程正相反。

    進(jìn)程

    • 程序由指令和數(shù)據(jù)組成,但這些指令要運(yùn)行,數(shù)據(jù)要讀寫(xiě),就必須將指令加載至 CPU,數(shù)據(jù)加載至內(nèi)存。在指令運(yùn)行過(guò)程中還需要用到磁盤(pán)、網(wǎng)絡(luò)等設(shè)備。進(jìn)程就是用來(lái)加載指令、管理內(nèi)存、管理 IO 的。
    • 當(dāng)一個(gè)程序被運(yùn)行,從磁盤(pán)加載這個(gè)程序的代碼至內(nèi)存,這時(shí)就開(kāi)啟了一個(gè)進(jìn)程。
    • 進(jìn)程就可以視為程序的一個(gè)實(shí)例。大部分程序可以同時(shí)運(yùn)行多個(gè)實(shí)例進(jìn)程(例如記事本、畫(huà)圖、瀏覽器 等),也有的程序只能啟動(dòng)一個(gè)實(shí)例進(jìn)程(例如網(wǎng)易云音樂(lè)、360 安全衛(wèi)士等)

    線程

    • 一個(gè)進(jìn)程之內(nèi)可以分為一到多個(gè)線程。
    • 一個(gè)線程就是一個(gè)指令流,將指令流中的一條條指令以一定的順序交給 CPU 執(zhí)行 。
    • Java 中,線程作為小調(diào)度單位,進(jìn)程作為資源分配的小單位。 在 windows 中進(jìn)程是不活動(dòng)的,只是作 為線程的容器

    二者對(duì)比

    • 進(jìn)程基本上相互獨(dú)立的,而線程存在于進(jìn)程內(nèi),是進(jìn)程的一個(gè)子集 進(jìn)程擁有共享的資源,如內(nèi)存空間等,供其內(nèi)部的線程共享
      • 進(jìn)程間通信較為復(fù)雜 同一臺(tái)計(jì)算機(jī)的進(jìn)程通信稱為 IPC(Inter-process communication)
      • 不同計(jì)算機(jī)之間的進(jìn)程通信,需要通過(guò)網(wǎng)絡(luò),并遵守共同的協(xié)議,例如 HTTP
    • 線程通信相對(duì)簡(jiǎn)單,因?yàn)樗鼈児蚕磉M(jìn)程內(nèi)的內(nèi)存,一個(gè)例子是多個(gè)線程可以訪問(wèn)同一個(gè)共享變量 線程更輕量,線程上下文切換成本一般上要比進(jìn)程上下文切換低

    進(jìn)程和線程的切換

    上下文切換

    內(nèi)核為每一個(gè)進(jìn)程維持一個(gè)上下文。**上下文就是內(nèi)核重新啟動(dòng)一個(gè)被搶占的進(jìn)程所需的狀態(tài)。**包括以下內(nèi)容:

    • 通用目的寄存器
    • 浮點(diǎn)寄存器
    • 程序計(jì)數(shù)器
    • 用戶棧
    • 狀態(tài)寄存器
    • 內(nèi)核棧
    • 各種內(nèi)核數(shù)據(jù)結(jié)構(gòu):比如描繪地址空間的頁(yè)表,包含有關(guān)當(dāng)前進(jìn)程信息的進(jìn)程表,以及包含進(jìn)程已打開(kāi)文件的信息的文件表

    進(jìn)程切換和線程切換的主要區(qū)別

    最主要的一個(gè)區(qū)別在于進(jìn)程切換涉及虛擬地址空間的切換而線程不會(huì)。因?yàn)槊總€(gè)進(jìn)程都有自己的虛擬地址空間,而線程是共享所在進(jìn)程的虛擬地址空間的,因此同一個(gè)進(jìn)程中的線程進(jìn)行線程切換時(shí)不涉及虛擬地址空間的轉(zhuǎn)換

    頁(yè)表查找是一個(gè)很慢的過(guò)程,因此通常使用cache來(lái)緩存常用的地址映射,這樣可以加速頁(yè)表查找,這個(gè)cache就是快表TLB(translation Lookaside Buffer,用來(lái)加速頁(yè)表查找)。由于每個(gè)進(jìn)程都有自己的虛擬地址空間,那么顯然每個(gè)進(jìn)程都有自己的頁(yè)表,那么當(dāng)進(jìn)程切換后頁(yè)表也要進(jìn)行切換,頁(yè)表切換后TLB就失效了,cache失效導(dǎo)致命中率降低,那么虛擬地址轉(zhuǎn)換為物理地址就會(huì)變慢,表現(xiàn)出來(lái)的就是程序運(yùn)行會(huì)變慢,而線程切換則不會(huì)導(dǎo)致TLB失效,因?yàn)榫€程線程無(wú)需切換地址空間,因此我們通常說(shuō)線程切換要比較進(jìn)程切換快

    而且還可能出現(xiàn)缺頁(yè)中斷,這就需要操作系統(tǒng)將需要的內(nèi)容調(diào)入內(nèi)存中,若內(nèi)存已滿則還需要將不用的內(nèi)容調(diào)出內(nèi)存,這也需要花費(fèi)時(shí)間

    為什么TLB能加快訪問(wèn)速度

    快表可以避免每次都對(duì)頁(yè)號(hào)進(jìn)行地址的有效性判斷??毂碇斜4媪藢?duì)應(yīng)的物理塊號(hào),可以直接計(jì)算出物理地址,無(wú)需再進(jìn)行有效性檢查

    2.2 進(jìn)程有哪幾種狀態(tài)?

    一般把進(jìn)程大致分為 5 種狀態(tài),和線程很像

    • 創(chuàng)建狀態(tài)(new) :進(jìn)程正在被創(chuàng)建,尚未到就緒狀態(tài)。
    • 就緒狀態(tài)(ready) :進(jìn)程已處于準(zhǔn)備運(yùn)行狀態(tài),即進(jìn)程獲得了除了處理器之外的一切所需資源,一旦得到處理器資源(處理器分配的時(shí)間片)即可運(yùn)行。
    • 運(yùn)行狀態(tài)(running) :進(jìn)程正在處理器上上運(yùn)行(單核 CPU 下任意時(shí)刻只有一個(gè)進(jìn)程處于運(yùn)行狀態(tài))。
    • 阻塞狀態(tài)(waiting) :又稱為等待狀態(tài),進(jìn)程正在等待某一事件而暫停運(yùn)行如等待某資源為可用或等待 IO 操作完成。即使處理器空閑,該進(jìn)程也不能運(yùn)行。
    • 結(jié)束狀態(tài)(terminated) :進(jìn)程正在從系統(tǒng)中消失??赡苁沁M(jìn)程正常結(jié)束或其他原因中斷退出運(yùn)行。

    [^訂正:下圖中 running 狀態(tài)被 interrupt 向 ready 狀態(tài)轉(zhuǎn)換的箭頭方向反了。]:

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-6ouDbsYw-1658936354688)(C:\Users\18458\Desktop\d38202593012b457debbcd74994c6292.png)]

    2.3 進(jìn)程間的通信方式

  • 管道(Pipes) :分為匿名管道和命名管道。對(duì)于匿名管道,它的通信范圍是存在父子關(guān)系的進(jìn)程。因?yàn)楣艿罌](méi)有實(shí)體,也就是沒(méi)有管道文件,只能通過(guò) fork 來(lái)復(fù)制父進(jìn)程 fd 文件描述符,來(lái)達(dá)到通信的目的。對(duì)于命名管道,它可以在不相關(guān)的進(jìn)程間也能相互通信。因?yàn)槊罟艿?#xff0c;提前創(chuàng)建了一個(gè)類型為管道的設(shè)備文件,在進(jìn)程里只要使用這個(gè)設(shè)備文件,就可以相互通信。不管是匿名管道還是命名管道,進(jìn)程寫(xiě)入的數(shù)據(jù)都是緩存在內(nèi)核中,另一個(gè)進(jìn)程讀取數(shù)據(jù)時(shí)候自然也是從內(nèi)核中獲取,同時(shí)通信數(shù)據(jù)都遵循先進(jìn)先出原則。

  • 消息隊(duì)列(Message Queuing) :管道的通信方式是效率低的,因此管道不適合進(jìn)程間頻繁地交換數(shù)據(jù)。對(duì)于這個(gè)問(wèn)題,消息隊(duì)列的通信模式就可以解決。比如,A 進(jìn)程要給 B 進(jìn)程發(fā)送消息,A 進(jìn)程把數(shù)據(jù)放在對(duì)應(yīng)的消息隊(duì)列后就可以正常返回了,B 進(jìn)程需要的時(shí)候再去讀取數(shù)據(jù)就可以了。同理,B 進(jìn)程要給 A 進(jìn)程發(fā)送消息也是如此。消息隊(duì)列是保存在內(nèi)核中的消息鏈表,如果進(jìn)程從消息隊(duì)列中讀取了消息體,內(nèi)核就會(huì)把這個(gè)消息體刪除。消息隊(duì)列生命周期隨內(nèi)核,如果沒(méi)有釋放消息隊(duì)列或者沒(méi)有關(guān)閉操作系統(tǒng),消息隊(duì)列會(huì)一直存在,而前面提到的匿名管道的生命周期,是隨進(jìn)程的創(chuàng)建而建立,隨進(jìn)程的結(jié)束而銷(xiāo)毀。但存在兩個(gè)不足:

  • 消息隊(duì)列不適合比較大數(shù)據(jù)的傳輸,因?yàn)樵趦?nèi)核中每個(gè)消息體都有一個(gè)最大長(zhǎng)度的限制,同時(shí)所有隊(duì)列所包含的全部消息體的總長(zhǎng)度也是有上限。
  • 消息隊(duì)列通信過(guò)程中,存在用戶態(tài)與內(nèi)核態(tài)之間的數(shù)據(jù)拷貝開(kāi)銷(xiāo),因?yàn)檫M(jìn)程寫(xiě)入數(shù)據(jù)到內(nèi)核中的消息隊(duì)列時(shí),會(huì)發(fā)生從用戶態(tài)拷貝數(shù)據(jù)到內(nèi)核態(tài)的過(guò)程,同理另一進(jìn)程讀取內(nèi)核中的消息數(shù)據(jù)時(shí),會(huì)發(fā)生從內(nèi)核態(tài)拷貝數(shù)據(jù)到用戶態(tài)的過(guò)程。
  • 共享內(nèi)存(Shared memory) :消息隊(duì)列的讀取和寫(xiě)入的過(guò)程,都會(huì)有發(fā)生用戶態(tài)與內(nèi)核態(tài)之間的消息拷貝過(guò)程。那共享內(nèi)存的方式,就很好的解決了這一問(wèn)題。

    現(xiàn)代操作系統(tǒng),對(duì)于內(nèi)存管理,采用的是虛擬內(nèi)存技術(shù),也就是每個(gè)進(jìn)程都有自己獨(dú)立的虛擬內(nèi)存空間,不同進(jìn)程的虛擬內(nèi)存映射到不同的物理內(nèi)存中。所以,即使進(jìn)程 A 和 進(jìn)程 B 的虛擬地址是一樣的,其實(shí)訪問(wèn)的是不同的物理內(nèi)存地址,對(duì)于數(shù)據(jù)的增刪查改互不影響。

    共享內(nèi)存的機(jī)制,就是拿出一塊虛擬地址空間來(lái),映射到相同的物理內(nèi)存中。這樣這個(gè)進(jìn)程寫(xiě)入的東西,另外一個(gè)進(jìn)程馬上就能看到了,都不需要拷貝來(lái)拷貝去,傳來(lái)傳去,大大提高了進(jìn)程間通信的速度。
    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-iFsCRSrv-1658936354689)(C:\Users\18458\Desktop\圖片\虛擬內(nèi)存.png)]

  • 信號(hào)量(Semaphores) :用了共享內(nèi)存通信方式,帶來(lái)新的問(wèn)題,那就是如果多個(gè)進(jìn)程同時(shí)修改同一個(gè)共享內(nèi)存,很有可能就沖突了。例如兩個(gè)進(jìn)程都同時(shí)寫(xiě)一個(gè)地址,那先寫(xiě)的那個(gè)進(jìn)程會(huì)發(fā)現(xiàn)內(nèi)容被別人覆蓋了。

    為了防止多進(jìn)程競(jìng)爭(zhēng)共享資源,而造成的數(shù)據(jù)錯(cuò)亂,所以需要保護(hù)機(jī)制,使得共享的資源,在任意時(shí)刻只能被一個(gè)進(jìn)程訪問(wèn)。正好,信號(hào)量就實(shí)現(xiàn)了這一保護(hù)機(jī)制。

    信號(hào)量其實(shí)是一個(gè)整型的計(jì)數(shù)器,主要用于實(shí)現(xiàn)進(jìn)程間的互斥與同步,而不是用于緩存進(jìn)程間通信的數(shù)據(jù)。

  • 信號(hào)(Signal) :信號(hào)是進(jìn)程間通信機(jī)制中唯一的異步通信機(jī)制,信號(hào)可以在應(yīng)用進(jìn)程和內(nèi)核之間直接交互,內(nèi)核也可以利用信號(hào)來(lái)通知用戶空間的進(jìn)程發(fā)生了哪些系統(tǒng)事件,信號(hào)事件的來(lái)源主要有硬件來(lái)源(如鍵盤(pán) Cltr+C ,Ctrl+C 產(chǎn)生 SIGINT 信號(hào),表示終止該進(jìn)程,Ctrl+Z 產(chǎn)生 SIGTSTP 信號(hào),表示停止該進(jìn)程,但還未結(jié)束;)和軟件來(lái)源(如 kill 命令,進(jìn)程發(fā)送 SIGKILL 信號(hào),用來(lái)立即結(jié)束該進(jìn)程)。**

  • 套接字(Sockets) : 前面提到的管道、消息隊(duì)列、共享內(nèi)存、信號(hào)量和信號(hào)都是在同一臺(tái)主機(jī)上進(jìn)行進(jìn)程間通信,那要想跨網(wǎng)絡(luò)與不同主機(jī)上的進(jìn)程之間通信,就需要 Socket 通信了,可根據(jù)創(chuàng)建 Socket 的類型不同,分為三種常見(jiàn)的通信方式,一個(gè)是基于 TCP 協(xié)議的通信方式,一個(gè)是基于 UDP 協(xié)議的通信方式,一個(gè)是本地進(jìn)程間通信方式。

  • 2.4 線程間的同步的方式

    線程同步是兩個(gè)或多個(gè)共享關(guān)鍵資源的線程的并發(fā)執(zhí)行。應(yīng)該同步線程以避免關(guān)鍵的資源使用沖突。操作系統(tǒng)一般有下面三種線程同步的方式:

  • 互斥量(Mutex):采用互斥對(duì)象機(jī)制,只有擁有互斥對(duì)象的線程才有訪問(wèn)公共資源的權(quán)限。因?yàn)榛コ鈱?duì)象只有一個(gè),所以可以保證公共資源不會(huì)被多個(gè)線程同時(shí)訪問(wèn)。比如 Java 中的 synchronized 關(guān)鍵詞和各種 Lock 都是這種機(jī)制。
  • 信號(hào)量(Semaphore) :它允許同一時(shí)刻多個(gè)線程訪問(wèn)同一資源,但是需要控制同一時(shí)刻訪問(wèn)此資源的最大線程數(shù)量。
  • 事件(Event) :Wait/Notify:通過(guò)通知操作的方式來(lái)保持多線程同步,還可以方便的實(shí)現(xiàn)多線程優(yōu)先級(jí)的比較操作。
  • 處理機(jī)
    處理機(jī)是計(jì)算機(jī)系統(tǒng)中存儲(chǔ)程序和數(shù)據(jù),并按照程序規(guī)定的步驟執(zhí)行指令的部件。程序是描述處理機(jī)完成某項(xiàng)任務(wù)的指令序列。指令則是處理機(jī)能直接解釋、執(zhí)行的信息單位。處理機(jī)包括中央處理器(cpu),主存儲(chǔ)器,輸入-輸出接口。處理機(jī)加接外圍設(shè)備就構(gòu)成完整的計(jì)算機(jī)系統(tǒng)

    cpu
    中央處理器(CPU,Central Processing Unit)是一塊超大規(guī)模的集成電路,是一臺(tái)計(jì)算機(jī)的運(yùn)算核心(Core)和控制核心( Control Unit)。它的功能主要是解釋計(jì)算機(jī)指令以及處理計(jì)算機(jī)軟件中的數(shù)據(jù)。

    處理機(jī)和cpu處理器的區(qū)別
    1、指代不同
    處理機(jī):是處理計(jì)算機(jī)系統(tǒng)中存儲(chǔ)程序和數(shù)據(jù),并按照程序規(guī)定的步驟執(zhí)行指令的部件。

    cpu處理器:作為計(jì)算機(jī)系統(tǒng)的運(yùn)算和控制核心,是信息處理、程序運(yùn)行的最終執(zhí)行單元。

    2、構(gòu)成不同
    處理機(jī):包括中央處理器,主存儲(chǔ)器,輸入-輸出接口,加接外圍設(shè)備就構(gòu)成完整的計(jì)算機(jī)系統(tǒng)。

    cpu處理器:主要包括兩個(gè)部分,即控制器、運(yùn)算器,其中還包括高速緩沖存儲(chǔ)器及實(shí)現(xiàn)它們之間聯(lián)系的數(shù)據(jù)、控制的總線。

    2.5 進(jìn)程的調(diào)度算法

    • 先到先服務(wù)(FCFS)調(diào)度算法 : 從就緒隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程為之分配資源,使它立即執(zhí)行并一直執(zhí)行到完成或發(fā)生某事件而被阻塞放棄占用 CPU 時(shí)再重新調(diào)度。
      • 優(yōu)先級(jí)調(diào)度 : 為每個(gè)流程分配優(yōu)先級(jí),首先執(zhí)行具有最高優(yōu)先級(jí)的進(jìn)程,依此類推。具有相同優(yōu)先級(jí)的進(jìn)程以 FCFS 方式執(zhí)行??梢愿鶕?jù)內(nèi)存要求,時(shí)間要求或任何其他資源要求來(lái)確定優(yōu)先級(jí)。
      • 時(shí)間片輪轉(zhuǎn)調(diào)度算法 : 時(shí)間片輪轉(zhuǎn)調(diào)度是一種最古老,最簡(jiǎn)單,最公平且使用最廣的算法,又稱 RR(Round robin)調(diào)度。每個(gè)進(jìn)程被分配一個(gè)時(shí)間段,稱作它的時(shí)間片,即該進(jìn)程允許運(yùn)行的時(shí)間。
    • 短進(jìn)程優(yōu)先(SJF)的調(diào)度算法 : 從就緒隊(duì)列中選出一個(gè)估計(jì)運(yùn)行時(shí)間最短的進(jìn)程為之分配資源,使它立即執(zhí)行并一直執(zhí)行到完成或發(fā)生某事件而被阻塞放棄占用 CPU 時(shí)再重新調(diào)度。
    • 最短剩余時(shí)間優(yōu)先調(diào)度算法:最短剩余時(shí)間優(yōu)先調(diào)度算法是將短進(jìn)程優(yōu)先調(diào)度算法用于分時(shí)環(huán)境的變形。其基本思想是,讓“運(yùn)行到任務(wù)完成時(shí)所需的運(yùn)行時(shí)間最短”的進(jìn)程優(yōu)先得到處理,包括新進(jìn)入系統(tǒng)的進(jìn)程。在最短進(jìn)程優(yōu)先調(diào)度算法中,一個(gè)進(jìn)程一旦得到處理機(jī),就一直運(yùn)行到任務(wù)完成(或等待事件)而不能被剝奪(除非主動(dòng)讓出處理機(jī))。而最短剩余時(shí)間優(yōu)先調(diào)度算法允許被一個(gè)新進(jìn)入系統(tǒng)的且其運(yùn)行時(shí)間短于當(dāng)前運(yùn)行進(jìn)程的剩余運(yùn)行時(shí)間的進(jìn)程所搶占。
      該算法的優(yōu)點(diǎn)是,可以用于分時(shí)系統(tǒng),保證及時(shí)響應(yīng)用戶要求。缺點(diǎn)是,系統(tǒng)開(kāi)銷(xiāo)增加。首先,要保存進(jìn)程的運(yùn)行情況記錄,以比較其剩余時(shí)間長(zhǎng)短:其次,剝奪本身也要消耗處理機(jī)時(shí)間。毫無(wú)疑問(wèn),這個(gè)算法使短進(jìn)程一進(jìn)入系統(tǒng)就能立即得到服務(wù),從而縮短進(jìn)程的平均等待時(shí)間。
      最高響應(yīng)比優(yōu)先調(diào)度算法:每個(gè)進(jìn)程都有一個(gè)動(dòng)態(tài)優(yōu)先數(shù),該優(yōu)先數(shù)不但是要求的服務(wù)時(shí)間的函數(shù),而且是該進(jìn)程得到服務(wù)所花費(fèi)的等待時(shí)間的函數(shù)。進(jìn)程的動(dòng)態(tài)優(yōu)先數(shù)計(jì)算公式如下:
      優(yōu)先數(shù)=(等待時(shí)間+要求的服務(wù)時(shí)間)/要求的服務(wù)時(shí)間
      要求的服務(wù)時(shí)間是分母,所以對(duì)短進(jìn)程是有利的,因?yàn)閰^(qū)的優(yōu)先數(shù)高,可優(yōu)先運(yùn)行。另外,因?yàn)榈却龝r(shí)間是分子,所以長(zhǎng)進(jìn)程由于其等待了較長(zhǎng)時(shí)間,從而提高了其優(yōu)先致,終于得到了處理機(jī)。進(jìn)程一旦得到處理機(jī),它就一直運(yùn)行到進(jìn)程完成任務(wù)(或因等待事件而主動(dòng)讓出處理機(jī)),中間不被搶占。
    • 多級(jí)反饋隊(duì)列調(diào)度算法 :前面介紹的幾種進(jìn)程調(diào)度的算法都有一定的局限性。如短進(jìn)程優(yōu)先的調(diào)度算法,僅照顧了短進(jìn)程而忽略了長(zhǎng)進(jìn)程 。多級(jí)反饋隊(duì)列調(diào)度算法既能使高優(yōu)先級(jí)的作業(yè)得到響應(yīng)又能使短作業(yè)(進(jìn)程)迅速完成。,因而它是目前被公認(rèn)的一種較好的進(jìn)程調(diào)度算法,UNIX 操作系統(tǒng)采取的便是這種調(diào)度算法。
    • 系統(tǒng)中有多個(gè)進(jìn)程就緒隊(duì)列,每個(gè)就緒隊(duì)列對(duì)應(yīng)一個(gè)調(diào)度級(jí)別。第1級(jí)隊(duì)列的優(yōu)先級(jí)最高,以下各級(jí)隊(duì)列的優(yōu)先級(jí)逐次降低。調(diào)度時(shí),選擇高優(yōu)先級(jí)隊(duì)列中的第1個(gè)就緒進(jìn)程。各級(jí)隊(duì)列中的進(jìn)程具有不同的時(shí)間片值。優(yōu)先級(jí)最高的第1級(jí)隊(duì)列中的進(jìn)程的時(shí)間片值最少;題看隊(duì)列級(jí)別的增高,其進(jìn)程的優(yōu)先級(jí)降低了,但時(shí)間片值卻增大了。通常,下放一級(jí),其時(shí)間片值增大1倍。各級(jí)隊(duì)列均按先來(lái)先服務(wù)原則排序。

    頁(yè)面置換算法

    1、最優(yōu)頁(yè)面置換算法;2、NRU最近未使用算法;3、FIFO先進(jìn)先出頁(yè)面置換算法;4、第二次機(jī)會(huì)頁(yè)面置換算法;5、時(shí)鐘頁(yè)面置換算法;6、LRU最近最少使用頁(yè)面置換算法;7、NFU最不經(jīng)常使用算法;8、老化算法;9、工作集頁(yè)面置換算法;10、工作集時(shí)鐘頁(yè)面置換算法

    fork子進(jìn)程發(fā)生什么

    先說(shuō)一下fork,fork會(huì)生成一個(gè)和當(dāng)前進(jìn)程相同的副本,稱為子進(jìn)程。fork之后,操作系統(tǒng)會(huì)copy當(dāng)前進(jìn)程的task_struct機(jī)構(gòu)體,除了id號(hào)不一樣之外,其余完全一樣。原進(jìn)程的所有資源都以適當(dāng)?shù)姆绞綇?fù)制到子進(jìn)程,因此該系統(tǒng)調(diào)用之后,原來(lái)的進(jìn)程就有了兩個(gè)獨(dú)立的實(shí)例。這兩個(gè)實(shí)例的聯(lián)系包括:同一組打開(kāi)文件、同樣的工作目錄、內(nèi)存中同樣的數(shù)據(jù)(兩個(gè)進(jìn)程各有一份副本)。
    其實(shí)主要就這三個(gè)區(qū)別:
    1.fork之后父子進(jìn)程將共享代碼文本段,但是各自擁有不同的棧段、數(shù)據(jù)段及堆段拷貝。子進(jìn)程的棧、數(shù)據(jù)從fork一瞬間開(kāi)始是對(duì)于父進(jìn)程的完全拷貝、每個(gè)進(jìn)程可以更改自己的數(shù)據(jù),而不要擔(dān)心相互影響!
    2.fork之后父子進(jìn)程同時(shí)開(kāi)始從fork點(diǎn)向下執(zhí)行代碼,具體fork之后CPU會(huì)調(diào)度到誰(shuí)?不一定!
    3.執(zhí)行fork之后,子進(jìn)程將拷貝父進(jìn)程的文件描述符副本,指向同一個(gè)文件句柄(包含了當(dāng)前文件讀寫(xiě)的偏移量等信息)。

    僵尸進(jìn)程和孤兒進(jìn)程

    孤兒進(jìn)程:一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng),并由init進(jìn)程對(duì)它們完成狀態(tài)收集工作。
    僵尸狀態(tài)是一個(gè)比較特殊的狀態(tài),當(dāng)進(jìn)程退出父進(jìn)程(使用wait()系統(tǒng)調(diào)用)沒(méi)有讀取到子進(jìn)程退出的返回代碼時(shí)就會(huì)產(chǎn)生僵尸進(jìn)程。僵尸進(jìn)程會(huì)在以終止?fàn)顟B(tài)保持在進(jìn)程表中,并且會(huì)一直等待父進(jìn)程讀取退出狀態(tài)代碼。
    僵尸進(jìn)程與孤兒進(jìn)程的區(qū)別:
    孤兒進(jìn)程是子進(jìn)程還在運(yùn)行,而父進(jìn)程掛了,子進(jìn)程被init進(jìn)程收養(yǎng)。僵尸進(jìn)程是父進(jìn)程還在運(yùn)行但是子進(jìn)程掛了,但是父進(jìn)程卻沒(méi)有使用wait來(lái)清理子進(jìn)程的進(jìn)程信息,導(dǎo)致子進(jìn)程雖然運(yùn)行實(shí)體已經(jīng)消失,但是仍然在內(nèi)核的進(jìn)程表中占據(jù)一條記錄,這樣長(zhǎng)期下去對(duì)于系統(tǒng)資源是一個(gè)浪費(fèi)。僵尸進(jìn)程將會(huì)導(dǎo)致資源浪費(fèi),而孤兒則不會(huì)

    死鎖相關(guān)

    存儲(chǔ)器層次化結(jié)構(gòu)

    存儲(chǔ)器有很多種類,我們常見(jiàn)的有內(nèi)存、磁盤(pán),還有平時(shí)看不到的集成在CPU內(nèi)部的寄存器、高速緩存等。

    正常來(lái)說(shuō),存儲(chǔ)器的容量和性能應(yīng)該伴隨著CPU的速度和性能提升而提升,以匹配CPU的數(shù)據(jù)處理。但隨著時(shí)間的推移,CPU和存儲(chǔ)器在性能上的發(fā)展差異越來(lái)越大,存儲(chǔ)器在性能增長(zhǎng)越來(lái)越跟不上CPU性能發(fā)展的需要。

    那怎么辦呢?

    為了縮小存儲(chǔ)器和CPU之間的性能差距,通常在計(jì)算機(jī)內(nèi)部采用層次化的存儲(chǔ)器體系結(jié)構(gòu),以此來(lái)發(fā)揮出存儲(chǔ)器的綜合性能。

    存儲(chǔ)器層次化結(jié)構(gòu)如下:

    最上層的是寄存器,存取時(shí)間極快,但容量小。其次是高速緩存,存取時(shí)間次之,容量比寄存器大一些。再往下就是我們常見(jiàn)的內(nèi)存、硬盤(pán),存取速度遞減,但容量越來(lái)越大。

    CPU在訪問(wèn)數(shù)據(jù)時(shí),數(shù)據(jù)一般在相鄰兩層之間復(fù)制傳送,且總是從慢速存儲(chǔ)器復(fù)制到快速存儲(chǔ)器,通過(guò)這種方式保證CPU的速度和存儲(chǔ)器的速度相匹配。

    程序訪問(wèn)的局部性

    最早期的計(jì)算機(jī),在執(zhí)行一段程序時(shí),都是把硬盤(pán)中的數(shù)據(jù)加載到內(nèi)存,然后CPU從內(nèi)存中取出代碼和數(shù)據(jù)執(zhí)行,在把計(jì)算結(jié)果寫(xiě)入內(nèi)存,最終輸出結(jié)果。

    其實(shí)這么干,本身沒(méi)有什么問(wèn)題,但后來(lái)程序運(yùn)行越來(lái)越多,就發(fā)現(xiàn)一個(gè)規(guī)律:內(nèi)存中某個(gè)地址被訪問(wèn)后,短時(shí)間內(nèi)還有可能繼續(xù)訪問(wèn)這塊地址。內(nèi)存中的某個(gè)地址被訪問(wèn)后,它相鄰的內(nèi)存單元被訪問(wèn)的概率也很大。

    人們發(fā)現(xiàn)的這種規(guī)律被稱為程序訪問(wèn)的局部性。

    程序訪問(wèn)的局部性包含2種:

    • 時(shí)間局部性:某個(gè)內(nèi)存單元在較短時(shí)間內(nèi)很可能被再次訪問(wèn)
    • 空間局部性:某個(gè)內(nèi)存單元被訪問(wèn)后相鄰的內(nèi)存單元較短時(shí)間內(nèi)很可能被訪問(wèn)

    出現(xiàn)這種情況的原因很簡(jiǎn)單,因?yàn)槌绦蚴侵噶詈蛿?shù)據(jù)組成的,指令在內(nèi)存中按順序存放且地址連續(xù),如果運(yùn)行一段循環(huán)程序或調(diào)用一個(gè)方法,又或者再程序中遍歷一個(gè)數(shù)組,都有可能符合上面提到的局部性原理。

    那既然在執(zhí)行程序時(shí),內(nèi)存的某些單元很可能會(huì)經(jīng)常的訪問(wèn)或?qū)懭?#xff0c;那可否在CPU和內(nèi)存之間,加一個(gè)緩存,CPU在訪問(wèn)數(shù)據(jù)時(shí),先看一下緩存中是否存在,如果有直接就讀取緩存中的數(shù)據(jù)即可。如果緩存中不存在,再?gòu)膬?nèi)存中讀取數(shù)據(jù)。

    事實(shí)證明利用這種方式,程序的運(yùn)行效率會(huì)提高90%以上,這個(gè)緩存也叫做高速緩存Cache。

    高速緩存Cache原理

    高速緩存Cache是非常小容量的存儲(chǔ)器,它集成在CPU芯片內(nèi)。為了便于CPU、高速緩存Cache、內(nèi)存之間的信息交換,內(nèi)存按塊劃分,高速緩存Cache按行或槽劃分。

    CPU對(duì)內(nèi)存、高速緩存Cache進(jìn)行數(shù)據(jù)訪問(wèn)的流程如圖:

    CPU先查詢Cache中是否有數(shù)據(jù),如果有,直接讀取即可。

    如果Cache中沒(méi)有,則從內(nèi)存中讀取數(shù)據(jù),同時(shí)把數(shù)據(jù)放入Cache中,然后把數(shù)據(jù)返回給CPU。

    整個(gè)流程其實(shí)很簡(jiǎn)單,但對(duì)于Cache和內(nèi)存信息的交換,需要考慮一些問(wèn)題:

    • 對(duì)于CPU讀取數(shù)據(jù),如果Cache中沒(méi)有數(shù)據(jù),從內(nèi)存中讀取數(shù)據(jù)后,如何分配到Cache中?
    • 如果Cache滿了,采用什么策略替換?
    • 對(duì)于CPU寫(xiě)入數(shù)據(jù),如何保證Cache和內(nèi)存數(shù)據(jù)的一致性?

    對(duì)于這3個(gè)問(wèn)題,下面依次來(lái)分析是如何解決的。

    Cache和內(nèi)存映射方式

    對(duì)于第一個(gè)問(wèn)題,Cache中沒(méi)有命中數(shù)據(jù)時(shí),內(nèi)存數(shù)據(jù)是如何分配到Cache中的。

    由于內(nèi)存的容量比Cache容量要大,兩者之間的容量不匹配,所以內(nèi)存數(shù)據(jù)填充到Cache中,就需要設(shè)計(jì)一種規(guī)則來(lái)保證Cache的利用率最大,保證CPU訪問(wèn)Cache的命中率最高。

    內(nèi)存到Cache的映射規(guī)則有3種方式:

    • 直接映射:每個(gè)內(nèi)存塊數(shù)據(jù)只映射到固定的緩存行中
    • 全相聯(lián)映射:每個(gè)內(nèi)存塊數(shù)據(jù)可以映射到任意緩存行中
    • 組相聯(lián)映射:每個(gè)內(nèi)存塊數(shù)據(jù)可以映射到固定組任意緩存行中

    下面我們分別來(lái)看這3種映射方式。

    直接映射

    訪問(wèn)內(nèi)存數(shù)據(jù)會(huì)給出一個(gè)內(nèi)存地址,首先把這個(gè)內(nèi)存地址,按位劃分為3個(gè)字段:標(biāo)記、Cache行號(hào)、塊內(nèi)地址,如圖:

    然后根據(jù)第2個(gè)字段的二進(jìn)制位進(jìn)行取模運(yùn)算,得到對(duì)應(yīng)的Cache行號(hào)。

    找到對(duì)應(yīng)的Cache號(hào)后,校驗(yàn)Cache的有效位,如果有效,再比較內(nèi)存第1個(gè)字段的標(biāo)記與Cache的標(biāo)記是否一致,如果一致,直接獲取Cache中的數(shù)據(jù)即可。

    如果有效位無(wú)效,或有效位有效但內(nèi)存第1個(gè)字段的標(biāo)記與Cache的標(biāo)記不一致,那么根據(jù)內(nèi)存地址去內(nèi)存獲取數(shù)據(jù),然后把對(duì)應(yīng)的Cache行有效位設(shè)置為有效,標(biāo)記設(shè)置為與內(nèi)存標(biāo)記一致,并在Cache中記錄內(nèi)存的數(shù)據(jù),以便下次獲取。

    具體映射關(guān)系如圖:

    可見(jiàn)Cache與內(nèi)存的映射可能是一對(duì)多的,即不同內(nèi)存塊可能映射到同一Cache行。

    這種映射方式比較簡(jiǎn)單粗暴,如果緩存不命中或內(nèi)存和Cache標(biāo)識(shí)不一致,就會(huì)替換Cache行中的數(shù)據(jù)。這就可能導(dǎo)致同一Cache行在短時(shí)間內(nèi)被頻繁替換,命中率不高。

    全相聯(lián)映射

    全相聯(lián)映射與直接映射方式不同的是,它把內(nèi)存分成2個(gè)字段:標(biāo)記、塊內(nèi)地址,沒(méi)有了Cache行號(hào)這個(gè)字段。

    在訪問(wèn)數(shù)據(jù)時(shí),直接根據(jù)內(nèi)存地址中的標(biāo)記,去直接遍歷對(duì)比每一個(gè)Cache行,直到找到一致的標(biāo)記的Cache行,然后訪問(wèn)Cache中的數(shù)據(jù)即可。

    如果遍歷完Cache行后,沒(méi)有找到一致的標(biāo)記,那么會(huì)從內(nèi)存中獲取數(shù)據(jù),然后找到空閑的Cache行,直接寫(xiě)入標(biāo)記和數(shù)據(jù)即可。

    也就是說(shuō),這種映射方式,就是哪里有空閑的Cache行,我就把內(nèi)存塊映射到這個(gè)Cache行中。在訪問(wèn)時(shí),依次遍歷Cache行,直到找到標(biāo)記一直的Cache行,然后讀取數(shù)據(jù)。

    這種方式雖然在空間利用率上保證最大化,但其缺點(diǎn)在于要在Cache中尋找符合標(biāo)識(shí)一致的行的時(shí)間要比直接映射的時(shí)間久,效率較低。

    那有什么方式能集合上面2種方式,發(fā)揮各自的優(yōu)勢(shì)呢?這就是下面要說(shuō)的組相聯(lián)映射方式。

    組相聯(lián)映射

    組相聯(lián)映射方式把內(nèi)存也分為3個(gè)字段:標(biāo)記、Cache組號(hào)、塊內(nèi)地址

    注意,與直接映射不同的是,第2個(gè)字段是組號(hào)而不是行號(hào)。這種方式把Cache行先進(jìn)行分組,然后每個(gè)分組中包含多個(gè)Cache行,如圖:

    在訪問(wèn)數(shù)據(jù)時(shí),先根據(jù)內(nèi)存地址中的Cache組號(hào),定位到Cache的分組,然后在這個(gè)組內(nèi),依次遍歷每個(gè)行,尋找標(biāo)記一致的Cache行,如果標(biāo)記一致則獲取數(shù)據(jù),不一致則從內(nèi)存中獲取數(shù)據(jù)后寫(xiě)入當(dāng)前組內(nèi)空閑的任意一個(gè)Cache行中。

    這種方式兼顧了訪問(wèn)速度和空間利用率,使用前2種方式結(jié)合的方案,保證緩存命中率最大化。在現(xiàn)實(shí)中實(shí)際上采用的這種映射方式。

    Cache的替換算法

    對(duì)于上面提的第2個(gè)問(wèn)題,如果Cache滿了,如何進(jìn)行替換?

    Cache容量比內(nèi)存小,所以內(nèi)存數(shù)據(jù)映射到Cache時(shí),必然會(huì)導(dǎo)致Cache滿的情況,那之后的內(nèi)存映射要替Cache中的哪些行呢?這就需要制定一種策略。

    常見(jiàn)的替換算法有如下幾種:

    • 先進(jìn)先出算法(FIFO):總是把最早裝入Cache的行替換掉,這種算法實(shí)現(xiàn)簡(jiǎn)單,但不能正確反映程序的訪問(wèn)局部性,命中率不高
    • 最近最少使用算法(LRU):總是選擇最近最少使用的Cache行替換,這種這種算法稍微復(fù)雜一些,但可以正確反映程序訪問(wèn)的局部性,命中率最高
    • 最不經(jīng)常使用算法(LFU):總是替換掉Cache中引用次數(shù)最少的行,與LRU類似,但沒(méi)有LRU替換方式更精準(zhǔn)
    • 隨機(jī)替換算法(Random):隨機(jī)替換掉Cache中的行,與使用情況無(wú)關(guān),命中率不高

    現(xiàn)實(shí)使用最多的是最近最少使用算法(LRU)進(jìn)行Cache行的替換方案,這種方案使得緩存的命中率最高。

    Cache的一致性問(wèn)題

    上面提的第3個(gè)問(wèn)題,對(duì)于寫(xiě)入的數(shù)據(jù),如何保證Cache和內(nèi)存數(shù)據(jù)的一致性?

    試想,如果CPU想要修改某個(gè)內(nèi)存的數(shù)據(jù),這塊內(nèi)存的數(shù)據(jù)剛好在Cache中存在,那么是不是要同時(shí)更新Cache中的數(shù)據(jù)?

    這個(gè)寫(xiě)入數(shù)據(jù)的過(guò)程,通常采用2種方式:

    • 全寫(xiě)法(通寫(xiě)法/直寫(xiě)法/寫(xiě)直達(dá)法)
    • 回寫(xiě)法(寫(xiě)回法)

    全寫(xiě)法

    在寫(xiě)操作時(shí),如果Cache命中,則同時(shí)寫(xiě)Cache和內(nèi)存。

    如果Cache中不命中,則分為以下2種情況:

    • 寫(xiě)分配法:先更新內(nèi)存數(shù)據(jù),然后再寫(xiě)入空閑的Cache行中,保證Cache有數(shù)據(jù),提高了緩存命中率,但增加了寫(xiě)入Cache的開(kāi)銷(xiāo)
    • 非寫(xiě)分配法:只更新內(nèi)存數(shù)據(jù),不寫(xiě)入Cache,只有等訪問(wèn)不命中時(shí),再進(jìn)行緩存寫(xiě)入

    另外,這種方式為了減少內(nèi)存的寫(xiě)入開(kāi)銷(xiāo),一般會(huì)在Cache和內(nèi)存之間加一個(gè)寫(xiě)緩沖隊(duì)列,在CPU寫(xiě)入Cache的同時(shí),也會(huì)寫(xiě)入緩沖隊(duì)列,然后由存儲(chǔ)控制器將緩沖隊(duì)列寫(xiě)入內(nèi)存。

    如果在寫(xiě)操作不頻繁的情況下,效果很好。但如果寫(xiě)操作頻繁,則會(huì)導(dǎo)致寫(xiě)緩沖隊(duì)列飽和而發(fā)生阻塞。

    回寫(xiě)法

    這種方式在寫(xiě)操作時(shí),如果Cache命中,則只更新Cache而不更新內(nèi)存。

    如果Cache不命中,則從內(nèi)存中讀取內(nèi)容,寫(xiě)入Cache并更新為最新內(nèi)容。

    這種方式不會(huì)主動(dòng)更新內(nèi)存,只有在Cache被再次修改時(shí),才將內(nèi)容一次性寫(xiě)入內(nèi)存。這樣做的好處是減少了寫(xiě)內(nèi)存的次數(shù),大大降低內(nèi)存帶寬需求。但有可能在某個(gè)時(shí)間點(diǎn),Cache和內(nèi)存中的數(shù)據(jù)會(huì)出現(xiàn)不一致的情況。

    影響Cache的性能因素

    既然Cache在CPU訪問(wèn)數(shù)據(jù)時(shí)提升的效率這么高,那決定Cache性能的因素有哪些?

    決定訪問(wèn)性能的重要因素之一就是Cache的命中率,它與許多因素有關(guān),具體涉及如下:

    • Cache容量:容量越大,緩存數(shù)據(jù)越多,命中率越高
    • 內(nèi)存塊大小:大的內(nèi)存交換單位能更好地利用空間局部性,但過(guò)大也會(huì)導(dǎo)致命中率降低,必須適中

    除此之外,如何設(shè)計(jì)Cache也會(huì)影響到它的性能:

    • 多級(jí)Cache:現(xiàn)在的CPU會(huì)采用3級(jí)Cache,最大程度的提升命中率
    • 內(nèi)存、總線、Cache連接結(jié)構(gòu):設(shè)計(jì)一個(gè)效率高的傳輸通道,能夠提升Cache的訪問(wèn)速度
    • 內(nèi)存結(jié)構(gòu)與Cache配合:在訪問(wèn)不命中時(shí),會(huì)去訪問(wèn)內(nèi)存,設(shè)計(jì)效率高的傳輸通道與Cache配合也可以提升Cache的性能

    總結(jié)

    本篇文章主要介紹了高速緩存Cache的重點(diǎn)知識(shí),總結(jié)如下:

    • 程序運(yùn)行有訪問(wèn)局部性的規(guī)律:時(shí)間局部性、空間局部性
    • 內(nèi)存與Cache的映射方式有3種:直接映射、全相聯(lián)映射、組相聯(lián)映射,其中組相聯(lián)映射方式命中率最高
    • Cache的替換算法有4種:先進(jìn)先出(FIFO)、最近最少使用(LRU)、最不經(jīng)常使用(LFU)、隨機(jī)(Random),其中最近最少使用算法的命中率最高
    • 保證內(nèi)存與Cache的一致性方案有2種:全寫(xiě)法、回寫(xiě)法
    • 影響Cache的性能因素有:容量、內(nèi)存塊大小、Cache組合、內(nèi)存結(jié)構(gòu)與傳輸通道設(shè)計(jì)等

    補(bǔ)充

    什么是用戶態(tài)和內(nèi)核態(tài)?

    Kernel 運(yùn)行在超級(jí)權(quán)限模式(Supervisor Mode)下,所以擁有很高的權(quán)限。按照權(quán)限管理的原則,多數(shù)應(yīng)用程序應(yīng)該運(yùn)行在最小權(quán)限下。因此,很多操作系統(tǒng),將內(nèi)存分成了兩個(gè)區(qū)域:內(nèi)核空間(Kernal Space),這個(gè)空間只有內(nèi)核程序可以訪問(wèn);用戶空間(User Space),這部分內(nèi)存專門(mén)給應(yīng)用程序使用。

    用戶態(tài)和內(nèi)核態(tài)
    用戶空間中的代碼被限制了只能使用一個(gè)局部的內(nèi)存空間,我們說(shuō)這些程序在用戶態(tài)(User Mode) 執(zhí)行。
    內(nèi)核空間中的代碼可以訪問(wèn)所有內(nèi)存,我們稱這些程序在內(nèi)核態(tài)(Kernal Mode) 執(zhí)行。

    用戶態(tài)線程
    用戶態(tài)線程也稱作用戶級(jí)線程(User Level Thread)。操作系統(tǒng)內(nèi)核并不知道它的存在,它完全是在用戶空間中創(chuàng)建。

    完全建立在用戶空間,內(nèi)核無(wú)法感知線程的存在,內(nèi)核只對(duì)線程所屬的進(jìn)程進(jìn)行控制。優(yōu)點(diǎn)是不依賴內(nèi)核實(shí)現(xiàn),但用戶需要在用戶態(tài)實(shí)現(xiàn)線程創(chuàng)建和調(diào)度功能,一般只在不支持多線程的操作系統(tǒng)上使用,實(shí)現(xiàn)并發(fā)。

    用戶級(jí)線程有很多優(yōu)勢(shì),比如。

    管理開(kāi)銷(xiāo)小:創(chuàng)建、銷(xiāo)毀不需要系統(tǒng)調(diào)用。

    切換成本低:用戶空間程序可以自己維護(hù),不需要走操作系統(tǒng)調(diào)度。

    但是這種線程也有很多的缺點(diǎn)。

    與內(nèi)核協(xié)作成本高:比如這種線程完全是用戶空間程序在管理,當(dāng)它進(jìn)行 I/O 的時(shí)候,無(wú)法利用到內(nèi)核的優(yōu)勢(shì),需要頻繁進(jìn)行用戶態(tài)到內(nèi)核態(tài)的切換。

    線程間協(xié)作成本高:設(shè)想兩個(gè)線程需要通信,通信需要 I/O,I/O 需要系統(tǒng)調(diào)用,因此用戶態(tài)線程需要支付額外的系統(tǒng)調(diào)用成本。

    無(wú)法利用多核優(yōu)勢(shì):比如操作系統(tǒng)調(diào)度的仍然是這個(gè)線程所屬的進(jìn)程,所以無(wú)論每次一個(gè)進(jìn)程有多少用戶態(tài)的線程,都只能并發(fā)執(zhí)行一個(gè)線程,因此一個(gè)進(jìn)程的多個(gè)線程無(wú)法利用多核的優(yōu)勢(shì)。

    操作系統(tǒng)無(wú)法針對(duì)線程調(diào)度進(jìn)行優(yōu)化:當(dāng)一個(gè)進(jìn)程的一個(gè)用戶態(tài)線程阻塞(Block)了,操作系統(tǒng)無(wú)法及時(shí)發(fā)現(xiàn)和處理阻塞問(wèn)題,它不會(huì)更換執(zhí)行其他線程,從而造成資源浪費(fèi)。

    內(nèi)核態(tài)線程
    內(nèi)核態(tài)線程也稱作內(nèi)核級(jí)線程(Kernel Level Thread)。這種線程執(zhí)行在內(nèi)核態(tài),可以通過(guò)系統(tǒng)調(diào)用創(chuàng)造一個(gè)內(nèi)核級(jí)線程。

    由內(nèi)核通過(guò)調(diào)度器來(lái)完成線程切換,優(yōu)點(diǎn)是每個(gè)線程是獨(dú)立的調(diào)度單元,線程之間互不影響,但缺點(diǎn)是線程創(chuàng)建和切換開(kāi)銷(xiāo)大

    內(nèi)核級(jí)線程有很多優(yōu)勢(shì)。

    可以利用多核 CPU 優(yōu)勢(shì):內(nèi)核擁有較高權(quán)限,因此可以在多個(gè) CPU 核心上執(zhí)行內(nèi)核線程。

    操作系統(tǒng)級(jí)優(yōu)化:內(nèi)核中的線程操作 I/O 不需要進(jìn)行系統(tǒng)調(diào)用;一個(gè)內(nèi)核線程阻塞了,可以立即讓另一個(gè)執(zhí)行。

    當(dāng)然內(nèi)核線程也有一些缺點(diǎn)。

    創(chuàng)建成本高:創(chuàng)建的時(shí)候需要系統(tǒng)調(diào)用,也就是切換到內(nèi)核態(tài)。

    擴(kuò)展性差:由一個(gè)內(nèi)核程序管理,不可能數(shù)量太多。

    切換成本較高:切換的時(shí)候,也同樣存在需要內(nèi)核操作,需要切換內(nèi)核態(tài)。

    用戶態(tài)和內(nèi)核態(tài)的區(qū)別
    用戶態(tài)線程工作在用戶空間,內(nèi)核態(tài)線程工作在內(nèi)核空間。用戶態(tài)線程調(diào)度完全由進(jìn)程負(fù)責(zé),通常就是由進(jìn)程的主線程負(fù)責(zé)。相當(dāng)于進(jìn)程主線程的延展,使用的是操作系統(tǒng)分配給進(jìn)程主線程的時(shí)間片段。內(nèi)核線程由內(nèi)核維護(hù),由操作系統(tǒng)調(diào)度。

    用戶態(tài)線程無(wú)法跨核心,一個(gè)進(jìn)程的多個(gè)用戶態(tài)線程不能并發(fā),阻塞一個(gè)用戶態(tài)線程會(huì)導(dǎo)致進(jìn)程的主線程阻塞,直接交出執(zhí)行權(quán)限。這些都是用戶態(tài)線程的劣勢(shì)。內(nèi)核線程可以獨(dú)立執(zhí)行,操作系統(tǒng)會(huì)分配時(shí)間片段。因此內(nèi)核態(tài)線程更完整,也稱作輕量級(jí)進(jìn)程。內(nèi)核態(tài)線程創(chuàng)建成本高,切換成本高,創(chuàng)建太多還會(huì)給調(diào)度算法增加壓力,因此不會(huì)太多。

    混合實(shí)現(xiàn)

    即存在用戶線程,也存在輕量級(jí)進(jìn)程,支持大規(guī)模的用戶線程并發(fā),同時(shí)使用內(nèi)核線程進(jìn)行調(diào)度和處理映射。用戶線程和內(nèi)核線程的映射有 1:1,M:N 兩種形式,Java 線程為 1:1 的形式,Go 的 goroutine 為 M:N 的形式

    用戶態(tài)線程創(chuàng)建成本低,問(wèn)題明顯,不可以利用多核。內(nèi)核態(tài)線程,創(chuàng)建成本高,可以利用多核,切換速度慢。因此通常我們會(huì)在內(nèi)核中預(yù)先創(chuàng)建一些線程,并反復(fù)利用這些線程。將用戶態(tài)線程附著在內(nèi)核態(tài)線程中執(zhí)行

    進(jìn)程的PCB包含哪些信息

    為了使參與并發(fā)執(zhí)行的每個(gè)程序,包含數(shù)據(jù)都能獨(dú)立地運(yùn)行,在操作系統(tǒng)中必須為之配置一個(gè)專門(mén)的數(shù)據(jù)結(jié)構(gòu),稱為進(jìn)程控制塊(PCB,Process Control Block)。進(jìn)程與PCB是一一對(duì)應(yīng)的,用戶進(jìn)程不能修改。

    進(jìn)程控制塊PCB的作用:

    為了便于系統(tǒng)描述和管理進(jìn)程的運(yùn)行,在OS的核心為每個(gè)進(jìn)程專門(mén)定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)——進(jìn)程控制塊PCB(Process Control Block)。PCB作為進(jìn)程實(shí)體的一部分,記錄了操作系統(tǒng)所需的,用于描述進(jìn)程的當(dāng)前情況以及管理進(jìn)程運(yùn)行的全部信息,是操作系統(tǒng)中最重要的記錄型數(shù)據(jù)結(jié)構(gòu)。PCB的作用是使一個(gè)在多道程序環(huán)境下不能獨(dú)立運(yùn)行的程序(含數(shù)據(jù))成為一個(gè)能獨(dú)立運(yùn)行的基本單位,一個(gè)能與其他進(jìn)程并發(fā)執(zhí)行的進(jìn)程。
    **(1)PCB作為獨(dú)立運(yùn)行基本單位的標(biāo)志。**當(dāng)一個(gè)程序(含數(shù)據(jù))配置了PCB后,就表示它已經(jīng)是一個(gè)能在多道程序環(huán)境下獨(dú)立運(yùn)行的、合法的基本單位,也就具有取得OS服務(wù)的權(quán)力,如打開(kāi)文件系統(tǒng)中的文件,請(qǐng)求獲得系統(tǒng)中的I/O設(shè)備,以及與其它相關(guān)進(jìn)程的進(jìn)行通信等。因此,當(dāng)系統(tǒng)創(chuàng)建一個(gè)新進(jìn)程時(shí),就為它建立了一個(gè)PCB。進(jìn)程結(jié)束時(shí)又回收其PCB,進(jìn)程于是也隨之消亡。系統(tǒng)是通過(guò)PCB感知進(jìn)程的存在的。事實(shí)上,PCB已成為進(jìn)程存在于系統(tǒng)中的唯一標(biāo)志。
    (2)PCB能實(shí)現(xiàn)間斷性運(yùn)行方式。在多道程序環(huán)境下,程序是采用停停走走間斷性的運(yùn)行方式運(yùn)行的。當(dāng)進(jìn)程因阻塞而暫停運(yùn)行時(shí),它必須保留自己運(yùn)行時(shí)的CPU現(xiàn)場(chǎng)信息。在有了PCB后,系統(tǒng)就可以將CPU現(xiàn)場(chǎng)信息保存在被中斷進(jìn)程的PCB中,供該進(jìn)程再次被調(diào)度執(zhí)行時(shí)恢復(fù)CPU現(xiàn)場(chǎng)時(shí)使用。由此,可再次明確,在多道程序環(huán)境下,作為傳統(tǒng)意義上的靜態(tài)程序,因其并不具有保護(hù)或保存自己運(yùn)行現(xiàn)場(chǎng)的手段,無(wú)法保證其運(yùn)行結(jié)果的可再現(xiàn)性,從而失去運(yùn)行的意義。
    **(3)PCB提供進(jìn)程管理所需要的信息。**當(dāng)調(diào)度程序調(diào)度到某進(jìn)程運(yùn)行時(shí),只能根據(jù)該進(jìn)程PCB中記錄的程序和數(shù)據(jù)在內(nèi)存或外存中的始址指針,找到相應(yīng)的程序和數(shù)據(jù);在進(jìn)程運(yùn)行過(guò)程中,當(dāng)需要訪問(wèn)文件系統(tǒng)中的文件或I/O設(shè)備時(shí),也都需要借助于PCB中的信息。另外,還可根據(jù)PCB中的資源清單了解到該進(jìn)程所需的全部資源等??梢?jiàn),在進(jìn)程的整個(gè)生命周期中,操作系統(tǒng)總是根據(jù)PCB實(shí)施對(duì)進(jìn)程的控制和管理。
    (4)PCB提供進(jìn)程調(diào)度所需要的信息。只有處于就緒狀態(tài)的進(jìn)程才能被調(diào)度執(zhí)行,而在PCB中就提供了進(jìn)程出于何種狀態(tài)的信息。如果進(jìn)程處于就緒狀態(tài),系統(tǒng)便將它插入到進(jìn)程就緒隊(duì)列中,等待著調(diào)度程序的調(diào)度;另外在進(jìn)行調(diào)度時(shí)往往還需要了解進(jìn)程的其他信息,如在優(yōu)先級(jí)調(diào)度算法中,就需要知道進(jìn)程的優(yōu)先級(jí)。在有些較為公平的調(diào)度算法中,還需要知道進(jìn)程的等待時(shí)間和已執(zhí)行過(guò)的事件等。
    (5)PCB實(shí)現(xiàn)與其他進(jìn)程的同步與通信。進(jìn)程同步機(jī)制是用于實(shí)現(xiàn)諸進(jìn)程的協(xié)調(diào)運(yùn)行的,在采用信號(hào)量機(jī)制時(shí),它要求在每個(gè)進(jìn)程中都設(shè)置有相應(yīng)的用于同步的信號(hào)量。在PCB中還具有用于實(shí)現(xiàn)進(jìn)程通信的區(qū)域或通信隊(duì)列指針等。

    進(jìn)程控制塊中的信息:

    為了實(shí)現(xiàn)進(jìn)程模型,操作系統(tǒng)維護(hù)著進(jìn)程表。改表項(xiàng)包含了進(jìn)程狀態(tài)的重要信息,包括程序計(jì)數(shù)器、堆棧指針、內(nèi)存分配狀況、所打開(kāi)文件的狀態(tài)、賬號(hào)和調(diào)度信息,以及其他進(jìn)程由運(yùn)行態(tài)轉(zhuǎn)換到就緒態(tài)或阻塞態(tài)時(shí)必須保存的信息,從而保證該進(jìn)程隨后能再次啟動(dòng),就像從未被中斷一樣。

    哪些時(shí)線程共享的,哪些是線程私有的

    在進(jìn)程控制塊中,主要包括以下幾個(gè)方面的信息:
    (1)進(jìn)程標(biāo)識(shí)符:進(jìn)程標(biāo)識(shí)符用于唯一的表示一個(gè)進(jìn)程。一個(gè)進(jìn)程通常有兩種標(biāo)識(shí)符:①外部標(biāo)識(shí)符。為了方便用戶進(jìn)程對(duì)進(jìn)程的訪問(wèn),須為每一個(gè)進(jìn)程設(shè)置一個(gè)外部標(biāo)識(shí)符。它是由創(chuàng)建者提供的,通常由字母、數(shù)字組成。為了描述進(jìn)程的家族關(guān)系,還應(yīng)設(shè)置父進(jìn)程標(biāo)識(shí)及子進(jìn)程標(biāo)識(shí)。此外,還可設(shè)置用戶標(biāo)識(shí),以指示擁有該進(jìn)程的用戶。②內(nèi)部標(biāo)識(shí)符。為了方便系統(tǒng)對(duì)進(jìn)程的使用,在OS中又為進(jìn)程設(shè)置了內(nèi)部標(biāo)識(shí)符,即賦予每一個(gè)進(jìn)程一個(gè)唯一的數(shù)字標(biāo)識(shí)符,它通常是一個(gè)進(jìn)程的序號(hào)。
    (2)處理機(jī)狀態(tài):處理機(jī)狀態(tài)信息也稱為處理機(jī)的上下文,主要是由處理機(jī)的各種寄存器中的內(nèi)容組成的。這些寄存器包括:①通用寄存器,又稱為用戶可視寄存器,它們是用戶程序可以訪問(wèn)的,用于暫存信息,在大多數(shù)處理機(jī)中,有8~32個(gè)通用寄存器,在RISC結(jié)構(gòu)的計(jì)算機(jī)中可超過(guò)100個(gè);②指令計(jì)數(shù)器,其中存放了要訪問(wèn)的下一條指令的地址;③程序狀態(tài)字PSW,其中含有狀態(tài)信息,如條件碼、執(zhí)行方式、中斷屏蔽標(biāo)志等;④用戶棧指針,指每個(gè)用戶進(jìn)程都有一個(gè)或若干個(gè)與之相關(guān)的系統(tǒng)棧,用于存放過(guò)程和系統(tǒng)調(diào)用參數(shù)及調(diào)用地址。棧指針指向該棧的棧頂。處理機(jī)處于執(zhí)行狀態(tài)時(shí),正在處理的許多信息都是放在寄存器中。當(dāng)進(jìn)程被切換時(shí),處理機(jī)狀態(tài)信息都必須保存在相應(yīng)的PCB中,以便在該進(jìn)程重新執(zhí)行是能再?gòu)臄帱c(diǎn)繼續(xù)執(zhí)行。
    (3)進(jìn)程調(diào)度信息:在OS進(jìn)行調(diào)度時(shí),必須了解進(jìn)程的狀態(tài)及有關(guān)進(jìn)程調(diào)度的信息,這些信息包括:①進(jìn)程狀態(tài),指明進(jìn)程的當(dāng)前狀態(tài),它是作為進(jìn)程調(diào)度和對(duì)換時(shí)的依據(jù);②進(jìn)程優(yōu)先級(jí),是用于描述進(jìn)程使用處理機(jī)的優(yōu)先級(jí)別的一個(gè)整數(shù),優(yōu)先級(jí)高的進(jìn)程應(yīng)優(yōu)先獲得處理機(jī);③進(jìn)程調(diào)度所需的其他信息,它們與所采用的進(jìn)程調(diào)度算法有關(guān),比如,進(jìn)程已等待CPU的時(shí)間總和、進(jìn)程已執(zhí)行的時(shí)間總和等等;④事件,是指進(jìn)程由執(zhí)行態(tài)轉(zhuǎn)變?yōu)樽枞麪顟B(tài)所等待發(fā)生的事件,即阻塞原因。
    (4)進(jìn)程控制信息:是指用于進(jìn)程控制所必須的信息,它包括:①程序和數(shù)據(jù)的地址,進(jìn)程實(shí)體中的程序和數(shù)據(jù)的內(nèi)存或外存地址,以便再調(diào)度到該進(jìn)程執(zhí)行時(shí),能從PCB中找到其程序和數(shù)據(jù);②進(jìn)程同步和通信機(jī)制,這是實(shí)現(xiàn)同步和進(jìn)程通信時(shí)必需的機(jī)制,如消息隊(duì)列指針、信號(hào)量等,它們可能全部或部分地放在PCB中;③資源清單,在該清單中列出了進(jìn)程在運(yùn)行期間所需的全部資源(除CPU),另外還有一張已分配到該進(jìn)程的資源的清單;④鏈接指針,它給出了本進(jìn)程(PCB)所在隊(duì)列中的下一個(gè)進(jìn)程地PCB的首地址。

    總結(jié)

    以上是生活随笔為你收集整理的操作系统面试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。