设为首页 - 加入收藏
广告 1000x90
您的当前位置:黄大仙78345救世报网 > 局部死锁 > 正文

ACE网络编程 --ACE库入门:中篇-程序员教程

来源:未知 编辑:admin 时间:2019-05-30

  1).主机基础设施中间件:对OS并发机制和进程间通信机制进行封装,以获得面向对象编程的能力。例如封装socket、posix线).分布式中间件:扩展了主机基础设施中间件,使得一些网络编程(连接管理、内存管理、整编、解编端点和请求的多路分离、同步、多线程)自动化。主要管理支持面向对象分布式整编模型的终端系统资源。分布式中间件的核心是ORB,COM++,JAVA RMI,CORBA

  3).公共中间件:扩展了分布式中间件,独立于特定服务,主要对整个分布式系统中的各种资源进行分配、调度和协调

  满足QoS需求:相比于分布式中间件,主机基础设施中间件吞吐量和延迟上的开销小,可以解决抖动和可靠性

  *定制网络协议,以对网络带宽的使用实施优化,或将共享内存通信替换为回送网络通讯

  *数据成帧策略:面向连接提供了多种数据成帧策略,如面向消息发送策略被某些面向连接协议所支持如TP4,XTP。而TCP市一中字节流协议,不

  保护应用程序消息的边界,例如在TCP上,如果某一应用程序通过4个send()调用传输4条不同的消息,那么会有1个或多个(可能4个)TCP数据段

  被传输给接收端。所以如果某一应用程序需要面向消息发送,发送端和接收端就必须执行额外的处理,以将4条在TCP上交换的消息分割成帧。如

  果消息的总长度总相同,并且永远没有网络错误,成帧相对来说简单,否则就会成为一个不小的问题。选择了TCP就要在TCP字节流上实现分帧机制

  *连接多路复用策略(非I/O的多路复用):在面向连接协议上传输数据,有2个一般性的策略:多路复用(一个进程的所以线程发出的所有客户

  请求都通过1条TCP连接传递给一个服务器进程。优点:节省OS通讯资源;缺点:难以控制难以编程缺乏效率和确定性)和非多路复用(每一个客

  户都是用不同的额连接和对等服务程序通讯。优点:可以更好的控制通讯的优先级,且同步开销小)

  .同步及异步消息交换:管理请求/应答协议交换的可选机制有2种:同步和异步消息交换。同步请求/应答协议中请求和应答是以锁步的次序交换的,每一个

  请求必须同步接收到一个应答,然后才能发送下一个请求。异步请求/应答协议中每一个消息是独立的,但是异步请求往往需要一种策略来检测请求

  的丢失或失败,然后重新发送。异步适用于“通信延迟”和“请求所需的处理时间”密切相关的场合。

  .消息传递与共享内存实现数据交换:消息传递明确的通过IPC机制来交换字节流和面向记录的数据。消息传递IPC机制通过IPC信道,将数据以消息的形式从

  一个进程或线程传递到另一个进程或线程。如果数据很大,这些数据就会分片以消息序列的形式发送。如果有一个以上的进程接收数据,则每一条

  消息就要发送多次,每一次针对一个接收者。譬如RPC、CORBA和面向消息中间件(MOM),其内部都是基于消息传递模型。

  内存共享:允许相同或不同主机上的多个进程访问、交换数据就像数据位于每一个进程的本地地址空间一样。在网络应用程序中,如果数据必须被

  多个进程读取和处理,那么较之“消息传递”则“内存共享”设施是一种更有效的通信机制。共享内存有本地和分布式内存共享2种:

  分布式共享内存(DSM):DSM在网络上扩展了虚拟内存的概念,以通过全局/共享内存中的数据进行透明的进程通信。

  2.Socket接口:每一个Socket可以绑定至一个本地地址和一个远程地址。Socket API大约有20多个系统函数,这些函数可以分为以下5类:

  2).连接的建立与终止:connect(主动在一个socket句柄上建立连接) listen(表示愿意被动侦听来自客户的连接请求) accept(工厂函数。响应客户请求,创建一个新的连接) shutdown(有选择的终止双向连接中读取方和写入方的数据流)

  3).数据传输机制:send recv(通过某一特定的I/O句柄,传送和接收数据缓冲区数据) sendto recvfrom(交换无连接数据报)

  read write(通过某一句柄,接收和传送数据缓冲区) readv writev(分别支持“分散读取”和“集中写入”,以优化模式切换,简化内存管理。) sendmsg recvmsg(通用函数,包含其他其他数据传输函数的行为)

  4).选项管理:setsockopt(在协议的不同层修改选项) getsockopt(在协议的不同层查询选项)

  ACE_SOCK_Connector:连接工厂,连接到一个对等的接受者,然后在一个ACE_SOCK_Stream 对象中初始化一个新的通信端点

  ACE_SOCK_IO:封装了”数据模式“socket支持的数据传输机制。

  ACE_SOCK_Acceptor:接收连接工厂,在一个ACE_SOCK_Stream对象中初始化一个新的通信端点,对来自对等连接者的请求做出响应。

  客户端和服务器的ACE_Addr地址都可以使用sap_any:*客户端可以使用sap_any来创建OS分配的临时端口号,在连接关闭之后,这些端口可以再次使用

  *服务器程序可以通过sap_any选择他们的端口号,只要他们通过某种定位机制向客户输出了被分配的端口号

  该类是一个工厂类,用以主动建立一个新的通信端。对给定的服务器地址进行连接,并返回一个ACE_SOCK_Stream对象供应用程序读写支持”阻塞“、”非阻塞“、”定时“

  该类负责数据的接收和发送,提供了多种send和recv方法变体(包括”分散读取,集中写入“的方法)。支持”阻塞“、”非阻塞“、”定时“分散读取和集中写入的作用:

  分散/聚集I/O对于将数据划分为几个部分很有用。例如,您可能在编写一个使用消息对象的网络应用程序,每一个消息被划分为固定

  长度的头部和固定长度的正文。您可以创建一个刚好可以容纳头部的缓冲区和另一个刚好可以容难正文的缓冲区。当您将它们放入一

  个数组中并使用分散读取来向它们读入消息时,头部和正文将整齐地划分到这 两个缓冲区中。

  该类封装了底层的socket、bind、listen用来被动接收一个对等端连接,并在连接建立后,返回一个ACE_SOCK_Stream对象,供服务器读写支持”阻塞“、”非阻塞“、”定时“

  ACE_Mem_Map的基础是”内存映射文件”机制。使用了OS虚拟内存机制,将文件地址映射到进程地址空间中。被映射的文件内容可以通过指针直接访问。“内存映射文件”可以被同一台主机上的多个进程共享。

  第四章、网络日志服务器的实现#ACE_Message_Block(简单消息块(链))

  作用:统一不同主机不同环境的“字节序”规则,将类型化的数据和数据流相互转换。只提供原始数据类型及其数组的整编和解编。

  ACE_OutputCDR 根据数据结构创建CDR缓冲区,将数据保存在缓冲区中-整编

  并发设计空间涉及使用多进程、多线程及其同步装置的策略和机制。服务器分类:循环式、反应式、并发式。

  循环式服务器:在处理后续的请求之前,会完整的处理每一个客户请求。因此在处理一个请求时,要将其它请求排成队列。

  缺点:当客户端因为等待服务器处理请求而被阻塞时,会阻止客户程序继续向下运行。如果服务器延迟太久,

  则应用程序和中间件层中用于”重新传输“的”超时“计算会变得复杂,从而引发严重的网络阻塞;并且根

  并发式服务器:使用多线程或多进程,同时处理多个客户请求。如果是”单服务“服务器,则同一服务的多个副本可以同时运行。

  优点:可以使用更精细的同步技术,能在“应用程序定义的层次”将“请求”串行化。这种机制需要使用同步机制如信号量、互斥锁,以

  反应式服务器(同步事件多路分离机制):几乎可以同时处理多个请求(尽管所有的处理实际上都在一个线程中完成,当请求到达时也可分离出相应的线程专门处理请求。)

  “基于任务”的并发体系:根据应用程序中的“服务功能单元”来组织多个CPU。在这一体系中,任务是主动的

  而任务处理的消息是被动的。并发性是通过在各个CPU中执行服务任务,并在任务/CPU之间传递数据消

  息和控制消息而获得。“基于任务”的并发体系可以通过“生产者/消费者”模式来实现。

  “基于消息”的并发体系:从应用程序和网络设备接收到的消息来组织CPU。在这一体系中消息是主动的,

  任务是被动的。并发性是借助一个服务任务栈,通过同时在各个CPU上处理多个消息来获得。”一个请求一个线程“、

  ”一个连接一个线程“、”线程池“模型可以用来实现”基于消息“的并发体系。

  ”同步事件多路分离“:select/Poll用于在一组事件源上等待特定事件的发生。当某个(或多个)事件源被激活时,函数将返回至调用者。于是,调用者就可以处理这些”来自多个源“的时间。同步事件多路分离是反应式服务器的基础。

  *递归互斥锁:拥有互斥锁的线程可以多次获得它而不会产生死锁,只要这个线程最终以相同的次数释放这个互斥锁即可

  网络应用程序中的事件源主要是socket句柄。select可以管理事件源。

  #ACE_Handle_Set 封装了select可以管理的所有句柄该类利用wrapper facade模式来指导fd_set的封装,提供了对句柄操作的方法。select管理的句柄一定要设置为非阻塞模式,否则有可能程序永远被挂起

  *服务器的事件循环搜索活动句柄集,并针对每一个活动句柄执行”时间处理“代码

  多进程适用于:*不可能使用多线程方案的地方*不适合使用多线程方案的地方-受”不可重入“方法的影响

  *creation_flags() 指定是否在被创建进程中运行新的程序映像

  #ACE_TSS(Thread_specific storage)线程专有存储-相当于智能指针 (模板容器,使得某个静态变量为线程安全的,在每一个线程中都有一份拷贝)

  第 1章 ACE 自适配通信环境1.ACE 中的组件可用于以下几种目的:

  第一组类是那些基于 ACE_Allocator的类。这组类使用动态绑定和策略模式来提供灵活性和可扩展性。它们只能用于局部的动态内存分配。

  二组类基于 ACE_Malloc 模板类。这组类使用 C++模板和外部多态性 (External Polymorphism)来为内存分配机制提供灵活性。在这组类中的类不仅包括了用于局部动态内存管理的类,也包括了管理进程间共享内存的类。这些共享内存类使用底层 OS(OS)共享内存接口。

  linux IPC进程间通信SAP、system V IPC封装;POSIX pthreads 和 Win32 线程都实现了递归和非递归互斥体;Token(令牌) :Token 类提供一种比 Mutex 更为通用的同步机制。例如,它实现了“递归互斥体”语义,拥有令牌的线程可以重新获取它,而不会导致死锁。此外,当其他线程释放令牌时,阻塞在该令牌上的线程以严格的 FIFO(先进先出)的顺序被服务(相反,Mutex 并不严格地强制实行一种获取顺序);条件变量与其它同步机制的不同(主动等待与被动等待)条件变量提供风格与互斥体、读/写锁和计数信号量不同的锁定机制。当持有锁的线程在临界区执行代码时,这三种机制让协作线程进行等待。相反,条件变量通常被一个线程用于使自己等待,直到一个涉及共享数据的条件表达式到达特定的状态。当另外的协作线程指示共享数据的状态已发生变化,调度器就唤醒一个在该条件变量上挂起的线程。于是新唤醒的线程重新对它的条件表达式进行求值,如果共享数据已到达合适状态,就恢复处理。 对于涉及条件表达式语义的情况,条件变量比信号量或互斥体要更为有用。条件变量语义特别适合用于实现生产者/消费者模型.

  TSS线程专有存储-thread specific save,线程专有存储数据实现线程对一个类中所有方法的互斥访问(将全局数据放入线程专有存储中),而原子操作类SCE_Atomic_Op类只能实现对普通数据类型的互斥访问。

  主动对象持有自己的线程,并将这个线程用于执行对它们的任何方法的调用。因而,如果一个传统对象,在里面封装了一个线程或多个线程,它就是一个主动对象。

  任务:每个任务都含有一或多个线程,以及一个底层消息队列。各个任务通过这些消息队列进行通信。但是,消息队列并非是程序员需要关注的对象。发送任务可以使用 putq()调用来将消

  息插入到另一任务的消息队列中。随后接收任务就可以通过使用 getq()调用来从它自己的消息队列里将消息提取出来。

  b.调用启用(Activation)方法:在主动对象实例化后,你必须通过调用 activate()启用它。要在主动对象中创建的线程的数目,以及其他一些参数,被传递给 activate()方法。activate()方法会使 svc()方法成为所有它生成的线程的启动点。 activate()方法需要用户主动调用。c.实现服务专有的处理方法:如上面所提到的,在主动对象被启用后,各个新线程在 svc()方法中启动。应用开发者必须在子类中定义此方法。 svc()方法在用户调用了activate()方法后将被自动调用。

  c.若干 ACE_Method_Object(主动对象的每个方法都需要有一个方法对象) 。

  d.若干 ACE_Future 对象(每个要返回结果的方法都需要这样一个对象) 。

  还将若干不同种类的事件的多路分离集成到易于使用的 API 中。特别地,反应器对基于定时器的事件、信号事件、基于 I/O 端口监控的事件和用户定义的通知进行统一地处理。

  2.具体服务处理器ACE_Svc_Handler-My_Service_Handler

  由应用开发者编写,它的 open()方法在连接建立后被自动回调。接受器框架假定服务处理类的类型是 ACE_Event_Handler,这是 ACE 定义的接口类(该类已在反应器一章中详细讨论过)。另一个特别为接受器和连接器模式的服务处理而创建的类是 ACE_Svc_Handler。该类不仅基于ACE_Event_Handler接口 (这是使用反应器所必需的) , 同时还基于在 ASX 流框架中使用的 ACE_Task类。ACE_Task 类提供的功能有:创建分离的线程、使用消息队列来存储到来的数据消息、并发地处理它们,以及其他一些有用的功能。

  接收器和连接器设计模式:工厂+反应器设计模式接收器和连接器都可以单独使用,而不需要使用工厂+反应器设计模式。

  ACE_Acceptor和ACE_Connector工厂其实是一个委托,可以封装不同的底层接受器和连接器,只是提供了统一的访问接口。

  ACE_Event_Handler事件处理器类是各种用户自定义事件的子类,用户可以用该类来实现文件可读事件处理器、文件可写事件处理器、连接/接受事件处理器、定时事件处理器、信号事件处理器、通知事件处理器等,每一个具体的事件处理器其实就是继承了ACE_Event_Handler类并封装了一个文件、连接/接受器等。事件处理器用于反应器中,一个反应器需要一个或多个事件处理器(事件处理器没有其它的用途了)。每一个事件处理器都有一个底层流,可以使用ACE_Event_Handler的peer()方法来获取,同样可以使用该方法来为ACE_Event_Handler对应的句柄(流)赋值。

  ACE_Event_Handler这个需要2方面的实现:a.处理谁的事件,对应它的底层流或句柄;b.如何处理事件,实现相应的方法。 综合起来:处理谁的事件,如何处理。只要满足了这2个条件就可以把它注

  册到反应器里面去了。反应器是通过get_handle()函数知道要处理发生在哪个句柄对象上的事件的。ACE_Svc_Handler类模板继承于ACE_Event_Handler和ACE_Task,根据需要实现ACE_Event_Handler和ACE_Task的相关方法,专门用于处理网络通信事件;当有连接到达时,反应器调用其open()方法,都

  a.名为 ACE_Service_Object 的抽象类。应用开发者必须从它派生出子类,以创建他自己的应用特有的具体服务对象(Service Object) 。

  e.服务配置文件。该文件含有所有服务对象的配置信息。其缺省的名字是f。当你的应用对ACE_Service_Config 发出open()调用时,服务配置器框架会读取并处理你写在此文件中的所有配置信息,随后相应地配置应用。

  了介绍。当开发者想要他的类响应来自反应器的事件时,他就从 ACE_Event_Handler派生他的子类。2.实现动态服务器配置的步骤:

  ACE_Service_Manager 是可用于对服务配置器进行远程管理的服务。它目前可以接受两种类型的请求。其一,你可以向它发送“help”消息,列出当前被加载进应用的所有服务。其二,你可以向服务管理器发送“reconfigure”消息,从而使得服务配置器重新配置它自己。 在远程端需要在指定的端口启动ACE_Service_Manager,他是一个已经实现的对象‘然后在本地就可以发送reconfigure信息对远程主机上的服务进行重新配置。下面的命令指定在 9876 端口静态地启动服务管理器:(配置文件中)

  c.指向“片段链” (fragment chain)中的下一个消息块的指针。消息块可以实际地链接在一起来形成链。随后链可被放入消息队列中,就好像它是单个数据块一样。该参数缺省为0,意味着此块不使用链。

  d.指向要存储在此消息块中的数据缓冲区的指针。如果该参数的值为零,就会创建缓冲区(大小由第一个参数指定),并由该消息块进行管理。当消息块被删除时,相应的数据缓冲区也被

  删除。但是,如果在此参数中指定了数据缓冲区, 也就是, 参数不为空, 当消息块被销毁时它就不会删除数据缓冲区。这是一个重要特性,必须牢牢记住。e.用于分配数据缓存(如果需要)的 allocator_strategy,在第四个参数为空时使用(如上面所解释的)。任何 ACE_Allocator 的子类都可被用作这一参数。f.如果 locking_strategy 不为零,它就将用于保护访问共享状态(例如,引用计数)的代码区,以避免竞争状态。

  g.priority设置优先级;后面两个参数用于 ACE 中的实时消息队列的调度,如果将该消息块放入ACE_Dynamic_Message_Queue中,那么后2个参数将会产生作用。

  置,而 wr_ptr指向下一次写入数据的位置。程序员必须小心地管理这些指针,以保证它们总是指向正确的位置。在使用这些指针读写数据时,程序员必须自己来增加它们的值,它们不会魔

  ACE 有若干不同类型的消息队列,它们大体上可划分为两种范畴:静态的和动态的。静态 队列是一 种通用的 消息队列 ( ACE_Message_Queue ),而动 态消息队列(ACE_Dynamic_Message_Queue)是实时消息队列。这两种消息队列的主要区别是:静态队列中的消息具有静态的优先级,也就是,一旦优先级被设定就不会再改变;而另一方面,在动态消息队列中,基于诸如执行时间和最终期限等参数,消息的优先级可以动态地改变。不管是哪种消息队列保存的都是ACE_Message_Block,只是调度的方式不同。

  类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序员可能使用类型相当安全的语言写出类型不***全的程序。绝对类型安全的编程语言暂时还没有。C语言的类型安全,C只在局部上下文中表现出类型安全,比如试图从一种结构体的指针转换成另一种结构体的指针时,编译器将会报告错误,除非使用显式类型转换。然而,C中相当多的操作是不安全的。ACE实现了类型安全。

  ACE_Arg_Shifter将已知的参数或选项移动到 argv 向量的后面,这样在进行更深层次的参数解析时,就可以在 argv 向量的开始处定位还没有处理的参数。也可以用于参数解析

本文链接:http://sesdagreat.com/jubusisuo/144.html

相关推荐:

网友评论:

栏目分类

现金彩票 联系QQ:24498872301 邮箱:24498872301@qq.com

Copyright © 2002-2011 DEDECMS. 现金彩票 版权所有 Power by DedeCms

Top