中断和阻塞的关系区别

转载仅供自己记录和学习
原文链接:https://blog.csdn.net/zhghost/article/details/109019955

一、中断

一般而言,由硬件产生的信号需要cpu立马做出回应(不然数据可能就丢失),所以它的优先级很高。cpu理应中断掉正在执行的程序,去做出响应;当cpu完成对硬件的响应后,再重新执行用户程序。

中断的过程如下图,和函数调用差不多。只不过函数调用是事先定好位置,而中断的位置由“信号”决定。
在这里插入图片描述

对于网络数据而言,网卡接收到的数据,会把数据写入到内存中。然后,网卡向cpu发出一个中断信号,操作系统便能得知有新数据到来,再通过网卡中断程序去处理数据。

二、进程阻塞

阻塞是进程调度的关键一环,指的是进程在等待某事件(如接收到网络数据)发生之前的等待状态,recv、select和epoll都是阻塞方法。

对于阻塞来说,是不占用CPU资源的。下面我们看下“进程阻塞为什么不占用cpu资源?”

操作系统为了支持多任务,实现了进程调度的功能,会把进程分为“运行”和“等待”等几种状态。

1.运行状态是进程获得cpu使用权,正在执行代码的状态;
2.等待状态是阻塞状态,比如上述程序运行到recv时,
程序会从运行状态变为等待状态,接收到数据后又变回运行状态。
操作系统会分时执行各个运行状态的进程,由于速度很快,看上去就像是同时执行多个任务。下面演示了这个运行和阻塞的调度情况。
在这里插入图片描述
第一步:当进程A执行到创建socket的语句时,操作系统会创建一个由文件系统管理的socket对象(如下图)。这个socket对象包含了发送缓冲区、接收缓冲区、等待队列等成员。

等待队列是个非常重要的结构,它指向所有需要等待该socket事件的进程。

在这里插入图片描述
第二步:当程序执行到recv时,操作系统会将进程A从工作队列移动到该socket的等待队列中(如下图)。

由于工作队列只剩下了进程B和C,依据进程调度,cpu会轮流执行这两个进程的程序,不会执行进程A的程序。

所以进程A被阻塞,不会往下执行代码,也不会占用cpu资源。
在这里插入图片描述

备注:操作系统添加等待队列只是添加了对这个“等待中”进程的引用,以便在接收到数据时获取进程对象、将其唤醒,而非直接将进程管理纳入自己之下。

第三步:内核接收数据
在这里插入图片描述

进程在recv阻塞期间,计算机收到了对端传送的数据(步骤①)。数据经由网卡传送到内存(步骤②),然后网卡通过中断信号通知cpu有数据到达,cpu执行中断程序(步骤③)。此处的中断程序主要有两项功能,先将网络数据写入到对应socket的接收缓冲区里面(步骤④),再唤醒进程A(步骤⑤),重新将进程A放入工作队列中。

第四步:唤醒进程

当socket接收到数据后,操作系统将该socket等待队列上的进程重新放回到工作队列,该进程变成运行状态,继续执行代码。也由于socket的接收缓冲区已经有了数据,recv可以返回接收到的数据。
在这里插入图片描述

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 FreeRTOS 中,中断优先级和任务优先级是两个独立的概念。 中断优先级用于确定不同中断之间的优先级关系。通常,芯片的中断控制器会提供多个中断通道,每个中断通道都有一个可配置的优先级。当多个中断同时发生时,具有更高优先级的中断会被优先处理。 任务优先级用于确定不同任务之间的调度顺序。FreeRTOS 使用优先级抢占调度算法,具有更高优先级的任务将抢占正在运行的低优先级任务,以确保高优先级任务能够及时执行。 在 FreeRTOS 中,任务优先级的范围通常是从 0 到 configMAX_PRIORITIES-1,其中 configMAX_PRIORITIES 是 FreeRTOS 配置文件中定义的最大任务优先级数。而中断优先级的范围则取决于芯片和中断控制器的具体实现。 当一个任务和一个中断同时发生时,如果中断的优先级高于或等于任务的优先级,则中断会打断任务的执行,并立即执行中断服务程序。当中断服务程序完成后,系统会根据任务的优先级重新进行调度。 需要注意的是,中断服务程序(ISR)应该尽量保持简短,并尽可能避免在 ISR 中进行阻塞操作或长时间的计算。这是因为在 ISR 中,任务调度器是被禁止的,而且其他中断也无法打断当前的中断服务程序。因此,长时间的 ISR 可能会导致系统响应性能下降。 总结来说,中断优先级用于确定中断之间的优先级关系,而任务优先级用于确定任务之间的调度顺序。在设计和使用 FreeRTOS 系统时,合理配置中断和任务的优先级是至关重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值