计算机系统应用教程网站

网站首页 > 技术文章 正文

探索IO模型:从同步阻塞到异步非阻塞

btikc 2024-10-21 04:10:30 技术文章 13 ℃ 0 评论

1、先了解一些名词概念:

同步:在用户空间和内核空间进行数据交互时,用户空间需要的数据必须等待内核空间给予后才能开始其他操作,数据在传输过程中是阻塞的。同步IO适用于读写操作频繁的场景,但当IO操作较多时,性能会受到影响

异步:在用户空间和内核空间进行数据交互时,用户空间不需要等待内核空间给予数据即可开始其他操作,数据在传输过程中不会阻塞。异步IO适用于读写操作不频繁的场景,可以提高系统的并发性能。当IO操作真正完成后,内核会通知用户空间,用户空间再去处理数据。

用户空间和内核空间:

用户空间和内核空间的划分主要是为了实现操作系统的安全性和稳定性。以下是用户空间和内核空间划分的具体方式:

虚拟地址空间的划分:操作系统将虚拟地址空间划分为两部分,一部分是用户空间,另一部分是内核空间。用户空间和内核空间拥有各自的地址空间,应用程序只能访问用户空间的地址,而不能访问内核空间的地址。通过这种划分,可以保护内核空间不被应用程序破坏,同时保证应用程序的正常运行。

系统调用的实现:用户空间和内核空间之间的数据交互可以通过系统调用来实现。当用户空间需要访问内核空间时,它会触发一个系统调用,并将控制权传递给内核空间。在系统调用完成后,内核会将结果返回给用户空间,并返回到用户空间的执行上下文。通过系统调用的方式,可以保证用户空间和内核空间之间的数据交互的正确性和安全性。

内核态和用户态的切换:在操作系统中,程序运行在不同的态上,分别是内核态和用户态。内核态具有较高的权限,可以访问系统所有资源,而用户态则具有较低的权限,只能访问有限资源。当程序需要执行敏感操作时,例如读写文件、网络通信等,需要切换到内核态下执行。当操作完成后,程序会切换回用户态继续执行其他任务。通过态的切换,可以保证程序对系统资源的正确使用和安全性。

进程切换:进程切换是操作系统在控制进程执行过程中所使用的一种技术。当一个进程在运行时,它占用CPU及内存。当操作系统需要执行另一个进程时,它需要进行进程切换。这个过程涉及到保存当前进程的上下文信息,包括CPU寄存器、程序计数器、栈指针等,然后恢复调度执行下一个进程所需的上下文信息。

CPU与外设设备数据传输方式:

程序控制方式:CPU与外设之间的数据传送在程序控制下完成。具体来说,包括无条件传送和条件传送两种方式。在无条件传送中,外设任何时刻均已准备好数据或处于接受数据的状态,程序不检查外设的状态,直接执行输入输出指令。这适用于无需应答联络的场合。在条件传送中,CPU先执行一条输入指令,从外设的状态端口读取它的当前状态,如果外设未准备好数据或处于忙碌状态,则程序转回反复执行读状态指令,不断检查外设状态;如果外设已准备好数据,CPU便执行输入指令,从外设输入数据。

中断方式:在中断服务程序中,用输入输出指令在CPU与外设间进行一次数据交换。等输入或输出操作完成后,CPU又回去执行原来的程序。这种方式适用于实时系统以及多个外设的系统中,可以提高CPU的效率和使系统具有实时性能。

DMA方式:这是一种直接存储器传输方式,外设不经过CPU直接与内存进行数据传递。这适用于高速设备或者频繁需要与内存进行数据交流的外设。通过开辟直接的数据交换通道,DMA方式避免了等待和多重中断的问题,提高了数据传输的效率。

阻塞和非阻塞:

阻塞:当前线程会在结果返回之前被挂起,只有在得到结果之后才会返回。这种情况下,如果资源或结果暂时不可用,线程可能会浪费大量时间等待。

非阻塞: 如果资源或结果暂时不可用,线程可以继续执行其他任务,或者选择定期轮询以查看状态。这种方式的优点是它可以提高系统的并发性能,但同时也会增加CPU资源的消耗。

阻塞和非阻塞的区别在于:在阻塞情况下,线程会等待直到资源或结果可用;在非阻塞情况下,线程可以在等待资源或结果时继续执行其他任务。

2、介绍几种IO模型

同步阻塞IO模型

同步阻塞IO模型中,线程在进行了系统调用之后,由于数据还没有准备好,此后一直处于内核态,直到数据准备完成并且从内核的缓冲区中拷贝到用户态的数据区中,系统才从内核态切换成用户态,才能继续执行下面处理数据的操作

同步非阻塞IO模型

用户线程发起I/O系统调用后,内核立即返回给用户一个状态值,用户空间无需等待内核的IO操作彻底完成,可以立即返回给用户空间执行用户的操作,处于非阻塞的状态。

非阻塞IO要求Socket被设置为NONBLOCK。需要注意的是,NIO(同步非阻塞IO)模型并非Java的NIO(New IO)库。

这种模型的缺点是当数据准备好之后,内核拷贝数据到内存的过程中对于进程来说其实还是阻塞的。

同步多路复用IO模型

是使用单个进程/线程来同时处理多个I/O请求。一个进程/线程可以监视多个文件句柄(网络连接、磁盘文件等),一旦某个文件句柄就绪(即数据准备就绪),它就能够通知应用程序进行相应的读写操作。在没有文件句柄就绪时,应用程序会被阻塞并交出CPU,以便其他进程或线程有机会执行。

异步非阻塞IO模型

允许应用程序发起I/O操作后立即返回,不需要等待I/O操作完成。当I/O操作完成时,应用程序会得到通知。这种模型通常用于处理大量并发I/O请求的情况,可以提高系统吞吐量和并发性。特点

  • 异步性:应用程序发起I/O操作后无需等待,可以继续执行其他任务。当I/O操作完成后,应用程序会收到通知。
  • 非阻塞性:应用程序在发起I/O操作后可以立即返回,不需要等待I/O操作完成。这样可以避免线程阻塞,提高系统并发性。
  • 事件驱动:异步非阻塞IO模型通常采用事件驱动的方式进行处理。当某个I/O事件发生时,系统会通知应用程序进行处理

信号驱动IO模型

基于信号机制。在这种模型中,应用程序预先告知内核,当某个描述符上发生某事时,内核使用信号通知进程。具体来说,当用户态程序向内核发起一个系统调用时,它会注册一个信号处理函数,并告诉内核在某个条件满足时发送一个信号。当这个条件满足时,内核会向用户态程序发送一个信号,用户态程序收到信号后,会调用相应的函数来处理数据。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表