信号量概念
信号量(Semaphore)是操作系统中最典型的用于同步和互斥的手段,信号量的值可以是0、1或者n。
①如果信号量S的值大于零,该进程继续执行。P(S)
②如果S的值为零,将该进程置为等待状态,排入信号量的等待队列,直到V操作唤醒之。V(S)
相关函数
1.定义信号量
2.初始化信号量
该函数初始化信号量,并设置信号量sem的值为val。
3.获得信号量
该函数用于获得信号量sem,它会导致睡眠,因此不能在中断上下文中使用。
该函数功能与down类似,不同之处为,因为down ()进入睡眠状态的进程不能被信号打断,但因为down_interruptible ()进入睡眠状态的进程能被信号打断,信号也会导致该函数返回,这时候函数的返回值非0。
该函数尝试获得信号量sem,如果能够立刻获得,它就获得该信号量并返回0,否则,返回非o值。它不会导致调用者睡眠,可以在中断上下文中使用。
在使用down_interruptible ()获取信号量时,对返回值一般会进行检查,如果非0,通常立即返回-ERESTARTSYs,如:
4.释放信号量
信号量作为一种可能的互斥手段,可以用于保护临界区,它的使用方法和自旋锁类似。与自旋锁相同,只有得到信号量的进程才能执行临界区代码。但是,与自旋锁不同的是,当获取不到信号量时,进程不会原地打转而是进入休眠等待状态。
用作互斥时,信号量的使用方式:
信号量也可以用于同步,一个进程A执行down ()等待信号量,另外一个进程B执行up ()释放信号量,这样进程A就同步地等待了进程B。其过程类似: