一個好的服務(wù)器,一般都是并發(fā)服務(wù)器(同一時刻可以響應(yīng)多個客戶端的請求)。并發(fā)服務(wù)器設(shè)計技術(shù)一般有:多進(jìn)程服務(wù)器、多線程服務(wù)器、I/O復(fù)用服務(wù)器等。
1、多進(jìn)程服務(wù)器
多進(jìn)程服務(wù)器是當(dāng)客戶有請求時,服務(wù)器用一個子進(jìn)程來處理客戶請求。父進(jìn)程繼續(xù)等待其它客戶的請求。這種方法的優(yōu)點是當(dāng)客戶有請求時,服務(wù)器能及時處理客戶,特別是在客戶服務(wù)器交互系統(tǒng)中。對于一個 TCP 服務(wù)器,客戶與服務(wù)器的連接可能并不馬上關(guān)閉,可能會等到客戶提交某些數(shù)據(jù)后再關(guān)閉,這段時間服務(wù)器端的進(jìn)程會阻塞,所以這時操作系統(tǒng)可能調(diào)度其它客戶服務(wù)進(jìn)程,這比起循環(huán)服務(wù)器大大提高了服務(wù)性能。
總結(jié):通過為每個客戶端創(chuàng)建?個進(jìn)程的方式, 能夠同時為多個客戶端進(jìn)行服務(wù),當(dāng)客戶端不是特別多的時候, 這種方式還行, 如果有成百上千個, 就不可取了, 因為每次創(chuàng)建進(jìn)程等過程需要消耗較多的資源。
2、多線程服務(wù)器
多線程服務(wù)器與多進(jìn)程服務(wù)器在代碼上十分相似,只需要做出稍微的改動,這里不再贅述。
3、進(jìn)程與線程的比較
從以上可以看出,多進(jìn)程和多線程都實現(xiàn)了同樣的目的,從表面來看并沒有太大區(qū)別,那么進(jìn)程和線程的區(qū)別究竟表現(xiàn)在哪里呢?
1、進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制品,是獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制品;而線程,相對與進(jìn)程而言,線程是一個更加接近執(zhí)行體的概念,它可以與同進(jìn)程的其他線程共享數(shù)據(jù),但擁有自己的棧空間,擁有獨立的執(zhí)行序列。兩者都可以提高程序的并發(fā)度,提高程序運行效率和響應(yīng)時間。
2、線程和進(jìn)程在使用上各有優(yōu)缺點:線程執(zhí)行開銷小,但不利于資源管理和保護(hù);而進(jìn)程正相反。同時,線程適合于在SMP機(jī)器(簡單來講就是平時所說的雙CPU系統(tǒng),是對稱多處理機(jī)中最常見的一種)上運行,而進(jìn)程則可以跨機(jī)器遷移。
3、根本區(qū)別就一點:用多進(jìn)程每個進(jìn)程有自己的地址空間(address space),線程則共享地址空間。所有其它區(qū)別都是由此而來的:a、速度:線程產(chǎn)生的速度快,線程間的通訊快、切換快等,因為他們在同一個地址空間內(nèi);b、資源利用率:線程的資源利用率比較好也是因為他們在同一個地址空間內(nèi);c、同步問題:線程使用公共變量/內(nèi)存時需要使用同步機(jī)制還是因為他們在同一個地址空間內(nèi)。
舉一個比較形象的例子,多進(jìn)程的服務(wù)器就好比是立體的交通系統(tǒng)(立交橋),雖然說建造的時候花費比較大,消耗的資源比較多,但是真要是跑起來不會交通堵塞。但是汽車在上面跑,相互通信就是個很費事兒問題(進(jìn)程間通信比較麻煩);多線程就好比是平面的交通系統(tǒng),造價低,但是很容易交通堵塞,但是也有好處,同步的時候方便。
在網(wǎng)絡(luò)服務(wù)器方面:
單進(jìn)程 < 多進(jìn)程(單線程)< 多進(jìn)程(多線程)