Linux内核同步和异步使用(速览)

介绍

kernel有很多的同步和异步机制,做简单整理,力求能够熟练使用。

1.同步机制

  • 并发:多个执行单元同时被执行
  • 竞态:并发的执行单元对共享资源(硬件资源和软件上的全局变量等)的访问导致竞争状态。
    并发与竞态。

假设有2个进程试图同时向一个设备的相同位置写入数据,就会造成数据混乱。处理并发常用的技术:加锁或者互斥,即确保在任何时间只有一个执行单元可以操作共享资源。在Linux内核中主要通过semaphore机制和spin_lock机制实现。

1.1 信号量

Linux内核信号量在概念和原理上与用户信号量一样的,但是它不能在内核之外使用,它是一种睡眠锁.

如果有一个任务想要获得已经被占用的信号量时,信号量会将这个进程放入一个等待队列,然后让其睡眠当持有信号量的进程将其释放后,处与等待队列中任务被唤醒,并让其获得信号量。

  • 信号量在创建时需要设置一个初始值,表示允许几个任务同时访问该信号量保护的共享资源。初始值为1就变成互斥锁(Mutex),即同时只能有一个任务可以访问信号量保护的共享资源。
  • 当任务访问完被信号量保护的共享资源后,必须释放信号量。释放信号量通常把信号量的值加1实现,如果释放后信号量的值为非正数,表明有任务任务等待当前信号量,因此要唤醒信号量的任务。

信号量的实现也是与体系结构相关的,定义在中,struct semaphore类型用类表示信号量。

1.定义信号量

你可能感兴趣的:(Linux)