并发:一个CPU在一个时间片只能执行一个任务,切换速度很快。
并行:双核CPU,真正的同时执行两个任务
并行就是并发的理想情况,统称并发。
【问】Linux在什么情况下产生并发?
1.中断中修改公共资源
2.抢占式并发访问:正在执行的进程随时可能被抢占
3.多核处理器并发访问
【问】并发时我们需要怎么做?
保护共享资源
【问】共享资源有什么?
全局变量、驱动设备结构体、共享数据....
【原子操作】 atomic(保护进程)
原子操作是一个最小单位的执行操作,在执行完前不可以被任何操作打断
用于保护一个整型单位或者位。
【原子操作 驱动程序】
static atomic64_t v = ATOMIC_INIT(1); //定义一个原子变量v,初值为1
static int cdev_open(struct inode *inode, struct file *filp)
{
/*****************************************/
file->private_data = &dev1; //指向设备结构体
return 0;
}
static int cdev_open(struct inode *inode, struct file *filp)
{
if( !atomic64_dec_and_test(&v)){ // -1
atomic64_inc(&v); // +1
return -EBUSY; //返回错误
}
file->private_data = &dev1; //指向设备结构体
return 0;
}
分析:
假如A进入驱动函数,v的值为1,v-1为0,v = 返回1,取反等于0,不满足要求,则执行下面的私有数据。
A在使用OPEN函数,此时B进入驱动函数,v的值为0,返回值为0,取反为1,进入if函数,返回EBUSY错误指令。
【APP】
int main(int argc, char *argv[])
{
int fd1;
char buf1[32] = "ni hao test1!";
fd1 = open("/dev/test1", HELLO); /* 打开设备节点1 */
sleep(5); /* 延时5秒,为了实验效果*/
close(fd1);
return 0;
}
生成a.out ,复制一个为b.out
【实验效果】
执行a.out后马上执行b.out返回error,因为a.out中有五秒延时占用程序。
过五秒后执行b.out即执行正常。