视频字幕
信号量是操作系统中用于进程同步和互斥的重要机制。我们可以把它想象成停车场的管理员,手中拿着一个计数器。信号量是一个整数变量,只能通过P和V两种原子操作来访问。当信号量值为正数时,表示可用资源的数量;当为负数时,表示正在等待资源的进程数量。就像停车场管理员的计数器显示剩余车位数一样。
P和V操作是信号量的两个核心操作。P操作用于申请资源,执行时信号量值减1,如果结果小于0则进程被阻塞。V操作用于释放资源,执行时信号量值加1,如果结果小于等于0则唤醒一个等待的进程。这两个操作都具有原子性,不可被中断。让我们通过动画来看看这个过程。
互斥信号量用于解决进程间的互斥访问问题。我们将互斥信号量初始化为1,表示临界区可以被一个进程访问。当进程要进入临界区时,先执行P操作,如果成功则进入临界区,退出时执行V操作。这样可以保证同时只有一个进程能够访问临界区,实现互斥访问。
同步信号量用于控制进程间的执行顺序。与互斥信号量不同,同步信号量初始化为0。生产者进程完成工作后执行V操作,将信号量值加1,表示有工作完成。消费者进程执行P操作等待生产者完成工作,如果信号量值为0则阻塞等待。这样实现了进程间的同步协调。
生产者消费者问题是信号量应用的经典例子。我们需要三个信号量:empty表示空缓冲区数量,full表示满缓冲区数量,mutex保证对缓冲区的互斥访问。生产者先申请空缓冲区和互斥锁,生产后释放互斥锁并增加满缓冲区计数。消费者则相反,先申请满缓冲区和互斥锁,消费后释放互斥锁并增加空缓冲区计数。