1. 首頁
  2. 計算機軟體

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

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

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佇列的隊尾。

3.Windows的訊息機制

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)

Application.Initialize;//初始化

Application.CreateForm(TForm1, Form1);//建立主窗體

Application.Run;//開始執行,準備進行訊息迴圈

如果不建立主窗體,應用程式同樣可以存在和執行。

第二步:開始呼叫訊息迴圈(HandleMessage)

procedure TApplication.Run;

begin

FRunning := True;

try

AddExitproc(DoneApplication);

if FMainForm <> nil then

begin

case CmdShow of

SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMini