真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

計(jì)算機(jī)基礎(chǔ)知識八股文(操作系統(tǒng)篇)-創(chuàng)新互聯(lián)

二 操作系統(tǒng)篇 2.1 簡述什么是進(jìn)程?

進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,

成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站制作、成都網(wǎng)站制作與策劃設(shè)計(jì),向陽網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:向陽等地區(qū)。向陽做網(wǎng)站價(jià)格咨詢:18982081108

進(jìn)程本質(zhì)上是運(yùn)行中的程序是動態(tài)的,需要將進(jìn)程運(yùn)行的當(dāng)前狀態(tài),所需資源等信息保存到進(jìn)程控制塊中,操作系統(tǒng)為了管理進(jìn)程設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)叫進(jìn)程控制塊,里面存的字段可以分成進(jìn)程標(biāo)識符、處理機(jī)狀態(tài)、進(jìn)程調(diào)度信息、進(jìn)程控制信息。

2.2 進(jìn)程狀態(tài)模型 —簡述阻塞、非阻塞、同步、異步—簡述為什么發(fā)送阻塞?

五狀態(tài)模型:創(chuàng)建、就緒、終止、阻塞。運(yùn)行

就緒狀態(tài):其他資源都準(zhǔn)備好了,只差CPU資源的狀態(tài),只要在獲得CPU使用權(quán)就可以隨時被調(diào)度執(zhí)行。

創(chuàng)建狀態(tài):創(chuàng)建進(jìn)程是擁有PCB(進(jìn)程控制塊)但其他資源沒有就緒為創(chuàng)建狀態(tài)

先分配PCB(進(jìn)程控制塊)然后插入就緒隊(duì)列。

操作系統(tǒng)提供fork函數(shù)接口創(chuàng)建進(jìn)程

終止?fàn)顟B(tài):進(jìn)程結(jié)束有系統(tǒng)清理或者歸還PCB的狀態(tài)為終止?fàn)顟B(tài)。

阻塞狀態(tài):進(jìn)程因?yàn)槟撤N原因(其他設(shè)備沒有就緒包括磁盤、網(wǎng)卡等)無法繼續(xù)執(zhí)行而放棄cpu的使用權(quán),把cpu資源讓給其他進(jìn)程。

在這里插入圖片描述

進(jìn)程從就緒狀態(tài)進(jìn)行進(jìn)程調(diào)度,分配cpu資源,然后到運(yùn)行狀態(tài),當(dāng)時間片用完之后進(jìn)入就緒狀態(tài),而在運(yùn)行狀態(tài)時因?yàn)槟承┵Y源沒有就緒比如IO請求包括網(wǎng)絡(luò)IO、磁盤IO、都可能從運(yùn)行狀態(tài)切換到阻塞狀態(tài),當(dāng)IO請求完成了進(jìn)程從阻塞狀態(tài)切換就緒狀態(tài)。

阻塞、非阻塞、同步、異步。

阻塞狀態(tài)(同步):阻塞的話典型的就是IO過程,從調(diào)用到返回會經(jīng)歷一段時間。因?yàn)楸热缤鈬O(shè)備包括磁盤。網(wǎng)卡等,在讀寫數(shù)據(jù)沒有CPU快,所以通常讀取數(shù)據(jù)的時候會經(jīng)歷一段時間,這段時間就是屬于阻塞狀態(tài)。在調(diào)用結(jié)果返回之前,當(dāng)前進(jìn)程會被掛起,只有得到結(jié)果才會返回。

同步:進(jìn)程因?yàn)樵谶@段時間并沒有干其他事情,而是同步的等待數(shù)據(jù)返回

非阻塞狀態(tài)(異步):并沒有一直等待數(shù)據(jù)的返回,而是其他的工作,等到比如IO完成了會通知已經(jīng)完成,進(jìn)程再去返回IO任務(wù)去讀取數(shù)據(jù)。

異步:進(jìn)程在IO之后沒有進(jìn)行同步等待,去干其他事情,并且等待IO這個過程準(zhǔn)備好之后進(jìn)行通知,進(jìn)程接收到通知ready之后再切換回去讀取數(shù)據(jù)。

當(dāng)一個異步的調(diào)用發(fā)出之后,調(diào)用并不會得到結(jié)果而是,被調(diào)用者通過狀態(tài)或者通知,來通知進(jìn)程獲取結(jié)果。

總結(jié):同步異步搶到消息通訊機(jī)制,阻塞非阻塞搶到進(jìn)程在等待調(diào)用結(jié)果的狀態(tài)。

2.3 PBC是什么?(進(jìn)程控制塊)

PCB是進(jìn)程控制塊。

PCB是進(jìn)程的唯一標(biāo)識,操作系統(tǒng)調(diào)度進(jìn)程時就是根據(jù)每個進(jìn)程PCB中的信息進(jìn)行調(diào)度的,當(dāng)決定執(zhí)行 某個進(jìn)程后,會根據(jù)該進(jìn)程PCB中保存的信息去恢復(fù)上次執(zhí)行的現(xiàn)場,當(dāng)分配到的CPU時間片用完 后,需要將當(dāng)前狀態(tài)保存到PCB中,以便下次恢復(fù)。

PCB組織方式: 通過鏈表的方式組織成一個個隊(duì)列,擁有相同狀態(tài)的進(jìn)程組成一個隊(duì)列。 比如就緒進(jìn)程就會組成就緒隊(duì)列、因?yàn)槟承┦录枞倪M(jìn)程組成阻塞隊(duì)列。 也可以將相同狀態(tài)的PCB按照其他策略排成多個鏈表

PCB包含進(jìn)程的屬性和狀態(tài)信息:

  • 進(jìn)程標(biāo)識符(進(jìn)程ID)
  • CPU狀態(tài)信息(寄存器、PC)
  • 進(jìn)程調(diào)度信息(進(jìn)程狀態(tài)、進(jìn)程優(yōu)先級、進(jìn)程已等待時間等)
  • 進(jìn)程控制信息(頁表地址)
2.3 線程——介紹進(jìn)程、線程、協(xié)程

線程:

線程是任務(wù)調(diào)度和執(zhí)行的基本單位。CPU上真正運(yùn)行的是線程,但線程本身幾乎不擁有資源,線程自己只擁有一點(diǎn)運(yùn)行時必不可少的資源,如PC、寄存器和棧,但線程可以和同一進(jìn)程下的其他線程共享進(jìn)程資源。

進(jìn)程:

進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,

進(jìn)程本質(zhì)上是“運(yùn)行中的程序”,單純的程序只是保存在磁盤中的一段代碼,是靜態(tài)的,而進(jìn)程是運(yùn)行中的代碼,是動態(tài)的,除了需要保存這段代碼外,還需要將進(jìn)程運(yùn)行的當(dāng)前狀態(tài),所需資源等信息保存到進(jìn)程控制塊中,操作系統(tǒng)為了管理進(jìn)程設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)叫進(jìn)程控制塊,里面存的字段可以分成進(jìn)程標(biāo)識符、處理機(jī)狀態(tài)(進(jìn)程當(dāng)前運(yùn)行到什么時候什么狀態(tài)的一些信息)、進(jìn)程調(diào)度信息、進(jìn)程控制信息。所以進(jìn)程由3部分組成:程序段、數(shù)據(jù)段和進(jìn)程控制塊。

