1. 信号量概述
System V信号量又被称为System V信号量集,信号量的作用和消息队列不太一样,消息队列的作用是进程之间传递消息。而信号量的作用是为了同步多个进程的操作。
一般来说,信号量和某种预先定义的资源相关联的。信号量元素的值,表示与之关联的资源个数。内核会负责维护信号量的值,并确保其值不小于0。
使用最广泛的信号量是二值信号量。对于这种信号量而言,它只有两种合法值:0和1,对应一个可用的资源。若当前有资源可用,则与之对应的二值信号量的值为1;若资源已经被占用,则与之对应的二值信号量的值为0.当前进程申请资源时,如果当前信号量的值为0,那么进程会陷入阻塞,直到有其他进程释放资源,将信号量的值加1才能被唤醒。
从这个角度看,二值信号量和互斥量所起的作用非常类似。那信号量和互斥量有何不同之处呢?
互斥量是用来保护临界区的,所谓临界区,是指同一时间只能容忍一个进程的进入。而信号量是用来管理资源的,资源的个数不一定是1,可能同时存在多个一模一样的资源,因此容忍多个进程同时使用资源。
更重要的区别是,互斥量和信号量解决的问题是不同的,互斥量的关键在于互斥、排他,同一时间只允许一个线程访问临界区。这种严格的互斥,决定了解铃还须系铃人,即加锁进程必然也是解锁进程
而信号量的关键在于资源的多少和有无。申请资源的进程不一定要释放资源,信号量同样可以用于生产者-消费者的场景。在这种场景下,生产者进程只负责增加信号量的值,而消费者进程只负责减少信号的值。彼此之间通过信号的值