計算機等級考試四級 網絡工程師 之 操作系統原理1 適合懶人備考哈哈哈

第一題

1 操作系統的結構:早期操作系統是無結構的,也有人把它稱爲 整體系統結構;模塊化結構;分層式結構; 微內核結構。
2 編譯高級語言編寫的程序不是操作系統所具有的功能。操作系統是管理和控制計算機硬件與軟件資源的計算機程序。
3 現代操作系統最基本的特徵是 併發性。現代操作系統基本特徵是併發、共享、虛擬和異步,其中併發性是最基本的特性。
4 若一個單核處理機的系統中有多個進程存在,則這些進程是 併發運行的。不是並行運行的。
5 採用多道程序設計技術,能有效地提高系統的 併發性。
6 在計算機中配置操作系統的主要目的是 提高計算機系統資源的利用率。
7 計算機系統的資源分爲 硬件資源和軟件資源,軟件資源由 程序和數據組成。
8 從計算機應用角度來看,操作系統的主要作用是提供 人機交互接口 (系統軟件)。
9 從軟件設計和開發角度來看,操作系統的主要作用是提供 軟件開發基礎平臺
10 從計算機安全保護角度來看,操作系統的主要作用是提供 第一道安全防線
11 從計算機系統發展角度來看,操作系統的主要作用是提供 虛擬機和擴展機
12 操作系統作爲系統軟件,位於軟件系統的哪一個層面? 硬件之上,支撐軟件之下。
13 計算機系統中,操作系統作爲系統軟件集中了下列哪兩類主要功能? 資源管理和控制程序執行
14 操作系統能夠“合理”地組織計算機工作流程、控制程序的執行,其中“合理”是指 公平對待不同用戶程序,不發生死鎖和飢餓。
15 在操作系統中建立了用於記錄各種軟硬件資源信息的數據結構,該數據結構的用途是 瞭解用戶需求和當前資源使用情況,對資源進行有效組織、管理。
16 隨機性是操作系統的特徵之一,哪種現象具有“隨機性”? 操作系統內核進行進程切換這一現象具有隨機性。
17 併發性是操作系統的特徵之一,哪種現象具有“併發性”? 在單處理器環境下,兩個程序交替在 CPU 上運行。易錯項:在多處理器環境下,兩個程序在兩個 CPU 上同時運行。此項顯然不是併發性。

第二題

1 在不同類型的操作系統中,批處理操作系統的缺點是 缺少交互性。
2 在操作系統的結構設計中,微內核結構表示的是 客戶機/ 服務器結構。
3 組成操作系統的主要部分通常是進程線程管理(處理機管理)、內存管理(存儲管理)、設備管理和 文件管理。還有作業管理。
4 操作系統作爲系統軟件,爲用戶提供了高效使用計算機的接口。
5 共享性是操作系統的特徵之一,計算機中的各類設備在操作系統管理下實現共享CPU 、硬盤、內存 可以被 同時 共享。 打印機、 磁帶機、投影儀和掃描儀 只能互斥共享 。打印機、磁帶機、投影儀和掃描儀 不能被搶佔,CPU 、硬盤、內存可以被搶佔。
6可以同時共享的軟件資源:可重入代碼 、SPOOLing 系統 、log ()函數子程序。不可以同時共享的軟件資源: 臨界區 、 中斷服務程序 、 內核調度模塊 、 內存分配模塊 。
7 併發性是操作系統的特徵之一,所謂“併發性”是指 進程在宏觀上是同時運行,而在微觀上是交替運行。
8 共享性是操作系統的特徵之一,所謂“共享性”是指 在一定的策略控制下,按不同資源類型共同佔有使用。
9 隨機性是操作系統的特徵之一,所謂“隨機性”是指 操作系統不能對所運行程序的行爲以及硬件設備的情況做出任何事先的假定。
10 哪一個狀態位不包含在程序狀態字(PSW)中? 駐留位(A) )。
11 哪一項寄存器組都是用戶可見寄存器? 數據寄存器、地址寄存器、條件碼寄存器

第三題

