1、常見面向對象中間件體系結構:
1)主機基礎設施中間件:對並發和ipc機制封裝,如JavaPackage、ACE
2)分布式中間件:擴充1),使一些網絡編程任務(連接管理和內存管理、整編、解編、端點和請求的多路分離)自動化,即只需向目標對象請求操作,不關心目標的位置、語言、OS、硬件,核心是ORB(Object Request Broker),如COM+、Java RMI、CORBA,主要是管理支持“面向對象”分布式編程模型的終端系統資源,
3)公共中間件服務:擴展2),定義了更高層次、獨立於特定領域的服務,如事件通知、日志記錄、持久性安全且可恢復的事務,是對整個分布式系統中的各種資源進行分配、調度和協調
4)特定領域中間件服務:滿足特定領域(如電信、電子商務、醫療保健、過程自動化、航空電子)的特定需求,面向“縱向市場”(其他中間件層提供的是廣泛復用、橫向的機制和服務)
1、 ACE軟件包基礎:
1)ACE OS Adaptation層:封裝了原始的基於C的OS API,提供統一的OS接口
2)ACE C++ Wrapper Facade層:在類型安全的面向對象接口中封裝了一些C++類,而不再是獨立的C函數
3)ACE framework層:集成、擴充2),運用高級的並發和網絡編程模式,具體化ACE中多組相關類之間的標准控制流程和合作,獲得更大范圍的軟件可復用性
a)事件多路分離和分發框架:Reactor和Proactor框架,自動處理和應用相關的處理程序的多路分離和分發,以相應各種基於I/O、計時器、信號、同步的事件
b)連接建立和服務初始化框架,Acceptor-Connertor框架,將主動和被動初始化角色,和初始化結束後通信對等服務所執行的應用處理,分離開來
c)並發框架:Task框架,實現主要的並發模式(Active Object、Half-Sync/Half-Async),將方法的執行/請求、同步/異步處理分離開來
d)服務配置起框架:Component Configurator組建配置起模式,支持開發後期動態組裝,運行期間動態重新配置
e)流框架:Pipes and Filters模式,每個處理步驟封裝在過濾模塊。
4)ACE網絡服務組件層:網絡服務庫,庫中的服務被包裝成組件,ACE庫本身不包含這些組件,它們被捆綁在ACE軟件的發行包中,提供的功能有,演示ACE功能的常見使用方式、提取客服用的網絡應用構件
無連接提供“面向消息”服務,即每個消息獨立尋址發送,不保證到達次序,不保證一定會到達,如用戶數據報協議UDP/IP,可直接用於多媒體應用,允許一定程度的數據丟失,還是支持不可靠的多播、廣播
面向連接提供可靠、有序、不重復的發送服務,如傳輸控制協議TCP,用於面向會話的應用,設計時必須考慮:
(1)數據成幀策略:某些面向連接(TP4、XTP)協議支持面向消息發送策略,而TCP是字節流協議,不保護應用程序消息的邊界,因此要在字節流上實現數據分幀機制
(2)連接多路復用策略
1)多路復用:多線程的客戶請求都通過一條TCP連接傳遞給服務器進程,優點節省OS資源,缺點編程難、效率低、確定性低
2)非多路復用:每個庫戶通過不同的連接和對等服務程序通信,優點可以更好控制通信的優先級,同步開銷小,發送和接收雙向請求不需要額外的鎖定工作,缺點使用更多OS資源,某些環境(如大容量電子商務服務器)伸縮性不是很好
管理請求-應答協議交換策略:同步、異步,選擇時考慮的因素請求之間的關聯性、底層協議或傳輸介質的延遲
(1)同步請求-應答協議:鎖步次序交換,即每個請求必須同步接收到一個應答,才能發送下一個請求,使用場合:
1)請求的結果決定後續請求
2)應用程序中交換的信息需要在低延遲網絡中執行短期處理
3)比異步性能提高
(2)異步請求-應答協議:將請求連續發送到服務端,不需要等應當再發下一個請求,因此需要一種策略來檢查請求的丟失或失敗,然後重新發送,使用場合:
1)無需應答就可以決定後續請求,每個請求是獨立的
2)通信延遲和請求所需處理事件密切相關
消息傳遞:明確地通過IPC(Inter Process Communication,進程間通信)機制交換字節流和“面向記錄”的數據,IPC機制:通過IPC信道,將數據以消息形式從一個進程或線程傳輸給另一個進程或線程
共享內存:允許相同或不同主機上的多個進程訪問、交換數據,就像數據位於沒一個進程的本地地址空間一樣,兩種形式:
(1)本地共享內存:進程擁有一個或多個共享內存區,可以被映射到不同的虛擬地址范圍
1)System V UNIX共享內存,shmget()創建或返回共享內存區,進程通過shmat()將該內存去掛接到自己的虛擬地址空間
2)內存映射文件,文件的全部或局部映射到虛擬內存區,該虛擬內存區被多個進程共享,內存映射文件的內存可以轉存至永久存儲器中
(2)分布式共享內存DSM:程序設計的一種抽象,擴張了OS虛擬內存機制,以供應程序所需,通過全局/共享內存中的數據盡心透明的進程間通信,提現共享內存多處理器和分布式系統這兩種計算范式的結合
1)本地環境管理,管理本地環境信息,這些信息通常存儲在OS內核或系統庫中
socket()、bind()、getsockname()、getpeername()、close()
2)連接的建立和終止
connect()、listen()、accept()、shutdown()
3)數據傳輸機制,通過socket句柄發送和接收數據
send()、recv()通過特定I/O口傳送和接收數據緩沖區
sendto()、recvfrom()交換“無連接”數據包,每一個sendto調用都要提供接收方IP
UNIX上還可用於其他類型的I/O句柄,如文件和終端設備,read()和write()、readv()和writev()、sendmsg()和recvmsg()
4)選項管理,可改變缺省的socket行為,來支持多播廣播,能修改/查詢傳輸緩沖區大小
setsockopt():在協議棧的不同層修改選項
getsockopt():在協議棧的不同層查詢選項
5)網絡地址,將可讀性名稱解析為地基網絡地址
gethostbyname()、gethostbyaddr()處理主機名和IPv4地址在指尖的網絡地址映射
getipnodebyname()、getipnodebyaddr()處理主機名和IPv4/IPv6地址之間的網絡地址映射
getservbyname()通過具有可讀性的名稱標識服務
Socket API常用來編寫TCP/IP應用層程序,也可以支持多個通信領域,通信領域由協議簇和地址簇確定:
1)協議簇:如UNIX領域(PF-UNIX)、Internet領域的IPv4(PF-INET)和IPv6(PF-INET6)、ATM(PF-ATMSVC)、X.25(PF-X25)、Appletalk(PF-APPLETALK)等
2)服務類型:如有序可靠的字節流SOCK_STREAM、不可靠的數據報SOCK_DGRAM等,通過PF_INET(或PF_INET6)和SOCK_STREAM標志給socket()函數,就制定了TCP/IP協議
各平台之間存在分歧:
1)函數名稱:如read、write函數無法移植到所有操作系統,Windows定義了不同的函數ReadFile、WriteFile、closesocket等
2)函數語義:如UNIX、Win32中,可以將NULL指針傳給accept,其他平台不一定可以
3)Socket句柄類型不同
4)頭文件名稱不同
抽象類
enable()和disable():啟用/禁止“I/O句柄”選項
set_handle()和get_handle():設置和獲取底層I/O句柄
Loggint_Server::run()模版方法,其中的open、wait_for_multiple_events、handle_data、handle_connections都是hook方法,可以被子類重寫
方法有recv_log_record()、write_log_record()、log_record()
1)hook方法handle_connection接收客戶新連接,收到下個客戶連接前會阻塞
2)hook方法handle_data讀取和處理,直到連接關閉或發生錯誤
3)回到1)
(1)循環式服務器:處理後續請求之前,會完整處理每個客戶請求,處理一個請求時,要麼講其他請求排成隊列,要麼忽略,適合短期服務(如標准Internet RCHO和DATIME服務)、不經常運行的服務(如夜間才運行的“遠程文件系統備份服務”)
(2)並發式服務器:同時處理多個客戶請求,要使用多進程或多線程,單服務服務器則同一服務的多副本可同時運行,多服務服務器則不同服務的多副本也可同時運行,適合I/O操作頻繁的服務、執行時間會變的長周期服務,需要使用信號量或互斥鎖保證進程線程鍵的合作和數據共享,通常對每個客戶請求,主線程會單獨創建一個工作者線程,如線程池、進程池模型
(3)反應式服務器:幾乎是同時處理多個請求,所有處理實際在一個線程中完成,通常通過“同步事件多路分離”策略來實現,即多個服務請求有一個單線程進程依次循環處理,如基於select()的反應式服務器
局限性:
編程復雜性增加:需要顯式創建事件循環線程、手動保存和恢復環境信息
可靠性和性能降低:一個操作失敗整個服務器進程會掛起,只要有一個服務調用系統函數出錯,os會阻塞整個進程,降低服務器進程性能,如果只是用非阻塞方法,很難使用DMA之類的高級技術,也就無法利用數據和指令緩存的引用局部性來提高性能
通過並發式服務器或異步I/O可以解決這些局限性
(1)急式創建策略:服務器創建期間,會預先創建一個或多個進程/線程,形成一個池,池可以靜態或動態擴充或收縮,可通過半同步/半異步模式將I/O層請求向上提供給池中工作者線程,或通過領導者/跟隨者模式管理線程池(池中請求沒有同步或排序限制時,用該模式可提高性能)
(2)隨需創建策略:在客戶連接或數據請求來時創建新進程或線程
1)進程競爭范圍:線程在統一進程中競爭被調度的CPU時間,不和其他進程的線程競爭
2)系統競爭范圍:無論線程和什麼進程關聯,直接和系統范圍內其他線程競爭,
(2)三種線程調度模型:
1)N:1用戶線程模型
2)1:1核心線程模型:“系統范圍”線程
3)N:M混合線程模型
(3)競爭范圍選擇:
1)為避免和其他任務發生沖突而創建線程,應使用“系統范圍”線程,1:1模型系統直接可提供系統范圍線程,N:M模型系統中,可以顯示請求系統競爭,N:1系統則不方便
2)為簡化應用程序設計而創建線程,使用“進程范圍”線程,N:1模型直接得到或N:M模型中請求得到
(4)利用多線程,掌握同步模式和OS並發機制可簡化程序設計
(5)多線程比使用同步/異步事件處理模式(如Reactor或Proactor)更直接