一、簡單說下你對併發和並行的理解?算法
二、同步、異步、阻塞、非阻塞的概念數組
同步:當一個同步調用發出後,調用者要一直等待返回結果。通知後,才能進行後續的執行。
異步:當一個異步過程調用發出後,調用者不能馬上獲得返回結果。實際處理這個調用的部件在完成後,經過狀態、通知和回調來通知調用者。
阻塞:是指調用結果返回前,當前線程會被掛起,即阻塞。安全
非阻塞:是指即便調用結果沒返回,也不會阻塞當前線程。併發
進程:進程是系統進行資源分配和調度的一個獨立單位,是系統中的併發執行的單位。異步
線程:線程是進程的一個實體,也是 CPU 調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位,有時又被稱爲輕權進程或輕量級進程。函數
四、進程與線程的區別?高併發
1. 進程是資源分配的最小單位,而線程是 CPU 調度的最小單位;性能
2. 建立進程或撤銷進程,系統都要爲之分配或回收資源,操做系統開銷遠大於建立或撤銷線程時的開銷;
3. 不一樣進程地址空間相互獨立,同一進程內的線程共享同一地址空間。一個進程的線程在另外一個進程內是不可見的;測試
4. 進程間不會相互影響,而一個線程掛掉將可能致使整個進程掛掉;spa
五、爲何有了進程,還要有線程呢?
進程可使多個程序併發執行,以提升資源的利用率和系統的吞吐量,可是其帶來了一些缺點:
1. 進程在同一時間只能幹一件事情;
2. 進程在執行的過程當中若是阻塞,整個進程就會被掛起,即便進程中有些工做不依賴與等待的資源,仍然不會執行。
基於以上的缺點,操做系統引入了比進程粒度更小的線程,做爲併發執行的基本單位,從而減小程序在併發執行時所付出的時間和空間開銷,提升併發性能。
1. 就緒 —> 執行:對就緒狀態的進程,當進程調度程序按一種選定的策略從中選中一個就緒進程,爲之分配了處理機後,該進程便由就緒狀態變爲執行狀態;
2. 執行 —> 阻塞:正在執行的進程因發生某等待事件而沒法執行,則進程由執行狀態變爲阻塞狀態,如進程提出輸入/輸出請求而變成等待外部設備傳輸信息的狀態,進程申請資源(主存空間或外部設備)得不到知足時變成等待資源狀態,進程運行中出現了故障(程序出錯或主存儲器讀寫錯等)變成等待干預狀態等等;
3. 阻塞 —> 就緒:處於阻塞狀態的進程,在其等待的事件已經發生,如輸入/輸出完成,資源獲得知足或錯誤處理完畢時,處於等待狀態的進程並不立刻轉入執行狀態,而是先轉入就緒狀態,而後再由系統進程調度程序在適當的時候將該進程轉爲執行狀態;
4. 執行 —> 就緒:正在執行的進程,因時間片用完而被暫停執行,或在採用搶先式優先級調度算法的系統中,當有更高優先級的進程要運行而被迫讓出處理機時,該進程便由執行狀態轉變爲就緒狀態。
七、進程間的通訊方式有哪些?
進程間通訊(IPC,InterProcess Communication)是指在不一樣進程之間傳播或交換信息。IPC 的方式一般有管道(包括無名管道和命名管道)、消息隊列、信號量、共享存儲、Socket、Streams 等。其中 Socket 和 Streams 支持不一樣主機上的兩個進程 IPC。
2. 它只能用於父子進程或者兄弟進程之間的進程的通訊;
3. 它能夠當作是一種特殊的文件,對於它的讀寫也可使用普通的 read、write 等函數。可是它不是普通的文件,並不屬於其餘任何文件系統,而且只存在於內存中。
2. FIFO 有路徑名與之相關聯,它以一種特殊設備文件形式存在於文件系統中。
3. 消息隊列獨立於發送與接收進程。進程終止時,消息隊列及其內容並不會被刪除;
4. 消息隊列能夠實現消息的隨機查詢,消息不必定要以先進先出的次序讀取,也能夠按消息的類型讀取。
1. 信號量(semaphore)是一個計數器。用於實現進程間的互斥與同步,而不是用於存儲進程間通訊數據;
2. 信號量用於進程間同步,若要在進程間傳遞數據須要結合共享內存;
3. 信號量基於操做系統的 PV 操做,程序對信號量的操做都是原子操做;
4. 每次對信號量的 PV 操做不只限於對信號量值加 1 或減 1,並且能夠加減任意正整數;
5. 支持信號量組。
八、進程的調度算法有哪些?
調度算法是指:根據系統的資源分配策略所規定的資源分配算法。經常使用的調度算法有:先來先服務調度算法、時間片輪轉調度法、短做業優先調度算法、最短剩餘時間優先、高響應比優先調度算法、優先級調度算法等等。
先來先服務調度算法是一種最簡單的調度算法,也稱爲先進先出或嚴格排隊方案。當每一個進程就緒後,它加入就緒隊列。當前正運行的進程中止執行,選擇在就緒隊列中存在時間最長的進程運行。該算法既能夠用於做業調度,也能夠用於進程調度。先來先去服務比較適合於常做業(進程),而不利於段做業(進程)。
時間片輪轉調度算法主要適用於分時系統。在這種算法中,系統將全部就緒進程按到達時間的前後次序排成一個隊列,進程調度程序老是選擇就緒隊列中第一個進程執行,即先來先服務的原則,但僅能運行一個時間片。
短做業優先調度算法是指對短做業優先調度的算法,從後備隊列中選擇一個或若干個估計運行時間最短的做業,將它們調入內存運行。 短做業優先調度算法是一個非搶佔策略,他的原則是下一次選擇預計處理時間最短的進程,所以短進程將會越過長做業,跳至隊列頭。
最短剩餘時間是針對最短進程優先增長了搶佔機制的版本。在這種狀況下,進程調度老是選擇預期剩餘時間最短的進程。當一個進程加入到就緒隊列時,他可能比當前運行的進程具備更短的剩餘時間,所以只要新進程就緒,調度程序就能可能搶佔當前正在運行的進程。像最短進程優先同樣,調度程序正在執行選擇函數是必須有關於處理時間的估計,而且存在長進程飢餓的危險。
高響應比優先調度算法主要用於做業調度,該算法是對 先來先服務調度算法和短做業優先調度算法的一種綜合平衡,同時考慮每一個做業的等待時間和估計的運行時間。在每次進行做業調度時,先計算後備做業隊列中每一個做業的響應比,從中選出響應比最高的做業投入運行。
優先級調度算法每次從後備做業隊列中選擇優先級最髙的一個或幾個做業,將它們調入內存,分配必要的資源,建立進程並放入就緒隊列。在進程調度中,優先級調度算法每次從就緒隊列中選擇優先級最高的進程,將處理機分配給它,使之投入運行。
九、什麼是死鎖?
死鎖,是指多個進程在運行過程當中因爭奪資源而形成的一種僵局,當進程處於這種僵持狀態時,若無外力做用,它們都將沒法再向前推動。 以下圖所示:若是此時有一個線程 A,已經持有了鎖 A,可是試圖獲取鎖 B,線程 B 持有鎖 B,而試圖獲取鎖 A,這種狀況下就會產生死鎖。
十、產生死鎖的緣由?
因爲系統中存在一些不可剝奪資源,而當兩個或兩個以上進程佔有自身資源,並請求對方資源時,會致使每一個進程都沒法向前推動,這就是死鎖。
競爭資源
例如:系統中只有一臺打印機,可供進程 A 使用,假定 A 已佔用了打印機,若 B 繼續要求打印機打印將被阻塞。
系統中的資源能夠分爲兩類:
2. 不可剝奪資源,當系統把這類資源分配給某進程後,再不能強行收回,只能在進程用完後自行釋放,如磁帶機、打印機等。
例如:進程 A 和 進程 B 互相等待對方的數據。
十一、死鎖產生的必要條件?
1. 互斥條件:進程要求對所分配的資源進行排它性控制,即在一段時間內某資源僅爲一進程所佔用。
2. 請求和保持條件:當進程因請求資源而阻塞時,對已得到的資源保持不放。
3. 不剝奪條件:進程已得到的資源在未使用完以前,不能剝奪,只能在使用完時由本身釋放。
4. 環路等待條件:在發生死鎖時,必然存在一個進程--資源的環形鏈。
十二、解決死鎖的基本方法?
1. 預防死鎖
2. 避免死鎖
3. 檢測死鎖
4. 解除死鎖
1三、怎麼預防死鎖?
1. 破壞請求條件:一次性分配全部資源,這樣就不會再有請求了;
2. 破壞請保持條件:只要有一個資源得不到分配,也不給這個進程分配其餘的資源:
3. 破壞不可剝奪條件:當某進程得到了部分資源,但得不到其它資源,則釋放已佔有的資源;
4. 破壞環路等待條件:系統給每類資源賦予一個編號,每個進程按編號遞增的順序請求資源,釋放則相反。
1四、怎麼避免死鎖?
當進程首次申請資源時,要測試該進程對資源的最大需求量,若是系統現存的資源能夠知足它的最大需求量則按當前的申請量分配資源,不然就推遲分配。
當進程在執行中繼續申請資源時,先測試該進程已佔用的資源數與本次申請資源數之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源。若沒超過則再測試系統現存的資源可否知足該進程尚需的最大資源量,若知足則按當前的申請量分配資源,不然也要推遲分配。
是指系統能按某種進程推動順序(P1, P2, P3, ..., Pn),爲每一個進程 Pi 分配其所須要的資源,直至知足每一個進程對資源的最大需求,使每一個進程均可以順序地完成。這種推動順序就叫安全序列【銀行家算法的核心就是找到一個安全序列】。
若是系統能找到一個安全序列,就稱系統處於安全狀態,不然,就稱系統處於不安全狀態。
1五、怎麼解除死鎖?
1. 資源剝奪:掛起某些死鎖進程,並搶佔它的資源,將這些資源分配給其餘死鎖進程(但應該防止被掛起的進程長時間得不到資源);
2. 撤銷進程:強制撤銷部分、甚至所有死鎖進程並剝奪這些進程的資源(撤銷的原則能夠按進程優先級和撤銷進程代價的高低進行);
3. 進程回退:讓一個或多個進程回退到足以免死鎖的地步。進程回退時自願釋放資源而不是被剝奪。要求系統保持進程的歷史信息,設置還原點。
1六、什麼是緩衝區溢出?有什麼危害?
緩衝區爲暫時置放輸出或輸入資料的內存。緩衝區溢出是指當計算機向緩衝區填充數據時超出了緩衝區自己的容量,溢出的數據覆蓋在合法數據上。形成緩衝區溢出的主要緣由是程序中沒有仔細檢查用戶輸入是否合理。計算機中,緩衝區溢出會形成的危害主要有如下兩點:程序崩潰致使拒絕服務和跳轉而且執行一段惡意代碼。
1九、頁面置換算法有哪些?
請求調頁,也稱按需調頁,即對不在內存中的「頁」,當進程執行時要用時才調入,不然有可能到程序結束時也不會調入。而內存中給頁面留的位置是有限的,在內存中以幀爲單位放置頁面。爲了防止請求調頁的過程出現過多的內存頁面錯誤(即須要的頁面當前不在內存中,須要從硬盤中讀數據,也即須要作頁面的替換)而使得程序執行效率降低,咱們須要設計一些頁面置換算法,頁面按照這些算法進行相互替換時,能夠儘可能達到較低的錯誤率。經常使用的頁面置換算法以下:
先進先出,即淘汰最先調入的頁面。
選將來最遠將使用的頁淘汰,是一種最優的方案,能夠證實缺頁數最小。
即選擇最近最久未使用的頁面予以淘汰
時鐘置換算法也叫最近未用算法 NRU(Not RecentlyUsed)。該算法爲每一個頁面設置一位訪問位,將內存中的全部頁面都經過連接指針鏈成一個循環隊列。
20、談談你對動態連接庫和靜態連接庫的理解?
靜態連接就是在編譯連接時直接將須要的執行代碼拷貝到調用處,優勢就是在程序發佈的時候就不須要的依賴庫,也就是再也不須要帶着庫一塊發佈,程序能夠獨立執行,可是體積可能會相對大一些。
動態連接就是在編譯的時候不直接拷貝可執行代碼,而是經過記錄一系列符號和參數,在程序運行或加載時將這些信息傳遞給操做系統,操做系統負責將須要的動態庫加載到內存中,而後程序在運行到指定的代碼時,去共享執行內存中已經加載的動態庫可執行代碼,最終達到運行時鏈接的目的。優勢是多個程序能夠共享同一段代碼,而不須要在磁盤上存儲多個拷貝,缺點是因爲是運行時加載,可能會影響程序的前期執行性能。