程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++網絡編程 卷1 運用ACE和模式消除復雜性——筆記1

C++網絡編程 卷1 運用ACE和模式消除復雜性——筆記1

編輯:關於C++

第0篇

0.3.1 面向對象中間件層

1、常見面向對象中間件體系結構:

1)主機基礎設施中間件:對並發和ipc機制封裝,如JavaPackage、ACE

2)分布式中間件:擴充1),使一些網絡編程任務(連接管理和內存管理、整編、解編、端點和請求的多路分離)自動化,即只需向目標對象請求操作,不關心目標的位置、語言、OS、硬件,核心是ORB(Object Request Broker),如COM+、Java RMI、CORBA,主要是管理支持“面向對象”分布式編程模型的終端系統資源,

3)公共中間件服務:擴展2),定義了更高層次、獨立於特定領域的服務,如事件通知、日志記錄、持久性安全且可恢復的事務,是對整個分布式系統中的各種資源進行分配、調度和協調

4)特定領域中間件服務:滿足特定領域(如電信、電子商務、醫療保健、過程自動化、航空電子)的特定需求,面向“縱向市場”(其他中間件層提供的是廣泛復用、橫向的機制和服務)

0.4 ACE工具包

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功能的常見使用方式、提取客服用的網絡應用構件

第1篇 面向對象網絡編程

第1章 通信設計空間

1.1 無連接與面向連接

無連接提供“面向消息”服務,即每個消息獨立尋址發送,不保證到達次序,不保證一定會到達,如用戶數據報協議UDP/IP,可直接用於多媒體應用,允許一定程度的數據丟失,還是支持不可靠的多播、廣播

面向連接提供可靠、有序、不重復的發送服務,如傳輸控制協議TCP,用於面向會話的應用,設計時必須考慮:

(1)數據成幀策略:某些面向連接(TP4、XTP)協議支持面向消息發送策略,而TCP是字節流協議,不保護應用程序消息的邊界,因此要在字節流上實現數據分幀機制

(2)連接多路復用策略

1)多路復用:多線程的客戶請求都通過一條TCP連接傳遞給服務器進程,優點節省OS資源,缺點編程難、效率低、確定性低

2)非多路復用:每個庫戶通過不同的連接和對等服務程序通信,優點可以更好控制通信的優先級,同步開銷小,發送和接收雙向請求不需要額外的鎖定工作,缺點使用更多OS資源,某些環境(如大容量電子商務服務器)伸縮性不是很好

1.2 同步、異步消息交換

管理請求-應答協議交換策略:同步、異步,選擇時考慮的因素請求之間的關聯性、底層協議或傳輸介質的延遲

(1)同步請求-應答協議:鎖步次序交換,即每個請求必須同步接收到一個應答,才能發送下一個請求,使用場合:

1)請求的結果決定後續請求

2)應用程序中交換的信息需要在低延遲網絡中執行短期處理

3)比異步性能提高

(2)異步請求-應答協議:將請求連續發送到服務端,不需要等應當再發下一個請求,因此需要一種策略來檢查請求的丟失或失敗,然後重新發送,使用場合:

1)無需應答就可以決定後續請求,每個請求是獨立的

2)通信延遲和請求所需處理事件密切相關

1.3 消息傳遞、共享內存

消息傳遞:明確地通過IPC(Inter Process Communication,進程間通信)機制交換字節流和“面向記錄”的數據,IPC機制:通過IPC信道,將數據以消息形式從一個進程或線程傳輸給另一個進程或線程

共享內存:允許相同或不同主機上的多個進程訪問、交換數據,就像數據位於沒一個進程的本地地址空間一樣,兩種形式:

(1)本地共享內存:進程擁有一個或多個共享內存區,可以被映射到不同的虛擬地址范圍

1)System V UNIX共享內存,shmget()創建或返回共享內存區,進程通過shmat()將該內存去掛接到自己的虛擬地址空間

2)內存映射文件,文件的全部或局部映射到虛擬內存區,該虛擬內存區被多個進程共享,內存映射文件的內存可以轉存至永久存儲器中

(2)分布式共享內存DSM:程序設計的一種抽象,擴張了OS虛擬內存機制,以供應程序所需,通過全局/共享內存中的數據盡心透明的進程間通信,提現共享內存多處理器和分布式系統這兩種計算范式的結合

第2章 Socket API 概述

2.1 操作系統IPC機制

操作系統IPC機制分為兩類:
本地IPC:位於同一計算機上實體間通信,如共享內存、管道、UNIX領域、socket、門、信號等
遠程IPC:允許配置或分布在一個網絡上的實體間通信,如Internet鄰域socket、X.25電路、Win32命名管道

2.2 Socket API

Socket API包含大約20多個系統函數,分為五類:

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協議

2.3 Socket API局限性

2.3.1 容易出錯

2.3.2 過於復雜

2.3.3 不可移植或不統一

各平台之間存在分歧:

1)函數名稱:如read、write函數無法移植到所有操作系統,Windows定義了不同的函數ReadFile、WriteFile、closesocket等

