fork()部分可能會問到的問題總結(持續更新)

2021-08-22 05:54:12 字數 4343 閱讀 2608

pcb是什麼,有什麼作用?

pcb是程序管理和控制的最重要的資料結構,每個程序均有乙個pcb,其中包含:

程序識別符號;

處理機的資訊(通用暫存器,指令計數器,使用者的棧指標);

程序排程資訊(程序狀態,程序優先順序,事件);

程序控制資訊(程式的資料的位址,程序同步和通訊機制);

系統是通過pcb來管理所有的程序;

記憶體的分頁管理,頁表是什麼?在程式中我們使用的是邏輯位址還是實體地址?引入虛擬記憶體後,對程式的執行會產生什麼樣的影響?

頁式記憶體管理是將虛擬記憶體和物理記憶體分為大小相同的頁,32位下頁的大小為4k。系統通過頁表來管理虛擬頁面到物理頁面的對映關係,通常頁表也分為多級頁表。就像圖書的目錄一樣分為一級目錄、二級目錄等。虛擬位址實際由頁面號和頁內偏移值兩部分組成mmu(記憶體管理單元)會分析虛擬位址,再查詢使用者程式對應的頁表(pgb-pmd-pet),準確定位該虛擬位址對於的物理頁面。

程式中使用的位址一般是邏輯位址,也成為虛擬位址;(程式在裝入記憶體之前,通常為邏輯位址形式,有時甚至在裝入記憶體之後,程式仍為相對位址形式。為了保證cpu執行程式指令時能正確訪問儲存記憶體單元,需要將使用者程式中的邏輯位址轉化為可以由機器直接定址的實體地址,這一過程稱為位址對映);

對於需要將程式一次性裝入記憶體才能執行的儲存管理方案來說,其缺點是明顯的。

當乙個參與併發執行的程序執行時,其整個程式必須都在記憶體;若程序的程式比記憶體可用空間還大,該程式將無法裝入記憶體執行。

程式被裝入記憶體後,便一直駐留在記憶體直至程式執行結束才釋放記憶體,這樣就會使一些需要盡快執行的作業無法被裝入執行,更嚴重的是,若程序因i/o而長期等待或程式暫時不執行的時候,它將一直占有記憶體資源,導致記憶體不能得到充分的利用;

虛擬記憶體將記憶體和外存結合起來,為使用者程式提供乙個容量遠大於物理儲存器的虛擬儲存空間,使用者程式可以先只裝入一部分就開始執行,以後根據執行1的具體情況再依次請求裝入剩下的部分,直至整個程式都執行完畢。這就從邏輯上擴充了記憶體;

在程式中malloc申請1g空間能不能成功?

malloc能夠申請的空間大小與物理記憶體的大小沒有直接關係,僅僅與程式的虛擬位址空間相關。程式執行時,堆空間只是程式向作業系統申請劃出來的一大塊虛擬位址空間。應用程式通過malloc申請空間,得到的是在虛擬位址空間中的位址,之後程式執行所提供的物理記憶體是由作業系統完成的;

分時系統的特點?時間片?併發和並行區別?

分時作業系統的工作方式:一台主機連線了若干個終端,每個終端有乙個使用者在使用。使用者互動式的向系統提出命令請求,系統接受每個使用者的命令,採用時間片輪轉方式處理服務請求,並通過互動方式在終端上向使用者顯示結果。使用者根據上步結果發出下道命令。分時作業系統將cpu的時間劃分成若干片段,稱為時間片。作業系統以時間片為單位,輪流為每個終端使用者服務。每個使用者輪流使用乙個時間片而使每個使用者並不感到有別的使用者存在。

分時系統具有多路性:有多個使用者使用一台計算機,巨集觀上看是多個人同時使用乙個cpu,微觀上是多個人在不同時刻輪流使用cpu。

互動性:使用者根據系統響應結果進一步提出新請求

獨占性:使用者感覺不到計算機為其他人服務

及時性:系統對使用者提出的請求及時響應

並行:可以同時做多件事;

併發:一次處理很多事情;

根據底層是否有多處理器,併發與並行是可以等效的,這並不是兩個互斥的概念。

產生僵死程序的條件?如何避免?

如果子程序先於父程序退出,同時父程序又沒有呼叫wait/waitpid,則該子程序將成為僵死程序;(通過ps命令,我們可以看程序狀態);

一般情況下我們可以建立乙個捕獲sigchild訊號的訊號處理函式,在函式體中呼叫wait(或waitpid),就可以清理退出的子程序以達到防止殭屍程序的目的;

void sig_chld( int signo )

int main()

但是有特殊情況上述方法並不能解決:

假設有乙個client/sever從程式,對於每乙個連線的client,sever都啟動乙個新的程序去處理client的請求。在client中,發起了多個到sever的請求,sever會fork5個子程序來讀取client輸入並處理;當我們終止這個client程序的時候,核心將自動關閉所有由client開啟的套接字。那麼由這個client程序發起的5個連線基本在同一時刻終止,這就引發了5個fin,sever端接收到這5個fin的時候,5個子程序基本在同一時刻終止,這又導致差不多在同一時刻遞交5個sigchld訊號給父程序;

通過測試可以發現剩下了2個殭屍程序,所以建立訊號處理函式並在其中呼叫wait並不足以防止出現殭屍程序。其原因在於:所有5個訊號都在訊號處理函式執行之前產生,而訊號處理函式只執行一次。

