`
bigBan
  • 浏览: 6695 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

内核同步方法(一)--原子操作

 
阅读更多

简介:

现代操作系统中,同一时间可能有多个内核执行流在执行,因此内核需要一些同步机制来同步对共享数据的访问。而且在对称多处理器系统(SMP)上,也需要同样的机制。多个执行线程同时访问和操作数据,就有可能出现共享数据被覆盖的情况,这是一种很难察觉的危险的情况。

原子操作可以保证指令以原子的方式执行,执行期间不会被打断。本人的理解是原子操作就是保证变量的读取-写入-回写这个过程原子的完成,不能够被打断,否则就有可能出现数据被覆盖的情况。linux内核提供了两组原子操作接口,分别是整数操作和单独的位操作。大多数体系结构会提供支持原子操作的简单指令。也就是把整个操作放到了一个指令中去执行,不会被中断打断(cpu在每条指令结束时候进行中断检测)。

原子整数操作:

针对整数的原子操作采用了一个特殊的数据类型,只能对atomic_t类型的数据进行处理。这里引入了一个新的数据类型,而不是使用c语言中的int直接定义一个整型变量。这样做让原子操作之接受atomic_t类型的数据,使之特殊化。这一结构的定义在<linux/types.h>中。

atomic_t结构:

typedef struct {
		volatile int counter;
	}atomic_t
原子操作的函数声明在<asm/atomic.h>中

ATOMIC_INIT(atomic_t *v,int i) 在声明一个atomic_t变量时候,将他初始化为i

int atomic_read(atomic_t *v); 读取原子变量

void atomic_set(atomic *v,int i); 设置原子变量

void atomic_add(int i,atomic *v); 原子变量之+i

void atomic_inc(atomic *v); 原子变量自加操作

void atomic_dec(atomic *v); 原子变量自减操作

int atomic_sub_and_test(int i,atomic_t *v); 原子变量-i,并判断是否为0

int atomic_add_negative(int i,atomic_t *v); 原子变量+i,并判断是否为负

int atomic_add_return(int i,atomic_t *v); 原子变量+i,并返回

int atomic_sub_return(int i,atomic_t *v); 原子变量-i,并返回

int atomic_inc_return(atomic_t *v); 原子变量自加并返回

int atomic_dec_return(atomic_t * v); 原子变量自减并返回




版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    Linux内核同步机制

    内核很容易产生竞争条件。同一时间可能有多个内核执行流在执行,内核的许多特性都要求能够并发地访问共享数据,这就要求有同步机制来同步各执行单元对共享数据的访问以保证不出现竞争条件

    linux操作系统内核技术-uestc课件

     7掌握内核同步原理和方法:原子操作,自旋锁,(读—写)信号量,完成变量,bkl,seqlock和延迟内核抢占。了解指令“路障”。(4小时)  8介绍系统时钟和硬件定时器,单处理器和多处理器上的linux计时体系结构,...

    Linux2.6内核标准教程(共计8-- 第1个)

    第8章 内核同步机制 312 8.1 同步基本原理 313 8.1.1 原子变量 313 8.1.2 中断禁用 315 8.1.3 内核态抢占 316 8.2 系统引导过程分析 318 8.2.1 普通自旋锁 318 8.2.2 读写自旋锁 325 8.2.3 顺序...

    Linux2.6内核标准教程(共计8--第6个)

    第8章 内核同步机制 312 8.1 同步基本原理 313 8.1.1 原子变量 313 8.1.2 中断禁用 315 8.1.3 内核态抢占 316 8.2 系统引导过程分析 318 8.2.1 普通自旋锁 318 8.2.2 读写自旋锁 325 8.2.3 顺序...

    Linux2.6内核标准教程(共计8--第8个)

    第8章 内核同步机制 312 8.1 同步基本原理 313 8.1.1 原子变量 313 8.1.2 中断禁用 315 8.1.3 内核态抢占 316 8.2 系统引导过程分析 318 8.2.1 普通自旋锁 318 8.2.2 读写自旋锁 325 8.2.3 顺序...

    Linux2.6内核标准教程(共计8--第3个)

    第8章 内核同步机制 312 8.1 同步基本原理 313 8.1.1 原子变量 313 8.1.2 中断禁用 315 8.1.3 内核态抢占 316 8.2 系统引导过程分析 318 8.2.1 普通自旋锁 318 8.2.2 读写自旋锁 325 8.2.3 顺序...

    Linux2.6内核标准教程(共计8--第7个)

    第8章 内核同步机制 312 8.1 同步基本原理 313 8.1.1 原子变量 313 8.1.2 中断禁用 315 8.1.3 内核态抢占 316 8.2 系统引导过程分析 318 8.2.1 普通自旋锁 318 8.2.2 读写自旋锁 325 8.2.3 顺序...

    Linux内核的同步机制

    一、引言 在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问。尤其是在多处理器系统上,更需要一些同步机制来同步...

    Linux2.6内核标准教程(共计8--第4个)

    第8章 内核同步机制 312 8.1 同步基本原理 313 8.1.1 原子变量 313 8.1.2 中断禁用 315 8.1.3 内核态抢占 316 8.2 系统引导过程分析 318 8.2.1 普通自旋锁 318 8.2.2 读写自旋锁 325 8.2.3 顺序...

    Linux2.6内核标准教程(共计8--第2个)

    第8章 内核同步机制 312 8.1 同步基本原理 313 8.1.1 原子变量 313 8.1.2 中断禁用 315 8.1.3 内核态抢占 316 8.2 系统引导过程分析 318 8.2.1 普通自旋锁 318 8.2.2 读写自旋锁 325 8.2.3 顺序...

    Linux2.6内核标准教程(共计8--第5个)

    第8章 内核同步机制 312 8.1 同步基本原理 313 8.1.1 原子变量 313 8.1.2 中断禁用 315 8.1.3 内核态抢占 316 8.2 系统引导过程分析 318 8.2.1 普通自旋锁 318 8.2.2 读写自旋锁 325 8.2.3 顺序...

    疯狂内核之——进程管理子系统

    目录 1 进程的组织 5 1.1 进程相关数据结构 5 1.1.1 进程的基本信息 6 1.1.2 进程状态 10 1.1.3 TASK_RUNNING状态的进程链表 11 1.1.4 进程间关系 12 1.2 Linux的线程——轻量级进程 ...4.12 内核同步与互斥的总结 233

    深入分析Linux内核源码

    4.8 内核同步 4.8.1信号量 4.8.2原子操作 4.8.3 自旋锁、读写自旋锁和大读者自旋锁 4.9 本章小节 第五章进程调度 5.1 Linux时间系统 5.1.1 时钟硬件 5.1.2 时钟运作机制 5.1.3 Linux时间基准 5.1.4 ...

    Linux内核源码深度解析与开发实战视频.zip

    13:内核同步_rec 14:第一份作业.txt 15:第一周答疑视频_rec 16:不可睡眠锁:自旋锁spinlock编码示例_rec 17:不可睡眠锁:RCUread-copy-update_rec 18:可睡眠锁-互斥量mutex_rec 19:可睡眠锁:信号量semaphore...

    Java Unsafe类的使用.docx

    synchronize关键字修饰的代码块被加了独占锁,相同时间只能有一个线程访问其中的内容,在高并发下这必然会导致大量线程挂起,从用户态转为内核态,带来很大的消耗而且操作效率低下。CAS算法的出现使得在不使用...

    代码客:G-TcpServer(IOCP) 1.0 正式版及Demo源码

    HndData回收有多种方法,但额外会在收发数据这两个频率操作上增加工作量,因此尽量避免在这两个操作时做太多的工作是有必要的。模块均不采用“投递计数”或“投递链表”的方式来判断回收HndData的时机,而是一旦...

    代码客:Iocp Tcp Server(G-TcpServer) 1.0 Demo源码

    HndData回收有多种方法,但额外会在收发数据这两个频率操作上增加工作量,因此尽量避免在这两个操作时做太多的工作是有必要的。模块均不采用“投递计数”或“投递链表”的方式来判断回收HndData的时机,而是一旦...

    C#线程锁介绍源码

    互锁操作是原子的,即整个操作是不能由相 同变量上的另一个互锁操作所中断的单元。这在抢先多线程操作系统中是很重要的,在这样的操作系统中,线程可以在从某个内存地址加载值之后但是在有机会更改 和存储该值之前被...

    清华大学Linux操作系统原理与应用

    7.2 内核同步方法 153 7.2.1 原子操作 153 7.2.2 自旋锁 155 7.2.3 信号量 156 7.3 并发控制实例 157 7.3.1 内核任务及其并发关系 158 7.3.2 实现机制 158 7.3.3 关键代码解释 162 7.3.4 实现步骤 163 习题7 164 第8...

Global site tag (gtag.js) - Google Analytics