筆試訓練4

1.某系統中有3個併發進程,都需要同類資源4個,試問該系統不會發生死鎖的最少資源數是多少

可能會發生死鎖的上限資源數,爲每個進程均只差一個資源的情況,爲9個,只要再加一個資源就不可能發生死鎖了,所以不會發生死鎖的最少資源數爲10。


2.內存相關

關於內存正確的是
A.內存的存取速度不能低於cpu速度,否則會造成數據丟失
B.程序只有在數據和代碼等被調入內存後才能運行
C.採用虛擬內存技術後程序可以在硬盤上直接運行
D.某計算機的內存容量爲16MB,那麼他的地址總線爲24位

B
A 內存的讀取速度往往低於CPU的處理速度,慢的話可以等待,不會錯。
B 正確
C 採用虛擬存儲只是把現在不用的放到外存,需要時在調入內存。

D 至少是24位,一般要大於24位,因爲要採用虛擬存儲技術。


3.下列關於線性調度的敘述中,錯誤的是


A.調用線程的sleep()方法,可以使比當前線程優先級低的線程獲得運行機會
B.調用線程的yeild()方法,只會是與當前線程相同優先級的線程獲得運行機會
C.當有比當前線程的優先級高的線程出現時,高優先級線程搶佔CPU並運行。
D.一個線程由於某些原因進入阻塞狀態,會放棄CPU
E.具有相同優先級的多個線程的調度一定是分時的

F.分時調度模型是讓所有線程輪流獲得CPU使用權

B,E
A.sleep()讓當前正在執行的線程暫停一段時間並進入阻塞狀態,使其他線程得到運行的機會,不論進程優先級。
B. 讓 yield()只是使當前線程重新回到可執行狀態,所以執行yield()的線程有可能在進入到可執行狀態後馬上又被執行。 當調用了yield方法後,只有優先級與當前線程相同,或者優先級比當前線程更高的就緒狀態的線程纔會獲得執行的機會

E.也可以是搶佔式調度


4.同步IO和異步IO的區別

異步文件IO也就是重疊IO。
在同步文件IO中,線程啓動一個IO操作然後就立即進入等待狀態,直到IO操作完成後才醒來繼續執行。而異步文件IO方式中,線程發送一個IO請求到內核,然後繼續處理其他的事情,內核完成IO請求後,將會通知線程IO操作完成了。
如果IO請求需要大量時間執行的話,異步文件IO方式可以顯著提高效率,因爲在線程等待的這段時間內,CPU將會調度其他線程進行執行,如果沒有其他線程需要執行的話,這段時間將會浪費掉(可能會調度操作系統的零頁線程)。如果IO請求操作很快,用異步IO方式反而還低效,還不如用同步IO方式。
同步IO在同一時刻只允許一個IO操作,也就是說對於同一個文件句柄的IO操作是序列化的,即使使用兩個線程也不能同時對同一個文件句柄同時發出讀寫操作。重疊IO允許一個或多個線程同時發出IO請求。
異步IO在請求完成時,通過將文件句柄設爲有信號狀態來通知應用程序,或者應用程序通過GetOverlappedResult察看IO請求是否完成,也可以通過一個事件對象來通知應用程序。
例如DeviceIoControl這個函數,他就可以通過參數指定是同步或異步,如果是同步的話,則該函數將會等待結果返回後,才執行下一條語句。如果是異步的話,DeviceIoControl調用後馬上返回,如果參數正確,則回返回ERROR_IO_PENDING(忘了怎樣寫,不過肯定是有PENDING這個詞),然後你可以通過GetOverlappedResult獲取返回結果,是一個overlap結構,是在你調用DeviceIoControl的最後一個參數傳進去的``
簡單的說``同步在編程裏,一般是指某個操作執行完後,纔可以執行後面的操作``拿到IO上來說``就是我要做完這個IO操作``才繼續後面的操作```

異步則是,我交帶了某個操作給系統(可以是windows,也可以是你自己的庫),我呆會過來拿,我現在要去忙別的``拿到IO上說``我交帶了某個IO操作給系統。。。。。


5.typedef與#define的比較

1) #define是預處理指令,在編譯預處理時進行簡單的替換,不作正確性檢查,不關含義是否正確照樣帶入,只有在編譯已被展開的源程序時纔會發現可能的錯誤並報錯。例如:
#define PI 3.1415926
程序中的:area=PI*r*r 會替換爲3.1415926*r*r
如果你把#define語句中的數字9 寫成字母g 預處理也照樣帶入。
2)typedef是在編譯時處理的。它在自己的作用域內給一個已經存在的類型一個別名,但是You cannot use the typedef specifier inside a function definition。
3)typedef int * int_ptr;

#define int_ptr int * 
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所說 ,#define在預處理 時進行簡單的替換,而typedef不是簡單替換 ,而是採用如同定義變量的方法那樣來聲明一種類型。也就是說;
//refer to (xzgyb(老達摩))
#define int_ptr int *
int_ptr a, b; //相當於int * a, b; 只是簡單的宏替換
typedef int* int_ptr;
int_ptr a, b; //a, b 都爲指向int的指針,typedef爲int* 引入了一個新的助記符
這也說明了爲什麼下面觀點成立
//QunKangLi(維護成本與程序員的創造力的平方成正比)
typedef int * pint ;
#define PINT int *
那麼:
const pint p ;//p不可更改,但p指向的內容可更改
const PINT p ;//p可更改,但是p指向的內容不可更改。
pint是一種指針類型 const pint p 就是把指針給鎖住了 p不可更改
而const PINT p 是const int * p 鎖的是指針p所指的對象。
3)也許您已經注意到#define 不是語句 不要在行末加分號,否則 會連分號一塊置換。

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