欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++网络编程 卷1 运用ACE和模式消除复杂性——笔记1

程序员文章站 2023-04-08 12:45:35
第0篇 0.3.1 面向对象中间件层 1、常见面向对象中间件体系结构: 1)主机基础设施中间件:对并发和ipc机制封装,如javapackage、ace 2)分布式中间件:扩充1),使一些网络任务(...

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