Chinaunix首页 | 论坛 | 博客
  • 博客访问: 133759
  • 博文数量: 85
  • 博客积分: 3980
  • 博客等级: 中校
  • 技术积分: 1000
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-08 06:42
文章分类

全部博文(85)

文章存档

2010年(1)

2009年(84)

我的朋友

分类: LINUX

2009-07-14 06:34:51

-----------------------------------------------------------------------------------------------------------------
1.--->ymons 在 Linux内核技术论坛发贴问:
set_current_state和__set_current_state的区别?

#define __set_current_state(state_value) \
do { current->state = (state_value); } while (0)

#define set_current_state(state_value) \
set_mb(current->state, (state_value))

#define set_mb(var, value) do { var = value; mb(); } while (0)
#define mb() __asm__ __volatile__ ("" : : : "memory")

在linux的源代码中经常有这种设置当前进程状态的代码,但我搞不清楚这两种用法的不同?有哪位大虾指点一二,必将感谢不尽!
------------------

2.wheelz发帖指出:
#define __set_task_state(tsk, state_value) \
do { (tsk)->state = (state_value); } while (0)

#define set_task_state(tsk, state_value) \
set_mb((tsk)->state, (state_value))

set_task_state()带有一个memory barrier,__set_task_state()则没有,当状态state是RUNNING时,因为scheduler可能访问这个state,因 此此时要变成其他状态(如INTERRUPTIBLE),就要用set_task_state()而当state不是RUNNING时,因为没有其他人会 访问这个state,因此可以用__set_task_state()反正用set_task_state()肯定是安全的,但 __set_task_state()可能会快些。

自己分析:
wheelz讲解很清楚,尤其是指出了__set_task_state()速度会快于set_task_state()。这一点,很多贴子忽略了,这里有独到之处。在此,作者专门强调之。

3.自己分析:
1)set_mb(),mb(),barrier()函数追踪到底,就是__asm__ __volatile__("":::"memory"),而这行代码就是内存屏障。
2)__asm__用于指示编译器在此插入汇编语句
3)__volatile__用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。即:原原本本按原来的样子处理这这里的汇编。
4)memory强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数据将 作废。cpu将不得不在需要的时候重新读取内存中的数据。这就阻止了cpu又将registers,cache中的数据用于去优化指令,而避免去访问内 存。
5)"":::表示这是个空指令。barrier()不用在此插入一条串行化汇编指令。在后文将讨论什么叫串行化指令。
6)__asm__,__volatile__,memory在前面已经解释
7)lock前缀表示将后面这句汇编语句:"addl $0,0(%%esp)"作为cpu的一个内存屏障。
8)addl $0,0(%%esp)表示将数值0加到esp寄存器中,而该寄存器指向栈顶的内存单元。加上一个0,esp寄存器的数值依然不变。即这是一条无用的汇编 指令。在此利用这条无价值的汇编指令来配合lock指令,在__asm__,__volatile__,memory的作用下,用作cpu的内存屏障。
9)set_current_state()和__set_current_state()区别就不难看出。
10)至于barrier()就很易懂了。

from:
lm_tom的技术人生
阅读(626) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~