1 用戶態下只能使用非特權指令,內核態下可以使用所有制令,特權指令只能在內核態下運行。屬於特權指令的有: 屏蔽中斷 、 關中斷指令。
2 用戶程序在用戶態下使用特權指令而引起的中斷是 訪管中斷 。是 訪管中斷是 CPU 由用戶態向核心態轉換的方法 。
3 用戶應用程序不屬於操作系統內核程序。屬於操作系統內核程序的有進程調度程序、中斷服務程序、設備驅動程序。
4 中斷服務程序是固定在某個地址的代碼段,不能作爲進程來管理。
5 用戶編程需要打印輸出,使用操作系統提供的 系統調用 write()。
6 操作系統提供給用戶的接口是 命令輸入和系統調用。
7 當用戶程序需要調用操作系統所提供的文件讀寫功能時,該功能首先執行的指令是 訪管指令。訪管中斷由訪管指令產生,程序員使用訪管指令向操作系統請求服務。
8 內核態和用戶態是用於操作系統運行安全而設置的一種狀態標誌,其含義是指 CPU 在運行時所處的狀態。不是操作系統。
9 在操作系統中,只能在內核態下運行的指令(特權指令)是 屏蔽中斷 、 關中斷指令。
10 操作系統需要處理器從內核態轉爲用戶態時,採用的是 修改程序狀態字。 訪管中斷是 CPU由用戶態向核心態轉換的方法 。
11 在操作系統中,既可以在內核態下運行又可以在用戶態下運行的指令是 置移位方向標誌。
12 處理器中對用戶可見的寄存器 包括:數據寄存器、地址寄存器以及條件碼寄存器。
13 不包含在程序狀態字(PSW)中的標誌位有: 保護位(P) ) 、 修改位(M) ) 、 訪問位(R) ) 、駐留位(A) )。
14 中斷是由外部事件引發的,而異常則是由正在執行的指令引發的。屬於中斷的事件有: 用戶按鼠標左鍵;屬於異常的事件有:執行訪管指令、進程打開文件時出錯、程序對只讀內存執行寫指令。

第四題

1 引入中斷技術可以使計算機的運行效率得到提高,中斷優先級對中斷響應順序產生影響。
2 指令錯不屬於 I/O 中斷的事件。 3 用戶編寫程序時調用 fork()創建進程,其使用的是操作系統提供給用戶系統調用接口。
4 當用戶在終端窗口通過輸入命令來控制計算機運行時,使用的是操作系統的命令行接口。
5 用戶程序需要關閉中斷響應(執行特權指令),他必須首先發起訪管中斷。
6 計算機操作系統位於核心態時,它既可運行特權指令,也可以運行任何非特權指令。
7 中斷處理程序的入口地址一般存放在中斷向量表中。
8 外部 I/O 設備向處理器發出的中斷信號又稱爲中斷請求。
9 中斷是由外部事件引發的,而異常則是由正在執行的指令引發的。 屬於中斷的事件有:用戶按鼠標左鍵、用戶敲擊鍵盤、網卡上數據緩衝區滿、系統掉電、 控制檯出現故障、完成寫硬盤操作、時鐘中斷、控制檯命令、存儲器校驗錯、定時器計時結 束; 屬於異常的事件有:被零除、運行過程中執行了除零操作、算術溢出、內存保護出錯、程 序執行時所訪問的變量不在內存、執行訪管指令、目態程序試圖執行特權指令、進程打開文 件時出錯、程序對只讀內存執行寫指令。 10 進程運行時,當運行中的進程不希望被外部事件打擾時,可以採用屏蔽中斷。
11 程序性中斷與當前運行的進程有關。
12 中斷源是指引起中斷的那些事件。
13 中斷請求是指中斷控制器向處理器發出的信號。
14 中斷響應是指處理器暫停當前程序,轉而進入中斷處理程序。
15 中斷斷點是指正在運行的程序的暫停點。
16 將一個整型變量轉換爲浮點數變量(用戶程序變量類型轉換)不屬於系統調用。
17 系統調用時,調用程序和被調用程序位於不同狀態;一般過程調用只需要在用戶態就能 完成。