**協(xié)程:**比線程更加輕量級,協(xié)程不被操作系統(tǒng)內(nèi)核所管理,完全是用戶態(tài)的

2.4 進(jìn)程與線程區(qū)別
  • 一個進(jìn)程包含多個線程,一個線程只能屬于一個進(jìn)程
  • 創(chuàng)建和銷毀線程的速度快,因?yàn)閯?chuàng)建線程不需要單獨(dú)分配資源了。
  • 線程間切換的速度較快,只需要保存和恢復(fù)寄存器內(nèi)容即可,而進(jìn)程切換就需要保存當(dāng)前CPU狀態(tài)到PCB中,然后 將下一個進(jìn)程的狀態(tài)進(jìn)行恢復(fù)。
  • 由于線程間共享進(jìn)程的內(nèi)存和文件,所以線程間通信不需要其他復(fù)雜的機(jī)制,也不需要涉及內(nèi)核,既簡便又快速
  • 進(jìn)程的健壯性更強(qiáng),一個線程掛掉會導(dǎo)致整個進(jìn)程掛掉,但一個進(jìn)程掛掉不會導(dǎo)致其他進(jìn)程掛掉。
  • 進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,線程是任務(wù)調(diào)度和執(zhí)行的基本單位。
2.5 進(jìn)程和線程的切換流程

進(jìn)程切換流程: 進(jìn)程之間的虛擬地址空間是不同的,所以要先切換頁表,清空快表緩存。 切換內(nèi)核棧和硬件上下文

進(jìn)程上下文:當(dāng)一個進(jìn)程在執(zhí)行時,CPU的所有寄存器中的值、進(jìn)程的狀態(tài)以及堆棧中的內(nèi)容被稱為該進(jìn)程的上下文

線程切換流程: 線程之間共享進(jìn)程的虛擬地址空間,所以線程切換不需要切換頁表 直接切換內(nèi)核棧和硬件上下文即可

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

并發(fā)和并行在一個時間段內(nèi)的表現(xiàn)都是多個進(jìn)程得到了運(yùn)行。

  • 并發(fā)在任意一個時刻下,只有一個進(jìn)程在運(yùn)行;
  • 并行在任意一個時刻下,有多個進(jìn)程在同時運(yùn)行。
2.7 進(jìn)程調(diào)度策略

非搶占式:進(jìn)程獲得CPU資源后,一直運(yùn)行直到進(jìn)程結(jié)束或阻塞才釋放CPU使用權(quán)。

  • 優(yōu)點(diǎn):簡單、上下文切換開銷小
  • 缺點(diǎn):緊急任務(wù)不能馬上執(zhí)行、后到的短進(jìn)程需要等待長進(jìn)程完成,導(dǎo)致短進(jìn)程周轉(zhuǎn)時間變長

搶占式:操作系統(tǒng)可以在進(jìn)程執(zhí)行時剝奪CPU,分配給其他進(jìn)程使用。 典型的有:優(yōu)先級原則、短進(jìn)程優(yōu)先原則、時間片原則

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

  • 短作業(yè)優(yōu)先: 搶占式、難以準(zhǔn)確預(yù)測進(jìn)程執(zhí)行時間
  • 優(yōu)先級調(diào)度 - 最常用: 搶占式、分為靜態(tài)優(yōu)先級和動態(tài)優(yōu)先級,動態(tài)優(yōu)先級系統(tǒng)開銷較大,靜態(tài)優(yōu)先級是在進(jìn)程創(chuàng)建時就決定的
  • 時間片輪轉(zhuǎn) - 分時系統(tǒng) :搶占式、為每個執(zhí)行進(jìn)程設(shè)置時間片,時間片用完則交出CPU
  • 先進(jìn)先出算法 - FIFO: 非搶占式、容易造成短進(jìn)程等待時間變長
  • 最高響應(yīng)比優(yōu)先: 非搶占式、對短進(jìn)程有利,長進(jìn)程由于等待時間變長會提高響應(yīng)比,不至于讓長進(jìn)程餓死
  • 前后臺調(diào)度 :前臺執(zhí)行分時程序,用時間片輪轉(zhuǎn)調(diào)度;后臺執(zhí)行批處理程序,用FIFO調(diào)度。只有當(dāng)前臺沒有程序 時,CPU才交給后臺使用。
  • 多級反饋隊(duì)列輪轉(zhuǎn)算法: 將就緒隊(duì)列分成多個優(yōu)先級不同的隊(duì)列。 剛創(chuàng)建和進(jìn)程 和 因IO未用完時間片的進(jìn)程排在最高優(yōu)先級隊(duì)列,2-3個時間片還未執(zhí)行完的進(jìn)程放入 較低優(yōu)先級隊(duì)列,只有優(yōu)先級更高的隊(duì)列為空時才會調(diào)度當(dāng)前隊(duì)列。
2.8 僵尸進(jìn)程 孤兒進(jìn)程 守護(hù)進(jìn)程
  • 孤兒進(jìn)程:子進(jìn)程的父進(jìn)程退出,子進(jìn)程被ID號為1的inti進(jìn)程收養(yǎng),作為子進(jìn)程的父進(jìn)程.然后init進(jìn)程會執(zhí)行wait或waitpid操作,去釋放孤兒進(jìn)程的資源.

    危害:孤兒進(jìn)程沒有危害

  • 僵尸進(jìn)程:子進(jìn)程先退出,父進(jìn)程沒有通過wait()或者waipid()去回收釋放子進(jìn)程的資源,此時子進(jìn)程雖然 退出了,但還占有原本的PCB.

    危害:當(dāng)有大量僵尸進(jìn)程在內(nèi)存中時,會占據(jù)大量PCB,而PCB資源是有限的,所以會導(dǎo)致無法創(chuàng)建新的進(jìn)程.

    處理:父進(jìn)程退出,讓僵尸進(jìn)程成為孤兒進(jìn)程,由init進(jìn)程收養(yǎng),處理資源回收工作.

  • 守護(hù)進(jìn)程:在后臺運(yùn)行不受終端控制的進(jìn)程.

2.9 進(jìn)程的上下文切換需要哪些開銷?線程呢?

進(jìn)程切換的開銷 :1、切換頁表 2、切換內(nèi)核態(tài)堆棧 3、將寄存器中的上下文保存到PCB中 4、刷新跳表TLB是為了更快的進(jìn)行地址翻譯而將部分的頁表內(nèi)容緩存

線程切換的開銷 :1、切換內(nèi)核棧 2、切換硬件上下文

