linux用户抢占和内核抢占

来源:互联网 发布:c4dr16 mac注册机 编辑:程序博客网 时间:2024/05/16 05:42

一、linux用户抢占

  • linux用户抢占
    • 当内核即将返回用户空间时,内核会检查need_resched是否设置,如果设置,则调用schedule(),此时,发生用户抢占。
    • 内核在thread_info的flags中设置了一个标识来标志进程 是否需要重新调度,即重新调度need_resched标识TIF_NEED_RESCHED。
  • 用户抢占的发生时机—-发生在用户空间的抢占现象。
    • 从系统调用返回用户空间
    • 从中断(异常)处理程序返回用户空间
  • 更加详细的触发条件包括以下几方面(在上面两种发生时机下)
    • 时钟中断处理例程检查当前任务的时间片,当人物的时间片消耗完时,scheduler_tick()函数就会设置need_resched标志。
    • 信号量、等待队列、completion等机制唤醒时
    • 设置用户进程的nice值时,可能会使高优先级的任务进入就绪状态
    • 改变任务的优先级时,可能会使高优先级的任务进入就绪状态
    • 新建一个任务时,可能是或者使高优先级任务进入就绪
    • 对CPU(SMP)进行负载均衡时,当前任务可能需要反那个道另外一个CPU上运行。

二、linux内核抢占

  • 内核抢占的概念
    • 是指一个在内核态运行的进程,可能在执行内核函数期间被另一个进程取代。
  • 内核抢占的时机
    • 当中断处理程序执行完成,且返回内核空间之前。引式的调用schedule()函数,当前任务没有主动放弃CPU,而是被剥夺了CPU使用权。
    • 当内核代码再次具有可抢占性的时候,如解锁及使能软中断(local_bh_enable)等。此时preempt_count变为0。隐式的调用schedule()函数。
    • 内核中的任务显示的调用schedule()主动放弃cpu
    • 内核中的任务发生阻塞,导致会调用schedule()
  • 内核不能抢占的点
    • 内核正在进行中断处理。进程不能抢占中断,中断只能被其他中断抢占或终止,schedule()会进行判断,打印出错误信息
    • 内核正在进行中断上下文的bottom half处理(软中断处理)。软中断只能被中断终止或抢占,同种软中断不能抢占。
    • 内核代码证持有自旋锁、读写锁等锁(原始自旋锁),内核中的这些锁是为了在SMP系统中短时间内保证不同CPU上运行的进程并发执行的正确性。当持有锁时,不能被抢占。
    • 内核正在执行调度程序
    • 内核正在对per_CPU私有数据结构操作。在SMP中,对per_CPU数据结构未使用spinlocks保护,因为这些数据结构隐含地被保护了(不同的CPU有不一样的per_CPU数据,其他CPU上运行的进程不会用到另一个CPU的per-CPU数据)。如果允许抢占,一个进程获取了per-CPU,被抢占后重新调度,有可能调度到其他的CPU上去,这时定义的per-CPU变量就会有问题,应该禁止抢占。
原创粉丝点击