2009年4月21日 星期二

Multithreading in Windows Forms

當你寫一個Windows Forms的Application時候,如果再用上Thread的功能,這時候可能就會發生:跨執行緒作業無效: 存取控制項 'controls_name' 時所使用的執行緒與建立控制項的執行緒不同。哇!我也是第一次遇到,程式寫的少了...還好有解,並得到建德兄的幫助來解決。


2009年4月19日 星期日

TPC-W基準

TPC-W是TPC所制定的一個基準(benchmark),主要是用在交易型網路電子商務(transactional web e-Commerce)上面,目的為測試系統的效能並給予量化(給出數據)。

TPC-W所測量出來的數據單位為WIPS(Web Interaction Per Second),以表示效能(performance)的程度,這就是throughput的多寡。2.0版本之後,是用SIPS(Service Interaction Per Second)的單位,不過,目前的資料多以WIPS為單位就是了,可能是2.0版本還未實際應用。

除了WIPS之外,也有將總體成本除以throughput的方式,用以評斷設備是不是划算(即Cost/Performance, CP值)!其單位為$/WIPS。

TPC-W的量測以一個應用伺服器(application server)為主,避免cluster的問題使得benchmark的數據有所差異。也就是說在TPC-W個規範當中,你是不能用來測量cluster的架構!

TPC-W中有些專有名詞,其定義如下:
  • Emulated Browser (EB), Emulated Business (EB)
    模擬的瀏覽器,功能是向SUT發送工作量(workload)。2.0版的文件改用Emulated Business 表示。
  • Remote Browser Emulator (RBE), Remote Business Emulator (RBE)
    這是用來管理和控制EB的軟體。
  • Business Session Length (BSL)
    交易的數量,也就是REB和SUT之間的交易數量。
  • System Under Test (SUT)
    欲測試的系統,可能包含多個server和router。
  • Payment Gateway Emulator (PGE)
    模擬SUT外面的付費授權機制的服務,提供帳務處理功能。
目前網路上已有實作的程式碼,有需要研究的人可以參考,分別如下:
根據我最近的研究,2.0版本似乎不夠完全,1.8版的benchmark比較正常一點!而且實做的程式目前只到1.8版。另外,2.0個好像跟1.x完全不一樣。

2009年4月13日 星期一

Benchmark

今天談談Benchmark,Benchmark的中文是基準,也有人說是標竿測試(應該用benchmark test)、測試基準,中文的意思實在很難照字面解釋。Benchmark的意思是:一些基本的方法來量測系統的效能(這是一個活動,所以英文用benchmarking)。而Benchmark通常指的是測試用的軟體工具。

在量測系統效能當中,有兩項數據重要:時間(time)比率(rate)。時間指的是反應時間(response time);比率指的是工作處理量,通常是單位時間的交易量、單位時間的回應次數,或者說是throughput。其實一個是從使用者的角度來觀看,另一個是從管理者的角度來觀看。

比率的量測中以MIPS為單位,什麼是MIPS?MIPS即Millions of instructions per second,每秒條百萬指令,通常是用來測試CPU(而CPU不太會用頻率Hz為基準比較)。要注意的是MIPS也不一定準確,因為CPU有區分RISCCISC兩種,所以用一件工作來比較,有可能產生不同效能結果。

系統效能(System Performance)是一件很複雜的事情,因為系統包含多個軟體與硬體,要量測更是困難(使用benchmark),就算我們得到其結果,要解釋其效能結果更不是一件容易的事情。

Benchmark從量測的性質來看,可以分為兩大類:粗糙基準(coarse-grain benchmark),細微基準(fine-grain benchmark)。另外,以系統角度來看可以分為四個階層(hierarchy),由內而外分別是。
  1. Basic Operations(最內層)
    加減法運算,測量CPU之類。對系統效能量測實用性低。
  2. Toy Benchmark
    用一些難解的問題(puzzle)計算。
  3. Kernels
    主要是一些程式的片段,或者函數之類。測量系統某部分的效能。
  4. Real Programs(最外層)
    最趨於真實程式的測量,也是對系統的效能量測實用性最高的。(有點廢話...)
要注意的是,每一種benchmark有不同的運用場合(domain-oriented),好比你不能拿測量CPU的軟體去測量網路頻寬,可能不能測量,就算可以,其結果也沒有什麼意義!(有點誇張的例子,但要注意且記得!)

