设为首页 加入收藏

TOP

C++网络编程 卷1 运用ACE和模式消除复杂性――笔记1(二)
2016-09-16 23:03:10 】 浏览:609
Tags:网络编程 运用 ACE 模式 消除 复杂性 笔记
写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 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++异步调用利器future/promise实.. 下一篇C++侵入式智能指针的实现

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目