操作系统原语到底是用什么方法保证“不被中断”的?

nj_wy 2014-04-22 03:36:58
百度对“原语”的解释如下:

原语 操作系统用语范畴。是由若干条指令组成的,用于完成一定功能的一个过程。primitive or atomic action 是由若干个机器指令构成的完成某种特定功能的一段程序,具有不可分割性·即原语的执行必须是连续的,在执行过程中不允许被中断。

既然“在执行过程中不允许被中断”,请问操作系统到底是用什么方法保证其不被中断的?

比如,P操作和V操作:

procedure p(var s:samephore);
{
s.value=s.value-1;
if (s.value<0) asleep(s.queue);
}
procedure v(var s:samephore);
{
s.value=s.value+1;
if (s.value<=0) wakeup(s.queue);
}

操作系统用什么方法保证
s.value=s.value-1;
if (s.value<0) asleep(s.queue);
这两条语句被连贯执行而不被中断?
...全文
759 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
操作系统给你提供了用于实现pv操作的系统调用(例如信号量),不需要自己去实现,直接用这些系统调用就行了,这些系统调用会保证你的操作是原子的。
nj_wy 2015-02-22
  • 打赏
  • 举报
回复
引用 1 楼 my_live_123 的回复:
方法很多,常用的是自选锁,又称原地循环等待;另外是读写LOCK汇编指令——即保证每次读写过程一次性完成而不被中断。其实目前读写指令都是原子的!在linux下 raw_spin_lock_irqsave()即是喽。关中断以及上锁,对应 raw_spin_unlock_irqrestore

 53 void down(struct semaphore *sem)
 54 {
 55         unsigned long flags;
 56 
 57         raw_spin_lock_irqsave(&sem->lock, flags);
 58         if (likely(sem->count > 0))
 59                 sem->count--;
 60         else
 61                 __down(sem);
 62         raw_spin_unlock_irqrestore(&sem->lock, flags);
 63 }

178 void up(struct semaphore *sem)
179 {
180         unsigned long flags;
181 
182         raw_spin_lock_irqsave(&sem->lock, flags);
183         if (likely(list_empty(&sem->wait_list)))
184                 sem->count++;
185         else
186                 __up(sem);
187         raw_spin_unlock_irqrestore(&sem->lock, flags);
188 }
raw_spin是如何保证原子性的???通过什么物理上的方法吗?
一根烂笔头 2014-04-23
  • 打赏
  • 举报
回复
方法很多,常用的是自选锁,又称原地循环等待;另外是读写LOCK汇编指令——即保证每次读写过程一次性完成而不被中断。其实目前读写指令都是原子的!在linux下 raw_spin_lock_irqsave()即是喽。关中断以及上锁,对应 raw_spin_unlock_irqrestore

 53 void down(struct semaphore *sem)
 54 {
 55         unsigned long flags;
 56 
 57         raw_spin_lock_irqsave(&sem->lock, flags);
 58         if (likely(sem->count > 0))
 59                 sem->count--;
 60         else
 61                 __down(sem);
 62         raw_spin_unlock_irqrestore(&sem->lock, flags);
 63 }

178 void up(struct semaphore *sem)
179 {
180         unsigned long flags;
181 
182         raw_spin_lock_irqsave(&sem->lock, flags);
183         if (likely(list_empty(&sem->wait_list)))
184                 sem->count++;
185         else
186                 __up(sem);
187         raw_spin_unlock_irqrestore(&sem->lock, flags);
188 }

4,436

社区成员

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

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