常用的benchmark有下列單位制訂:(中文看看就好,沒有官方的中文名字,而且翻譯也怪怪的)
  • Transaction Processing Performance Council (交易處理效能機構),簡稱TPC
    有TPC-C, TPC-H, TPC-R, TPC-W
  • Standard Performance Evaluation Corporation(標準性能評估機構),簡稱SPEC。
    有SPECxxxx, SPECweb
效能測試(Performance Test)的類型基本上有3種:
  • Load Testing(負載測試)
    模擬實際的使用情形,取得測試結果,看看是不是符合要求。
  • Stress Testing(壓力測試)
    在最糟的情況下,對服務施加最大負載量。看看是不是能正常運作。
  • Spike Testing(突波測試)
    施加比平均負載高出好幾倍的量,通常施加的時間為一段小週期。
以上簡短介紹Benchmark和Performance Test。

HttpWebRequest and HttpWebResponse

之前有介紹.NET Framework的WebClient這個類別,用了用了發現我還需要更多功能,只好往下一層類別來找答案。WebClient用起來真的很容易,程式沒有幾行就可以做到一個功能,所以學習的時候,建議先用這個類別來玩玩看,先從簡單的開始,這是解決問題的第一步。

HttpWebRequest和HttpWebResponse兩個類別,是從另外兩個抽象類別繼承而來,各分別WebRequestWebResponse兩個,你待會看程式的時候,就會發現比起WebClient要多幾個步驟才能做一件事。

在開始使用HttpWebRequest和HttpWebResponse之前,我們先來看看HTTP(Hypertext Transfer Protocol)這個通訊協定,似乎HTTP隨著WWW的發展越來越顯得重要,太多地方都用了!HTTP所傳送的message有兩種格式,一個是request message,另一個是response message。(這不是廢話,client-server的架構大概都是這樣。下面列出message的大概格式,主要是給個view,要詳細的資料請google)

Request Message
  • Request Line
    method+sp+URL+sp+Version+cr+lf
  • Header Lines
    header field name:+sp+value+cr+lf
    header field name:+sp+value+cr+lf
    ...
  • Blank Line
    cr+lf
  • Entity Body
    要求的上傳資料
Response Message
  • Status Line
    version+sp+status code+sp+phrase+cr+lf
  • Header Lines
    header field name:+sp+value+cr+lf
    header field name:+sp+value+cr+lf
    ...
  • Blank Line
    cr+lf
  • Entity Body
    回傳的資料(網頁內容)
說明一下上面兩個message的意思,因為畫表格說明不太容易,只好用條列式的方式展現。注意:所有的HTTP message都是用ASCII文字。(+號是為了區分欄位,實際上的message沒有出現)
  • cr= carriage return(回到最前面)
  • lf=line feed(換行)
  • sp=space(空白)
接下來看看程式,用同步(Synchronous)的方式:


//取得URI識別
Uri thisUri = new Uri(requestTextBox.Text);

HttpWebRequest thisHttpWebRequest = (HttpWebRequest)WebRequest.Create(thisUri);

//設定快取原則
HttpRequestCachePolicy thisHttpRequestCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
thisHttpWebRequest.CachePolicy = thisHttpRequestCachePolicy;

//提出同步要求,並且傳回包含回應的HttpWebResponse物件
HttpWebResponse thisHttpWebResponse = (HttpWebResponse)thisHttpWebRequest.GetResponse();

//取得回應的header相關資料
messageTextBox.Text += thisHttpWebResponse.IsFromCache.ToString() + Environment.NewLine;
messageTextBox.Text += thisHttpWebResponse.StatusCode.ToString() + Environment.NewLine;

//將多行的TextBox移到最後一列
messageTextBox.Select(messageTextBox.Text.Length, 0);
messageTextBox.ScrollToCaret();//將控制項的內容捲動到目前插入號的位置

//關閉資料流,並釋放連線以重複使用
thisHttpWebResponse.Close();

2009年4月11日 星期六

System Properties系統特性

