spin_lock自旋锁的时间片轮转

againyuan 2011-03-10 11:32:24
很关键的内核问题

被保护的资源已经持有自旋锁,那么新的内核线程再度访问保护的资源的时候,会自旋等待。
1 那么此内核线程的时间片用完之后,自旋锁是会让出cpu,还是一直自旋等待锁的释放???

2 还有在中断处理程序执行的过程中,中断处理程序是否分配有时间片??? 假如有,内核是处于中断上下文中,中断处理程序让出CPU后又怎么会被再次调度呢????
...全文
364 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
againyuan 2011-03-15
  • 打赏
  • 举报
回复
内核没有时间片轮转。打开内核抢占,内核调度的规则就变了。比如进程上下文,被中断抢占,中断处理之后,若没有打开抢占则返回进程上下文执行,不会去执行高优先级任务;若打开抢占,则会重新调度查看是否有更高优先级任务要是有则限制性高优先级任务。
ashengsheng 2011-03-14
  • 打赏
  • 举报
回复
楼上说的在理啊,好像在《linux的内核设计与实现》中看过这一段话。

在内核态真的没有时间片轮转吗?如果打开了内核抢占了,好像就有内核抢占了吧?还得请问一下楼上的了
againyuan 2011-03-11
  • 打赏
  • 举报
回复
看来时间片的轮转是在用户态,在内核态下面没有时间片轮转。请看下面的解释内核态的抢占:

从中断返回内核空间的时候,内核会检查need_resched和preempt_count的值。如果need_ resched被设置,并且preempt count为0的话,这说明可能有一个更为重要的任务需要执行并且可以安全地抢占,此时,调度程序就会被调用。如果preempt-count不为0,则说明内核现在处干不可抢占状态,不能进行重新调度。这时,就会像通常那样直接从中断返回当前执行进程。如果当前进程持有的所有的锁都被释放了,那么preempt_ count就会重新为0。此时,释放锁的代码会检查need_ resched是否被设置。如果是的话,就会调用调度程序。
againyuan 2011-03-10
  • 打赏
  • 举报
回复
低级的中断(软中断)???
这个是物理中断,调用的底半部才是软中断吧???
时间片中断,不是物理中断吗???
软中断是tasklet,workqueue才对啊,难道是我的概念有偏差?


假如中断处理程序有时间片轮转,是不是在中断处理程序中时间片超时,就丢掉cpu进程被切换了???
无知者无谓 2011-03-10
  • 打赏
  • 举报
回复
时间片用完并不会释放spin_lock,它拥有之后就一直到它主动释放,否则别人只能等待,除非使用别的方式让系统接入进来。
中断的调用和函数调用一个道理,都有一个调用栈。当在处理一个物理中断的时候低级的中断(软中断)是不能打断的,比如时间片中断就是软中断。你把不相关的问题搅在一起想当然想不通了
againyuan 2011-03-10
  • 打赏
  • 举报
回复
自旋锁保持期间是抢占失效的----
这句话是说时间片轮转(任务的切换)还是高优先级任务在时间片未用完时切换低优先级任务???

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