第五題

1 操作系統提供給用戶用於應用程序編程的唯一接口是 系統調用 (程序接口)。
2 在屏幕上畫出一個紅色的圓,需要使用 系統調用顯示屏的驅動程序。
3 用戶進程從用戶態轉變爲內核態時,使用的指令是 訪管指令。從內核態轉爲用戶態時,採用的是 修改程序狀態字。
4 在用戶態或內核態下執行的指令(非特權指令):算術運算指令、關機、讀文件、設置時間、讀時鐘指令、取數指令、移位指令、 置移位方向標誌(既可以在內核態下運行又可以在用戶態下運行)。
只能在內核態下執行的指令(特權指令):屏蔽中斷、關中斷指令、置程序計數器、清指令寄存器、設置控制寄存器指令、切換棧指針指令。
5 關於操作系統的結構, “ 清晰的單向依賴和單向調用性 ” 不是微內核結構的特點。
6 若用戶數爲 100,爲保證響應時間≤100ms;則時間片設置爲 100ms/100=1ms。
7 用戶需要動態請求和釋放系統資源,在用戶程序中所使用的方法是通過 系統調用。
8 調用程序多次嵌套與遞歸是 系統調用無法實現的功能。
9 函數 open 是 文件操作類系統調用。
10 函數 fork 是 進程控制類 系統調用。
11 用戶進程在實現 系統調用時, 通過變量傳遞不能用於傳遞參數。
12 系統調用時調用程序位於用戶態,被調用程序位於核心態。 一般過程調用只需要在用戶態就能完成。
13 系統調用時需要通過陷入機制(訪管指令使用系統調用),從用戶態的調用程序轉到核心態的被調用程序。
14 過程調用和系統調用均可以嵌套使用。
15 過程調用直接返回到調用程序, 系統調用在返回到調用程序前先運行調度程序。
16 不屬於系統調用: 查找數據庫中的某個學生信息不屬於系統調用,它是對數據庫應用系統的調用; 將成績填入學生成績數據庫不屬於系統調用,它是對數據庫應用系統的調用; 查找數組中的最大數不屬於系統調用,屬於一般過程調用;將一個整型 變量轉換爲浮點數變量(用戶程序變量類型轉換)不屬於系統調用。屬於系統調用:用戶程序創建一個新進程(fork)或用戶程序終止一個進程(exit)或用戶程序需要獲得當前進程的屬性或用戶程序需要將本進程休眠或進程通過共享內存交換數據屬於 進程控制方面的系統調用;一個進程向另一個進程發送消息屬於 進程通信方面的系統調用;關閉一個打開的文件(close)或打開磁盤上的一個文件(open)或讀寫(read、write)硬盤上一個打開的文件或在硬盤上創建一個公共目錄屬於 文件操作方面的系統調用;對臨界區加互斥鎖屬於 信號量方面的系統調用;請求使用光盤驅動器屬於 設備管理類系統調用。
17 線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如 程序計數器、 寄存器和棧)

第六題