系統特性(System Properties)當中有下列幾項定義,這邊介紹主要是用在效能評估上面,因為排隊理論通常就是用來解決這樣的問題,我們先定義,之後才有辦法討論。(這是參考Queueing Networks and Markov Chains: Modeling and Performance Evaluation with Computer Science Applications, 2nd Edition)


  • Performance:(效能)
    The degree to which a system or component accomplishes its designated functions within given constraints, such as speed, accuracy, or memory usage.
  • Reliability:(可靠性)
    The probability that the software will not cause the failure of the system for a specified time under specified condition.
  • Availability:(可利用性)
    The ability of a system to perform its required function at a stated instant or over a stated period of time.
  • Dependability:(可依賴性)
    The dependability of a computer system is the ability to deliver a service that can justifiably be trusted.
  • Performability:(可執行性)
    The probability that the system reaches an accomplishment level y over a utilization interval (0,t).

2009年4月10日 星期五

Computer Simulation電腦模擬

在工程和科學的領域當中,除了實際測量或是試驗之外,我們還可以模擬自然或人為(man-made)的現象。其中所模擬的對象是系統(system),什麼是系統呢?一個系統可以視為元件的集合,組織這些元件使得它們可以完成一件目的。好比說一台電腦就是一個系統,包含無數個元件(CPU、記憶體、硬碟、主機板、鍵盤...),這些元件可以完成你要的一個目的,比方說上網、玩遊戲、看電影...。

所謂的模擬(simulation)是根據以往經驗(empirically)來決定系統特性(characteristics)的一個實驗,主要方式為產生(generation)與觀察(observation)系統的資料,於是就能夠知道系統的一些結論(inference)。

為何說是根據經驗呢?因為人類所知有限,根據人類的觀察和所推討的理論,盡可能來推測真實的發生情形。例如我們都知道東西會往下掉,推導出萬有引力的理論,那是不是全宇宙都是符合這個定律?我們不曉得,根據以往經驗來看是這樣的(東西會往下掉)。同樣的道理,模擬也是基於這樣的觀念,模擬必須有個模型(model),而此模型則是基於經驗與理論的基礎,並且要盡可能模仿(mimic)仿真(emulate)系統的行為。

一個模型中的狀態以狀態變數(state variable)來表示,電腦上則是程式的變數(variable),一個模擬軟體事實上就是改變這些狀態變數,最後來觀測這些變數的數值,那要怎麼改變呢?則依照系統的模型(數學關係)。

模擬所需的模型有下列幾種分類方法:
  1. Continuous/Discrete
  2. Deterministic/Stochastic
  3. Terminating/Steady-State
  4. Synthetic(Distribution-Driven)/Trace-Driven
  5. Sequential/Distributed
  6. Symbolic
  7. Event-Oriented/Process-Oriented
回到基本問題(模擬哲學),如果我們已經建立模型,而且證實這個模型式可用的、可靠的,我們要如何求解這個模型呢?方法有兩種,一個是模擬解(Simulative Solution),另一個是分析解(Analytic Solution),到底該用哪一種方法呢?

2009年4月9日 星期四

WebClient Class

MSDN
英:http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx
中:http://msdn.microsoft.com/zh-tw/library/system.net.webclient.aspx

先做個簡單的程式來學學網路應用程式,System.Net內的類別當中,我先用最高層次的類別來玩玩看,這個類別是WebClient,只能讓你當作client來使用。

控制項
  • requestTextBox=輸入的網址
  • messageTextBox=訊息輸出
程式


try
{
//取得URI識別
Uri thisUri = new Uri(requestTextBox.Text);

WebClient thisWebClient = new WebClient();
//設定快取原則
thisWebClient.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
//設定用於上載和下載字串的Encoding
thisWebClient.Encoding = Encoding.UTF8;

//下載回應的body資料為string,呼叫DownloadString這會開始執行下載動作
String thisDownloadString = thisWebClient.DownloadString(thisUri);

//取得回應的header資料
messageTextBox.Text += thisWebClient.ResponseHeaders.ToString() + Environment.NewLine;
messageTextBox.Text += thisDownloadString + Environment.NewLine;

//將多行的TextBox移到最後一列
messageTextBox.Select(messageTextBox.Text.Length, 0);
messageTextBox.ScrollToCaret();//將控制項的內容捲動到目前插入號的位置

}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
//clean up
}



上述是同步(Synchronous)的方式,程式需等待下載命令執行完之後,才能繼續run,你的成是有可能會當掉鎖住,解決方式就是使用非同步(Asynchronous )方式,非同步方法不會封鎖呼叫執行緒