進(jìn)程切換和線程切換,開銷差距大就大在頁表切換上,因?yàn)檫@個步驟涉及將寄存器中的內(nèi)容切換出。 還有,進(jìn)程切換后,由于跳表刷新,所以一段時間內(nèi)命中率就很低。

2.10 堆和棧的區(qū)別

堆:程序員分配和釋放的空間,不釋放則由操作系統(tǒng)回收,形式是鏈表。

棧:操作系統(tǒng)自動分配釋放的空間,保存函數(shù)的參數(shù)和局部變量,形式是棧。

2.11 用戶態(tài)&內(nèi)核態(tài)

通過系統(tǒng)調(diào)用將操作系統(tǒng)整個體系分為用戶態(tài)和內(nèi)核態(tài)。

一般的操作系統(tǒng)對執(zhí)行權(quán)限進(jìn)行分級,分別為用戶態(tài)和內(nèi)核態(tài)。用戶態(tài)相較于內(nèi)核態(tài)有較低的執(zhí)行權(quán)限,很多操作是不被操作系統(tǒng)允許的,內(nèi)核態(tài)相當(dāng)于一個介于硬件與應(yīng)用之間的層,有最高權(quán)限,可以執(zhí)行任何cpu指令,也可以引用任何內(nèi)存地址,包括外圍設(shè)備, 例如硬盤, 網(wǎng)卡,權(quán)限等級最高。

為什么要有用戶態(tài)和內(nèi)核態(tài):為了限制不同程序?qū)?shù)據(jù)的訪問能力,防止部分程序獲取其他程序的數(shù)據(jù),或者獲取外圍設(shè)備的數(shù)據(jù),發(fā)送到網(wǎng)絡(luò)上提高安全性.

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

從應(yīng)用程序訪問到系統(tǒng)內(nèi)核資源,稱之為系統(tǒng)調(diào)用。

當(dāng)一個程序從需要操作系統(tǒng)資源的時候,實(shí)際上是從【用戶態(tài)】->【內(nèi)核態(tài)】->【用戶態(tài)】這樣的一個過程。在這個過程中也需要一定的開銷,(strace命令監(jiān)控一次系統(tǒng)調(diào)用的開銷,可以使用strace -cp 查看一個進(jìn)程一段時間內(nèi)的系統(tǒng)調(diào)用,我們可以看到每個系統(tǒng)調(diào)用的次數(shù)以及總時間。)

簡單來說有下面幾點(diǎn):

  1. 保存用戶態(tài)現(xiàn)場
  2. 復(fù)制用戶態(tài)參數(shù)并且校驗(yàn)
  3. 執(zhí)行內(nèi)核態(tài)代碼
  4. 復(fù)制執(zhí)行結(jié)果
  5. 恢復(fù)用戶態(tài)現(xiàn)場
2.13 如何從用戶態(tài)進(jìn)入內(nèi)核態(tài)
  • 系統(tǒng)調(diào)用:這是用戶態(tài)進(jìn)程主動要求切換到內(nèi)核態(tài)的一種方式。例如fork()就是執(zhí)行了一個創(chuàng)建新進(jìn)程的系統(tǒng)調(diào)用。系統(tǒng)調(diào)用的機(jī)制和新是使用了操作系統(tǒng)為用戶特別開放的一個中斷來實(shí)現(xiàn),所以系統(tǒng)調(diào)用本身就是中斷,但是軟件中斷,跟硬中斷不同。
  • 異常:如果當(dāng)前進(jìn)程運(yùn)行在用戶態(tài),如果這個時候發(fā)生了異常事件,就會觸發(fā)切換。例如:缺頁異常。
  • 外設(shè)中斷:當(dāng)外設(shè)完成用戶的請求時,會向CPU發(fā)送中斷信號。這時CPU會暫停執(zhí)行下一條即將要執(zhí)行的指令而轉(zhuǎn)到與中斷信號對應(yīng)的處理程序去執(zhí)行,如果前面執(zhí)行的指令時用戶態(tài)下的程序,那么轉(zhuǎn)換的過程自然就會是 由用戶態(tài)到內(nèi)核態(tài)的切換。如硬盤讀寫操作完成,系統(tǒng)會切換到硬盤讀寫的中斷處理程序中執(zhí)行后邊的操作等。
2.14 程序運(yùn)行類型分析——什么是IO密集型任務(wù)/CPU密集型任務(wù)

CPU密集型:也叫計(jì)算密集型,指的是系統(tǒng)的硬盤、內(nèi)存性能相對CPU要高,此時讀寫IO(硬盤/內(nèi)存)時可以在很短的時間內(nèi)完成,而CPU還有許多運(yùn)算要處理,因此CPU負(fù)載很高。

通過多線程提高CPU利用率,通常線程數(shù)只需要設(shè)置為CPU核心數(shù)的線程個數(shù)。

因?yàn)?*頻繁的切換線程或進(jìn)程**也是要消耗時間的。因此對于 CPU 密集型的任務(wù)來說,線程數(shù)/進(jìn)程數(shù)等于 CPU 數(shù)是最好的了。

IO密集型:指的是系統(tǒng)的CPU性能相對硬盤、內(nèi)存要好很多,此時,系統(tǒng)運(yùn)作,大部分的狀況是CPU在等IO (硬盤/內(nèi)存) 的讀寫操作,因此,CPU負(fù)載并不高。

當(dāng)線程進(jìn)行 I/O 操作 CPU 空閑時,啟用其他線程繼續(xù)使用 CPU,以提高 CPU 的使用率。

2.15 系統(tǒng)設(shè)計(jì)中緩存的作用——存儲器的層次結(jié)構(gòu)

存儲器層次結(jié)構(gòu)分為寄存器、主存、輔存。

局部性原理:CPU訪問存儲器時。無論是存取指令還是數(shù)據(jù),訪問的存儲單元都趨向于聚集在一個較小的連續(xù)區(qū)域中。

在這里插入圖片描述

緩存-主存層次:根據(jù)局部性原理通過在CPU與主存之間增加Cache以解決主存速度不足的問題。

主存-輔存層次:根據(jù)局部性原理通過增加輔助存儲器包括磁盤啥的以解決主存容量不足的問題。

緩存(如redis)的設(shè)計(jì):原理也是局部性原理,借鑒操作系統(tǒng)的原理,分離冷熱數(shù)據(jù),降低熱點(diǎn)數(shù)據(jù)負(fù)載,提升吞吐量、并發(fā)量、提升服務(wù)質(zhì)量。

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

緩沖區(qū)溢出是指向計(jì)算機(jī)緩沖區(qū)填充數(shù)據(jù)時超過了緩沖區(qū)大容量,導(dǎo)致數(shù)據(jù)被寫到緩沖區(qū)以外。

危害: 程序崩潰 跳轉(zhuǎn)到惡意代碼

原因:程序中沒有仔細(xì)檢查用戶輸入

2.17 操作系統(tǒng)內(nèi)存管理——缺頁中斷、內(nèi)存頁 什么是分頁?