1 與進程具有一一對應關係的是 進程控制塊 (PCB) )。
2 在多道程序設計系統中,能並行工作的是 CPU 與外部設備。
3 多道程序設計的意義是 宏觀上有多個進程在計算機中同時運行。 多道程序技術運行的特徵:多道、宏觀上並行、微觀上串行。
4 進程調度所需的信息-- 進程優先級–是存放在 進程控制塊(PCB) )。
5 從靜態的角度看, 進程控制塊(PCB )是進程必須擁有而程序所沒有的。
6 進程優先級是位於進程控制塊中而不是位於進程中。
7 多道程序設計技術使得進程能夠併發運行,相比單道程序運行,併發運行的多道程序不再具有 可再現性。
8 計算機操作系統中,所謂進程的唯一"標誌"是指 進程控制塊(PCB) )。
9 進程控制塊的基本內容有: 進程標識符、進程調度狀態、進程相應的程序和數據地址、進程優先級、CPU 現場保護區、進程同步與通信機制、進程所在隊列文件句柄、與進程有關的其他信息。 進程的用戶棧不保存在進程控制塊中。
10 所謂“可再入程序”是指“ 純代碼程序,運行中不需要修改”的程序。
11 進程控制塊(PCB)的組織方式主要有三種: 線性方法、索引方法、鏈接方法。沒有 B+樹方法。
12 進程控制塊(PCB)的內容一般可以分成調度信息和現場信息兩大部分, 現場信息包括:程序狀態字、時鐘 信息 、界地址寄存器等;調度信息包括:進程名、進程號、存儲信息、優先級、當前狀態、資源清單、“家族”關係、消息隊列指針等。
13 進程的實質是程序在多道程序系統中的一次執行過程。進程具有 併發性、動態性、獨立性 和異步性 。進程的“併發性”是指 宏觀上,不同的進程可以一起向前推進。進程的“動態性”是指 進程是動態產生、 動態變化 、動態消亡的。進程的“獨立性”是指 一個進程是一個相對完整的資源分配單位。進程的“異步性”是指 每個進程按照各自獨立的、不可預知的速度向前推進。
14 多道程序設計的含義是指 允許多個程序同時進入內存並運行

第七題

1 某個進程由多個線程組成,其中一個線程被調度程序選中投入運行,其他的線程有的位於就緒隊列,有的被阻塞,則此時該進程的狀態是 運行狀態。運行中的進程可以具有以下三種基本狀態。
1) 就緒狀態:進程已獲得除處理器外的所需資源,等待分配處理器資源;只要分配了處理器進程就可執行。
2) 運行狀態:進程佔用處理器資源;處於此狀態的進程的數目小於等於處理器的數目。
3) 阻塞狀態:由於進程等待某種條件(如 I/O 操作或進程同步),在條件滿足之前無法繼續執行。

2 Linux 操作系統進程有 5 種狀態: 運行、 中斷、 不可中斷、 僵死、 停止。 安全狀態不是 Linux支持的進程狀態。

3 引起進程阻塞的事件有:
1)請求系統服務;
2)啓動某種操作;
3) 新數據尚未到達 ( 需要的數據沒有準備好) ;
4)無新工作可做。

4 進程在運行過程中具有多種狀態,當它從 等待態 (阻塞態)轉換爲 就緒態時稱爲 喚醒。當被阻塞的進程所期待的事件出現時,如 I/O 完成或者其所期待的數據已經到達,則由有關進程調用喚醒原語 wakeup(),將等待該事件的進程喚醒。

5 進程運行時所發生的典型事件中, 設備忙不會導致進程終止,將導致阻塞。被 被 0 除 、 對只讀內存執行寫操作 、 堆棧溢出均會導致進程終止。

6 進程運行過程中,導致進程從運行態轉換爲就緒態的典型事件是到 時間片到 ( 時間片用完) )。
圖 進程的三種基本狀態及其轉換

在這裏插入圖片描述
7 單核處理機的計算機系統中,處於運行狀態的進程至多有 1 個,最少爲爲 0。單核處理機的計算機系統中共有 20 個進程, 處於就緒狀態的進程已經獲得了除處理機外的所需資源,此時再分配給它處理機,就可以執行; 假設 20 個進程都處於就緒狀態,那麼必將有一個進程會分配到處理機,轉爲運行狀態,那麼最多有 19 個進程處於就緒狀態 。 若進程推進的順序不當,或資源不足(或分配不當)則 所 有進程全部阻塞, 那麼 處於就緒狀態的進程最少可以是 0 個。單核處理器的計算機系統因爲競爭資源而發生死鎖時,最多有可能 20 個進程全部阻塞。

以上內容注意總結記憶: 進程數 n,單核運行多少(1, ,0) ) 、就緒多少(n-1, ,0) ) 、阻塞 (n )。一般一個進程會有多個線程,也可以有一個線程。