2)函數語義:如UNIX、Win32中,可以將NULL指針傳給accept,其他平台不一定可以

3)Socket句柄類型不同

4)頭文件名稱不同

第3章 ACE Socket Wrapper Facade

3.1 概述

3.2 ACE_Addr類和ACE_INET_Addr類

3.3 ACE_IPC_SAP類

抽象類
enable()和disable():啟用/禁止“I/O句柄”選項
set_handle()和get_handle():設置和獲取底層I/O句柄

3.4 ACE_SOCK類

抽象類
Open()和close():創建和銷毀socket通信端點
set_local_addr()和get_remote_addr():分別返回本地和遠程對等端的地址
set_option()和get_option():設置和獲取socket選項

3.5 ACE_SOCK_Connector類

factory,用於主動建立新的通信端,功能:
1)發起到“對等接受著”的連接,建立連接後初始化一個ACE_SOCK_Stream對象
2)連接可通過“阻塞”、“非阻塞”、“定時”方式發起,通過ACE_Time_value值來控制connect方法
3)運用C++ traits,支持泛型編程,可以通過c++參數化類型進行功能上批量替換

3.6 ACE_SOCK_IO類和ACE_SOCK_Stream類

ACE_SOCK_Stream類,派生自ACE_SOCK_IO類,封裝了“數據模式”socket支持的數據傳輸機制
send()和recv():讀寫字節數可能比請求的字節數少,收OS緩沖機制和傳輸協議流量控制影響
send_n()和recv_n():少量寫入、少量讀取
sendv_n()和recvv_n():使用OS的分散讀取、集中發送系統函數

3.7 ACE_SOCK_Acceptor類

open()、accept()

第4章 網絡日志服務程序的實現

4.1 概述

4.2 ACE_Message_Block類

高效管理具有固定/可變長度的消息
模型大致基於System VSTREAMS消息緩沖機制,支持兩種消息:
簡單消息:至包含一個ACE_Message_Block
復合消息:包含多個ACE_Message_Block,依據Composite模式連接,形成一種結構,構造“遞歸聚合體”

4.3 ACE_InputCDR類和ACE_OutputCDR類

4.4 日志服務器初始版

4.4.1 Logging_Server基類

Loggint_Server::run()模版方法,其中的open、wait_for_multiple_events、handle_data、handle_connections都是hook方法,可以被子類重寫

4.4.2 Logging_Handler類

方法有recv_log_record()、write_log_record()、log_record()

4.4.3 Iterative——Logging_Server類

1)hook方法handle_connection接收客戶新連接,收到下個客戶連接前會阻塞

2)hook方法handle_data讀取和處理,直到連接關閉或發生錯誤

3)回到1)

4.5 客戶程序

Logging_Client類,send方法

第2篇 並發式面向對象網絡編程

第5章 並發設計空間

5.1 循環、並發、反應式服務器

(1)循環式服務器:處理後續請求之前,會完整處理每個客戶請求,處理一個請求時,要麼講其他請求排成隊列,要麼忽略,適合短期服務(如標准Internet RCHO和DATIME服務)、不經常運行的服務(如夜間才運行的“遠程文件系統備份服務”)
(2)並發式服務器:同時處理多個客戶請求,要使用多進程或多線程,單服務服務器則同一服務的多副本可同時運行,多服務服務器則不同服務的多副本也可同時運行,適合I/O操作頻繁的服務、執行時間會變的長周期服務,需要使用信號量或互斥鎖保證進程線程鍵的合作和數據共享,通常對每個客戶請求,主線程會單獨創建一個工作者線程,如線程池、進程池模型
(3)反應式服務器:幾乎是同時處理多個請求,所有處理實際在一個線程中完成,通常通過“同步事件多路分離”策略來實現,即多個服務請求有一個單線程進程依次循環處理,如基於select()的反應式服務器

局限性:
編程復雜性增加:需要顯式創建事件循環線程、手動保存和恢復環境信息
可靠性和性能降低:一個操作失敗整個服務器進程會掛起,只要有一個服務調用系統函數出錯,os會阻塞整個進程,降低服務器進程性能,如果只是用非阻塞方法,很難使用DMA之類的高級技術,也就無法利用數據和指令緩存的引用局部性來提高性能
通過並發式服務器或異步I/O可以解決這些局限性

5.2 進程與線程

多進程->多線程

5.3 進程/線程創建策略

(1)急式創建策略:服務器創建期間,會預先創建一個或多個進程/線程,形成一個池,池可以靜態或動態擴充或收縮,可通過半同步/半異步模式將I/O層請求向上提供給池中工作者線程,或通過領導者/跟隨者模式管理線程池(池中請求沒有同步或排序限制時,用該模式可提高性能)
(2)隨需創建策略:在客戶連接或數據請求來時創建新進程或線程

5.4 用戶、核心、混合線程模型

(1)模型之間的區別主要是線程所處的競爭范圍不同:

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)更直接

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved