範文齋

面試時一些基本的軟件測試題

1).什麼是“死鎖”?

面試時一些基本的軟件測試題

死鎖即是兩個或兩個以上的進程在執行過程中,因爭奪資源而造的相互等待的現象,若無外力的作用下,他們將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。 由於資源佔用是互斥的,當某個進程提出申請資源後,使得有關進程在無外力協助下,永遠分配不到必需的資源而無法繼續運行,這就產生了一種特殊現象死鎖。

2),進程調度的算法有哪些?

調度算法是指:根據系統的資源分配策略所規定的資源分配算法。

一、先來先服務和短作業(進程)優先調度算法

1. 先來先服務調度算法

先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用於作業調度, 也可用於進程調度。FCFS算法比較有利於長作業(進程),而不利於短作業(進程)。由此可知,本算法適合於CpU繁忙型作業, 而不利於I/O繁忙型的作業(進程)。

2. 短作業(進程)優先調度算法

短作業(進程)優先調度算法(SJ/pF)是指對短作業或短進程優先調度的算法,該算法既可用於作業調度, 也可用於進程調度。但其對長作業不利;不能保證緊迫性作業(進程)被及時處理;作業的長短只是被估算出來的。

二、高優先權優先調度算法

1. 優先權調度算法的類型

爲了照顧緊迫性作業,使之進入系統後便獲得優先處理,引入了最高優先權優先(FpF)調度算法。 此算法常被用在批處理系統中,作爲作業調度算法,也作爲多種操作系統中的進程調度,還可以用於實時系統中。當其用於作業調度, 將後備隊列中若干個優先權最高的作業裝入內存。當其用於進程調度時,把處理機分配給就緒隊列中優先權最高的進程,此時, 又可以進一步把該算法分成以下兩種:

1)非搶佔式優先權算法

2)搶佔式優先權調度算法(高性能計算機操作系統)

2. 優先權類型

對於最高優先權優先調度算法,其核心在於:它是使用靜態優先權還是動態優先權, 以及如何確定進程的優先權。

3. 高響應比優先調度算法

爲了彌補短作業優先算法的不足,我們引入動態優先權,使作業的優先等級隨着等待時間的增加而以速率a提高。 該優先權變化規律可描述爲:優先權=(等待時間+要求服務時間)/要求服務時間;即 =(響應時間)/要求服務時間

三、基於時間片的輪轉調度算法

1. 時間片輪轉法 時間片輪轉法一般用於進程調度,每次調度,把CpU分配隊首進程,並令其執行一個時間片。 當執行的時間片用完時,由一個記時器發出一個時鐘中斷請求,該進程被停止,並被送往就緒隊列末尾;依次循環。 2. 多級反饋隊列調度算法 多級反饋隊列調度算法多級反饋隊列調度算法,不必事先知道各種進程所需要執行的時間,它是目前被公認的一種較好的進程調度算法。 其實施過程如下:

1) 設置多個就緒隊列,併爲各個隊列賦予不同的優先級。在優先權越高的隊列中, 爲每個進程所規定的執行時間片就越小。

2) 當一個新進程進入內存後,首先放入第一隊列的末尾,按FCFS原則排隊等候調度。 如果他能在一個時間片中完成,便可撤離;如果未完成,就轉入第二隊列的末尾,在同樣等待調度…… 如此下去,當一個長作業(進程)從第一隊列依次將到第n隊列(最後隊列)後,便按第n隊列時間片輪轉運行。

3) 僅當第一隊列空閒時,調度程序才調度第二隊列中的進程運行;僅當第1到第(i-1)隊列空時, 纔會調度第i隊列中的進程運行,並執行相應的時間片輪轉。

4) 如果處理機正在處理第i隊列中某進程,又有新進程進入優先權較高的隊列, 則此新隊列搶佔正在運行的處理機,並把正在運行的進程放在第i隊列的隊尾。

ows的消息機制

Windows操作系統最大的特點就是其圖形化的.操作界面,其圖形化界面是建立在其消息處理機制這個基礎之上的。如果不理解Windows消息處理機制,肯定無法深入的理解Windows編程。可惜很多程序員對Windows消息只是略有所聞,對其使用知之甚少,更不瞭解其內部實現原理,本文試着一步一步向大家披露我理解的Windows消息機制。可以說,掌握了這一部分知識,就是掌握了Windows編程中的神兵利器,靈活運用它,將會極大的提高我們的編程能力。

一、 消息概述

Windows窗體是怎樣展現在屏幕上的呢?衆所周知,是通過ApI繪製實現的。Windows操作系統提供了一系列的ApI函數來實現界面的繪製功能,例如:

DrawText 繪製文字

DrawEdge 繪製邊框

DrawIcon 繪製圖標

BitBlt 繪製位圖

Rectangle 繪製矩形

再複雜的程序界面都是通過這個函數來實現的。

那什麼時候調用這些函數呢?顯然我們需要一個控制中心,用來進行“發號施令”,我們還需要一個命令傳達機制,將命令即時的傳達到目的地。這個控制中心,就是一個動力源,就像一顆心臟,源源不斷地將血液送往各處。這個命令傳達機制就是Windows消息機制,Windows消息就好比是身體中的血液,它是命令傳達的使者。

