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