8 某 4 核處理器的計算機系統中共有 50 個進程,4 核心處理器意味着同時可以執行 4 個進程的指令,所以處於運行狀態的進程 最多可以有 4 個。但是當計算機系統中的多個進程由於競爭資源等原因導致系統處於死鎖狀態而無法運行,那麼此時處於運行狀態的 進程爲 0 個。處於就緒狀態的進程已經獲得了除處理機外的所需資源,此時再分配給它處理機,就可以執行;題目計算機系統有 4 核處理器,50 個進程,假設 50 個進程都處於就緒狀態,那麼必將有一個進程會分配到處理機,轉爲運行狀態,若此進程(多線程)運行時所需處理機爲 4個,那麼 最多有 49 個進程處於就緒狀態。若進程推進的順序不當,或資源不足(或分配不當)則所有進程全部阻塞,因而處於就緒狀態的進程 最少可以是 0 個。

以上內容注意總結記憶:進程數 n ,多核(m 核)運行多少(m ,0 )、就緒多少(n-1 ,0 )、阻塞多(n )。一般一個進程會有多個線程,也可以有一個線程。

9 服務器裝有四顆處理器,每顆處理器有八個核,共計 4*8=32 核。32 核也就是存在 32 個CPU 系統,所以處於運行狀態的進程最多可以有 32 個。

第八題

1 一個運行着的進程打開了一個新的文件,則指向該文件數據結構的關鍵指針存放在 進程控制塊
2 當一個新的進程創建完成後,該進程的進程控制塊將被插入到 就緒隊列

3 當進程從運行態轉換到就緒態時,處理機的現場信息必須保存在 進程控制塊中;
操作系統的重要概念是進程,不同的進程執行的 代碼可能相同(不是不同);
進程存在的標誌是進程控制塊,與本進程相關的運行狀態 只能操作系統讀取(用戶不能讀取);
當進程申請處理機而得不到滿足時,它將進入 就緒狀態(不是阻塞態)。

4 爲使進程從阻塞態轉換爲掛起態,使用的原語是 suspend()。
原語是由 若干條機器指令構成的完成某種特定功能的一段程序,具有不可分割性。即原語的執行必須是連續的,在執行過程中不允許被中斷。

5 當用戶在編程中需要創建一個進程時,他可以 調用進程創建原語由操作系統創建進程。
進程具有多種狀態,操作系統改變進程狀態主要是通過 調用進程控制原語實現。
當使用進程創建原語創建進程時,正確的順序是 申請 PCB ,填寫 PCB ,放入就緒隊列。

當使用進程撤銷原語撤銷進程時,正確的順序是的 找到對應進程的 PCB ,撤銷其下的子孫進程,釋放該進程資源,撤銷該 PCB。

當使用進程喚醒原語喚醒進程時,正確的順序是 在等待隊列中找到該進程 PCB ,修改 PCB中進程狀態爲就緒,將其插入到就緒隊列。

當使用進程阻塞原語阻塞進程時,正確的順序是 中斷 CPU 執行,保存現場信息,修改 PCB中進程狀態爲阻塞,將其插入到阻塞隊列。

6 若一個進程由於申請的內存資源長期不能得到滿足,那麼,操作系統處理該進程的最佳方法是 掛起該進程。 掛起是指 把一個進程從內存轉到外存。當條件允許的時候,會被操作系統再次調回內存,重新進入等待被執行的狀態即就緒態。

7 系統中有多個進程分別處於就緒狀態、運行狀態和阻塞狀態, 運行狀態→ 阻塞狀態的變化( 讓出 CPU 引起就緒狀態進程得到運行)必然引起另一個進程的狀態發生變化。

8 進程控制塊 PCB 的組織方式主要有三種: 線性方法、索引方法、鏈接方法。沒有哈希表方式。

9 進程由 程序代碼、數據和 PCB (進程控制塊)三部分組成 ,沒有人機交互界面。

10 爲了實現對進程的管理,系統將所有進程的 PCB 排成若干個隊列, 進程隊列分爲三類:就緒隊列、等待隊列和運行隊列。沒有調度隊列。

