[LINUX]linux进程调度与中断处理

linux进程调度与中断处理:
简单起见,只先看单核cpu的场景。

  • ①在linux内核中,每一个进程都有对应的进程上下文数据结构,其中存储了本进程相关的属性信息、运行时的状态信息以及对应的u区表、用户栈、内核栈等等一切和进程运行有关的所有的信息。类似于进程的身份证一样。其中最最主要的数据字段是:进程状态,分为用户态运行中、内核态运行中、睡眠状态,和就绪状态,前两个看名字就理解了,睡眠状态表示进程处于休眠态,不进入进程调度队列,当且仅当某个条件满足之后,才会被唤醒,唤醒后也不是立即执行而是进入就绪状态,意思是已经做好所有被调度的准备,会进入调度队列中。所
    以,进程的调度是有专门的调度程序来实现的,里面会根据优先级等调度策略实现进程的分时调度功能(linux实际上核心功能就是多进程分时调度的系统);
  • ②对于单cpu,内核同一个时间点只会运行一个进程,可能是在用户态,也可能是在内核态,但有且仅有一个在运行,这有一个非常大的好处,即可以防止并发导致的条件竞争问题,当进程运行计时器到点了,或者由于一些IO操作、wait其他进程操作等进入睡眠状态,则内核会进行进程的上下文切换,去调度另一个进程来执行,前者(计时器满了),只可能发生在用户态,后者,进入睡眠则只可能发生在内核态,原因是为了避免全局数据在切换过程中发生异常,内核态的操作被设计成“原子操作”,即如果一个进程运行在内核态,那么无法被进程切换,即便其执行时间计数器已经到了,这样做的好处是可以很好的保持一些全局数据的一致性,避免由于进程的来回切换导致数据被不符合预期的破坏掉;
  • ③进程之间的同步:进程之间虽然没有条件竞争(同一时间只有一个进程执行),但是仍然可能有同步的需求,即可能进程1运行到某个I/O后进入睡眠,这个时候其实我们并不期望进程2运行,我们可能希望进程2等进程1的I/O完毕后再运行。这种需要同步的场景,仍然需要用到条件变量(即类似锁的概念),当某个条件没有满足时进入睡眠,不占用cpu资源,直到这个条件被满足才唤醒。cpu硬件提供的这种睡眠、唤醒的机制,很大程度上提升了程序的可能性,系统的吞吐量大大提升(如果没有这种机制,可能就会需要轮询的去检查某个变量了,占用cpu时间、占用进程上下文切换等消耗)。④中断处理程序:内核还有一些中断机制,来处理一些“临时紧急任务”,中断本质上就是突然来了一个高优先级的任务,这个时候临时的停止手头工作,先到预设的中断处理程序进行处理,处理完毕后再返回,之所以称之为中断,而不是任务抢占,是因为中断是硬件提供的一种机制(提供临时停止+保留当前现场+恢复之前的执行的功能),但本质上就是高优先级的任务抢占。需要注意的是中断本身并不导致进程的切换,最多是执行态的切换,例如一个系统调用,我们可以触发一个软中断,类似于一个更高优先级的任务,内核处理该中断的处理函数就是system_call,从而实现了从用户态到内核态的切换。中断执行过程其实类似于切换进程的过程,如果不是程序员手动触发的中断,比如系统调用,其他的中断很有可能导致之前的进程上下文中的一些数据被中断处理程序访问到,或者被修改,导致数据一致性问题,这个时候,提供的是临界区提权的方案,即当进入到某些临界区的时候,会将进程的执行优先级提升,以屏蔽中断(中断由于优先级不比当前进程高,会在队列中等待)当退出临界区的时候,恢复原来的优先级,中断处理再执行。但是这个过程实际上会造成中断处理的延迟(中断其实非常多的),会影响系统的吞吐量,所以临界区要尽量的最小化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值