1. 簡述Sun Workshop中的幾個重要概念:event/handler, watchpoint, RTC。
2. 簡述Solaris所實現(xiàn)的系統(tǒng)接口標(biāo)準(zhǔn)(至少兩種),并說明feature test macros的功能和使用方法。
unix 標(biāo)準(zhǔn)有:ANSI C, IEEE POSIX, X/OPEN XPG3 和 FIPS.實際應(yīng)用的有:System V Release 4, 4.3+BSD.
feature test macro: 頭文件中定義了很多宏,有POSIX,XPG3的。當(dāng)程序編譯時如果希望只使用POSIX的定義而不使用其它定義,
那么就需定義常數(shù)_ P O S I X _ S O U R C E。
當(dāng)該常數(shù)定義時,就能排除其它專有的定義。
常數(shù)_ P O S I X _ S O U R C E 及其對應(yīng)的常數(shù)_ X O P E N _ S O U R C E 被稱之為功能測試宏(f e a t u r e
test macro )。所有功能測試宏都以下劃線開始。當(dāng)要使用它們時,通常在c c 命令行中以下列方
式定義:
cc -D_POSIX_SOURCE file.c
這使得在C 程序包括任何頭文件之前,定義了功能測試宏。如果我們僅想使用P O S I X . 1 定義,那么也可將源文件的第一行設(shè)置為:
#define _POSIX_SOURCE 1
另一個功能測試宏是:_ _STDC_ _,它由符合ANSI C 標(biāo)準(zhǔn)的編譯程序自動定義。
這樣就允許我們編寫ANSI C 編譯程序和非ANSI C 編譯程序都能編譯的程序。
例如,一個頭文件可能會是:
#ifdef __STDC__
void *myfunc(const char *, int);
#else
void *myfunc();
#endif
3. 試比較系統(tǒng)調(diào)用和庫函數(shù)的區(qū)別(重點說明返回值和內(nèi)存分配)。
system call 是用戶訪問內(nèi)核系統(tǒng)服務(wù)的接口,使內(nèi)核為調(diào)用線程執(zhí)行某種特定的功能。
每個system call 在標(biāo)準(zhǔn)C 庫中設(shè)置一個具有同樣名字的函數(shù)。
用戶進(jìn)程用標(biāo)準(zhǔn)C 調(diào)用序列來調(diào)用這些函數(shù),然后,函數(shù)又用系統(tǒng)所要求的技術(shù)調(diào)用相應(yīng)的內(nèi)核服務(wù)。
然后執(zhí)行某個產(chǎn)生軟中斷進(jìn)入內(nèi)核的機(jī)器指令。是于平臺相關(guān)的。
library function 是將system call進(jìn)行封裝后提供的接口。實際上,用戶也可以定制自己的library function.
大體上,systerm call 實現(xiàn)內(nèi)存的分配,library function 實現(xiàn)內(nèi)存的管理。
當(dāng)
1)library function在調(diào)用system call時,system call不會申請靜態(tài)空間存放調(diào)用結(jié)果。Library function
應(yīng)該申請動態(tài)空間,將地址作為參數(shù)傳入。這時,system call將結(jié)果寫在動態(tài)空間中。
2)library function在調(diào)用system call時,system call每次將結(jié)果放在固定的靜態(tài)空間中。用戶得到的返回值在靜態(tài)空間中,
如果用戶要多次調(diào)用該函數(shù),則應(yīng)申請動態(tài)空間,將返回值拷貝到動態(tài)空間中。在下次調(diào)用時,靜態(tài)空間被重新賦值。
3)library function在調(diào)用system call時,system call每次都為用戶進(jìn)程申請動態(tài)空間,賦值,將動態(tài)空間地址返回給用戶。
這種情況下,需要用戶在使用完后,釋放內(nèi)存。
4. 簡述Solaris的進(jìn)程及兩級線程模型,并說明概念-核心所支持的調(diào)度類。
進(jìn)程是含有一個用戶程序環(huán)境的抽象,包括虛存環(huán)境、程序所需資源以及至少一個執(zhí)行線程。
每個進(jìn)程中至少有一個輕量級線程,它是進(jìn)程中每個內(nèi)核線程的虛擬執(zhí)行環(huán)境。
輕量級進(jìn)程允許進(jìn)程中的每個內(nèi)核線程,獲得與同一進(jìn)程中的其他內(nèi)核線程無關(guān)的系統(tǒng)調(diào)用。
雖然在統(tǒng)一進(jìn)程內(nèi)切換多個線程是不耗資源的,但線程的創(chuàng)建和消除卻很耗資源。另外,進(jìn)程中的內(nèi)核線程要求有一個輕量級進(jìn)程,它含有消耗內(nèi)和資源的堆棧。
因此,在每個進(jìn)程中增加了一級線程管理用戶線程–二級線程模型。
見下圖:
solaris的調(diào)度類有:
TS(分時)–它是進(jìn)程和進(jìn)程中所有內(nèi)核線程的缺省調(diào)度類。他根據(jù)當(dāng)前處理器的使用情況動態(tài)改變進(jìn)程的優(yōu)先級。
進(jìn)程優(yōu)先級和時間量在每個時鐘滴答時,或在一個I/O引起睡眠后的喚醒期間,根據(jù)分時調(diào)度表計算。TS類的優(yōu)先級由0-59。
IA(交互類,增強(qiáng)的TS類)–它是由桌面視窗系統(tǒng)使用得調(diào)度類。用來提高目的視窗中線程的優(yōu)先級。
SYS(系統(tǒng)類)–內(nèi)核線程使用的系統(tǒng)類。優(yōu)先級60-99
RT(實時類)–用于實現(xiàn)固定的優(yōu)先級、固定的時間量調(diào)度。優(yōu)先級100-159
5. 當(dāng)使用vfork()創(chuàng)建的新進(jìn)程(沒有調(diào)用exec或exec不成功)要退出時,我們一般調(diào)用_exit()函數(shù),為什么?
v f o r k 用于創(chuàng)建一個新進(jìn)程,而該新進(jìn)程的目的是e x e c 一個新程序。v f o r k 與f o r k 一樣都創(chuàng)建一個子進(jìn)程,
但是它并不將父進(jìn)程的地址空間完全復(fù)制到子進(jìn)程中,因為子進(jìn)程會立即調(diào)用e x e c (或e x i t ),
不過在子進(jìn)程調(diào)用e x e c 或e x i t 之前,它在父進(jìn)程的空間中運行。v f o r k 保證子進(jìn)程先運行,在它調(diào)用e x e c 或e x i t 之后父進(jìn)
程才可能被調(diào)度運行。
e x i t 和_ e x i t 函數(shù)用于正常終止一個程序:_ e x i t 立即進(jìn)入內(nèi)核,e x i t 則先執(zhí)行一些清除處理(包括調(diào)用執(zhí)行各終止處理程序,關(guān)閉所有標(biāo)準(zhǔn)I / O 流等),然后進(jìn)入內(nèi)核。
_ e x i t 并不執(zhí)行標(biāo)準(zhǔn)I / O 緩存的刷新操作。
如果用e x i t 而不是_ e x i t ,它刷新開關(guān)閉了所有標(biāo)準(zhǔn)I / O 流,這包括標(biāo)準(zhǔn)輸出。
雖然這是由子進(jìn)程執(zhí)行的,但卻是在父進(jìn)程的地址空間中進(jìn)行的,所以所有受到影響的標(biāo)準(zhǔn)I/O FILE 對象都是在父進(jìn)程中的。
6. 什么是“zombie”進(jìn)程?在我們的程序中如何防止“zombie”進(jìn)程?(試說出其中的三種方法)
一個已經(jīng)終止、但是其父進(jìn)程尚未對其進(jìn)行善后處理(獲取終止子進(jìn)程的有關(guān)信息、釋放它仍占用的資源)的進(jìn)程被稱為僵死進(jìn)程(z o m b i e )。
避免z o m b i e 的方法:
(1)在S V R 4 中,如果調(diào)用s i g n a l 或s i g s e t 將S I G C H L D 的配置設(shè)置為忽略,則不會產(chǎn)生僵死子進(jìn)程。另外,使用S V R 4 版的s i g a c t i o n ,則可設(shè)置S A _ N O C L D WA I T 標(biāo)
志(見表1 0 – 5 )以避免子進(jìn)程僵死。(10.7)
(2)調(diào)用f o r k兩次。程序8 – 5 實現(xiàn)了這一點。
(3)用waitpid等待子進(jìn)程返回.
7. 以下代碼是不可靠信號處理的經(jīng)典例子之一,試說明其中的問題(包括細(xì)節(jié)):
8. 在信號(Signal)處理中,我們必須注意兩個重要的問題:可重啟動的系統(tǒng)調(diào)用和可重入函數(shù)。試說明以下兩個問題:
a) 在Solaris中如何設(shè)置可重啟動的系統(tǒng)調(diào)用標(biāo)志(提示:使用sigaction)。