精华内容
下载资源
问答
  • WinSock 异步IO模型

    2011-10-24 21:30:54
    WinSock 异步IO模型WinSock 异步IO模型
  • 异步IO模型和Overlapped结构.pdf
  • TCP流式套接字的select模式编程 TCP流式套接字的异步事件WSAAsyncSelect编程 TCP流式套接字的事件对象I/O管理WSAEventSelect编程
  • Python之异步IO模型实现socket并发

    千次阅读 2019-04-21 18:16:40
    # 鉴于异步IO模型while True不停扫描高消耗CPU,所以采用IO多路复用模型 import select import socket sk = socket.socket() addr = ('127.0.0.1',8090) sk.setblocking(False) sk.bind(addr) sk.listen() read_...

    服务端:

    import socket
    sk = socket.socket()
    addr = ('127.0.0.1',8090)
    sk.bind(addr)
    sk.listen()
    sk.setblocking(False) # 设置非阻塞模式,accept,recv等方法均不阻塞,而是抛出异常
    
    conn_lst = [] # 建立一个列表存储接收到的连接
    del_lst = [] # 建立一个列表存储已经关闭的连接
    while True:
        try:
            conn,addr_client = sk.accept() # 没有连接时--BlockingIOError
            print('接收到一个连接') # 如果上一步没有异常发生,则表示收到一个连接
            conn_lst.append(conn) # 将接收到的连接放入列表中
        except BlockingIOError:
            for conn in conn_lst: # 循环接收到的连接,尝试接收消息
                try:
                    msg = conn.recv(1024) # 如果没有收到,同样抛出异常--BlockingIOError
                    if not msg: # 从一个关闭的客户端接收消息,收到的值为空
                        del_lst.append(conn) # 将已关闭的连接放入待删除列表中
                        continue
                    print(msg)
                except BlockingIOError:
                    for conn in del_lst: # 将客户端已关闭的连接关闭回收
                        conn.close()
                        conn_lst.remove(conn)
                    del_lst.clear() # 清空已关闭的连接记录
    

    客户端:

    import socket
    from threading import Thread
    import time
    def client():
        sk = socket.socket()
        addr = ('127.0.0.1',8090)
        sk.connect(addr)
        sk.send(b'hell0')
        sk.close()
    if __name__ == '__main__': # 模拟20个客户端并发连接服务端
        for i in range(20):
            Thread(target=client).start()

    弊端:while True循环模式极耗CPU,通常需要在循环中加入sleep,但是加入sleep影响实时性

    IO多路复用模型-服务端

    # 鉴于异步IO模型while True不停扫描高消耗CPU,所以采用IO多路复用模型
    import select
    import socket
    
    sk = socket.socket()
    addr = ('127.0.0.1',8090)
    sk.setblocking(False)
    sk.bind(addr)
    sk.listen()
    
    read_lst = [sk]
    while True:
        # select 监听请求对象,如果没有收到请求,则阻塞,此处相当于监听accept事件
        rret,wret,xret = select.select(read_lst,[],[]) # rret为响应事件对象,若响应accept事件,则返回sk,若响应recv,则返回conn
        # print(rret)
        for i in rret:
            if i is sk:
                conn,addr = i.accept()
                read_lst.append(conn)
            else:
                msg = i.recv(1024)
                if not msg:
                    read_lst.remove(i)
                    i.close()
                    continue
                print(msg)

     

    展开全文
  • OVERLAPPED结构主要用于异步I/O操作,其数据结构定义如下: typedef struct _OVERLAPPED {  DWORD Internal; // 系统保留,存放系统设置的状态  DWORD InternalHigh; // 系统保留,存放被传

    转自:http://space.itpub.net/25897606/viewspace-705867

    OVERLAPPED结构主要用于异步I/O操作,其数据结构定义如下:


    typedef struct _OVERLAPPED {
        DWORD Internal;     // 系统保留,存放系统设置的状态
        DWORD InternalHigh; // 系统保留,存放被传输数据的长度
        DWORD Offset;       // 指定文件的位置,文件位置是相对文件开始处的字节偏移量。
        DWORD OffsetHigh;   // 指定开始传送数据的字节偏移量的高位字
        HANDLE hEvent;      // 标识事件,数据传送完成时把它设为信号状态
    }OVERLAPPED;

    Overlapped I/O模型可以用以下几种方式实现:

    一、内核对象实现
    1. 把设备句柄看作同步对象,ReadFile将设备句柄设置为无信号。ReadFile异步I/O字节位置必须在OVERLAPPED结构中指定。
    2. 完成I/O,设置信息状态为有信号。
    3. 通过WaitForSingleObject或WaitForMultipleObject判断或者异步设备调用GetOverLappedResult函数。

    二、事件内核对象实现
    1. Overlapped成员hEven标识事件内核对象。CreateEvent,为每个请求创建一个事件,初始化每个请求的hEvent成员。调用WaitForMultipleObject来等其中一个或全部完成。
    2. Event对象必须是手动重置,使用自动重置WaitForSingleObject()和 WaitForMultipleObjects()函数不会返回。

    关于自动重置事件和手动重置事件
    自动重置事件:WaitForSingleObject()和WaitForMultipleObjects()会等待事件到信号状态,随后又自动将其重置为非信号状态,保证等待此事件的线程中只有一个会被唤醒。
    手动重置事件:需要调用ResetEvent()才会重置事件。可能有若干个线程在等待同一事件,这样当事件变为信号状态时,所有等待线程都可以 运行了。 SetEvent()函数用来把事件对象设置成信号状态,ResetEvent()把事件对象重置成非信号状态,两者均需事件对象句柄作参数。


    三、异步过程调用
    在一个Overlapped I/O完成之后,系统调用callback回调函数。系统在设备句柄有信号状态下,才会调用回调函数,传给它完成I/O请求的错误码,传输字节数和 Overlapped结构的地址。通过下面的五个函数可以设置信号状 态:SleepEx,WaitForSingleObjectEx,WaitForMultipleObjectEx,SingalObjectAndWait,MsgWaitForMultipleObjectsEx。

    四、完成端口
    完成端口(I/O completion)的优点:不会限制handle个数,可处理成千上万个连接。I/O completion port允许一个线程将一个请求暂时保存下来,由另一个线程为它做实际服务。
    并发模型与线程池:在典型的并发模型中, 服务器 为每一个客户端创建一个线程,如果很多客户同时请求,则这些线程都是运行的,那么CPU就要一个个 切换,CPU花费了更多的时间在线程切换,线程却没得到很多CPU时间。到底应该创建多少个线程比较合适呢, 微软 件帮助文档上讲应该是2*CPU个。但理 想条件下最好线程不要切换,而又能象线程池一样,重复利用。I/O完成端口就是使用了线程池。一个线程执行任务结束后不会销毁,而是重新回到线程队列中。
    展开全文
  • 最古老的javaIO通信模式BIO,即阻塞IO,同步调用,性能低: 在服务器端:有专门的客户连接 接收器Acceptor,当有新的客户端连接到达后,Acceptor负责第一步连接,然后给每一个客户端连接创建一个新的线程来处理对应...

    最古老的javaIO通信模式BIO,即阻塞IO,同步调用,性能低:

    在服务器端:有专门的客户连接 接收器Acceptor,当有新的客户端连接到达后,Acceptor负责第一步连接,然后给每一个客户端连接创建一个新的线程来处理对应的业务;处理完成后,通过输出流返回给客户端,并将线程销毁,这也是最典型的一对一服务模型。

    对应模型图如下:


    从图中可以明显看出对应Web Browser1,2,3,4 服务器端分别创建了线程New Thread1,2,3,4对应处理来应答对应的请求。

    伪异步模型IO;也被成为M:N客户服务模型。即通过线程池模型的形式用M个线程来服务N个客户端的连接;其中M的大小可以根据服务器的配置来设置最大值,而可服务客户端个数N则可以远远的大于M.这样来提高服务器的服务效率,提高线程利用率。同BIO模型类似,只不过,Acceptor接受客户端请求后,不再独立启动线程来处理,而是将客户请求交给线程池来处理,从而减少线程的创建数量,提高线程利用率,增加服务器的处理能力;

    对应的模型如下图:


    从上图可以看出,M:N的iO模型中的web Browser1,2,3,4最终都由Acceptor交给了Task任务队列,然后由Thread Pool来执行任务,并将最终的响应结果返回给客户端。

    其中ThreadPool中线程的数量M和Task任务队列的长度的设置,将会影响到服务器处理客户端请求的能力,合理的配置线程池和Task队列长度,才能使得服务器处理能力达到最大;而其具体大小需根据实际需求来决定;

    异步IO:NIO模型;有人叫做New IO,来区别BIO,也有人叫Non-block IO,不过都是表示非阻塞IO,与阻塞Io对应,客户端的Socket与服务器端的ServerSocket,分别为:SocketChannel和ServerSocketChannel两种不同的套接字来实现通信;不过他们即支持非阻塞通信模式,也支持阻塞通信模式,如果使用需要手动设置为非阻塞模式;这也是高效率和高性能的首选模式。

    NIO服务端通信序列图:


    从上图可以看出服务器端创建了ServerSocketChannel,创建了多路复用器Selector,然后将服务器的服务地址和端口绑定到SSC中,并注册给多路复用器,并启动多路复用器来处理不同的事件,包括连接事件,读取事件,写事件。当然对于每一个客户端的连接,都必须先建立连接,然后才能异步读和异步写,但是每一个客户端的读写事件并没有先后顺序,而是通过Selector选择器轮询所有的事件,在通过读写缓冲区准备好的事件(已经就绪),就会被选中并处理,然后完成对应的事件。如果A客户端先建立连接,但是需要读大量数据,则其读事件就不会处于就绪状态,也就不会被选择器选中,而B客户端后建立连接,但是读取数据少,很快就处于就绪状态,那么服务器就会处理B的数据,然后将结果写入写缓冲区,当写数据完成并就绪,则会触发写事件,返回给客户端。而此时如果A的读数据完成处于就绪状态,则处理器会继续处理A的读事件,之后服务器处理完成,并异步些人写缓冲区,处理逻辑同B的写逻辑;

    Nio客户端通信时序图:


    从上图可以看出,客户端创建SocketChannel并设置为非阻塞模式,并创建多路复用器Selector,客户端需要先创建连接,然后是异步读事件,然后是异步写事件,当然客户端和服务器端的连接(通道)一旦建立,则轮询器会不停的判断,当然也可以设置每过几秒来轮询一次,是否处于读就绪或者写就绪,如果缓冲已经就绪,则会处理对应的读写事件。对于读写事件的处理过程基本同服务器端。



    展开全文
  • 重叠IO模型 - 异步IO

    千次阅读 2011-12-29 15:55:48
    重叠IO模型 - 异步IO说到重叠模型首先还是提一下异步IO比较好,因为从本质上讲,重叠模型也是一种异步IO模型。我们知道,相对于计算机执行的其他操作而言,设备IO(文件、管道、套接字等)是比较慢的。于是在多线程...
    重叠IO模型 - 异步IO
    


    说到重叠模型首先还是提一下异步IO比较好,因为从本质上讲,重叠模型也是一种异步IO模型。
    我们知道,相对于计算机执行的其他操作而言,设备IO(文件、管道、套接字等)是比较慢的。于是在多线程结构中就考虑到采用异步的方式进行设备读写操作,即我们告诉系统对设备的读写数据,而同时应用程序的其他代码继续执行,直到获取设备操作完毕的系统通知。
    在进行异步IO时,我们先向系统发出IO请求,操作系统队列化各种IO请求,并在内部完成操作,当系统在处理IO请求时,我们的线程可以返回继续执行,当操作系统处理完IO请求之后,通知我们数据操作(发送、接收、出错)完毕。

    Windows提供了四种异步IO技术,机制几乎时相同的,区别在于通知结果的方式不同:

    more in 

    http://www.hudong.com/wiki/%E9%87%8D%E5%8F%A0IO%E6%A8%A1%E5%9E%8B

    展开全文
  • 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO
  • 5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

    万次阅读 多人点赞 2016-10-28 20:01:41
    5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度、环境不一样。所以,我们先说明基本的IO操作及环境。本文是在《UNIX网络编程 卷1:套接字联网API》...
  • 五种io模型: 阻塞io模型 非阻塞io模型 io复用模型 信号驱动io模型 异步io模型 其中阻塞与非阻塞 阻塞io:就是函数调用后,会被挂起,直到内核接受到了io的读写,拷贝到了应用进程的用户态后,函数才返回 非...
  • 程序员成长之旅——同步IO和异步IO(五种IO模型)同步和异步同步异步消息通知阻塞和非阻塞阻塞非阻塞同步IO阻塞IO非阻塞IO信号驱动IO多路转接IO 在这里首先要知道一点就是IO操作其实总的就分为两种,第一种是等待的...
  • 同步IO与异步IO的区别? 1.POSIX 2.IO模型 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动IO模型 异步IO模型 五种IO模型比较
  • 目录IO模型阻塞与非阻塞同步与异步阻塞IO非阻塞IO信号驱动IO多路复用IO异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO五类。 最主要的两个区别就是阻塞与非阻塞...
  • BIO编程模型异步IO编程模型 BIO编程和伪异步IO编程模型的区别就是前者一个客户端就创建一个线程,后者是直接从线程池中获取线程。
  • 同步(synchronous) IO异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non...
  • 异步通知IO模型

    2020-07-11 21:36:33
    同步和异步 同步异步的关键是函数的调用时刻和返回时刻与数据传输的开始时刻和完成时刻,数据传输指输出或输入到缓冲。 异步通知IO模型 ...异步通知IO模型中函数的返回与IO状态无关,指定IO监视对象
  • 作者:尐譽blog.csdn.net/tjiyu/article/details/529594185种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO看了一些文章,发现有很多不同的理解...
  • 异步IO模型 1. 阻塞与非阻塞 阻塞与非阻塞是针对做一件事情的时候,如果遇到一个需要耗时操作,是等待完成,还是不等待。 举个例子,烧开水。当经历了拿锅、接水、点火等操作,来到了一个耗时操作,烧水。 烧水是一...
  • IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO 原文地址 IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO 正文 IO模型 在《UNIX网络变成卷1:套接字联网API》这本书中,提到了五种I/O模型...
  • 异步IO

    2017-11-16 21:25:00
    解决CPU高速执行能力和IO设备龟速严重不匹配的方法: 同步IO:用多线程和多进程。但是线程的数目不能无限...异步IO模型需要一个消息循环,在消息循环中,主线程不断地重复“读取消息-处理消息”这一过程: lo...
  • 1.异步IO流程 2.异步IO与非阻塞IO

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,007
精华内容 40,802
关键字:

异步io模型