并发与竞态

同步异步的区别:

  1. 同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。

 

  1. 而我们平时经常讨论的同步问题多发生在多线程环境中的数据共享问题。即当多个线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某一特定时刻只能被一个线程所访问,如果使用异步,程序的运行结果将不可预料。因此,在这种情况下,就必须对数据进行同步,即限制只能有一个进程访问资源,其他线程必须等待。

 

  1. 实现同步的机制主要有临界区、互斥、信号量和事件
    临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资 源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
    互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
    信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 。信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
    事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 。

 

内核编程区别于常见应用程序编程的地方在于对并发的处理。(所以在编写程序时,应该铭记:同一时刻,可能会有很多事情在发生)

 

竞态通常是最为对资源的共享访问结果而产生的,没有并发也就不会有竞态。

设计驱动程序是,只要可能,就应该避免资源的共享,比如说尽量避免使用全局变量,全局变量不是共享数据的唯一途径,比如可以通过指针传递给内核的其他部分,也能实现共享。

访问管理的常见技术称为“锁定”或者“互斥”,当信号量用于互斥时,信号量的值应初始化为1,这种信号量在任何给定的时刻只能由单个进程或是线程拥有,在这种模式下,一个信号量有时也称为一个“互斥体(mutex)”,而在Linux内核中几乎所有的信号量均用于互斥。当互斥体的初始状态为锁定状态(信号量变量为0)时,任何线程访问前,必须显示地解锁该互斥体。

示例1

/* now trim to 0 the length of the device if open was write-only */
	if ( (filp->f_flags & O_ACCMODE) == O_WRONLY) {
		if (mutex_lock_interruptible(&dev->mutex))
			return -ERESTARTSYS;
		scullc_trim(dev); /* ignore errors */
		mutex_unlock(&dev->mutex);
	}

从上述代码中分析可知,对mutex_lock_interruptible的返回值进行了检查。如果它返回非零值,说明操作备被中断,在这种情况下通常要做的工作是返回-ERESTARTSYS,在见到这个返回代码后,内核的高层代码要么会从头重新启动该调用,要么会将该错误返回给用户,如果返回-ERESTARTSYS,则必须首先撤销已经做出的任何用户可见的修改,这样,系统调用可正确重试。如果无法撤销这些操作,则应该返回-EINTR

Completion是一种轻量级的机制,它允许一个线程告诉另一个线程某个工作已经完成,还有一种特殊的信号量类型,rwsem(读取者/写入者信号量)。

自旋锁:

大多数的锁定都是通过自旋锁的机制来实现的,自旋锁可在不能休眠的代码中使用,比如中断处理例程。自旋锁必须在可能的最短时间内拥有。

适用于自旋锁的核心规则是:任何拥有自旋锁的代码都必须是原子的,需要分配内存的任何操作会进入休眠,比如kmalloc,如果没有明确告知,它会在等待可用内存时放弃处理器进入休眠。

原子变量:

有时共享的资源可能恰好是一个简单的整数值,完整的锁机制对一个简单的整数来讲显得有些浪费,

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值