進(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)信息:
線程:
線程是任務(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)程之間的虛擬地址空間是不同的,所以要先切換頁表,清空快表緩存。 切換內(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)行。
非搶占式:進(jìn)程獲得CPU資源后,一直運(yùn)行直到進(jìn)程結(jié)束或阻塞才釋放CPU使用權(quán)。
搶占式:操作系統(tǒng)可以在進(jìn)程執(zhí)行時剝奪CPU,分配給其他進(jìn)程使用。 典型的有:優(yōu)先級原則、短進(jìn)程優(yōu)先原則、時間片原則
進(jìn)程調(diào)度算法:
孤兒進(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)程.
進(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ù)以及總時間。)
2.13 如何從用戶態(tài)進(jìn)入內(nèi)核態(tài)簡單來說有下面幾點(diǎn):
- 保存用戶態(tài)現(xiàn)場
- 復(fù)制用戶態(tài)參數(shù)并且校驗(yàn)
- 執(zhí)行內(nèi)核態(tài)代碼
- 復(fù)制執(zhí)行結(jié)果
- 恢復(fù)用戶態(tài)現(xiàn)場
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)頁號、頁內(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í)行淘汰頁的備份
頁面置換時機(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)鏈表+哈希表=哈希鏈表:
查找快, 可以想到哈希表, 但是哈希表是亂序的;有序, 可以想到鏈表, 鏈表插入、和刪除都很快, 但是查詢是O(n);集合一下就是哈希鏈表: , 結(jié)構(gòu)如下:
借助上圖結(jié)構(gòu), 分析上面的三個條件:
涉及到鏈表的刪除操作, 因?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):掃描算法既考慮了距離,又考慮了方向
死鎖就是多個進(jìn)程間彼此持有對方需要的資源,但又在等待對方釋放自己需要的資源的狀態(tài)。
2.28 為什么產(chǎ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):
(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ā)度
無鎖/偏向鎖/輕量級鎖/重量級鎖:
(不放棄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 命名
優(yōu)點(diǎn):實(shí)現(xiàn)簡單
缺點(diǎn): 1、通信效率低,不適合進(jìn)程間頻繁通信,先入先出
? 2、通信格式只支持字節(jié)流數(shù)據(jù)。
消息隊(duì)列:
優(yōu)點(diǎn):
缺點(diǎn):
共享內(nèi)存:
優(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)程間通信。
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ù)?大量使用鎖的弊端:
原子性:指一系列操作不能被中斷的特性,這一些列操作要么全部執(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):
缺點(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)時間長開銷大
分布式部署的比如集群、微服務(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)查看詳情吧