分頁是將內(nèi)存從物理上劃分成大小相同的頁(linux一般4K),進(jìn)程所需的數(shù)據(jù)分別存放在多個頁中, 這些頁離散地分布在內(nèi)存中,因此需要一張記錄內(nèi)存邏輯地址到物理地址映射關(guān)系的表,也就是頁表,具體記錄了頁號到物理塊號的映射。 分頁系統(tǒng)中,訪問數(shù)據(jù)需要兩次訪問內(nèi)存,第一次訪問的是內(nèi)存中的頁表,根據(jù)頁號和頁內(nèi)偏移量查找并計(jì)算出實(shí)際物理地址,第二次根據(jù)物理地址訪問內(nèi)存取數(shù)據(jù)。

什么是分段?

分段是將進(jìn)程的邏輯空間劃分為若干不同大小的段(長度由連續(xù)邏輯的長度決定),段地址是二維的,一維是段號、二維是段內(nèi)偏移。因?yàn)槎鄠€段之間也是離散分布在內(nèi)存中的,所以需要段表來記錄邏輯地址到物理地址的映射關(guān)系。

分頁和分段的區(qū)別?
  • 頁是物理單位,方便管理內(nèi)存空間,用戶不可見;段是邏輯單位,根據(jù)用戶需要自行劃分,對用戶可見
  • 段的大小不固定,頁的大小固定,一般是4K
  • 段向用戶提供二維地址空間,頁向用戶提供一維地址空間
  • 分頁的主要目的是為了實(shí)現(xiàn)虛擬內(nèi)存,提高內(nèi)存利用率;而分段是為了程序和數(shù)據(jù)能根據(jù)邏輯進(jìn)行劃分,從而更好地進(jìn)行管理
什么是段頁式存儲管理?

先將邏輯空間按段式管理分成若干段,在將段空間按頁式管理分成若干頁,段頁地址就可以通過段號、段內(nèi)頁號、頁內(nèi)地址找到屬于那一段那一頁。綜合兩者優(yōu)點(diǎn)

2.18 虛擬內(nèi)存

有些進(jìn)程實(shí)際需要很大的內(nèi)存,超過物理內(nèi)存容量,再加上多道程序設(shè)計(jì)使每個進(jìn)程可用的物理內(nèi)存更加稀缺,物理內(nèi)存總有不夠的時候。

虛擬內(nèi)存概述:作為操作系統(tǒng)的內(nèi)存管理技術(shù),把程序使用的內(nèi)存劃分,(根據(jù)局部性原理)將部分暫時不用的內(nèi)存放置到輔存。替換策略發(fā)生在緩存-主存層次/主存-輔存層次。解決速度/容量問題。如果訪問頁不在內(nèi)存,則發(fā)出缺頁中斷,發(fā)起頁面置換。

邏輯地址空間:指進(jìn)程可以使用的內(nèi)存空間,大小僅受CPU地址長度限制(比如32位的大邏輯空間為4G-- 2^32字節(jié), 2^32字節(jié))進(jìn)程運(yùn)行時可以使用的相對地址空間。

物理地址空間:物理內(nèi)存的存儲空間,進(jìn)程運(yùn)行時在物理內(nèi)存分配和使用的地址空間。

邏輯地址空間需要轉(zhuǎn)換到物理地址空間,是映射關(guān)系。

缺頁中斷:當(dāng)進(jìn)程讀取的頁號在頁表中不存在時,會觸發(fā)缺頁中斷,處理缺頁中斷的方法是從外存中找出目標(biāo)頁,然后裝入內(nèi)存中.

具體做法:

  • 從外存中找到目標(biāo)頁

  • 檢查當(dāng)前內(nèi)存中的空閑是否足夠目標(biāo)頁裝入

  • 若空間足夠,則直接裝入目標(biāo)頁,更新頁表,中斷處理結(jié)束

  • 若空間不夠,則執(zhí)行頁面置換算法,淘汰頁面直到空間足夠?yàn)橹?然后裝入目標(biāo)頁,中斷處理結(jié)束

    注意如果淘汰頁被修改過,則要執(zhí)行淘汰頁的備份

2.19 頁面置換算法——LRU/LFU算法

頁面置換時機(jī):高速緩存(需要從主存載入數(shù)據(jù))以及主存頁面(需要從輔存載入數(shù)據(jù))的替換。

先進(jìn)先出算法(FIFO):隊(duì)列式算法,頁面以鏈表形式組織,新頁裝入時,淘汰鏈表頭的最舊頁(雙向鏈表實(shí)現(xiàn))

優(yōu)點(diǎn):簡單、易于實(shí)現(xiàn)

缺點(diǎn):效率不高,駐留最久的頁不一定就是最長時間不使用的頁

最不經(jīng)常使用算法(LFU):優(yōu)先淘汰最不經(jīng)常使用的字塊,需要額外的空間記錄字塊的使用頻率。加入新頁時增加頻率,淘汰最低的

最近最少使用算法(LRU):

1)鏈表:

優(yōu)先淘汰一段時間沒有使用的頁面,表頭存最近訪問的頁,表尾存最久未用的頁。如果訪問目標(biāo)頁,則將該頁移向表頭,其他頁相應(yīng)地也移動,擠掉表尾的頁。

優(yōu)點(diǎn):效果好

缺點(diǎn):維護(hù)鏈表的開銷太大

2)鏈表+哈希表=哈希鏈表:

  • 想要查詢和插入的時間復(fù)雜度都是O(1), 需要滿足:必須是有序的, 以區(qū)分最近使用的和很久沒有使用的數(shù)據(jù), 當(dāng)容量滿了之后刪除很久沒有使用的數(shù)據(jù),
  • 要能夠快速找到某個key是否存在, 并返回value;
  • 每次訪問某個key, 需要將這個元素變?yōu)樽罱褂玫? 也就是說, 要支持在任意位置快速插入和刪除元素;

查找快, 可以想到哈希表, 但是哈希表是亂序的;有序, 可以想到鏈表, 鏈表插入、和刪除都很快, 但是查詢是O(n);集合一下就是哈希鏈表: , 結(jié)構(gòu)如下:

img

借助上圖結(jié)構(gòu), 分析上面的三個條件:

  • 每次在鏈表尾部添加元素, 那么越靠近尾部的元素就越是最近使用的, 鏈表頭部的元素就是越久未使用的;
  • 對于某一個key, 可以通過哈希表快速定位到鏈表中的節(jié)點(diǎn), 取到value, 不用從頭遍歷;
  • 鏈表支持在任意位置插入和刪除, 修改指針即可, 可以借助哈希表, 快速映射到任意一個鏈表節(jié)點(diǎn), 進(jìn)行插入和刪除。
為什么這里要用雙鏈表呢,單鏈表為什么不行?

涉及到鏈表的刪除操作, 因?yàn)橥ㄟ^哈希表定位到某一個鏈表中的節(jié)點(diǎn), 想要刪除時, 需要知道前驅(qū)節(jié)點(diǎn)的指針。

