性能測試-根據(jù)Loadrunner官方說明來解釋Vu的進程與線程區(qū)別在Loadrunner里面生成Vu的方式有2種,在“Runtime settings”里面有設(shè)置,具體看下圖,如果選擇Run Vuser as a thread表示Vu按照一個線程生成,如果選擇 Run Vuser as a process,則Vu按照進程(非多線程)方式生成,如圖:
下面我對上述的話做一個簡單的翻譯: Loadrunner支持多線程環(huán)境,使用多線程的方法能使每臺負載生成器運行更多的VU,但是只有支持線程安全的協(xié)議,才能使用Loadrunner的VU并發(fā)方式 下表列出哪些協(xié)議不能支持線程并發(fā)Sybase-Dblib,Infomix,Tuxedo,and PeopleSoft-Tuxedo 當使用進程并發(fā)是,在任務(wù)管理器中有mdrv.exe的進程,比如下圖,我以10個VU用戶并發(fā),就會在任務(wù)管理器中出現(xiàn)10個mmdrv進程,如下圖:
如果以多線程方式并發(fā),只會出現(xiàn)一個mmdrv進程,一個進程可以支持50VU的線程并發(fā), Loadrunner的參考幫助還說明了,如果采用多線程方式并發(fā),Load Generator將會比多進程支持更多的用戶,具體的一個VU占用內(nèi)存的取值根據(jù)Loadrunner的版本不同而不同:
操作系統(tǒng)底層的原理比較復(fù)雜,我知道如果一個VU從外部訪問的話都會以一個進程的方式請求和分配系統(tǒng)的資源,當VU并模擬成了線程的方式,我不知道仿真度上面是否有區(qū)別,還請知道的人多多提出自己的意見。下面附寫baidu中關(guān)于進程和線程的區(qū)別: 解釋一: 進程是程序的一次動態(tài)執(zhí)行過程,它對應(yīng)了從代碼加載、執(zhí)行到執(zhí)行完畢的一個完整過程,這個過程也是進程本身從產(chǎn)生、發(fā)展到消亡的過程線程是比進程更小的執(zhí)行單位。一個進程在其執(zhí)行過程能夠中,可以產(chǎn)生 多個線程,形成多條執(zhí)行線索。每條線索,即每個線程也有它自身的產(chǎn)生、存在和消亡過程,也是一個動態(tài)的概念。一個程序應(yīng)該只有一個進程吧,但是可以擁有多個線程。 可以說,一個執(zhí)文件被運行后,就可以稱為是一個進程了。但是進程只是存在內(nèi)存中,實際上他是不會做任何事情的。這個時候,起作用的就是線程了。線程是程序的執(zhí)行者,一個程序至少有一個線程,但是在多線程的操作系統(tǒng)中,可以有一個以上的線程。 其實我們可以把線程看成是我們排隊買肯德雞吃(循環(huán)的排隊,一直排下去,知道我不想買了,退出)。每人都有機會到達隊伍的最前端去買東西,這個就好比是線程,都有機會被程序執(zhí)行。但是線程真正起作用的時候,就是我們在隊伍的最前端買東西到東西買完后,這一段時間,這是線程真正執(zhí)行的階段。 解釋二: 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.線程的劃分尺度小于進程,使得多線程程序的并發(fā)性高。另外,進程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存,從而極大地提高了程序的運行效率。線程在執(zhí)行過程中與進程還是有區(qū)別的。每個獨立的線程有一個程序運行的入口、順序執(zhí)行序列和程序的出 口。但是線程不能夠獨立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個線程執(zhí)行控制。從邏輯角度來看,多線程的意義在于一個應(yīng)用程序中,有多個執(zhí)行部分可以同時執(zhí)行。但操作系統(tǒng)并沒有將多個線程看做多個獨立的應(yīng)用,來實現(xiàn)進程的調(diào)度和管理以及資源分配。這就是進程和線程的重要區(qū)別。進程是具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合上的一次運行活動,進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位. 線程是進程的一個實體,是CPU調(diào)度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源. 一個線程可以創(chuàng)建和撤銷另一個線程;同一個進程中的多個線程之間可以并發(fā)執(zhí)行.
關(guān)于進程安全 如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結(jié)果和單線程運行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的?;蛘哒f:一個類或者程序所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導致該接口的執(zhí)行結(jié)果存在二義性,也就是說我們不用考慮同步的問題。線程安全問題都是由全局變量及靜態(tài)變量引起的。若每個線程中對全局變量、靜態(tài)變量只有讀操作,而無寫操作,一般來說,這個全局變量是線程安全的;若有多個線程同時執(zhí)行寫操作,一般都需要考慮線程同步,否則就可能影響線程安全。 舉例: 比如一個 ArrayList 類,在添加一個元素的時候,它可能會有兩步來完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。 在單線程運行的情況下,如果 Size = 0,添加一個元素后,此元素在位置 0,而且 Size=1; 而如果是在多線程情況下,比如有兩個線程,線程 A 先將元素存放在位置 0。但是此時 CPU 調(diào)度線程A暫停,線程 B 得到運行的機會。線程B也向此 ArrayList 添加元素,因為此時 Size 仍然等于 0 (注意哦,我們假設(shè)的是添加一個元素是要兩個步驟哦,而線程A僅僅完成了步驟1),所以線程B也將元素存放在位置0。然后線程A和線程B都繼續(xù)運行,都增加 Size 的值。 那好,現(xiàn)在我們來看看 ArrayList 的情況,元素實際上只有一個,存放在位置 0,而 Size 卻等于 2。這就是“線程不安全”了。
|
|
|
來自: everydayOK > 《Lr資料》