try
{
//取得URI識別
Uri thisUri = new Uri(requestTextBox.Text);

WebClient thisWebClient = new WebClient();
//設定快取原則
thisWebClient.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
//設定用於上載和下載字串的Encoding
thisWebClient.Encoding = Encoding.UTF8;

//委派處理WebClient的DownloadStringCompleted 事件的方法
thisWebClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(thisWebClient_DownloadStringCompleted);

//呼叫DownloadString這會開始執行下載動作
thisWebClient.DownloadStringAsync(thisUri);

}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
//clean up
}

void thisWebClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
//throw new NotImplementedException();
try
{
//取得回應的body資料
String thisDownloadString = e.Result.ToString() + Environment.NewLine;

//取得回應的header資料
messageTextBox.Text += ((WebClient)sender).ResponseHeaders.ToString() + Environment.NewLine;
messageTextBox.Text += thisDownloadString + Environment.NewLine;

//將多行的TextBox移到最後一列
messageTextBox.Select(messageTextBox.Text.Length, 0);
messageTextBox.ScrollToCaret();//將控制項的內容捲動到目前插入號的位置

}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
//clean up
}
}

2009年4月6日 星期一

Networking Programming網路程式設計

本篇文章介紹使用.NET Framework來撰寫網路應用程式,參考書籍可以看「Visual C# 2008網路程式設計之道」(真的是一本參考書),基峯資訊出版,黃嘉輝著,訂價台幣550元整。如果不想買的話,可以參考MSDN的網站,書裡面的內容和MSDN是差不多的,可以省下一些錢。

黃嘉輝(2008),Visual C# 2008網路程式設計之道,台北:碁峰。

要寫網路程式的話,最主要利用兩個namespace的類別(class),一個是System.Net,另一個是System.Net.Sockets

其中,建德兄說網路程式的設計與撰寫,可以利用非同步程式設計模式,參考http://msdn.microsoft.com/zh-tw/library/ms228969.aspx,這會是比較優秀的方法,避免視窗程式鎖住當機。

首先介紹OSI七層,貼在這裡當作參考(關鍵字);
  • Application
  • Presentation
  • Session
  • Transport
  • Network
  • Data Link
  • Physical
TCP/IP類的模型為五層:(多數英文教科書的分類)
  • Application Layer(HTTP, FTP, SMTP, DNS...)
  • Transport Layer(TCP, UDP)
  • Network Layer(IP)
  • Data Link Layer(Ethernet)
  • Physical Layer
在.NET Framework中有許多類別可以使用,依照逞用程度和功能性來區分:(其中符號||左邊為client用,右邊為server用)
  • System.Net.WebClient||無
  • System.Net.WebRequest, System.Net.WebResponse||無
  • System.Net.TcpClient,System.Net.UdpClient||System.Net.TcpListner,System.Net.UdpListner
  • System.Net.Sockets(沒有區分client-server)
依照容易使用(ease of use)的程度來看,最上面最簡單容易使用,而最下面System.Net.Sockets使用較複雜,相對的,因為System.Net.Sockets較複雜,原因是功能性(Functionality)最完善,你可以自己處理最多功能。到底要用哪一個類別來開發,依照需求來決定。

WebClient類別來說,WebClient使用下層的WebRequestWebResponse製作,避免讓我們接觸下層的複雜功能,也因此限制了一些!所以使用上要注意,進階功能還是要使用下層的類別。另外,WebClient類別僅支援HTTP、FTP、file的通訊協定,這可能是因為WebRequest和WebResponse的繼承類別只有這三類,所以僅支援HTTP、FTP、file囉!

如果要操作TCP和UDP的話,就使用System.Net.TcpClient ,System.Net.UdpClient, System.Net.TcpListner, System.Net.UdpListner這些類別。如果不要通訊協定的話,那就用最底層的System.Net.Sockets類別,Sockets類別跟任何通訊協定沒有關係。

另外,由於抽象類別WebRequestWebResponse有其他類別繼承,所謂的抽象類別(Abstract Class)是僅可以讓其他類別繼承(inherit),不能產生實體,你不能直接拿WebRequest和WebResponse來用,記住抽象類別這個特性。其關係為:

System.Net.WebRequest的子類別:
  • HttpWebRequest
  • FtpWebRequest
  • FileWebRequest

System.Net.WebResponse的子類別:
  • HttpWebResponse
  • FtpWebResponse
  • FileWebResponse

2009年4月1日 星期三

Key word

對於要學習Queueing Theory的人來說,可以建議用下列關鍵字來搜尋。
  • queueing system
  • performance evaluation
  • stochastic model