哈希表里面已經(jīng)保存了 key ,那么鏈表中為什么還要存儲 key 和 value 呢,只存入 value 不就行了

如果鏈表中的結(jié)點(diǎn),只有 value 沒有 key,那么我們就無法刪除哈希表的 key。

時鐘算法:類似LRU,首先需要給每個頁設(shè)置訪問位,當(dāng)某頁被訪問時,訪問位為1,該算法按照先進(jìn)先出算法的順序依次遍歷內(nèi)存中所有頁,若該頁的訪問位為0,則將該頁換出,若為1,則將該頁訪問位置為0,暫時不換出給他第二次駐留內(nèi)存的機(jī)會,若遍歷到最后一個頁,訪問位仍然是1,則再從第一個頁開始遍歷。該算法也叫做最近未使用算法。

優(yōu)點(diǎn):性能和開銷較均衡

缺點(diǎn):沒有考慮到換出被修改過的頁所造成的置換代價(jià)

改進(jìn)時鐘算法:淘汰的既要是未被訪問過的頁面,也要是未被修改過的頁面。給頁面設(shè)置訪問位A和修改位M。

A = 0, M = 0 該頁最近未被訪問,也未被修改過,是最佳淘汰頁

A = 0, M = 1 該頁最近未被訪問,但被修改過,不是最佳的淘汰頁

A = 1, M = 0 該頁最近被訪問過,但未被修改,很可能會再次被訪問

A= 1, M = 1 該頁最近被訪問過,也被修改過,很可能會再次被訪問

算法執(zhí)行流程和簡單Clock算法類似:

1、第一輪掃描,目標(biāo)是 A = 0, M = 0 的頁,找到的第一個就作為淘汰頁

2、若第一輪失敗,則進(jìn)行第二輪掃描,目標(biāo)是 A = 0, M = 1 的頁,找到的第一個作為淘汰頁,且在第二輪掃描期間,將經(jīng)過的頁面 A置為0

3、若第二輪失敗,則進(jìn)行第三輪掃描,目標(biāo)是第一類頁

4、若第三輪失敗,則進(jìn)行第四輪掃描,目標(biāo)是第二類頁,此輪一定能找到淘汰頁。

優(yōu)點(diǎn):由于換出的是最近未被修改過的頁,所以可以減少磁盤IO次數(shù)

缺點(diǎn):該算法執(zhí)行時掃描輪次變多,開銷大

2.20 什么是交換、交換區(qū)?

操作系統(tǒng)將內(nèi)存中阻塞的進(jìn)程暫時移出內(nèi)存,并將已經(jīng)就緒的進(jìn)程移入內(nèi)存的操作叫做交換。

從操作系統(tǒng)中暫時移出的進(jìn)程,放在外存的交換區(qū)中。

2.21 為什么虛擬地址切換會比較耗時?

進(jìn)行虛擬地址到物理地址的轉(zhuǎn)換就需要去查頁表,而查找頁表是一個很慢的操作,所以為了加快該過程就會用快表去緩存最近查找過的虛擬地址,但每個進(jìn)程都有自己的頁表,一旦發(fā)生進(jìn)程切換,頁表就需要切換,那么快表就會被清空,所以導(dǎo)致進(jìn)程切換后查快表的命中率非常低,此時大量時間花在查頁表上,表現(xiàn)出來的就是程序運(yùn)行的速度變慢了。

線程切換就不會導(dǎo)致快表失效,因?yàn)榫€程切換無需切換地址空間,所以線程切換比進(jìn)程切換快。

2.22 什么是內(nèi)存碎片?如何解決?

內(nèi)存碎片分為內(nèi)部碎片和外部碎片.

內(nèi)部碎片分配出去但無法被利用的內(nèi)存空間,分頁系統(tǒng)是以頁為單位分配內(nèi)存空間的,而且頁的大小是固定的,這就使得分配給一個進(jìn)程的多個頁中,最后一頁往往無法全部利用,由空閑空間,這部分就是內(nèi)部碎片,直到進(jìn)程執(zhí)行結(jié)束,其他進(jìn)程都無法使用這部分空間.

解決方法:采用分段存儲,每個段的長度可以不一樣.

外部碎片是指那些還沒有被分配出去,但是因?yàn)榭臻g太小而無法分配給進(jìn)程的空閑空間,外部碎片因?yàn)楸舜酥g不連續(xù),本身又太小,所以無法被利用,只有通過將外部碎片地址整合在一起,才可以利用起來,但整合外部碎片的開銷又比較大.

解決方法:采用分頁存儲,頁與頁之間連續(xù),不會產(chǎn)生外部碎片

綜合解決方法:采用段頁式存儲,先對內(nèi)存分段,然后再將每一段分成大小相同的頁

2.23 虛擬地址和物理地址之間是如何進(jìn)行映射的?

通過MMU(內(nèi)存管理單元)

2.24 LInux軟連接與硬鏈接區(qū)別

EXT文件系統(tǒng):

在這里插入圖片描述在這里插入圖片描述

Inode Table :每一個文件(目錄)的索引節(jié)點(diǎn),存放Inode的地方,每一個文件(目錄)都有一個Inode

Inode:保存文件相關(guān)的原信息,包括文件類型、狀態(tài)、長度、等等。(文件名存放在目錄的Inode節(jié)點(diǎn)上,而不是文件的Inode)

linux文件=Inode(文件源信息)+block(文件數(shù)據(jù))

硬鏈接直接指向源文件的Inode。

軟連接有一個完整的文件包括Inode以及block,block存放的是源文件路徑。(快捷方式)

2.25 磁盤冗余陣列——服務(wù)器部署的RAID存儲

RAID(磁盤冗余陣列):利用虛擬化存儲技術(shù)把多個硬盤組合起來,成為一個或多個磁盤陣列,提示性能減少冗余。

RAID 0:性能是單塊性能的N倍,不提供數(shù)據(jù)校驗(yàn)和冗余,若是某一個磁盤損壞,數(shù)據(jù)直接丟失,可靠性低

RAID 1:相對RAID0做了冗余,增加鏡像磁盤備份,可以做數(shù)據(jù)恢復(fù)

RAID 5:(最常用)增加校驗(yàn)碼、海明碼,

RAID 1 0:結(jié)合RAID 0和RAID 1

2.26 常見的磁盤調(diào)度算法?
  • 先來先服務(wù):根據(jù)進(jìn)程請求訪問磁盤的先后順序進(jìn)行調(diào)度

    優(yōu)點(diǎn):實(shí)現(xiàn)簡單 缺點(diǎn):本質(zhì)上接近于隨機(jī)讀取

  • 最短尋道時間優(yōu)先:選擇距離當(dāng)前磁頭最近的訪問請求進(jìn)行服務(wù)

    優(yōu)點(diǎn):平均服務(wù)時間較短 缺點(diǎn):容易讓部分服務(wù)餓死

  • 掃描算法(電梯算法):選擇當(dāng)前磁頭移動方向上與當(dāng)前磁道距離最近的請求進(jìn)行服務(wù)

    優(yōu)點(diǎn):掃描算法既考慮了距離,又考慮了方向

