Username: Password:

原子操作 -- Linux内核中的同步机制
来源: ChinaUnix博客  作者: 发布时间:2008-01-01 11:38:00


                  所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,他的最小的执行单位,不可能有比他更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念。
  原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文档中,他们都使用汇编语言实现,因为C语言并不能实现这样的操作。
  原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的。原子类型定义如下:
typedef struct
{
volatile int counter;
}
atomic_t;
  volatile修饰字段告诉gcc不要对该类型的数据做优化处理,对他的访问都是对内存的访问,而不是对寄存器的访问。
  原子操作API包括:
atomic_read(atomic_t * v);
  该函数对原子类型的变量进行原子读操作,他返回原子类型的变量v的值。
atomic_set(atomic_t * v, int i);
  该函数配置原子类型的变量v的值为i。
void atomic_add(int i, atomic_t *v);
  该函数给原子类型的变量v增加值i。
atomic_sub(int i, atomic_t *v);
  该函数从原子类型的变量v中减去i。
int atomic_sub_and_test(int i, atomic_t *v);
  该函数从原子类型的变量v中减去i,并判断结果是否为0,假如为0,返回真,否则返回假。
void atomic_inc(atomic_t *v);
  该函数对原子类型变量v原子地增加1。
void atomic_dec(atomic_t *v);
  该函数对原子类型的变量v原子地减1。
int atomic_dec_and_test(atomic_t *v);
  该函数对原子类型的变量v原子地减1,并判断结果是否为0,假如为0,返回真,否则返回假。
int atomic_inc_and_test(atomic_t *v);
  该函数对原子类型的变量v原子地增加1,并判断结果是否为0,假如为0,返回真,否则返回假。
int atomic_add_negative(int i, atomic_t *v);
  该函数对原子类型的变量v原子地增加I,并判断结果是否为负数,假如是,返回真,否则返回假。
int atomic_add_return(int i, atomic_t *v);
  该函数对原子类型的变量v原子地增加i,并且返回指向v的指针。
int atomic_sub_return(int i, atomic_t *v);
  该函数从原子类型的变量v中减去i,并且返回指向v的指针。
int atomic_inc_return(atomic_t * v);
  该函数对原子类型的变量v原子地增加1并且返回指向v的指针。
int atomic_dec_return(atomic_t * v);
  该函数对原子类型的变量v原子地减1并且返回指向v的指针。
  原子操作通常用于实现资源的引用计数,在TCP/IP协议栈
的IP碎片处理中,就使用了引用计数,碎片队列结构struct
ipq描述了一个IP碎片,字段refcnt就是引用计数器,他的类型为atomic_t,当创建IP碎片时(在函数ip_frag_create中),
使用atomic_set函数把他配置为1,当引用该IP碎片时,就使用函数atomic_inc把引用计数加1。
  当无需引用
该IP碎片时,就使用函数ipq_put来释放该IP碎片,ipq_put使用函数atomic_dec_and_test把引用计数减1并判断引用计数
是否为0,假如是就释放IP碎片。函数ipq_kill把IP碎片从ipq队列中删除,并把该删除的IP碎片的引用计数减1(通过使用函数
atomic_dec实现)。
               
               
               
               
               

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