Windows消息控制中心一般是三層結構,其頂端就是Windows內核。Windows內核維護着一個消息隊列,第二級控制中心從這個消息隊列中獲取屬於自己管轄的消息,後做出處理,有些消息直接處理掉,有些還要發送給下一級窗體(Window)或控件(Control)。第二級控制中心一般是各Windows應用程序的Application對象。第三級控制中心就是Windows窗體對象,每一個窗體都有一個默認的窗體過程,這個過程負責處理各種接收到的消息。

消息是以固定的結構傳送給應用程序的,結構如下:

public Type MSG

hwnd As Long

message As Long

wparam As Long

lparam As Long

time As Long

pt As pOINTApI

End Type

其中hwnd是窗體的句柄,message是一個消息常量,用來表示消息的類型,wparam和lparam都是32位的附加信息,具體表示什麼內容,要視消息的類型而定,time是消息發送的時間,pt是消息發送時鼠標所在的位置。

Windows操作系統中包括以下幾種消息:

1、標準Windows消息:

這種消息以WM_打頭。

2、通知消息

通知消息是針對標準Windows控件的消息。這些控個包括:按鈕(Button)、組合框(ComboBox)、編輯框(TextBox)、列表框(ListBox)、ListView控件、Treeview控件、工具條(Toolbar)、菜單(Menu)等。每種消息以不同的字符串打頭。

3、自定義消息

編程人員還可以自定義消息。

二、 關於Windows句柄

不是每個控件都能接收消息,轉發消息和繪製自身,只有具有句柄(handle)的控件才能做到。有句柄的控件本質上都是一個窗體(window),它們可以獨立存在,可以作爲其它控件的容器,而沒有句柄的控件,如Label,是不能獨立存在的,只能作爲窗口控件的子控件,它不能繪製自身,只能依靠父窗體將它繪製來。

句柄的本質是一個系統自動維護的32位的數值,在整個操作系統的任一時刻,這個數值是唯一的。但該句柄代表的窗體釋放後,句柄也會被釋放,這個數值又可能被其它窗體使用。也就是說,句柄的數值是動態的,它本身只是一個唯一性標識,操作系統通過句柄來識別和查找它所代表的對象。

然而,並非所有的句柄都是窗體的句柄,Windows系統中還中很多其它類型的句柄,如畫布(hdc)句柄,畫筆句柄,畫刷句柄,應用程序句柄(hInstance)等。這種句柄是不能接收消息的。但不管是哪種句柄,都是系統中對象的唯一標識。本文只討論窗體句柄。

那爲什麼句柄使窗口具有了如此獨特的特性呢?實際是都是由於消息的原因。由於有了句柄,窗體能夠接收消息,也就知道了該什麼時候繪製自己,繪製子控件,知道了鼠標在什麼時候點擊了窗口的哪個部分,從而作出相應的處理。句柄就好像是一個人的身份證,有了它,你就可以從事各種社會活動;否則的話,你要麼是一個社會看不到的黑戶,要麼跟在別人後面,通過別人來證明你的存在。

三、 消息的傳送

1、從消息隊列獲取消息:

可以通過peekMessage或GetMessage函數從Windows消息隊列中獲取消息。Windows保存的消息隊列是以線程(Thread)來分組的,也就是說每個線程都有自己的消息隊列。

2、發送消息

發送消息到指定窗體一般通過以下兩個函數完成:SendMessage和postMessage。兩個函數的區別在於:postMessage函數只是向線程消息隊列中添加消息,如果添加成功,則返回True,否則返回False,消息是否被處理,或處理的結果,就不知道了。而SendMessage則有些不同,它並不是把消息加入到隊列裏,而是直接翻譯消息和調用消息處理,直到消息處理完成後才返回。所以,如果我們希望發送的消息立即被執行,就應該調用SendMessage。

還有一點,就是SendMessage發送的消息由於不會被加入到消息隊列中,所以通過peekMessage或GetMessage是不能獲取到由SendMessage發送的消息。

另外,有些消息用postMessage不會成功,比如wm_settext。所以不是所有的消息都能夠用postMessage的。

還有一些其它的發送消息ApI函數,如postThreadMessage,SendMessageCallback,SendMessageTimeout,SendNotifyMessage等。

四、 消息循環與窗體過程

消息循環是應用程序能夠持續存在的根本原因。如果循環退出,則應用程序就結束了。

我們來看一看Delphi中封裝的消息循環是怎樣的:

第一步:程序開始運行(Run)

ialize;  //初始化

teForm(TForm1, Form1); //創建主窗體

;  //開始運行,準備進行消息循環

如果不創建主窗體,應用程序同樣可以存在和運行。

第二步:開始調用消息循環(HandleMessage)

procedure ;

begin

FRunning := True;

try

AddExitproc(DoneApplication);

if FMainForm <> nil then

begin

case CmdShow of

SW_SHOWMINNOACTIVE: dowState := wsMini

標籤:軟件測試 面試