2.27 什么是死鎖,

死鎖就是多個進(jìn)程間彼此持有對方需要的資源,但又在等待對方釋放自己需要的資源的狀態(tài)。

2.28 為什么產(chǎn)生死鎖
  • 競爭資源引起死鎖:競爭非剝奪性資源(CPU和內(nèi)存是可剝奪資源,IO設(shè)備是非剝奪資源)和臨時性資源。非剝奪性資源分配不當(dāng)、使用未加限制都會產(chǎn)生死鎖
  • 進(jìn)程推進(jìn)順序不當(dāng):相似邏輯的程序,指令順序不相同。
2.29 死鎖必要條件的理解?
  • 互斥條件。進(jìn)程請求的資源具有互斥性,一段時間內(nèi)該資源只能被一個進(jìn)程獨(dú)占。
  • 請求和保持條件。當(dāng)進(jìn)程因請求資源而阻塞時,不會釋放已經(jīng)持有的資源。
  • 不剝奪條件。進(jìn)程獲得的資源,在進(jìn)程未使用完前,不用被剝奪,只能用完后主動釋放。
  • 環(huán)路等待條件。進(jìn)程集合中每一個進(jìn)程都在等待下一個進(jìn)程正在占用的資源。
2.30 解決死鎖的基本策略
  • 預(yù)防死鎖。從根本上破壞死鎖出現(xiàn)的四個條件之一,但會降低資源利用率
  • 避免死鎖。使用某種機(jī)制防止系統(tǒng)進(jìn)入死鎖狀態(tài),可以有較高的資源利用率
  • 檢測死鎖。允許發(fā)生死鎖,系統(tǒng)可以檢測出死鎖的發(fā)生,然后消除死鎖
  • 解除死鎖。與檢測死鎖配套使用,常用方法是撤銷或掛起一些進(jìn)程,釋放出一些資源,這些資源分配給阻塞的進(jìn)程,等于是疏通了環(huán)路。

1、預(yù)防死鎖

(1)破壞互斥條件:進(jìn)程申請資源時,為資源進(jìn)行一次拷貝,進(jìn)程可以獲取資源的拷貝

缺點(diǎn):實(shí)用性不強(qiáng),拷貝資源的成本極高,當(dāng)線程數(shù)較多時,不適用

(2)摒棄請求和保持條件:必須一次性將進(jìn)程所需的資源全部分配給進(jìn)程,否則可以分配的資源也不分配給進(jìn)程

優(yōu)點(diǎn):簡單、易于實(shí)現(xiàn)、安全

缺點(diǎn):

  • 進(jìn)程要在執(zhí)行期間獨(dú)占所需的全部資源,其中一些資源可能用的很少,造成資源浪費(fèi)
  • 進(jìn)程運(yùn)行延遲,可能出現(xiàn)一些進(jìn)程長時間申請不到全部資源而等待。

(3)摒棄不剝奪條件:當(dāng)進(jìn)程得不到新申請的資源時,釋放自己已經(jīng)持有的資源,等到需要時再重新申請;或者設(shè)置計(jì)時機(jī)制,當(dāng)進(jìn)程持有資源超過一定時間仍不能完成任務(wù)時,會釋放已經(jīng)持有的資源(參考CPU無法成為死鎖資源,因?yàn)镃PU的時間片輪轉(zhuǎn),讓每個進(jìn)程只能)。

缺點(diǎn):實(shí)現(xiàn)復(fù)雜、反復(fù)申請資源使得進(jìn)程無限推遲,降低系統(tǒng)吞吐量。

(4)摒棄環(huán)路等待條件:對所有資源進(jìn)行標(biāo)號,進(jìn)程對資源的申請順序必須按照資源標(biāo)號升序申請。

優(yōu)點(diǎn):資源利用率高、系統(tǒng)吞吐量大

缺點(diǎn):限制了新資源的加入、使用順序與申請順序不同,導(dǎo)致資源浪費(fèi)。

2、避免死鎖

(1)安全與不安全狀態(tài)。進(jìn)程動態(tài)申請資源,每次申請資源時系統(tǒng)都會評估分配該資源的安全性,若 此次分配不會導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),就將資源分配給進(jìn)程。

(2)銀行家算法??衫觅Y源向量、大需求矩陣、分配矩陣、需求矩陣。 進(jìn)程P的請求向量

1)若請求向量<= 需求矩陣,轉(zhuǎn)入第二步,否則出錯,因?yàn)檎埱筚Y源數(shù)大于它宣布的大數(shù)

2)若請求向量<= 可利用資源,轉(zhuǎn)入第三步,否則表示資源不夠,進(jìn)程等待

3)系統(tǒng)試探性地將資源分配給進(jìn)程,修改 可利用資源向量、分配矩陣、需求矩陣

4)系統(tǒng)執(zhí)行安全性算法,檢查資源分配后是否處于處于安全狀態(tài),若安全則執(zhí)行此次分配,若不安全 則撤銷此次分配。

3、檢測死鎖

(1)資源分配圖 + 死鎖定理

(2)死鎖檢測算法 = 銀行家算法中的安全檢測方法

4、解除死鎖

(1)剝奪資源。從其他進(jìn)程中剝奪足夠的資源給死鎖進(jìn)程。

(2)撤銷進(jìn)程。簡單的是清除全部死鎖進(jìn)程,溫和一點(diǎn)的是逐個清除死鎖進(jìn)程,直到死鎖狀態(tài)消除為 止。

2.31 簡述各種鎖的概念

樂觀鎖/悲觀鎖:

悲觀鎖每次操作都會加鎖,樂觀鎖默認(rèn)不加鎖

悲觀鎖適合寫操作多的場景,樂觀鎖適合讀操作多的場景,可以提升并發(fā)度

無鎖/偏向鎖/輕量級鎖/重量級鎖:

  • 無鎖:不鎖資源,多線程只有一個線程修改成功,其他線層會重試。
  • 偏向鎖:鎖會對有一個線程有偏向性,同一個線程執(zhí)行臨界資源會自動獲取資源
  • 輕量級鎖:多個線程競爭同步資源時,沒有獲得資源的線程自旋(不放棄CPU)等待鎖釋放。
  • 重量級鎖:多個線程競爭同步資源時,沒有獲得資源的線程阻塞等待喚醒。

公平鎖/非公平鎖:

公平鎖:有一個先進(jìn)先出的等待隊(duì)列,不會出現(xiàn)饑餓等待

非公平鎖:可以插隊(duì),沒有插上的話也是插在等待隊(duì)列尾部。會出現(xiàn)饑餓等待

可重入鎖/非可重入鎖:

重入:任意線程獲得鎖之后,這個線程再次獲取該鎖時不會阻塞

