Linux 中断、抢占、锁之间的关系

抢占(preempt)

现代操作系统为了提高资源的利用率一般都支持多任务(这里不想纠结进程、线程、内核线 程之间的关系所以使用任务一词),但是因为系统资源有限,系统中同一时间点能够运行的 任务是有限的(单核的话只有一个,多核可能有多个)。为了解决这个冲突,操作系统不得 不在任务之间不断的切换,让一些任务运行一段时间之后睡眠,然后从原来处于睡眠状态的 任务中选出一些来继续运行。这种从一个运行的任务切换到另一个运行的任务的行为叫做任 务切换,而任务切换是通过调度来完成的。

调度又分为两种调度:抢占式的调度和非抢占式的调度。在非抢占式的调度中,任务之间通 过协调来决定哪一个任务将会在下一刻运行,而在抢占式的调度中这一决策由调度器来完成 。调度器这种暂时停止一个任务的运行从而让另一个任务运行的行为就称为抢占。Linux 使 用的就是抢占式调度。

抢占一般又分为用户抢占和内核抢占。用户抢占:是指的内核在返回用户空间时做出的抢占 决定,它可能发生在一下两种情况下:

  • 内核从一个系统调用中返回用户空间(也就是说一个进程调用了一个系统调用从而陷入内 核空间,当内核完成了这个系统调用之后返回用户空间)。

  • 内核从一个中断处理器中返回用户空间(也就是说一个进程在正常执行中内核收到中断信 号转而执行中断处理器,中断处理器完成任务之后返回用户空间继续原来的进程执行)

内核抢占:是指在内核代码的执行过程中发生的抢占。通常在执行内核代码时必须等待内核 代码执行完成之后才能进行下一次调度(也就是上面的用户抢占的两种情况),也就是

你可能感兴趣的:(操作系统,linux,运维,服务器)