11 用於進程控制的原語一般有: 創建進程、撤銷進程、掛起進程、激活進程、阻塞進程、喚醒進程以及改變進程優先級等。沒有進程上下文切換。

12 爲了描述控制進程的運行,系統中存放進程的管理和控制信息的數據結構稱爲 進程控制塊(PCB)

第九題

1 在 Pthread 線程包中,線程操作 pthread_join 的含意是 等待一個特定的線程退出。
2 在 Pthread 線程包中,線程操作 pthread_yield 表示的是 線程讓出 CPU。

3 分析下列程序,不考慮其他因素,程序正常運行時最多會派生出多少個進程(8 個)。
int main() //1 個進程
{
fork(); //2 個進程
fork(); //4 個進程
fork();} //8 個進程

4
例 1:
int main() //進程數 1
{
printf(“Hello World\n”); //打印 1 行
fork(); //進程數 2
printf(“HelloWorld\n”); //打印 2 行
fork(); //進程數 4
printf(“Hello World\n”); //打印 4 行
}
在 UNIX 操作系統中正確編譯鏈接後,其正確的運行結果是( 共打印出 7 行 Hello World)
例 2:分析下列程序。
int main() //進程數 1
{ printf(“Hello”); //打印 1 個
fork(); //進程數 2
printf(“Hello”); //打印 2 個
fork(); //進程數 4
printf(“Hello”); //打印 4 個
fork(); //進程數 8
printf(“Hello”);} //打印 8 個
不考慮其他因素,程序正常運行後共打印出多少個"Hello"(15 個)。

5
例 1:
對於如下 C 語言程序
int main() //進程數 1
{
printf(“Hello World\n”); //打印 1 行
fork(); //進程數 2
printf(“Hello World\n”); //打印 2 行
}
在 UNIX 操作系統中正確編譯鏈接後,其正確的運行結果是( 共打印出 3 行 Hello World)。
例 2:
int main() //進程數 1
{
printf(“Hello World\n”); //打印 1 行
fork(); //進程數 2
fork(); //進程數 4
printf(“Hello World\n”); //打印 4 行
}
在 UNIX 操作系統中正確編譯鏈接後,其正確的運行結果爲( 共打印出 5 行 Hello World)。
例 3:
int main() //進程數 1
{
printf(“Hello World\n”); //打印 1 行
fork(); //進程數 2
fork(); //進程數 4
fork(); //進程數 8
printf(“Hello World\n”); //打印 8 行
}
在 UNIX 操作系統中正確編譯鏈接後,其正確的運行結果是( 共打印出 9 行 Hello World)。

6
例 1:
對於如下 C 語言程序
int main()
{
int i;
for ( i = 0; i < 1;i++) //由於 i 初始值爲 0,且 i 自增,循環進行下去的條件是 i<1,而 i 加了
一個 1 就不符合 i<1 了,所以 for 循環只執行 1 次。
{
fork();
printf(“Hello World\n”);
}
}
在 UNIX 操作系統中正確編譯鏈接後,其運行結果爲( 共打印出 2 行 行 Hello World)。
上述程序等價於:
int main()
{
fork();
printf(“Hello World\n”);
}
例 2:
int main()
{
int i;
for ( i = 0; i < 2;i++) //for 循環執行 2 次
{
fork();
printf(“Hello World\n”);

}
}
在 UNIX 操作系統中正確編譯鏈接後,其運行結果爲( 共打印出 6 行 行 Hello World)。
上述程序等價於:
int main()
{
fork();
printf(“Hello World\n”);
fork();
printf(“Hello World\n”);
}