可重入鎖:又名遞歸鎖,同一個線程在外層方法獲取鎖的時候,在進(jìn)入該線程的內(nèi)層方法會自動獲取鎖,不會因?yàn)橹耙呀?jīng)獲取過還沒釋放而阻塞。

非可重入鎖:會出現(xiàn)死鎖

共享鎖/排它鎖:

共享鎖:該鎖可以被多個線程持有,獲得共享鎖的線程只能讀不能寫。

排它鎖:又名互斥鎖。一次只能被一個線程持有。

2.32 線程間通信——互斥鎖和自旋鎖的區(qū)別——線程間同步?

互斥鎖:互斥鎖就是可以拒絕另一個線程訪問臨界資源的一種鎖。會讓出CPU,可以通過互斥鎖保證串行訪問資源以保護(hù)這個臨界資源。是最簡單的線程間通信方法。

自旋鎖(spin_lock):拒絕另一個線程訪問臨界資源的一種鎖,不過與互斥鎖的實(shí)現(xiàn)原理不同。自旋鎖不會讓出CPU,是一種忙等待狀態(tài)。為了避免進(jìn)程或者線程上下文切片的開銷,不適合單核CPU。

讀寫鎖:是一種特殊的自旋鎖,準(zhǔn)許多個讀者同時訪問提高讀性能,不過寫操作則是互斥鎖,適合多讀少寫的情況,因?yàn)樽x取的時候不會改變臨界資源。

條件變量:條件變量本質(zhì)也是一個條件變量,它的功能是阻塞線程,直至接收到“條件成立”的信號后,被阻塞的線程才能繼續(xù)執(zhí)行。

相對復(fù)雜的線程同步方法。允許線程睡眠,直到滿足某種條件,當(dāng)滿足條件,發(fā)送信號通知喚醒。wait——》signal

例如:生產(chǎn)消費(fèi)關(guān)系會用到,緩沖區(qū)空或者滿。當(dāng)生產(chǎn)者生產(chǎn)一份數(shù)據(jù)的時候,喚醒可能等待的消費(fèi)者,

2.33 進(jìn)程間通信——進(jìn)程間通信同步方式?

信號量:

允許多個進(jìn)程同時訪問統(tǒng)一資源,描述信號量的結(jié)構(gòu)體,保存了兩個變量,一個是整型變量 value,另一個是進(jìn)程鏈表L,對信號量的操作只有P和V兩個原子操作。執(zhí)行P操作時,會先將value值減一,若此時 value小于零,則說明臨界資源暫時不可訪問,于是進(jìn)程會阻塞,否則順利訪問資源;執(zhí)行V操作時,會先將value值 加一,如果此時有進(jìn)程正在睡眠等待此信號量,則喚醒此進(jìn)程。。

  • 當(dāng)信號量初始值為 1 時,信號量等同于互斥鎖。
  • 當(dāng)信號量初始值為 0 時,代表是同步信號量,可以用于控制兩個進(jìn)程的前驅(qū)關(guān)系。

AND信號量機(jī)制:

如果進(jìn)程P和進(jìn)程Q都需要臨界資源A和臨界資源B才能工作,那么有可能造成P持有 A、Q持有B的情況,此時兩個進(jìn)程都在等待對方釋放資源,互相持有對方需要的臨界資源,形成死鎖。為了解決死鎖,進(jìn)程引入了AND信號量機(jī)制,就是指進(jìn)程需要的全部資源,要么全部分配給進(jìn)程,如果有任意一個資源無法分配,就將可以分配的那些資源也放棄,等價(jià)于將分配進(jìn)程所需資源這個操作原子化。

缺點(diǎn):用信號量實(shí)現(xiàn)進(jìn)程同步會造成系統(tǒng)大量P操作和V操作,效率較低。

管道:例如:匿名管道 :cat 文件 | grep ERROR,命名管道 mkfifo 命名

  1. 進(jìn)程將數(shù)據(jù)以先入先出的方式寫入緩沖區(qū),緩沖區(qū)可以看成是一個循環(huán)隊(duì)列
  2. 管道以半雙工的方式工作,一個進(jìn)程可以向管道中寫數(shù)據(jù)fd[1],另一個進(jìn)程可以從管道中讀數(shù)據(jù) fd[0],要想實(shí)現(xiàn)雙向通信,就必須使用兩個管道
  3. 匿名管道是存在與內(nèi)存中的特殊文件,只支持具有親緣關(guān)系的進(jìn)程間通信(數(shù)據(jù)讀寫涉及內(nèi)核態(tài)和 用戶態(tài)之間的數(shù)據(jù)拷貝);命名管道是存在與磁盤中類型為p的文件,支持非親緣關(guān)系進(jìn)程間通信(數(shù) 據(jù)讀寫涉及IO操作)
  4. 進(jìn)程的生命周期隨進(jìn)程本身,進(jìn)程銷毀則管道銷毀

優(yōu)點(diǎn):實(shí)現(xiàn)簡單

缺點(diǎn): 1、通信效率低,不適合進(jìn)程間頻繁通信,先入先出

? 2、通信格式只支持字節(jié)流數(shù)據(jù)。

消息隊(duì)列:

  1. 消息隊(duì)列是保存在內(nèi)核中的鏈表
  2. 鏈表節(jié)點(diǎn)是消息,消息有特定的格式和特定的優(yōu)先級(表示優(yōu)先級的整數(shù)、消息長度、消息本身)
  3. 消息隊(duì)列獨(dú)立于發(fā)送進(jìn)程和接收進(jìn)程,即使進(jìn)程終止也不會讓消息隊(duì)列和消息被刪除
  4. 通過消息隊(duì)列進(jìn)行通訊,可以不必遵循先入先出,而是根據(jù)自定義條件接受特定類型的消息
  5. 內(nèi)核有一個消息隊(duì)列數(shù)組,消息隊(duì)列數(shù)量不能超過消息隊(duì)列數(shù)組的容量
  6. 當(dāng)進(jìn)程A要向進(jìn)程B發(fā)送消息時,通過msgsnd命令向隊(duì)列中添加消息,進(jìn)程B通過msgrcv從消息隊(duì) 列中取出消息

優(yōu)點(diǎn):

  1. 適合進(jìn)程間頻繁通信,讀消息時可以不按照消息順序進(jìn)行讀取,而是根據(jù)自定義條件接收特定類型 的消息。
  2. 可以用序列化對數(shù)據(jù)進(jìn)行封裝
  3. 可以跨級進(jìn)程間通信,MQ

缺點(diǎn):

  1. 使用消息隊(duì)列進(jìn)行通信時,會有用戶態(tài)到內(nèi)核態(tài)之間數(shù)據(jù)拷貝的開銷(因?yàn)橄㈥?duì)列在內(nèi)核中,進(jìn) 程是在用戶態(tài),所以將數(shù)據(jù)寫入隊(duì)列時,會有一個從用戶態(tài)到內(nèi)核態(tài)的數(shù)據(jù)拷貝)。
  2. 不適合大數(shù)據(jù)傳輸(消息塊有大長度限制)
  3. 通信不及時

