zoukankan      html  css  js  c++  java
  • 高效通信模型之

     
    #Socket事件
    >FD_CONNECT:通常由Client端socket调用socket API函数时触发
    >FD_ACCEPT:通常发生在server端的事件
    >网络传输服务进程会向socket window (CSocketWnd,即消息池)发送 WM_SOCKET_NOTIFY 通知
     
    网络服务进程,CSocket(WSock32.dll),Socket API(ws2_32.dll)层次关系如下:
     
     
     
    #阻塞模式
     
    阻塞通信模型(server),
    阻塞模式下server与client端之间的通信处于同步状态下
    当serer端收到FD_ACCEPT事件时,才会接触阻塞
     
    #非阻塞模式
     
    >在非阻塞模式下,client与server端通信处于异步状态下
    >函数调用后立即返回,当网络操作传送完毕之后由WINSOCK给应用程序发送一个消息通知操作完成,此时可以根据发送的消息参数判断是操作否正常。
    >与阻塞模式相比,非阻塞模式无需创建一个新线程
     
     
     
     
     
    #选择I/O模式  (SELECT)
     
    通过调用SELECT ,系统可以同时等待多个IO设备。当没有设备准备好时,SELECT挂起;其中任何一个设备准备好,SELECT就返回。
     
     
    #异步模型
     
    #异步和同步
    >同步,就是在发出一个功能调用时,在没有得到结果前,调用不返回
    >异步,当一个异步过程调用发出后,调用者不能立即得到调用结果,而是通过状态,通知和回调来通知调用者。
    >通过检查状态来判断异步调用结果,效率会很低,因为需要周期性检查状态
    >回调函数和通知差不多
     
    #同步调用与阻塞调用
    >对于同步调用来说,当前线程还是激活状态的。例如CSocket中调用Receive函数,当缓冲区没有数据时,虽然函数一直在等待而没有返回,但同时线程仍然能继续处理各种消息。
    >对于阻塞调用来说,当前线程会被挂起。例如 revc函数,当socket工作在阻塞模式的时候,如果在缓冲区没有数据的情况下调用该函数,那么线程将会被挂起,直到有数据为止。
     
    #非阻塞
    非阻塞,在不能得到结果前,函数不会阻塞当前线程,而是立即返回。
    >对象是否处于阻塞模式和函数是不是阻塞调用有很强的想关心,但并不是一一对应
    >阻塞对象可以有非阻塞的调用方式,可以通过API轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。
    >对于非阻塞对象,特殊调用也可以进入阻塞调用,例如select
    >CSocket::Receive 函数(同步)
    >recv (阻塞)
     
     
     
     
     
     
     
     
     
     
     
     
     
     





  • 相关阅读:
    RocketMQ之二:分布式开放消息系统RocketMQ的原理与实践(消息的顺序问题、重复问题、可靠消息/事务消息)
    Redis 发布/订阅机制原理分析
    Guava 12-数学运算
    Guava] 11
    Guava 10-散列
    Guava 9-I/O
    Guava 8-区间
    mat(Eclipse Memory Analyzer tool)之二--heap dump分析
    Python流程控制语句
    监控和管理Cassandra
  • 原文地址:https://www.cnblogs.com/fysola/p/4822646.html
Copyright © 2011-2022 走看看