![顧客服務(wù)員程序的設(shè)計(jì)要點(diǎn)說(shuō)明_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/bac5c1ba-7035-4f7b-8e86-7e357d789bff/bac5c1ba-7035-4f7b-8e86-7e357d789bff1.gif)
![顧客服務(wù)員程序的設(shè)計(jì)要點(diǎn)說(shuō)明_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/bac5c1ba-7035-4f7b-8e86-7e357d789bff/bac5c1ba-7035-4f7b-8e86-7e357d789bff2.gif)
![顧客服務(wù)員程序的設(shè)計(jì)要點(diǎn)說(shuō)明_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/8/bac5c1ba-7035-4f7b-8e86-7e357d789bff/bac5c1ba-7035-4f7b-8e86-7e357d789bff3.gif)
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、更多企業(yè)學(xué)院:中小企業(yè)管理全能版183套講座+89700 份資料總經(jīng)理、高層管理49套講座+16388份資料中層管理學(xué)院46套講座+6020份資料國(guó)學(xué)智慧、易經(jīng)46套講座人力資源學(xué)院56套講座+27123份資料各階段員工培訓(xùn)學(xué)院77套講座+ 324份資料員工管理企業(yè)學(xué)院67套講座+ 8720份資料工廠生產(chǎn)管理學(xué)院52套講座+ 13920份資料財(cái)務(wù)管理學(xué)院53套講座+ 17945份資料銷(xiāo)售經(jīng)理學(xué)院56套講座+ 14350份資料銷(xiāo)售人員培訓(xùn)學(xué)院72套講座+ 4879份資料第四章 顧客服務(wù)員程序設(shè)計(jì)4.1網(wǎng)絡(luò)服務(wù)模式近年來(lái),在信息系統(tǒng)中廣泛使用的信息共享模型是顧客/服務(wù)器模型,這種計(jì)算模式迅速取代了
2、以主機(jī)為主導(dǎo)的集中式計(jì)算方法。顧客/服務(wù)器計(jì)算具有自己的一組行業(yè)術(shù)語(yǔ)。表4-1列出了一些術(shù)語(yǔ),這些術(shù)語(yǔ)經(jīng)常出現(xiàn)在對(duì)顧客/服務(wù)器產(chǎn)品和應(yīng)用的描述中。表4-1顧客/服務(wù)器術(shù)語(yǔ)術(shù)語(yǔ)說(shuō)明應(yīng)用程序編程接口( API)一組支持顧客/服務(wù)器之間進(jìn)行相互通信的函數(shù)和可調(diào)用程序顧客一個(gè)服務(wù)的請(qǐng)求方,通常是一個(gè)末端系統(tǒng),能夠從服務(wù)器處查詢信息中間件一組驅(qū)動(dòng)程序、應(yīng)用程序編程接口或其它軟件,用于改善顧客/服務(wù)器之間的連接關(guān)系數(shù)據(jù)庫(kù)是一種把信息訪問(wèn)限制于按照搜索條件選擇數(shù)據(jù)的數(shù)據(jù)庫(kù)服務(wù)器是一臺(tái)計(jì)算機(jī),通常是一臺(tái)高性能工作站、 小型機(jī)或大型機(jī),擁有供網(wǎng)絡(luò)中 眾多用戶訪問(wèn)的信息結(jié)構(gòu)化查詢語(yǔ)言(SQL)由IBM開(kāi)發(fā)、由AN
3、SI標(biāo)準(zhǔn)化的一種語(yǔ)言,用于對(duì)關(guān)系數(shù)據(jù)庫(kù)的尋址、創(chuàng) 建、更新和查詢顧客/服務(wù)器環(huán)境中最基本元素是顧客和服務(wù)器。顧客通常是PC或工作站,為端用戶提供非常友好的界面, 例如微軟的 Windows等。服務(wù)器為顧客提供一組共享的用戶服務(wù)程 序。最常見(jiàn)的是數(shù)據(jù)庫(kù)服務(wù)器,服務(wù)器能夠使很多顧客共享對(duì)同一信息源的訪問(wèn)。除了顧客和服務(wù)器,組成顧客 /服務(wù)器模型的第三個(gè)基本要素是網(wǎng)絡(luò)系統(tǒng)。顧客。服務(wù) 器計(jì)算是分布式計(jì)算。用戶、應(yīng)用程序和資源是分布式的,用來(lái)響應(yīng)實(shí)際業(yè)務(wù)請(qǐng)求,并且它 們通過(guò)局域網(wǎng)、廣域網(wǎng)或 In ternet連接起來(lái)。顧客/服務(wù)器模型與分布式處理有很多不同點(diǎn),主要有:在用戶自己的系統(tǒng)中為該用戶提供界面
4、友好的應(yīng)用程序。這使得用戶可以在很大程度上控制時(shí)間安排和計(jì)算機(jī)使用類(lèi)型,并使得部門(mén)管理者具有響應(yīng)本地需求的能 力。盡管應(yīng)用是分散的,但仍然強(qiáng)調(diào)數(shù)據(jù)的集中以及很多網(wǎng)絡(luò)管理和使用功能的集中。 對(duì)于用戶組織和廠商來(lái)說(shuō),他們有一個(gè)共同的承諾,使系統(tǒng)開(kāi)放和模塊化。這意味 著用戶在選擇產(chǎn)品和混合使用來(lái)自眾多廠家的設(shè)備時(shí)具有很大的選擇性。網(wǎng)絡(luò)互聯(lián)是操作的基礎(chǔ),網(wǎng)絡(luò)管理和網(wǎng)絡(luò)安全在組織和操作系統(tǒng)中具有很高的優(yōu)先權(quán)。顧客/服務(wù)器應(yīng)用顧客/服務(wù)器體系結(jié)構(gòu)的核心是應(yīng)用程序級(jí)任務(wù)在顧客和服務(wù)器之間的分配。圖4-1給出了這個(gè)模型的一般情況。無(wú)論是顧客還是服務(wù)器,最基本的軟件是運(yùn)行在硬件平臺(tái)上的操作系統(tǒng),顧客的平臺(tái)和操作
5、系統(tǒng)可能和服務(wù)器的不同。事實(shí)上,在網(wǎng)絡(luò)環(huán)境下,可能會(huì)有很 多不同類(lèi)型的顧客平臺(tái)和操作系統(tǒng)以及很多類(lèi)型的服務(wù)器平臺(tái)和操作系統(tǒng)。只要特定的顧客和服務(wù)器共享相同的通信協(xié)議并支持相同的應(yīng)用程序,低層的細(xì)節(jié)不必考慮。顧客表示服務(wù)請(qǐng)求/應(yīng)答服務(wù)器應(yīng)用邏輯(顧客部分)4應(yīng)用邏輯(服務(wù)器部分)通信軟件通信軟件顧客操作系統(tǒng)協(xié)議交互服務(wù)器操作系統(tǒng)硬件平臺(tái)硬件平臺(tái)圖4-1顧客/服務(wù)器體系結(jié)構(gòu)使顧客和服務(wù)器能夠交互的基礎(chǔ)是通信軟件,這種軟件主要例子是TCP/IP。所有這些支持軟件(通信軟件和操作系統(tǒng))的主要任務(wù)是,為分布式的應(yīng)用程序提供一個(gè)基本結(jié)構(gòu)。在理論上,應(yīng)用程序所執(zhí)行的實(shí)際功能可以針對(duì)顧客和服務(wù)器分割開(kāi)來(lái),方法
6、是使平臺(tái)和網(wǎng)絡(luò)資源達(dá)到最優(yōu)化。且使用戶執(zhí)行各種任務(wù)及相互之間合作使用共享資源的能力達(dá)到最優(yōu) 化。在某些情況下,這些都要求大批的應(yīng)用程序軟件在服務(wù)器上執(zhí)行,而在其它一些情況下,多數(shù)應(yīng)用程序邏輯上位于顧客端。顧客/服務(wù)器環(huán)境能夠成功的一個(gè)基本因素是用戶將系統(tǒng)當(dāng)作一個(gè)整體而與之打交道的方式。因此,顧客端的用戶界面的設(shè)計(jì)是十分重要的。在大多數(shù)顧客/服務(wù)器系統(tǒng)中,都突出強(qiáng)調(diào)了要提供易于使用、易于學(xué)習(xí)、功能強(qiáng)大并且靈活的圖形用戶界面(GUI )。顧客/服務(wù)器應(yīng)用程序分類(lèi)在顧客/服務(wù)器的通用框架中,對(duì)顧客和服務(wù)器的工作劃分有許多不同的實(shí)現(xiàn)方法。圖4-2針對(duì)數(shù)據(jù)庫(kù)應(yīng)用說(shuō)明了可以以多種方式來(lái)分配處理過(guò)程,圖中概
7、括了數(shù)據(jù)庫(kù)應(yīng)用的一些主要選項(xiàng)。當(dāng)然也存在其它的劃分方法,并且對(duì)于其它不同類(lèi)型的應(yīng)用選項(xiàng)也可能具有不同的特點(diǎn)。服務(wù)器(a)基于主機(jī)的處理顧客顧客(b) 基于服務(wù)器的處理(c) 合作處理服務(wù)器服務(wù)器(d) 基于顧客的處理圖4-2顧客/服務(wù)器應(yīng)用程序分類(lèi)圖 4-2 描述了 4 種網(wǎng)絡(luò)服務(wù)類(lèi)型,它們分別是:基于主機(jī)的處理: 基于主機(jī)的處理并不是真正的用戶普遍認(rèn)同的顧客 / 服務(wù)器計(jì)算。 而且,基于主機(jī)的處理是指?jìng)鹘y(tǒng)的大型機(jī)環(huán)境,實(shí)質(zhì)上所有的處理都是在一臺(tái)中心 主機(jī)上完成的。用戶接口通常是通過(guò)一臺(tái)啞終端,即使用戶在使用一臺(tái)微機(jī),用戶 終端也是局限于終端仿真器的角色?;诜?wù)器的處理:顧客 / 服務(wù)器配置
8、的最基本的一類(lèi),即顧客端主要負(fù)責(zé)提供圖 形化用戶界面,而實(shí)質(zhì)上所有的處理都是在服務(wù)器上完成的。這種配置是早期的顧 客/ 服務(wù)器模式,尤其是部門(mén)級(jí)系統(tǒng)的典型。在這種配置背后的基本原理是用戶工 作站最適合提供良好的用戶界面,并且數(shù)據(jù)庫(kù)和應(yīng)用程序很容易在中心系統(tǒng)上維 護(hù)?;陬櫩偷奶幚恚涸诹硪粋€(gè)極端,實(shí)際上所有應(yīng)用處理可以全部在顧客端完成。一 個(gè)例外是最適合在服務(wù)器上執(zhí)行的數(shù)據(jù)確認(rèn)例程和其它數(shù)據(jù)庫(kù)邏輯功能。一般地, 某些更復(fù)雜的數(shù)據(jù)庫(kù)邏輯功能都位于顧客端。 這種結(jié)構(gòu)可能是當(dāng)今使用最普遍的顧 客/ 服務(wù)器方式,使用戶能夠使用適合本地需要的應(yīng)用。合作處理:在合作處理配置方式中,應(yīng)用處理是以最優(yōu)化的方式來(lái)
9、執(zhí)行的,充分利 用了顧客和服務(wù)器兩方面的優(yōu)勢(shì)以及數(shù)據(jù)的分布性。 這樣一種配置在設(shè)置和維護(hù)方 面更加復(fù)雜,但從長(zhǎng)遠(yuǎn)看,這種配置類(lèi)型比其它類(lèi)型可以為用戶更好的服務(wù)質(zhì)量和 更高的網(wǎng)絡(luò)效率。圖 4-2c 和圖 4-2d 對(duì)應(yīng)的配置情況是在顧客端上有相當(dāng)大的一部分負(fù)載。這種所謂的 “胖顧客”( fat client )模型已經(jīng)被像 Powersoft 公司的 PowerBuilder 和 Gupta 公司的 SQL Windows 這樣的應(yīng)用程序開(kāi)發(fā)工具所采用。 使用這些工具開(kāi)發(fā)的應(yīng)用在范圍上是部門(mén) 級(jí)的,支持 25 到 150 個(gè)用戶。胖顧客的主要優(yōu)點(diǎn)是它充分利用了桌面功能,卸除了服務(wù) 器上的應(yīng)用處理
10、并使它們更加有效,不易發(fā)生瓶頸。然而,胖顧客策略也存在許多缺點(diǎn),隨著更多功能累加起來(lái),快速地超出了桌面機(jī)器的 容量,迫使機(jī)器進(jìn)行升級(jí)。如果模型擴(kuò)充,超出了部門(mén)的界限,合并了很多用戶,則必須安 裝高性能局域網(wǎng)來(lái)支持瘦服務(wù)器和胖顧客之間大量的數(shù)據(jù)傳輸。 最后,維護(hù)、 升級(jí)或替換分 布于數(shù)十臺(tái)或百臺(tái)桌面機(jī)的應(yīng)用程序是非常困難的。圖 4-2b 代表了一種瘦顧客( thin client )的方式,這種方式更近似地模仿了傳統(tǒng)的以 主機(jī)為中心的方式, 常常是使應(yīng)用程序從大型機(jī)環(huán)境發(fā)展到分布式環(huán)境的移植途徑, 是目前 流行的 Internet 網(wǎng)絡(luò)環(huán)境下的應(yīng)用程序開(kāi)發(fā)模式。4.1.3 三層顧客 / 服務(wù)器結(jié)
11、構(gòu)傳統(tǒng)的顧客 / 服務(wù)器結(jié)構(gòu)包括兩級(jí)(或稱兩層) :顧客層和服務(wù)器層。近年來(lái),一種三 層結(jié)構(gòu)變得日益流行,如圖 4-3 所示。在這種結(jié)構(gòu)中,應(yīng)用軟件分布在三種類(lèi)型的機(jī)器上: 用戶機(jī)器、 中間層服務(wù)器以及后端服務(wù)器。用戶機(jī)器是顧客, 在三層結(jié)構(gòu)中,它一般是一種 瘦型顧客。 中間層機(jī)器基本上是位于顧客和很多后端數(shù)據(jù)庫(kù)服務(wù)器之間的連接器。 中間層機(jī) 器能夠轉(zhuǎn)換協(xié)議, 從一種類(lèi)型的數(shù)據(jù)庫(kù)系統(tǒng)映像為另一種。 另外, 中間層機(jī)器能夠融合來(lái)自 不同數(shù)據(jù)源的結(jié)果。 最后, 中間層機(jī)器也可以充當(dāng)桌面應(yīng)用程序和后端應(yīng)用程序之間的連接 器。在中間層服務(wù)器和后端服務(wù)器之間的交互也遵從顧客 / 服務(wù)器的模式。因此,中間
12、層服 務(wù)器同時(shí)充當(dāng)著顧客和服務(wù)器。圖4-3三層顧客/服務(wù)器結(jié)構(gòu)4.1.4 中間件顧客/服務(wù)器產(chǎn)品的開(kāi)發(fā)和使用缺少標(biāo)準(zhǔn)化,使得實(shí)現(xiàn)集成的、多廠商的、企業(yè)范圍的 顧客/服務(wù)器配置變得困難,因?yàn)轭櫩?/服務(wù)器方式的大多數(shù)優(yōu)點(diǎn)與其模塊化以及將平臺(tái)和 應(yīng)用程序混合、協(xié)調(diào)起來(lái)提供商業(yè)解決辦法的能力緊密相連的,這種互操作問(wèn)題必須得到很好的解決。為了獲得顧客/服務(wù)器的優(yōu)點(diǎn),開(kāi)發(fā)者必須開(kāi)發(fā)一組工具,為跨越所有平臺(tái)訪問(wèn)系統(tǒng)資 源提供唯一的方法和形式。這使程序員能夠構(gòu)件這樣的應(yīng)用程序:在不同的PC機(jī)和工作站上所見(jiàn)所感相同,而且無(wú)論數(shù)據(jù)在什么位置都使用相同的方法來(lái)訪問(wèn)數(shù)據(jù)。滿足這一要求的最普遍的方法是,在上層應(yīng)用程序
13、和下層通信軟件和操作系統(tǒng)之間使用 標(biāo)準(zhǔn)編程接口和協(xié)議。這種標(biāo)準(zhǔn)化的接口和協(xié)議稱為中間件(middleware )。具有了標(biāo)準(zhǔn)的編程接口,在不同的服務(wù)器類(lèi)型和工作站類(lèi)型上實(shí)現(xiàn)相同的應(yīng)用就很容易了。這對(duì)于用戶來(lái)說(shuō)具有明顯的好處,而廠商也受到市場(chǎng)的驅(qū)動(dòng)來(lái)提供這樣的接口。主要原因是用戶購(gòu)買(mǎi)應(yīng)用程序而不是服務(wù)器;用戶將只選擇那些運(yùn)行了他們希望的應(yīng)用程序的服務(wù)器。需要標(biāo)準(zhǔn)化的協(xié)議將這些不同的服務(wù)器接口與需要訪問(wèn)它們的顧客連接起來(lái)。目前已經(jīng)有很多中間件軟件包,從非常簡(jiǎn)單的到非常復(fù)雜的。它們所具有的共同特點(diǎn)是 隱藏不同網(wǎng)絡(luò)協(xié)議和操作系統(tǒng)的復(fù)雜性和不一致性。顧客和服務(wù)器廠商一般都提供了很多非常流行的中間件軟件包
14、供選擇,這樣,用戶可以決定一個(gè)特定的中間件策略,然后從各個(gè)廠商那里匯集裝置,來(lái)支持這個(gè)策略。圖4-4給出了在顧客/服務(wù)器結(jié)構(gòu)中中間件的作用。注意,中間件具有顧客端組件和服務(wù)器端組件兩部分,中間件的基本目的是使位于顧客端的應(yīng)用程序或用戶能夠訪問(wèn)服務(wù)器上的各種服務(wù),同時(shí)不需考慮服務(wù)器之間的差別。對(duì)于特定的應(yīng)用領(lǐng)域,結(jié)構(gòu)化查詢語(yǔ)言(SQL )提供一種標(biāo)準(zhǔn)化的方式,由本地或遠(yuǎn)程的用戶或應(yīng)用程序訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)。然而關(guān)系數(shù)據(jù)庫(kù)廠商盡管支持SQL,但他們將自己專(zhuān)有的擴(kuò)展加到了 SQL中。這樣使廠商能夠讓眾多產(chǎn)品有所差別,但也產(chǎn)生了潛在的不兼容性。圖4-4在顧客/服務(wù)器結(jié)構(gòu)中中間件的作用4.1.5 文件cac
15、he的一致性當(dāng)使用文件服務(wù)器時(shí),文件I/O的性能相對(duì)于局部文件訪問(wèn)具有顯著的下降,主要原因是網(wǎng)絡(luò)帶來(lái)的延遲。為了減少這種性能下降,系統(tǒng)可以使用文件高速緩沖器來(lái)保存最近訪 問(wèn)的文件記錄。由于局部性原理,使用本地文件高速緩沖器可以減少必須進(jìn)行的遠(yuǎn)程服務(wù)器 訪問(wèn)次數(shù)。圖4-5文件高速緩存機(jī)制圖4-5描述了一種典型的文件高速緩存機(jī)制,用于在網(wǎng)絡(luò)互連的工作站組上高速緩存文件。當(dāng)進(jìn)程要進(jìn)行文件訪問(wèn)時(shí),請(qǐng)求首先提交到進(jìn)程所在的工作站的cache中,如果在那里未得到滿足,則該請(qǐng)求或者傳遞給本地磁盤(pán),或者傳遞給文件服務(wù)器。 在服務(wù)器端,首先查詢服務(wù)器上的cache,如果沒(méi)有命中,則訪問(wèn)文件服務(wù)器的磁盤(pán)。 雙重高
16、速緩存的方法 用于減少通信量和磁盤(pán) I/O。當(dāng)cache中總能含有遠(yuǎn)程數(shù)據(jù)的精確副本時(shí),這些cache是一致的。Cache之間可能會(huì)變得不一致。這是因?yàn)檫h(yuǎn)程數(shù)據(jù)已經(jīng)改變,而相應(yīng)的已經(jīng)陳舊的本地cache副本并沒(méi)有被廢棄。當(dāng)一個(gè)顧客修改了也被其它顧客高速緩存了的文件時(shí),這種情況就會(huì)發(fā)生。這個(gè)問(wèn)題實(shí)際上存在于兩個(gè)層次上,如果顧客采用了將任何變化立即寫(xiě)回服務(wù)器的文件中的策略, 則任何具有文件相關(guān)部分的cache副本的其它顧客將具有陳舊的數(shù)據(jù)。如果顧客延遲了將變化寫(xiě)回服務(wù)器,則問(wèn)題就更糟了,因?yàn)榉?wù)器本身也只是擁有文件的舊版本,且將請(qǐng)求讀至服務(wù)器的新文件也可能擁有陳舊的數(shù)據(jù)。保持本地cache副本是遠(yuǎn)
17、程數(shù)據(jù)的最新變化的問(wèn)題就是cache的一致性問(wèn)題。解決cache 一致性的最簡(jiǎn)單的方法是使用文件上鎖技術(shù),以防止多個(gè)顧客對(duì)文件的同 時(shí)訪問(wèn)。這在損害性能和靈活性的前提下保證了一致性。Sprite系統(tǒng)中的機(jī)制提供了更好的方法,任何數(shù)目的遠(yuǎn)程進(jìn)程可以打開(kāi)一個(gè)文件,用于讀入和生成它們自己的顧客cache,但是當(dāng)一個(gè)針對(duì)服務(wù)器的打開(kāi)文件請(qǐng)求要求寫(xiě)入訪問(wèn)而其它進(jìn)程都是為讀訪問(wèn)而打開(kāi)這個(gè) 文件的,則服務(wù)器要采取兩步行動(dòng):第一,它告知寫(xiě)入進(jìn)程,盡管它保留了一個(gè)cache,但是必須在發(fā)生更新時(shí)立即寫(xiě)回所有改變的塊。系統(tǒng)在一個(gè)時(shí)刻最多只能有一個(gè)這樣的顧客。 第二,服務(wù)器告知所有使文件打開(kāi)的讀進(jìn)程,該文件已不再是
18、可緩存的了。服務(wù)員類(lèi)型在本章所舉的各個(gè)例子中都必須指定進(jìn)程的類(lèi)型(顧客/服務(wù)員)和協(xié)議的類(lèi)型(面向連接/無(wú)連接),而對(duì)于服務(wù)員則還要進(jìn)一步指出是并發(fā)型服務(wù)員還是反復(fù)型服務(wù)員(通常 顧客并不在乎是和并發(fā)型服務(wù)員還是和反復(fù)型服務(wù)員通信)。這樣,就給出4種可能組合如表 4-1。表4-1服務(wù)員類(lèi)型服務(wù)員類(lèi)型反復(fù)型并發(fā)型面向連接不常用有代表性無(wú)連接有代表性不常用4.2標(biāo)準(zhǔn)In ternet 服務(wù)和常見(jiàn)的應(yīng)用4.2.1 標(biāo)準(zhǔn) In ternet 服務(wù)表4-2列出了 TCP/IP多數(shù)實(shí)現(xiàn)都提供的一些標(biāo)準(zhǔn)服務(wù)。表中的所有服務(wù)同時(shí)使用TCP和UDP提供,并且這兩個(gè)協(xié)議的端口號(hào)也相同。表4-2 標(biāo)準(zhǔn)TCP/IP
19、服務(wù)名字TCP 端口UDP 端口RFC說(shuō)明Echo (回射)77862服務(wù)器返回顧客發(fā)送的數(shù)據(jù)Discard (丟棄)99863服務(wù)器丟棄顧客發(fā)送的數(shù)據(jù)Daytime (時(shí)間/日期)1313867服務(wù)器返回可讀的日期和時(shí)間Chargen (字符生成)1919864TCP服務(wù)器發(fā)送連續(xù)的字符流,直到顧客終 止連接。每當(dāng)顧客發(fā)送一個(gè)數(shù)據(jù)報(bào),UDP就返回一個(gè)包含隨機(jī)數(shù)量字符的數(shù)據(jù)報(bào)。time (時(shí)間)3737868服務(wù)器返回一個(gè)32位二進(jìn)制數(shù)值的時(shí)間。 這個(gè)數(shù)值表示從1900年1月1日子時(shí)(UTC) 以來(lái)所流逝的秒數(shù)。這些服務(wù)通常由 Unix系統(tǒng)中的inetd守護(hù)進(jìn)程提供。使用標(biāo)準(zhǔn)的telnet顧客
20、程序很容 易測(cè)試這些功能。這五個(gè)功能由inetd內(nèi)部處理的功能,對(duì)于TCP版本的echo、discard和chargen服務(wù)器由inetd派生出來(lái)后作為子進(jìn)程運(yùn)行,這是因?yàn)樗鼈兌家\(yùn)行到相應(yīng)的 顧客終止連接為止。另外兩個(gè)TCP服務(wù)器time和daytime并不需要派生,因?yàn)樗鼈兊姆?wù)實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單(取得當(dāng)前的時(shí)間和日期,把它格式化后輸出,在關(guān)閉連接),因此它們由inetd直接處理。所有五個(gè)UDP服務(wù)的處理都不需要 fork調(diào)用,因?yàn)樗鼈冎痪鸵l(fā)它們的顧客數(shù)據(jù)報(bào)生成并回應(yīng)最多一個(gè)數(shù)據(jù)報(bào),因此它們是由inetd直接處理的。4.2.2 常見(jiàn)的In ternet 應(yīng)用表4-3總結(jié)了各種常見(jiàn)的In t
21、ernet應(yīng)用程序?qū)f(xié)議的使用情況。表4-3各種常見(jiàn)的Internet應(yīng)用程序?qū)f(xié)議的使用情況應(yīng)用程序IPICMPUDPTCPPing*Traceroute*OSPF (路由協(xié)議)*RIP (路由協(xié)議)*BGP (路由協(xié)議)*BOOTP (引導(dǎo)協(xié)議)*DHCP (引導(dǎo)協(xié)議)*NTP (時(shí)間協(xié)議)*TFTP (簡(jiǎn)單的FTP)*SNMP (網(wǎng)絡(luò)管理)*SMTP (電子郵件)*Telnet(虛擬終端)*FTP (文件傳輸)*HTTP (Web)*NNTP (網(wǎng)絡(luò)新聞)*DNS (域名系統(tǒng))*NFS (網(wǎng)絡(luò)文件系統(tǒng))*Sun RPC (遠(yuǎn)程過(guò)程調(diào)用)*表中,前兩個(gè)應(yīng)用程序Ping和Traceroute
22、 是診斷應(yīng)用程序,它們使用ICMP協(xié)議。Traceroute 構(gòu)造自己的UDP分組來(lái)發(fā)送,并讀ICMP的應(yīng)答。緊接著是三個(gè)比較流行的 路由協(xié)議,它們展示了路由協(xié)議使用的各種傳輸協(xié)議。OSPF采用原始套接口直接使用IP,而RIP使用UDP,BGB則使用 TCP。下面5個(gè)是基于UDP的應(yīng)用程序,接著 5個(gè)應(yīng)用程序使用 TCP,最后3個(gè)是同時(shí)使 用UDP和TCP的應(yīng)用程序。4.3 并發(fā)服務(wù)器4.3.1 套接口對(duì)一個(gè)TCP連接的套接口對(duì)(socket pair )是一個(gè)定義該連接的兩個(gè)端點(diǎn)的四元組:本 地IP地址、本地TCP端口號(hào)、遠(yuǎn)程IP地址和遠(yuǎn)程TCP端口號(hào)。套接口對(duì)唯一標(biāo)識(shí)一個(gè)互 連網(wǎng)上的TCP
23、連接。標(biāo)識(shí)每個(gè)端點(diǎn)的兩個(gè)值(IP地址和端口號(hào))通常稱為一個(gè)套接口??梢园烟捉涌趯?duì)的概念擴(kuò)展到UDP,即使UDP是面向無(wú)連接的。當(dāng)描述套接口函數(shù)(bi nd、connenct、getpeername 等)時(shí),注明它們?cè)谡f(shuō)明套接口對(duì)中那個(gè)值, 例如bind 函數(shù)要求應(yīng)用程序說(shuō)明本地 IP和本地端口,既可以是TCP套接口,也可以是UDP套接口。432并發(fā)服務(wù)器對(duì)于像時(shí)間/日期這樣簡(jiǎn)單的服務(wù)器,使用迭代服務(wù)器( iterative server )具有較好的 服務(wù)質(zhì)量;但是,當(dāng)顧客的請(qǐng)求需要長(zhǎng)時(shí)間服務(wù)時(shí),不可能讓一個(gè)服務(wù)器長(zhǎng)時(shí)間地為一個(gè)顧客服務(wù),為了提供網(wǎng)絡(luò)服務(wù)質(zhì)量,而是同時(shí)為多個(gè)顧客服務(wù)。Unix系
24、統(tǒng)下編寫(xiě)一個(gè)并發(fā)應(yīng)用程序最簡(jiǎn)單的方法就是為每個(gè)顧客均fork 一個(gè)子進(jìn)程。下面代碼給出了一個(gè)典型的并發(fā)服務(wù)器程序框架。pid_t pid;int liste nfd,c onnfd;listenfd=Socket();/*Bind(listenfd,);Liste n( liste nfd, LISTENQ); For(;)Conn fd=Accept(liste nfd,If(pid=Fork()=0) Close(liste nfd); Doit(co nn fd); Close(c onn fd); Exit(0);Close(c onn fd);*/*/*/*/*/*并發(fā)服務(wù)器中主服務(wù)
25、器循環(huán)派生子進(jìn)程來(lái)處理每個(gè)新的連接。 程來(lái)處理顧客的請(qǐng)求。具體過(guò)程如圖4-6所示。create a socket*/liste n from the socket*/);create a child process*/child closes liste ning socket*/child termi nates*/pare ntcloses conn ected socket并發(fā)服務(wù)器讓派生的子進(jìn)請(qǐng)求(1)顧客(監(jiān)聽(tīng)套接口)服務(wù)器Fork (2)服務(wù)器(子進(jìn)程)連接(3)(已連接套接口)圖4-6并發(fā)服務(wù)器讓子進(jìn)程處理顧客請(qǐng)求的服務(wù)圖中有一個(gè)服務(wù)器,它的IP地址為。服務(wù)器在它的眾所周知的端口
26、(例如21端口)上執(zhí)行被動(dòng)打開(kāi),并等待顧客的請(qǐng)求。這里使用符號(hào)指出服務(wù)器的套接口對(duì)。服務(wù)器在任意本地接口(第一個(gè)星號(hào)) 的端口 21上等待連接請(qǐng)求。遠(yuǎn)程 IP地址和遠(yuǎn)程端口沒(méi)有指定,用“*.* ”表示。這里的星號(hào)稱為通配(wildcard )符。如果運(yùn)行服務(wù)器的主機(jī)有多個(gè)IP地址,服務(wù)器可以說(shuō)明它只接受到達(dá)某個(gè)特定本地接口的外來(lái)連接。這是指定一個(gè)接口或者任意接口的選擇。服務(wù)器不能指定多個(gè)地址的列表。通配的本地地址表示“任意”接口。此時(shí),必須區(qū)別服務(wù)器的監(jiān)聽(tīng)套接口和已連接套接口。這里,已連接套接口使用和監(jiān)聽(tīng)套接口相同的端口號(hào): 21。同時(shí),一旦建立連接,以連接的本地套接口的本地地址()隨即填入。
27、如果下一個(gè)顧客(假設(shè) IP地址為,端口號(hào)為1301 )隨即也提出了 服務(wù)請(qǐng)求,服務(wù)器就再派生第二個(gè)子進(jìn)程對(duì)它進(jìn)行服務(wù),這時(shí)建立連接的四元組為。服務(wù)器能夠區(qū)別這兩個(gè)連接:第一個(gè)連接的套接口對(duì)和第二個(gè)連接的套接口對(duì)是不同的。通過(guò)上面的例子可以看出,TCP無(wú)法僅僅通過(guò)查看目的端口來(lái)分離外來(lái)的分組。它必須查看套接口對(duì)的所有四個(gè)元素才能確定由哪個(gè)端點(diǎn)接收到達(dá)的分組。對(duì)于上面的例子,對(duì)于端口 21存在三個(gè)套接口,如果一個(gè)分組來(lái)自端口 1300,目的地為 端口 21,那么它就傳送給第一個(gè)子進(jìn)程;如果一個(gè)分組來(lái)自 端口 1301,目的地為 端口 21,那么它就傳送給第二個(gè) 子進(jìn)程;所有
28、其它的目的端口21的TCO分組則傳送給擁有監(jiān)聽(tīng)套接口的初始服務(wù)器(父進(jìn)程)。緩沖區(qū)大小及其限制由于通信雙方及中間節(jié)點(diǎn)的配置不同,有些會(huì)影響應(yīng)用程序數(shù)據(jù)的傳輸。影響IP數(shù)據(jù)報(bào)大小的主要限制有:1. IPv4數(shù)據(jù)報(bào)的最大值為 65535字節(jié),包括IPv4的頭部,總長(zhǎng)度字段占16位。2. IPv6數(shù)據(jù)報(bào)的最大值為 65575字節(jié),包括40字節(jié)的IPv6頭部,有效負(fù)載長(zhǎng)度字段占16位。這里IPv6的有效負(fù)載長(zhǎng)度字段不含IPv6頭部,而IPv4的總長(zhǎng)度字段包含IPv4頭部。另外,IPv6有一個(gè)特大有效負(fù)載選項(xiàng),它把有效負(fù)載長(zhǎng)度字段擴(kuò)展到32位,但是這個(gè)選項(xiàng)要求 MTU超過(guò)65535的數(shù)據(jù)鏈路,這個(gè)選項(xiàng)是
29、為 主機(jī)到主機(jī)的內(nèi)部連接而設(shè)計(jì)的,例如HIPPI,它們沒(méi)有內(nèi)在的 MTU。3. 很多網(wǎng)絡(luò)有一個(gè)最大傳輸單元MTU,它由硬件規(guī)定。例如以太網(wǎng)的 MTU為1500字節(jié)。其它鏈路其 MTU可以配置。IPv4要求的最小 MTU是68字節(jié),IPv6要求 的最小MTU為576字節(jié)。4. 在兩臺(tái)主機(jī)間的路徑上的最小 MTU 稱為路徑 MTU 。1500 字節(jié)的以太網(wǎng) MTU 是 當(dāng)今常見(jiàn)的路徑 MTU 。路徑 MTU 在不同方向可以不相同,因?yàn)樵谝蛱鼐W(wǎng)中路由 是非對(duì)稱的。5. 當(dāng)一個(gè)數(shù)據(jù)報(bào)將從某個(gè)接口發(fā)出時(shí),如果它的大小超過(guò)相應(yīng)鏈路的 MTU ,IPv4 和 IPV6 都將執(zhí)行分片( fragmentati
30、on )操作。各片段到達(dá)目的地前不會(huì)被重組(reassembling )。IPV4主機(jī)對(duì)其產(chǎn)生的數(shù)據(jù)報(bào)執(zhí)行分片,IPV4路由器對(duì)其轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)也執(zhí)行分片。但是, IPv6 只在數(shù)據(jù)報(bào)產(chǎn)生的主機(jī)執(zhí)行分片; IPv6 路由器 對(duì)其轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)不進(jìn)行分片。事實(shí)上, IPv6 路由器可以執(zhí)行分片,但只對(duì)那些 由路由器產(chǎn)生的數(shù)據(jù)報(bào)而不是轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)。這時(shí)的路由器實(shí)際上作為主機(jī)運(yùn)行。 例如,大多數(shù)路由器支持 Telnet 協(xié)議,系統(tǒng)管理員就用它來(lái)配置路由器。由路由 器的 Telnet 服務(wù)器產(chǎn)生的 IP 數(shù)據(jù)報(bào)是由路由器產(chǎn)生的,而不是路由器轉(zhuǎn)發(fā)的。6. IPv4 頭部的 DF (“不分片”)位若被設(shè)置,那
31、么不管是發(fā)送主機(jī)還是轉(zhuǎn)發(fā)路由器都不能對(duì)本數(shù)據(jù)報(bào)分片。當(dāng)路由器接收到一個(gè)超過(guò)其外出鏈路MTU 大小且設(shè)置了DF 位的 IPv4 數(shù)據(jù)報(bào)時(shí),它將產(chǎn)生一個(gè) ICMP 的“ destination unreachable, fragmentation needed but DF bit set(目的地不可達(dá),需要分片但 DF 位已設(shè)置)”出錯(cuò)消息。由于 IPv6 路由器不執(zhí)行分片,因此 IPv6 數(shù)據(jù)報(bào)隱含設(shè)置了 DF 位。如果 IPv6 路 由器接收到一個(gè)超過(guò)其外出鏈路 MTU 大小的 IPv6 數(shù)據(jù)報(bào)年,它將產(chǎn)生一個(gè) ICMPv6 的“ packet too big (分組太大) ”的出錯(cuò)消息。I
32、Pv4 的 DF 位和 IPv6 的隱含 DF 位可用于路徑 MTU 的發(fā)現(xiàn)。 例如, 如果 TCP 使 用 IPv4 技術(shù),它發(fā)送的數(shù)據(jù)報(bào)都將設(shè)置 DF 位。如果某個(gè)中間路由器返回一個(gè) ICMP 的“ destination unreachable, fragmentation needed but DF bit set"錯(cuò)誤,TCP 就減少每個(gè)數(shù)據(jù)報(bào)的數(shù)據(jù)量并重傳。路徑 MTU 的發(fā)現(xiàn)對(duì) IPv4 是可選的,但 所有 IPv6 的實(shí)現(xiàn)都必須支持它。7. IPv4 和 IPv6 都定義了最小重組緩沖區(qū)大小: 任何 IPv4 和 IPv6 的實(shí)現(xiàn)都必須支持 的最小數(shù)據(jù)報(bào)大小。對(duì) IP
33、v4 和其值為 576 字節(jié),對(duì) IPv6 為 1500 字節(jié)。例如, 對(duì) IPv4 來(lái)說(shuō),如果不能確信給定的目的主機(jī)是否能接收 577 字節(jié)的數(shù)據(jù)報(bào)。所以 很多使用 UDP 的應(yīng)用程序( DNS 、RIP 、TFTP 、BOOTP 、SNMP )避免產(chǎn)生大 于 576 字節(jié)的數(shù)據(jù)報(bào)。8. TCP 有一個(gè) MSS (最大分片大?。?,用于向?qū)Ψ?TCP 通告在每個(gè)分片中能發(fā)送的 最大 TCP 數(shù)據(jù)量 , 使用 MSS 的目的是告訴對(duì)方其重組緩沖區(qū)的實(shí)際值 ,從而避免 分片。 MSS 經(jīng)常設(shè)置成 MTU 減去 IP 和 TCP 頭部的固定長(zhǎng)度。在以太網(wǎng)環(huán)境下 IPv4 的 MSS 為 1460
34、字節(jié),使用 IPv6 的 MSS 值為 1440 字節(jié)(兩者的 TCP 頭 部都為 20 字節(jié),而 IPv4 頭部是 20 字節(jié), IPv6 的頭部是 40 字節(jié))。在 TCP 的 MSS 選項(xiàng)中, MSS 值是一個(gè) 16 位字段,最大值是 65535 字節(jié)。這個(gè) 值適合 IPv4 ,因?yàn)?IPv4 數(shù)據(jù)報(bào)中的最大 TCP 數(shù)據(jù)量為 65495 字節(jié)(即 65535 減去 IPv4 頭部 20 字節(jié)和 TCP 頭部 20 字節(jié))。但是, IPv6 有特大有效負(fù)荷選項(xiàng), 因此需要使用另外的技術(shù)。首先,沒(méi)有特大有效負(fù)荷選項(xiàng)的IPv6 數(shù)據(jù)報(bào)中最大的TCP 數(shù)據(jù)量為 65515 字節(jié)(即 65535
35、 減去 TCP 頭部 20 字節(jié))。因此 65535 這 個(gè) MSS 值被認(rèn)為是“無(wú)限”的特殊值,它只在用到特大有效負(fù)荷選項(xiàng)時(shí)才有用, 而這種情況又要求 MTU 超過(guò) 65535 。如果 TCP 使用特大有效負(fù)荷選項(xiàng),并且接 收到的對(duì)方通告的 MSS 超過(guò) 65535 ,那么它所發(fā)送數(shù)據(jù)報(bào)的大小限制就是接口 MTU 。如果這個(gè)值太大(即路徑上某個(gè)鏈路的 MTU 比它?。?,那么路徑 MTU 的 發(fā)現(xiàn)功能將確定這個(gè)最小值。434 TCP 發(fā)送圖4-7說(shuō)明了應(yīng)用程序發(fā)送數(shù)據(jù)到TCP套接口的過(guò)程。MTU大小的IPv4或IPv6分組圖4-7應(yīng)用程序發(fā)送數(shù)據(jù)到 TCP套接口的過(guò)程每個(gè)TCP套接口都有一個(gè)發(fā)
36、送緩沖區(qū),用戶可以使用SO_SNDBUF 套接口選項(xiàng)來(lái)改變這個(gè)緩沖區(qū)的大小。 當(dāng)應(yīng)用程序調(diào)用 write時(shí),內(nèi)核從應(yīng)用進(jìn)程的緩沖區(qū)中拷貝所有數(shù)據(jù) 到套接口的發(fā)送緩沖區(qū)。 如果套接口的發(fā)送緩沖區(qū)不能存放應(yīng)用程序的所有數(shù)據(jù)(即應(yīng)用程序的緩沖區(qū)大于套接口發(fā)送緩沖區(qū),或者套接口發(fā)送緩沖區(qū)還有其它數(shù)據(jù)),應(yīng)用程序?qū)⒈粧炱穑ㄋ撸?,這里假設(shè)套接口是阻塞的(缺省設(shè)置)。內(nèi)核將不從 write系統(tǒng)調(diào)用返回,直到應(yīng)用進(jìn)程緩沖區(qū)中的所有數(shù)據(jù)都拷貝到套接口發(fā)送緩沖區(qū)。所以從寫(xiě)一個(gè)TCP套接口的write調(diào)用成功返回僅表示可以重新使用應(yīng)用進(jìn)程的緩沖區(qū)。它并不能告訴用戶對(duì)方的 TCP或?qū)Ψ綉?yīng)用進(jìn)程已接收到數(shù)據(jù)。TCP取
37、出套接口發(fā)送緩沖區(qū)的數(shù)據(jù)并把它發(fā)送給對(duì)方TCP,其過(guò)程基于TCP數(shù)據(jù)傳送的所有規(guī)則。對(duì)方 TCP必須確認(rèn)收到的數(shù)據(jù),只有收到對(duì)方的 ACK,發(fā)送方TCP才能刪 除套接口發(fā)送緩沖區(qū)中已確認(rèn)的數(shù)據(jù)。 TCP必須保留數(shù)據(jù)拷貝直到對(duì)方確認(rèn)為止。TCP以MSS大小或者更小的塊發(fā)送數(shù)據(jù)給IP (它同時(shí)給每個(gè)數(shù)據(jù)塊填上TCP頭部以構(gòu)成分片),其中MSS是由對(duì)方通告的,當(dāng)對(duì)方未通告時(shí)使用 536這個(gè)值。IP給每個(gè)TCP 分片填上IP頭部以構(gòu)成數(shù)據(jù)報(bào),查找其目的IP地址的路由表項(xiàng)以確定外出接口,然后把數(shù)據(jù)報(bào)傳遞給相應(yīng)的數(shù)據(jù)鏈路。IP可能先將數(shù)據(jù)報(bào)分段, 再傳送給鏈路層。但如上所述,MSS 選項(xiàng)的目的是避免分片,
38、 而新的實(shí)現(xiàn)又使用路徑 MTU發(fā)現(xiàn)功能。每個(gè)鏈路有一個(gè)輸出隊(duì)列, 如果輸出隊(duì)列滿,則分組丟棄,并沿協(xié)議棧向上返回一個(gè)錯(cuò)誤。TCP將注意這個(gè)錯(cuò)誤,并在以后的某個(gè)時(shí)刻重傳這個(gè)分片,但應(yīng)用進(jìn)程不知道這些細(xì)節(jié)。4.3.5 UDP 發(fā)送圖4-8說(shuō)明了應(yīng)用程序發(fā)送數(shù)據(jù)到UDP套接口的過(guò)程。應(yīng)用進(jìn)程緩沖區(qū)用戶進(jìn)程1F套接口發(fā)送緩沖區(qū)內(nèi)核1UDP數(shù)據(jù)報(bào)rMTU大小的IPv4或IPv6分組圖4-8應(yīng)用程序發(fā)送數(shù)據(jù)到 UDP套接口的過(guò)程在圖4-8中,套接口發(fā)送緩沖區(qū)用虛線框,因?yàn)樗⒉淮嬖?。UDP套接口有發(fā)送緩沖區(qū)的大?。ㄓ脩艨梢允褂肧O_SNDBUF 套接口選項(xiàng)修改),但是它僅僅是發(fā)送(sendto)到套接口的
39、UDP數(shù)據(jù)報(bào)的上限。如果應(yīng)用程序發(fā)送一個(gè)大于套接口發(fā)送緩沖區(qū)的數(shù)據(jù)報(bào), 則返回EMSGSIZE 錯(cuò)誤。由于UDP是一種不可靠的服務(wù),它不必保存應(yīng)用程序的數(shù)據(jù)拷 貝,因此不需要一個(gè)真正的緩沖區(qū)。(應(yīng)用進(jìn)程的數(shù)據(jù)沿協(xié)議棧向下傳遞時(shí),以某種形式拷貝到內(nèi)核的緩沖區(qū),當(dāng)鏈路層把數(shù)據(jù)傳出后這個(gè)拷貝將丟棄。)UDP簡(jiǎn)單地填加它的8個(gè)字節(jié)的頭部以構(gòu)成數(shù)據(jù)報(bào)并把它傳遞給IP。IPv4或IPv6給它填加相應(yīng)的IP頭部,執(zhí)行路由操作確定外出接口,然后或者直接將數(shù)據(jù)報(bào)加入鏈路層輸 出隊(duì)列(如果適合于 MTU),或者分段后在把每個(gè)段加入數(shù)據(jù)鏈路層的輸出隊(duì)列。如果UDP應(yīng)用進(jìn)程發(fā)送一個(gè)大的數(shù)據(jù)報(bào)(例如 2000字節(jié)數(shù)據(jù)報(bào)
40、),它比TCP應(yīng)用進(jìn) 程更有可能分片,因?yàn)門(mén)CP會(huì)將應(yīng)用進(jìn)程數(shù)據(jù)分成 MSS大小的塊,但UDP卻沒(méi)有這個(gè)能 力。從寫(xiě)UDP套接口的sendto調(diào)用成功返回表示數(shù)據(jù)報(bào)或所有片段已被加入鏈路層的輸 出隊(duì)列。如果輸出隊(duì)列沒(méi)有足夠的空間存放數(shù)據(jù)報(bào)或它的某個(gè)分片,UDP將返回應(yīng)用進(jìn)程ENOBUFS 錯(cuò)誤。這里需要注意的是,有些UDP的實(shí)現(xiàn)不返回這種錯(cuò)誤,這樣甚至數(shù)據(jù)報(bào)未經(jīng)發(fā)出就丟失的情況應(yīng)用進(jìn)程也不知道。4.4網(wǎng)絡(luò)服務(wù)員工作模式當(dāng)用戶開(kāi)發(fā)一個(gè)服務(wù)器程序時(shí),有如下類(lèi)型的進(jìn)程控制方法可供選擇:迭代服務(wù)器程序。這種方式主要用于簡(jiǎn)單的網(wǎng)絡(luò)服務(wù)。它的主要缺點(diǎn)是在當(dāng)前顧客 服務(wù)完成之前,新到達(dá)的顧客無(wú)法得到服務(wù)。并
41、發(fā)服務(wù)器程序, 它為每個(gè)顧客 fork 一個(gè)子進(jìn)程提供服務(wù), 這是 Unix 服務(wù)器程序 通常的做法。使用 select 調(diào)用在一個(gè)進(jìn)程內(nèi)同時(shí)服務(wù)多個(gè)顧客的 TCP 服務(wù)器程序。 使用線程替代進(jìn)程實(shí)現(xiàn)的并發(fā)服務(wù)器程序。本節(jié)中介紹兩種新的并發(fā)程序設(shè)計(jì)方法:預(yù)先派生子進(jìn)程( preforking )。服務(wù)器啟動(dòng)后就派生一組子進(jìn)程,形成一個(gè)子進(jìn) 程池。沒(méi)當(dāng)?shù)絹?lái)一個(gè)顧客請(qǐng)求,就從進(jìn)程池內(nèi)選擇一個(gè)可用子進(jìn)程為它服務(wù)。 預(yù)先創(chuàng)建線程 ( prethreading )。服務(wù)器啟動(dòng)后就創(chuàng)建一組線程, 形成一個(gè)線程池。 每個(gè)顧客請(qǐng)求由池中的一個(gè)線程提供服務(wù)。4.4.1 TCP 迭代服務(wù)器程序迭代服務(wù)器總是在完全
42、處理了一個(gè)顧客的請(qǐng)求后, 才響應(yīng)下一個(gè)顧客的請(qǐng)求。 這種方式 主要用于簡(jiǎn)單的網(wǎng)絡(luò)服務(wù),下面程序給出了使用迭代方法實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的時(shí)間 / 日期服務(wù) 器程序。#include "unp.h"#include <time.h> intmain(int argc, char *argv) listenfd, connfd; servaddr; buffMAXLINE; ticks;intstruct sockaddr_in chartime_t listenfd = Socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr
43、, sizeof(servaddr); servaddr.sin_family= AF_INET;= htonl(INADDR_ANY);servaddr.sin_port= htons(13);/* daytime server */Bind(listenfd, (SA *) &servaddr, sizeof(servaddr);Listen(listenfd, LISTENQ); for ( ; ; ) connfd = Accept(listenfd, (SA *) NULL, NULL); ticks = time(NULL);snprintf(buff, sizeof(bu
44、ff), "%.24srn", ctime(&ticks); Write(connfd, buff, strlen(buff);Close(connfd);從進(jìn)程控制的角度來(lái)看,迭代服務(wù)器是最快的,因?yàn)樗贿M(jìn)行進(jìn)程控制。4.4.2 TCP 并發(fā)服務(wù)器程序傳統(tǒng)上,并發(fā)服務(wù)器是調(diào)用 fork 派生一個(gè)子進(jìn)程來(lái)處理顧客的請(qǐng)求。這使得服務(wù)器可 在同一時(shí)間為多個(gè)顧客提供服務(wù)。 唯一的限制是操作系統(tǒng)對(duì)同一用戶可擁有的進(jìn)程數(shù)量的限 制。下面的程序例子是一個(gè)并發(fā)服務(wù)器的實(shí)現(xiàn)。 絕大多數(shù) TCP 服務(wù)器程序也是這樣編寫(xiě)的。#include "unp.h"intma
45、in(int argc, char *argv)intlistenfd, connfd;pid_tchildpid;voidsig_chld(int), sig_int(int), web_child(int);socklen_tclilen, addrlen;struct sockaddr*cliaddr;if (argc = 2) listenfd = Tcp_listen(NULL, argv1, &addrlen);else if (argc = 3)listenfd = Tcp_listen(argv1, argv2, &addrlen); elseerr_quit(
46、"usage: serv01 <host> <port#>"); cliaddr = Malloc(addrlen);Signal(SIGCHLD, sig_chld);Signal(SIGINT, sig_int);for ( ; ; ) clilen = addrlen;if ( (connfd = accept(listenfd, cliaddr, &clilen) < 0) if (errno = EINTR)continue;/* back to for() */elseerr_sys("accept error&q
47、uot;); if ( (childpid = Fork() = 0) /* child process */ Close(listenfd);/* close listening socket */web_child(connfd);/* process the request */exit(0);Close(c onn fd);/* pare nt closes conn ected socket */* end serv01 */并發(fā)服務(wù)器的問(wèn)題在于 fork子進(jìn)程時(shí)所消耗的 CPU時(shí)間。20世紀(jì)80年代后期,當(dāng) 一個(gè)服務(wù)器一天只需處理幾百、幾千個(gè)顧客請(qǐng)求時(shí), 這樣實(shí)現(xiàn)從性能上是能夠滿足
48、的。然而到了 Web時(shí)代,一個(gè)重負(fù)荷的 Web服務(wù)器一天的訪問(wèn)數(shù)量以百萬(wàn)計(jì)。這種情況下,就單 臺(tái)主機(jī)而言,對(duì)于最繁忙的站點(diǎn)往往運(yùn)行多臺(tái)主機(jī)來(lái)分?jǐn)傌?fù)載。改進(jìn)服務(wù)器性能的方法有以下幾種。可以采用預(yù)先派生子進(jìn)程技術(shù)來(lái)提高并發(fā)服務(wù)器的性能。預(yù)先派生子進(jìn)程服務(wù)器程序不再為每個(gè)顧客請(qǐng)求 fork 一個(gè)子進(jìn)程,而是在服務(wù)器啟動(dòng)時(shí)就預(yù)先派生一組子進(jìn)程,做好為 接入的顧客請(qǐng)求服務(wù)的準(zhǔn)備。圖4-9顯示了一個(gè)預(yù)先派生 N個(gè)子進(jìn)程的服務(wù)器正在為 2個(gè)顧客同時(shí)服務(wù)的情形。可用子進(jìn)程池圖4-9預(yù)先派生子進(jìn)程的并發(fā)服務(wù)器使用預(yù)先派生子進(jìn)程的描述代碼如下:#i nclude"un p.h"static i
49、ntn childre n;static pid_t*pids;intmain (i nt argc, char *argv)intliste nfd, i;sockle n_taddrle n;voidsign t(i nt);pid_tchild_make(i nt,in t,in t);if (argc = 3)listenfd = Tcp_listen(NULL, argv1, &addrlen);else if (argc = 4)listenfd = Tcp_listen(argv1, argv2, &addrlen);elseerr_quit("usag
50、e: serv02 <host> <port#> <#children>");nchildren = atoi(argvargc-1);pids = Calloc(nchildren, sizeof(pid_t);for (i = 0; i < nchildren; i+)pidsi = child_make(i, listenfd, addrlen); /* parent returns */Signal(SIGINT, sig_int);for ( ; ; )pause(); /* everything done by children
51、*/這種技術(shù)的優(yōu)點(diǎn)在于:不需要引入父進(jìn)程執(zhí)行 fork 的開(kāi)銷(xiāo),新的顧客請(qǐng)求就能得到服 務(wù)。而缺點(diǎn)在于:每次啟動(dòng)服務(wù)器時(shí),父進(jìn)程必須確定需要產(chǎn)生多少個(gè)子進(jìn)程。如果不考慮 再派生子進(jìn)程, 一旦所有子進(jìn)程都被顧客請(qǐng)求占用, 此時(shí)新到的請(qǐng)求將被暫時(shí)忽略, 直到有 一個(gè)子進(jìn)程可用。對(duì)于父進(jìn)程可以監(jiān)視可用子進(jìn)程數(shù), 一旦低于某個(gè)系統(tǒng)預(yù)先設(shè)定的閥值就再派生額外的 子進(jìn)程。同樣, 如果空閑子進(jìn)程數(shù)大于某個(gè)閥值, 則父進(jìn)程將終止部分新派生的子進(jìn)程。因 為過(guò)多的子進(jìn)程會(huì)占用系統(tǒng)的資源,從而導(dǎo)致系統(tǒng)性能下降。當(dāng)系統(tǒng)負(fù)載較輕時(shí), 傳統(tǒng)的并發(fā)服務(wù)器模型能夠很好地處理顧客的請(qǐng)求, 也就是每來(lái)一 個(gè)請(qǐng)求, 服務(wù)器就派生一
52、個(gè)子進(jìn)程為之服務(wù)。 它甚至可以和 inetd 結(jié)合使用, 由 inetd 負(fù)責(zé) 接收每個(gè)連接。對(duì)于重負(fù)載情況,例如 web 服務(wù)器,可以使用相關(guān)的技術(shù)增強(qiáng)服務(wù)器的處 理能力。4.4.3 4.4BSD 上的實(shí)現(xiàn)在源自 Berkeley 的內(nèi)核實(shí)現(xiàn)上, 父進(jìn)程在派生子進(jìn)程之前創(chuàng)建監(jiān)聽(tīng)套接口, 而每次 fork 子進(jìn)程時(shí),各個(gè)子進(jìn)程復(fù)制父進(jìn)程的全部描述字。圖 4-10 描述了 proc 結(jié)構(gòu)(每個(gè)進(jìn)程一 個(gè))、監(jiān)聽(tīng)描述字的單個(gè) file 結(jié)構(gòu)以及單個(gè) socket 結(jié)構(gòu)的關(guān)系。在 proc 結(jié)構(gòu)中,描述字只是某個(gè)數(shù)組的一個(gè)下標(biāo),用于引用一個(gè) file 結(jié)構(gòu)。而 fork 派生子進(jìn)程時(shí),子進(jìn)程復(fù)制描述
53、字的特性之一就是:子進(jìn)程中給定的描述字所引用的 file 結(jié)構(gòu)與父進(jìn)程中同一描述字所引用的 file 結(jié)構(gòu)一致。 每個(gè) file 結(jié)構(gòu)有一個(gè)訪問(wèn)計(jì)數(shù), 它在文 件或者套接口打開(kāi)時(shí)為 1 ,而每當(dāng)調(diào)用 fork 或者 dup 本描述字時(shí),它就增加 1。在具有 N 個(gè)子進(jìn)程的例子中, file 結(jié)構(gòu)的訪問(wèn)計(jì)數(shù)為 N+1 (父進(jìn)程雖然從不調(diào)用 accept ,但它并未 關(guān)閉該監(jiān)聽(tīng)描述字) 。當(dāng)程序啟動(dòng)后, N 個(gè)子進(jìn)程被派生,它們分別調(diào)用 accept 并由內(nèi)核置入睡眠狀態(tài)。當(dāng) 第一個(gè)顧客連接到來(lái)時(shí), N 個(gè)睡眠進(jìn)程均被喚醒。 這是由于這 N 個(gè)進(jìn)程共享一個(gè) socket 結(jié)構(gòu),導(dǎo)致它們睡眠在同一等
54、待通道( wait channel ),即socket結(jié)構(gòu)的so_timeo 成員上。 但是,雖然N個(gè)進(jìn)程同時(shí)喚醒,只有最先被調(diào)度的進(jìn)程才能獲得顧客連接,而其它N-1個(gè)進(jìn)程在執(zhí)行過(guò)程中,它們會(huì)發(fā)現(xiàn)隊(duì)列長(zhǎng)度為0 (連接已被取走),因此被再次投入睡眠。這通常被稱為驚群(thu ndering herd )問(wèn)題,因?yàn)楸M管只有一個(gè)進(jìn)程可以獲得連接,但所有進(jìn)程都被喚醒。這樣雖然可以工作,但這種情況會(huì)導(dǎo)致系統(tǒng)性能的下降。為了避免驚群?jiǎn)栴}的發(fā)生,用戶不希望有額外子進(jìn)程空閑,某些Unix內(nèi)核有一個(gè)名字為 wakeup_one的函數(shù),對(duì)于等待某個(gè)事件的一群進(jìn)程,它只喚醒一個(gè)等待進(jìn)程,而不是所有進(jìn)程。但是 BSD
55、操作系統(tǒng)內(nèi)核沒(méi)有提供這個(gè)函數(shù)。procprocproc圖4-10 proc、file和socket結(jié)構(gòu)的關(guān)系4.5 守護(hù)進(jìn)程4.5.1 守護(hù)進(jìn)程的原理守護(hù)進(jìn)程(daemon )是在系統(tǒng)后臺(tái)運(yùn)行不受終端控制的進(jìn)程,只要系統(tǒng)沒(méi)有關(guān)機(jī)或者崩潰,守護(hù)進(jìn)程將在系統(tǒng)中不間斷地運(yùn)行。Unix系統(tǒng)中一般有很多守護(hù)進(jìn)程 (使用ps - ax命令可以看出)在后臺(tái)運(yùn)行(20到50個(gè)),執(zhí)行不同的系統(tǒng)任務(wù)。為了保證守護(hù)進(jìn)程正常地工作,必須使守護(hù)進(jìn)程和其它進(jìn)程運(yùn)行的環(huán)境隔離開(kāi),避免由于其它進(jìn)程的行為影響守護(hù)進(jìn)程的工作。守護(hù)進(jìn)程要脫離所有的終端的原因是因?yàn)槭刈o(hù)進(jìn)程可能是從終端上啟動(dòng)(與從初始化腳本中啟動(dòng)相反),在這之后這個(gè)終端可能執(zhí)行其它的任務(wù)。例如,如果在某個(gè)終端上啟動(dòng)了 一個(gè)守護(hù)進(jìn)程后從該終端上注銷(xiāo),其它用戶又從該終端登錄,那么任何關(guān)于守護(hù)進(jìn)程的錯(cuò)誤信息不應(yīng)在后面用戶的終端會(huì)話過(guò)程中出現(xiàn)。同樣,由終端上的一些鍵(熱鍵)所產(chǎn)生的信號(hào)(中斷信號(hào)),不應(yīng)對(duì)以前從該終端上啟動(dòng)的任何守護(hù)進(jìn)程造成影響。雖然使服務(wù)員程序 在系統(tǒng)后臺(tái)運(yùn)行很容易,但是用戶還應(yīng)該使程序能自動(dòng)轉(zhuǎn)到后臺(tái)運(yùn)行并且脫離與終端的聯(lián) 系。啟動(dòng)守護(hù)進(jìn)程的方法主要有:1. 在系統(tǒng)啟動(dòng)時(shí)很多守護(hù)程序是由系統(tǒng)初始化腳本啟動(dòng)。這些腳本一般在/etc目錄或者以/etc/rc 開(kāi)頭的目錄
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年受體激動(dòng)阻斷藥合作協(xié)議書(shū)
- 2025年主令電器防雷避雷產(chǎn)品合作協(xié)議書(shū)
- 2025年致密熔鑄合成云母陶瓷合作協(xié)議書(shū)
- 八年級(jí)美術(shù)-第三課-《書(shū)籍裝幀設(shè)計(jì)》教案
- 2025年二年級(jí)音樂(lè)年度總結(jié)參考(2篇)
- 2025年個(gè)人股權(quán)無(wú)償轉(zhuǎn)讓協(xié)議簡(jiǎn)單版(2篇)
- 2025年二手汽車(chē)轉(zhuǎn)讓協(xié)議格式范文(2篇)
- 山西省2024七年級(jí)道德與法治上冊(cè)第二單元成長(zhǎng)的時(shí)空第五課和諧的師生關(guān)系情境基礎(chǔ)小練新人教版
- 2025年五年級(jí)《紅樓夢(mèng)》讀書(shū)心得(2篇)
- 2025年個(gè)人房產(chǎn)轉(zhuǎn)讓合同簡(jiǎn)單版(2篇)
- 數(shù)學(xué)-河南省三門(mén)峽市2024-2025學(xué)年高二上學(xué)期1月期末調(diào)研考試試題和答案
- 二零二五版電力設(shè)施維修保養(yǎng)合同協(xié)議3篇
- 最經(jīng)典凈水廠施工組織設(shè)計(jì)
- VDA6.3過(guò)程審核報(bào)告
- 《心臟血管的解剖》課件
- 2024-2030年中國(guó)并購(gòu)基金行業(yè)發(fā)展前景預(yù)測(cè)及投資策略研究報(bào)告
- 河道清淤安全培訓(xùn)課件
- 2024年湖南商務(wù)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)帶答案
- 7.3.1印度(第1課時(shí))七年級(jí)地理下冊(cè)(人教版)
- 骨科手術(shù)中常被忽略的操作課件
- 《湖南師范大學(xué)》課件
評(píng)論
0/150
提交評(píng)論