共享內(nèi)存:

  1. 原本不同進(jìn)程虛擬內(nèi)存映射的物理內(nèi)存是不同的,共享內(nèi)存將一段公共內(nèi)存區(qū)域映射到多個進(jìn)程的虛擬地址空間,進(jìn)程間通過寫入該共享內(nèi)存實(shí)現(xiàn)通信,避免用戶態(tài)到內(nèi)核態(tài)的數(shù)據(jù)拷貝。本質(zhì)上類似于同一進(jìn)程中多個線程的同步。
  2. 由于多個進(jìn)程都可以同時對共享內(nèi)存進(jìn)行讀寫,所以需要額外的同步機(jī)制防止讀寫不一致,常與信號量搭配使用

優(yōu)點(diǎn):避免了用戶態(tài)到內(nèi)核態(tài)的數(shù)據(jù)拷貝,直接對內(nèi)存進(jìn)行讀寫,是最快的進(jìn)程間通信。

缺點(diǎn):缺少進(jìn)程同步機(jī)制,多個進(jìn)程可能同時對共享內(nèi)存進(jìn)行寫入,造成數(shù)據(jù)不一致,需要用到互斥鎖或信號量。

信號(事件):

事件機(jī)制就是一個進(jìn)程完成任務(wù)后,發(fā)送信號主動喚醒另一個sleep的線程執(zhí)行任務(wù),沒有收到喚醒信號的線程就會處于sleep狀態(tài),也可以實(shí)現(xiàn)不同進(jìn)程中的線程間的同步。

僅起到通知作用沒有數(shù)據(jù)交流,不同信號使用不同的值,Linux通過kill -l 查看信號列表:比如Ctrl c 用的信號值是2.

在這里插入圖片描述
套接字:

跨網(wǎng)絡(luò)跨主機(jī)進(jìn)程間通信。TCP連接本質(zhì)上就是由兩個套接字組成的跨網(wǎng)絡(luò)進(jìn)程間通信。 傳輸層提供主機(jī)不同進(jìn)程之間通信。

套接字=IP(標(biāo)識主機(jī))+端口(標(biāo)識進(jìn)程)

套接字類型有3種:TCP字節(jié)流通信、UDP數(shù)據(jù)報(bào)通信、本地進(jìn)程間通信。

  • TCP字節(jié)流通信:監(jiān)聽套接字(監(jiān)聽)和已完成套接字(真正傳送數(shù)據(jù))
  • UDP數(shù)據(jù)報(bào)通信:每一個UDP套接字都需要bind
  • 本地進(jìn)程間通信套接字:套接字bind的是一個文件,可以支持字節(jié)流和數(shù)據(jù)報(bào)兩種協(xié)議,效率遠(yuǎn)大于 TCP、UDP

UnIx域套接字:可以用于單機(jī)進(jìn)程間通信,提供網(wǎng)絡(luò)套接字類似的功能,因?yàn)闊o需經(jīng)過完整的網(wǎng)絡(luò)協(xié)議棧所以在單機(jī)上從性能方面考慮的話優(yōu)先使用域套接字。

2.34 簡述無所數(shù)據(jù)結(jié)構(gòu)原理——CAS原理與無鎖技術(shù)?

大量使用鎖的弊端:

  • 墨菲定律:只要存在鎖一定會發(fā)生死鎖,而死鎖的定位也是很麻煩的,可能會要一個很嚴(yán)苛的環(huán)境,比如在一定的并發(fā)量下才會復(fù)現(xiàn)
  • 調(diào)度問題:當(dāng)?shù)蛢?yōu)先級線程持有鎖的時候會導(dǎo)致高優(yōu)先級線程無法執(zhí)行。
  • 性能問題:頻繁的加鎖解鎖對性能有一定影響
  • 鎖粒度:鎖粒度過小,死鎖概率增肌,鎖粒度過大的話導(dǎo)致性能問題

原子性:指一系列操作不能被中斷的特性,這一些列操作要么全部執(zhí)行,要不都不執(zhí)行,不存在部分執(zhí)行。

無鎖是一種樂觀的策略,它假設(shè)所有對資源的訪問都是沒有沖突的,因此所有線程都可以不用阻塞的持續(xù)執(zhí)行,一旦遇到?jīng)_突,無鎖采用CAS(Compare And Swap)來鑒別沖突,一旦檢測到?jīng)_突,則重試當(dāng)前操作直到?jīng)]有沖突為止。

CAS實(shí)際上是一個原子性的CPU指令。

具體思想:

CAS包含三個參數(shù)(內(nèi)存地址,舊值,新值)只有當(dāng)內(nèi)存地址取的值與舊值一致時,才會把內(nèi)存中的值更新為最新的值;若不等,則說明該值被其他線程修改了。每次CAS操作時,一定有一個線程會成功更新變量,而其他失敗的線程不會掛起,而是允許繼續(xù)重試,直到成功為止。
優(yōu)點(diǎn):

  1. 無鎖的方式?jīng)]有鎖競爭帶來的系統(tǒng)開銷,也沒有不同線程間頻繁調(diào)度的開銷,所以性能比鎖更優(yōu)越
  2. 對死鎖免疫

缺點(diǎn):

? 1 ABA問題
ABA問題是指在CAS操作時,其他線程將變量值A(chǔ)改為了B,但是又被改回了A,等到本線程使用期望值A(chǔ)與當(dāng)前變量進(jìn)行比較時,發(fā)現(xiàn)變量A沒有變,于是CAS就將A值進(jìn)行了交換操作,但是實(shí)際上該值已經(jīng)被其他線程改變過。
解決辦法: 在變量前面加上版本號,每次變量更新的時候變量的版本號都+1,即A->B->A就變成了1A->2B->3A。只要變量被某一線程修改過,變量對應(yīng)的版本號就會發(fā)生遞增變化,從而解決了ABA問題。
? 2 循環(huán)時間長開銷大

2.35 分布式鎖實(shí)現(xiàn)方式?——業(yè)界常見分布式鎖框架?

分布式部署的比如集群、微服務(wù)。服務(wù)節(jié)點(diǎn)之間需要通信的并且數(shù)據(jù)有強(qiáng)一致性要求和并發(fā)量要求。

方案:

1 redis 2 Zookeeoer 3 ETCD(自己查一下)

4 MySQL:用UNIQUE KEY 表級唯一,不能重復(fù)插入,通過MySQL保證同一個Key只有一個節(jié)點(diǎn)能插入成功,通過刪除記錄釋放鎖,存在單點(diǎn)問題。

Linux五種IO模型

阻塞式I/O
非阻塞式I/O
I/O復(fù)用(select,poll,epoll等)
信號驅(qū)動式I/O(SIGIO)
異步I/O(POSIX的aio_系列函數(shù))

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站題目:計(jì)算機(jī)基礎(chǔ)知識八股文(操作系統(tǒng)篇)-創(chuàng)新互聯(lián)
文章路徑:http://weahome.cn/article/jpdoo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部