7
例 1:
對於如下 C 語言程序
int main()
{
pid_t pid;
int x=1;
pid = fork();
if(pid==0)
printf(“I am the child process, x=%d\n”, ++x);
else
printf(“I am the parent process, x=%d\n”, --x);
}
在 UNIX 操作系統中正確編譯鏈接後,其正確的運行結果是(I am the child process, x=2 I am the parent process, x=0)。
//子進程中,返回值是 0,走第一個 if 語句打印,++x(自增),即 x 加 1,再取值打印,結果爲 2;、父進程中,返回值不是 0,執行 else 打印,--x(自減),即 x 減 1,再取值打印,結果爲 0。
運行後的輸出爲 I am the child process, x=2 I am the parent process, x=0。
例 2:
對於如下 C 語言程序
int main()
{
pid_t pid;
int a = 20;
pid = fork();
if (pid == 0)
printf(“This is the son process, a=%d\n”, --a);
else
printf(“This is the dad process, a=%d\n”, ++a);
}
在 UNIX 操作系統中正確編譯鏈接後執行,其運行結果爲(This is the son process, a=19 This is the dad process, a=21)。

第十題

1 一定不會引起進程調度的操作是 一個進程從就緒狀態變成了運行狀態。
2 在採用非搶佔式調度的操作系統中,不能引起 新進程調度的事件是新創建的進程進入就緒隊列。
3 在 Pthread 線程包的使用中,當用戶編程創建一個新的線程時,需要使用的線程庫函數是
pthread_create()。
4 在 Pthread 線程包的使用中,當用戶需要結束一個線程時,可以使用的線程庫函數是pthread_exit()。
pthread_yield()線程讓出 CPU,pthread_join()等待一個特定的線程退出。
5 在 Pthread 線程包關於條件變量的使用中,pthread_mutex_init()表示的是 創建一個互斥量。
6 管程實現了進程的互斥,但是 管程無法保證本身互斥。
7 有如下 C 語言程序
void * th_f(void * arg)
{
printf(“Hello World”);
pthread_exit(0);
}
int main(voiD)
{
pthread_t tid;
int st;
st = pthread_create(&tid, NULL, th_f, NULL);
if(st==0)
printf(“Oops, I can not createthread\n”);
exit(NULL);
}
針對上述程序,下列敘述中哪一個是正確的()。
A)線程 th_f 運行後主動退出
B)線程 th_f 運行後等待一個特定的線程退出
C)線程 th_f 運行後主動釋放 CPU 給其他線程
D)線程 th_f 運行後進入等待態
A【解析】
pthread_create 是類 Unix 操作系統(Unix、Linux、Mac OS X 等)中創建線程的函數,裏面
包含四個參數,
第一個參數爲指向線程標識符的指針;
第二個參數用來設置線程屬性;
第三個參數是線程 入口 函數的起始地址也即線程名;
最後一個參數是入口函數的參數。
題目程序在 main()函數中調用 pthread_create()函數創建一個新線程 th_f,設置新線程的入口
函數爲 th_f,所以新線程創建後執行 th_f 函數,在 th_f 函數中輸出 Hello World,接着 調用
pthread_exit(0) 後 線程 th_f 主動退出,答案爲 A。

//分析上述程序關鍵語句(正數第 4 句和倒數第 4 句)
pthread_exit(0);
st = pthread_create(&tid, NULL, th_f, NULL);
結論: 調用 pthread_exit(0) 後 線程 th_f 主動退出

pthread_join(2);
st = pthread_create(&tid, NULL, th_f, NULL);
結論: 調用 pthread_join(2) ,線程 th_f 運行後等待該線程退出後 再 退出 。

pthread_yield(0);
st = pthread_create(&tid, NULL, th_f, NULL);
結論:用 調用 pthread_yield(0) ,線程 th_f 運行後等待該線程退出後掛起自己,將 CPU 讓給其他線程

pthread_exit(0);
st = pthread_create(&tid, NULL, th_f, NULL);
結論:在引入線程的操作系統中每一個進程裏有都一個主線程,由主線程再創建其他線程,
所以題目程序中如創建線程成功(pthread_create)則存在 2 個線程,否則還是隻有 1 個主線程。 即程序運行中最多存在 2 個線程 。
上述程序經過 正確編譯鏈接後執行,當 pthread_create 運行成功後, 進程有 2 個線程。

pthread_exit(0);
st = pthread_create(&tid, NULL, th_f, NULL);
結論:pthread_create 函數表示創建線程, 線程名爲 th_f。

其他題目複習在下一篇博文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章