Linux 设备驱动中的并发控制
2016-01-27 19:57
447 查看
一)并发与竞争
并发:是指几个进程同时在一个处理机上运行
竞争:是指两个或者以上的进程同时访问同一个资源而产生的。
并发的控制机制:原子变量操作、自旋锁、信号量、完成量。
二)原子变量操作
原子变量操作原理:原子操作,意思是,要么不执行,要执行就要执行完,在执行的过程中不被打断。需要硬件的支持,是架构相关的,类型和操作在 include/asm/atomic.h里定义,是用汇编语音来实现的。
原子变量的定义
typedef struct{
volatile int counter;
} atomic_t;
使用volatile,编译器就不要对该类型进行优化,对该变量的访问只能是基于内存的,不要缓冲到寄存器。通过这样的类型定义的变量,不能直接加1或者减1,而要利用linux的对应的函数
三)自旋锁
原子操作不能满足复杂的内核设计需求,因此有必要提供别的机制,锁就是方式。Linux一般认为有2种锁:自旋锁和信号量。
自旋锁使用:
首先定义: spinlock_t lock;
初始化: spin_lock_init(lock);
锁定:spin_lock(&lock);
临界区
解锁:spin_unlock(&lock);
注意事项:自旋锁是一种忙等待;自旋锁不能递归使用
四)信号量
信号量也是一种锁,有两种信号量:一种用于内核程序中,一种用于应用程序中。
信号量与自旋锁的区别在于:自旋锁是一种循环等待的机制;而信号量发现被锁了,就睡眠,直到被唤醒。这就要求能睡眠的进程才能使用信号量。
信号量是基于自旋锁来实现的
信号量的使用:
定义:semaphore sem;
初始化: init_MUTEX(sem);
锁定:down(&sem)
解锁:up(&sem);
并发:是指几个进程同时在一个处理机上运行
竞争:是指两个或者以上的进程同时访问同一个资源而产生的。
并发的控制机制:原子变量操作、自旋锁、信号量、完成量。
二)原子变量操作
原子变量操作原理:原子操作,意思是,要么不执行,要执行就要执行完,在执行的过程中不被打断。需要硬件的支持,是架构相关的,类型和操作在 include/asm/atomic.h里定义,是用汇编语音来实现的。
原子变量的定义
typedef struct{
volatile int counter;
} atomic_t;
使用volatile,编译器就不要对该类型进行优化,对该变量的访问只能是基于内存的,不要缓冲到寄存器。通过这样的类型定义的变量,不能直接加1或者减1,而要利用linux的对应的函数
三)自旋锁
原子操作不能满足复杂的内核设计需求,因此有必要提供别的机制,锁就是方式。Linux一般认为有2种锁:自旋锁和信号量。
自旋锁使用:
首先定义: spinlock_t lock;
初始化: spin_lock_init(lock);
锁定:spin_lock(&lock);
临界区
解锁:spin_unlock(&lock);
注意事项:自旋锁是一种忙等待;自旋锁不能递归使用
四)信号量
信号量也是一种锁,有两种信号量:一种用于内核程序中,一种用于应用程序中。
信号量与自旋锁的区别在于:自旋锁是一种循环等待的机制;而信号量发现被锁了,就睡眠,直到被唤醒。这就要求能睡眠的进程才能使用信号量。
信号量是基于自旋锁来实现的
信号量的使用:
定义:semaphore sem;
初始化: init_MUTEX(sem);
锁定:down(&sem)
解锁:up(&sem);
相关文章推荐
- Linux命令提示符显示格式的配置
- linux gdb 没有符号表被读取。请使用 "file" 命令。
- 使用Maven打包项目并上传到Linux服务器
- linux 测试端口是否开启
- linux 下vi中关于删除某段,某行,或者全部删除的命令
- 存储系统-Linux磁盘分区管理
- Linux nexus 搭建私服和安装索引
- linux下获取系统内存信息
- ZZ How to Flush Memory Cache on Linux Server
- linux编程之C语言代码执行时间测试方法
- CentOS安装scp命令的软件包openssh-clients
- linux 分区 大于2T 磁盘
- linux下查看日志基本命令
- Linux 进程后台运行的几种方式(screen) - Sean's Notes - SegmentFault
- Workday-Automation_Jenkins_Linux版
- Centos 6.5下以RPM方式安装MySQL5.6.16(详细版)
- centos yum 安装mongo
- 【Linxu学习001】Linux常用命令
- linux能搭建maven仓库
- Linux第三天03