正確的解決辦法是呼叫waitpid而不是wait,這個辦法的方法為:訊號處理函式中,在乙個迴圈內呼叫waitpid,以獲取所有以終止子程序狀態。我們必須指定wnohang選項,他告知waitpid在有尚未終止的子程序在執行時不要阻塞。(我們不能在迴圈內部呼叫wait,因為沒有辦法防止wait在尚有未終止的子程序在執行時阻塞,wait將會阻塞到現有的子程序中第乙個終止為止);

寫時拷貝技術及其實現?

描述:可以推遲甚至免除拷貝資料。核心此時並不複製整個程序位址空間,而是讓父程序和子程序共享乙個拷貝。只有在需要寫入的時候,資料才會被複製,從而使各個程序擁有各自的拷貝。也就是說,資源的複製只有在需要寫入的時候才進行,在此之前,只是以唯讀方式共享。這種優化可以避免拷貝大量根本就不會被使用的資料;

虛擬位址空間的拷貝是在函式copy_mm中完成的;

父子程序中的變數n的實體地址是不是在同一塊記憶體空間上?

在。這個一樣的位址是線性位址,每個程序的相同的線性位址都可以對映到不同的實體地址上。在fork的時候,子程序從父程序copy了task_struct結構,其中task_struct裡的mm就是線性位址的使用情況,mm也會被copy給子程序,所以在fork之前宣告的變數,在fork後在父程序和子程序裡的線性位址是一樣的。

檔案描述符?為什麼父程序開啟檔案,在執行fork後,在子程序中能夠繼續使用?

檔案描述符:相當於乙個邏輯控制代碼,(而open,close等函式則是將檔案或者物理裝置與控制代碼相關聯),控制代碼是乙個整數,可以理解為程序特定的檔案描述符表的索引;

檔案描述符表:使用者區的一部分,除非通過使用檔案描述符函式,否則程式無法對其進行訪問。對程序中每個開啟的檔案,檔案描述符表都包含乙個條目;

系統檔案表:為系統中所有的程序共享。對每個活動的open,它都包含乙個條目。每個系統檔案表的條目都包含檔案偏移量、訪問模式以及指向它的檔案描述符表的條目計數;

記憶體索引節點表:對系統中的每個活動的檔案,記憶體中索引節點表都包含乙個條目。幾個系統檔案表條目可能對應於同乙個記憶體索引節點表;

在fork()之前開啟的檔案,子程序都會繼承,與父程序共享相同的檔案偏移量;

在fork()之後開啟,這時父子程序關於檔案的檔案描述符表指向不同的系統檔案表條目,也不再共享檔案偏移量(fork以後兩個程序分別open,在系統檔案表中建立2個條目);

替換程序的過程?execl  execlp   execle   execv   execvp  execve

獲取命令列;

解析命令列;

建立乙個子程序(fork);

替換子程序;

父程序等待子程序退出(wait);

當程序呼叫一種exec函式時,該程序的使用者空間**和資料完全被新程序替換,從新程式的啟動例程(main函式)開始執行;

呼叫exec並不建立新程序,所以id並未改變。exec只是磁碟上的乙個新程式替換了當前程序的正文段、資料段、堆段和棧段;

l(list):表示引數採用列表;

v(vector):引數用陣列;

p(path):自動搜尋環境變數path;

e(env):自己維護環境變數;

守護程序的程式設計流程

在父程序中執行fork並exit退出;

在子程序中呼叫setsid函式建立新的會話;

在子程序中呼叫chdir函式,讓根目錄「/」成為子程序的工作目錄;

在子程序中呼叫unmask函式,設定程序的uumask為0;

在子程序中關閉任何不需要的檔案描述符;

如果父程序有三個執行緒,在某個執行緒中執行了fork之後,那麼子程序會有幾個執行緒?如果執行緒中使用了互斥鎖,那它在子程序中互斥鎖的狀態是什麼樣子?和父程序是不是同乙個鎖?

在多執行緒程式中,在「自身以外的執行緒存在的狀態」下一使用fork的話,就可能引起各種各樣的問題。比較典型的例子就是:fork出來的子程序可能會死鎖;

一般,fork做如下事情:

父程序的記憶體資料會原封不動的拷貝到子程序中;

子程序在但執行緒狀態下被生成;

父程序即使存在多個執行緒,他們也不會被繼承到子程序中;

CSS面試可能會問到的問題

更多flex布局參考 更多的相容參考鏈結 當乙個元素的visibility屬性被設定成collapse值後,對於一般的元素,它的表現跟hidden是一樣的。自動變成display block,因此,可以直接設定浮動元素的寬高 通過 查詢可以為不同大小和尺寸的 定義不同的css,適應相應的裝置的顯示。...

Vue介紹(面試可能會問到)。

什麼是mvvm m model資料層 v viewdom層 vm view model處理資料介面的中間層,指vue vue是什麼?vue是js的mvvm庫,只關注檢視層,以資料為驅動,vue將自身和dom進行繫結,dom與資料同步變化。它有什麼特點 1 簡潔 html json資料 vue例項組成...

Mysql面試可能會問到的基礎知識

mysql如何保證和監控主從資料一致性的 5.6 gtid複製,5.7 無損半同步複製 rpl semi sync master wait point after sync pt table checksum監控主從資料一致性 mysql如何監控和減少主從延遲的 5.5的單執行緒複製 5.6的多庫複...