楊鵬
摘要 并發(fā)性是影響網(wǎng)絡(luò)程序設(shè)計(jì)的主要因素,而隨著互聯(lián)網(wǎng)的不斷發(fā)展,現(xiàn)階段網(wǎng)絡(luò)程序設(shè)計(jì)中的并發(fā)復(fù)雜性也越來越高,為了更好的解決這樣的問題,在針對網(wǎng)絡(luò)程序設(shè)計(jì)現(xiàn)狀及網(wǎng)絡(luò)程序并發(fā)復(fù)雜性進(jìn)行介紹的基礎(chǔ)上,本文將在最后一部分內(nèi)容中研究網(wǎng)絡(luò)程序設(shè)計(jì)中的并發(fā)處理模型。
【關(guān)鍵詞】網(wǎng)絡(luò)程序設(shè)計(jì) 并發(fā)復(fù)雜性 模型
傳統(tǒng)的程序設(shè)計(jì)大都是在單機(jī)環(huán)境下完成的,而這樣的程序設(shè)計(jì)方法顯然不適用于當(dāng)前越來越復(fù)雜的網(wǎng)絡(luò)環(huán)境。在網(wǎng)絡(luò)程序設(shè)計(jì)的過程中,針對并發(fā)性的問題應(yīng)如何處理是影響整體程序性能的關(guān)鍵,為了盡量降低網(wǎng)絡(luò)程序的開發(fā)難度,對并發(fā)管理及具體的并發(fā)處理模型進(jìn)行研究是非常有必要的。本文將結(jié)合現(xiàn)階段最為常用的事件驅(qū)動(dòng)并發(fā)模型、多線程并發(fā)模型等展開論述。
1 網(wǎng)絡(luò)程序設(shè)計(jì)現(xiàn)狀
隨著互聯(lián)網(wǎng)及相關(guān)技術(shù)的不斷發(fā)展,網(wǎng)絡(luò)的應(yīng)用已經(jīng)滲透到了生活的方方面面,在這樣的背景之下,網(wǎng)絡(luò)程序設(shè)計(jì)的性能和質(zhì)量也就直接決定了相關(guān)軟件、設(shè)備能否有效的發(fā)揮其網(wǎng)絡(luò)功能。結(jié)合現(xiàn)狀來說,針對并發(fā)復(fù)雜性的處理是影響網(wǎng)絡(luò)程序設(shè)計(jì)發(fā)展的主要因素之一,而這一問題在實(shí)際程序設(shè)計(jì)過程中并不可能完全的避免,因此,程序設(shè)計(jì)人員應(yīng)結(jié)合實(shí)際需求,從細(xì)節(jié)和整體兩個(gè)方面出發(fā)對網(wǎng)絡(luò)程序設(shè)計(jì)進(jìn)行完善,盡量的縮小并發(fā)復(fù)雜性問題的處理規(guī)模,以此來保證網(wǎng)絡(luò)程序設(shè)計(jì)能達(dá)到人們生產(chǎn)、生活的具體需求。
2 網(wǎng)絡(luò)程序并發(fā)復(fù)雜性
從定義上來說,“并發(fā)”主要是指在同一個(gè)時(shí)間段中,程序中同時(shí)有某幾個(gè)程序都處于已經(jīng)啟動(dòng)運(yùn)行到運(yùn)行完畢的狀態(tài)之中,同時(shí),這幾個(gè)程序都在同一個(gè)處理機(jī)上運(yùn)行,那么就可以認(rèn)為這臺(tái)處理機(jī)上同時(shí)有幾個(gè)程序并發(fā)的在運(yùn)行。實(shí)際上,所謂的“并發(fā)”是不同程序之間的“串聯(lián)”,即在某一個(gè)具體的時(shí)間點(diǎn)上,處理機(jī)上只有一個(gè)程序在運(yùn)行。針對網(wǎng)絡(luò)程序設(shè)計(jì)并發(fā)復(fù)雜性的處理也就是針對同一時(shí)間段內(nèi)不同程序、不同運(yùn)行狀態(tài)之間的處理。上文中已經(jīng)提到,現(xiàn)階段網(wǎng)絡(luò)程序設(shè)計(jì)中并發(fā)性的問題并不能得到徹底的解決,程序設(shè)計(jì)人員應(yīng)結(jié)合具體的需求和實(shí)際狀況來對并發(fā)處理模型進(jìn)行選擇,常用的處理模型有事件驅(qū)動(dòng)并發(fā)模型、多線程模型、派生并發(fā)模型等,這些模型之間的優(yōu)劣性并不能獨(dú)立的來討論,在不同的應(yīng)用環(huán)境之下,他們所表現(xiàn)出的優(yōu)缺點(diǎn)各有不同,本文將在后續(xù)內(nèi)容中進(jìn)行詳細(xì)論述。
3 網(wǎng)絡(luò)程序設(shè)計(jì)中的并發(fā)理模型
3.1 事件驅(qū)動(dòng)并發(fā)模型
由于馮·諾依曼計(jì)算機(jī)模型的普及,事件驅(qū)動(dòng)并發(fā)模型仍是現(xiàn)階段網(wǎng)絡(luò)程序設(shè)計(jì)中應(yīng)用范圍最廣的處理模型之一。事件驅(qū)動(dòng)并發(fā)模型可以分為反應(yīng)式和前攝式兩類,前者中的事件主要是指“當(dāng)可以發(fā)送數(shù)據(jù)”、“當(dāng)可以接受數(shù)據(jù)”等,而前攝式中的事件則是指“當(dāng)發(fā)送完成”、“當(dāng)接受完成”等。
事件驅(qū)動(dòng)模型中存在的問題主要有控制流翻轉(zhuǎn)、函數(shù)分裂等,其中,控制流翻轉(zhuǎn)主要是由于在這一模型中,事件與任務(wù)之間的關(guān)系是由事件分派器來處理的,而程序在處理完每個(gè)事件之后,都要將CPU的控制權(quán)重新返還到底層事件分派器,由事件分派器進(jìn)行后續(xù)處理,進(jìn)而出現(xiàn)控制流反轉(zhuǎn)。Spring應(yīng)用框架能夠結(jié)合控制反轉(zhuǎn)原理實(shí)現(xiàn)依賴注入和面向方面的程序設(shè)計(jì),進(jìn)而降低不同模塊之間的耦合度,解決控制流反轉(zhuǎn)問題。函數(shù)分裂問題通常是伴隨控制流反轉(zhuǎn)而出現(xiàn)的,當(dāng)一個(gè)任務(wù)中包含了需要事件來驅(qū)動(dòng)的部分時(shí),那么這些任務(wù)就需要被拆分成多個(gè)函數(shù),這樣的狀況必然會(huì)導(dǎo)致代碼冗余,影響程序質(zhì)量。函數(shù)分裂問題可以通過編程語言來解決,JavaScript、Python等都支持就地函數(shù),即在分裂處就地定義一個(gè)新的函數(shù),以此來降低程序的復(fù)雜性。
3.2 多線程并發(fā)模型
線程可以分為搶占式和協(xié)作式兩類,前者主要是由調(diào)度器來決定線程具體的調(diào)度時(shí)機(jī),而后者則僅在任務(wù)主動(dòng)放棄CPU控制權(quán)時(shí)才會(huì)進(jìn)行切換。不同的處理模式也導(dǎo)致了不同的問題出現(xiàn),搶占式線程很有可能導(dǎo)致數(shù)據(jù)競爭,由于線程調(diào)度器大多位于操作系統(tǒng)內(nèi)核,而所有線程的相關(guān)操作都要經(jīng)過系統(tǒng)調(diào)用,在高并發(fā)或線程間協(xié)作復(fù)雜性較高等情況下,搶占式線程并發(fā)模型必然會(huì)造成空間的浪費(fèi),限制并發(fā)規(guī)模。針對這樣的問題,現(xiàn)階段已經(jīng)能通過編程語言來進(jìn)行解決,例如Java、C#等語言已經(jīng)不將占據(jù)內(nèi)存空間較大的對象分配在棧空間中,此外,使用鏈表形式的堆棧來取代連續(xù)空間的堆棧也能很好的解決這一問題。
多線程并發(fā)模型還同時(shí)存在靈活性較差的問題,在大部分情況下,多線程已經(jīng)能完成程序的開發(fā)需求,而當(dāng)遇到“廣播”、“訂閱”等類型的控制流時(shí),多線程模型很有可能難以對此類精巧的控制流進(jìn)行表達(dá)。針對這樣的問題,多線程模型與事件驅(qū)動(dòng)模型混用是主要的解決辦法,即混合型并發(fā)模型。
3.3 派生并發(fā)模型
本文主要對派生并發(fā)模型中的期貨進(jìn)行介紹。期貨模型具備以下特點(diǎn):并發(fā)管理的任務(wù)只集中于產(chǎn)生期貨的代碼,而使用期貨的代碼則不需要了解管理并發(fā)的具體細(xì)節(jié)。隨著并發(fā)程序設(shè)計(jì)受到的關(guān)注程度越來越高,期貨模型才得到了一定程度的發(fā)展,而針對這一模型的優(yōu)化則要從編程語言層面入手,進(jìn)而保證程序精簡。
3.4 混合型并發(fā)模型
事件驅(qū)動(dòng)模型與多線程模型適用于不同的應(yīng)用場景,而事件+線程的混合模型則能區(qū)分不同的場合來選擇合適的模型。例如,如果一個(gè)任務(wù)包含的等待點(diǎn)較多、流程較長,那么就應(yīng)該選擇線程模型來進(jìn)行處理,這種情況下,事件驅(qū)動(dòng)模型的應(yīng)用將會(huì)導(dǎo)致代碼中出現(xiàn)大量函數(shù)分裂,導(dǎo)致程序冗余。反之,則可以使用事件驅(qū)動(dòng)模型來進(jìn)行處理。
4 結(jié)語
綜上所述,在針對網(wǎng)絡(luò)程序設(shè)計(jì)現(xiàn)狀及其并發(fā)復(fù)雜性的實(shí)質(zhì)進(jìn)行介紹的基礎(chǔ)上,本文主要針對事件驅(qū)動(dòng)并發(fā)模型、多線程并發(fā)模型、混合型并發(fā)模型做了研究??偟膩碚f,網(wǎng)絡(luò)程序設(shè)計(jì)中的并發(fā)問題并不能完全的避免,而程序設(shè)計(jì)人員則應(yīng)根據(jù)具體的需求和實(shí)際情況來選擇合適的并發(fā)處理模型。
參考文獻(xiàn)
[1]林贊煌,關(guān)于網(wǎng)絡(luò)程序設(shè)計(jì)中的并發(fā)復(fù)雜性的幾點(diǎn)思考[J].民營科技,2016 (09).
[2]楊文福,王捷,網(wǎng)絡(luò)系統(tǒng)設(shè)計(jì)中的程序設(shè)計(jì)并發(fā)復(fù)雜性[J].信息通信,2016 (01).
[3]高偉,張學(xué)紅,關(guān)于網(wǎng)絡(luò)程序設(shè)計(jì)中的并發(fā)復(fù)雜性研究[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2014 (12).