信号量
信号量(semaphore)是一种用于提供不同进程之间或者一个给定的不同线程间同步手段的原语。信号量多用于进程间的同步与互斥。
原理
当有进程要求使用共享资源时,需要执行以下操作:
1.系统首先要检测该资源的信号量;
2.若该资源的信号量值大于0,则进程可以使用该资源,此时进程对该信号量执行P操作(wait()) ,将该资源的信号量值减1;
3.若该资源的信号量值为0,表明所有资源都在使用中,则进程进入阻塞状态,直到信号量值大于0时进程被唤醒,访问该资源。阻塞操作将一个进程放到与信号量相关的等待队列中,并且将该进程状态切换成等待状态。
4.当进程释放共享资源时,对该信号量执行V操作(signal()),将信号量值增加1,如果此时有进程处于休眠状态等待此信号量,则等待进程会被唤醒。
5.信号量操作应原子执行。即对同一信号量,没有两个进程可以同时执行操作P操作和V操作。这是一个临界区问题。
分类
Linux提供两种信号量:
(1)内核信号量,由内核控制路径使用;
(2)用户态进程使用的信号量,这种信号量又分为POSIX信号量和SYSTEM V信号量。
POSIX信号量
又分为有名信号量和无名信号量。
- 无名信号量,其值保存在内存中。无名信号量常用于多线程间的同步,同时也用于相关进程间的同步。无名信号量必须是多个进程(线程)的共享变量,无名信号量要保护的变量也必须是多个进程(线程)的共享变量,这两个条件缺一不可。无名信号量的常见用法是将要保护的变量放在sem_wait(P操作)和sem_post(

本文详细介绍了Linux中的信号量机制,包括原理、分类以及POSIX信号量与SYSTEM V信号量的区别。信号量作为进程间同步的重要工具,通过P、V操作实现资源的共享与互斥。Linux提供了内核信号量和用户态信号量,其中用户态信号量又分为有名和无名信号量,各有不同的应用场景和操作方式。
最低0.47元/天 解锁文章
2387

被折叠的 条评论
为什么被折叠?



