【Linux】posix版本的信号量
发布日期:2021-05-10 06:33:38 浏览次数:24 分类:精选文章

本文共 841 字,大约阅读时间需要 2 分钟。

信号量及其应用

信号量(Semaphore)是一种核心原子操作机制,用于管理多个进程或线程对共享资源的访问。在多进程或多线程系统中,当资源有限时,信号量能有效协调并同步各个执行流的访问,避免内容冲突或死锁。

信号量的组成

信号量核心基于一个计数器(Counter)和硬件布局(PCB上的等待队列和接口)。主要包含以下三个部分:

  • 计数器:用于记录当前资源的可用数量。

    • 当执行流成功获取信号量时,计数器减1。
    • 获取失败时,执行流进入等待队列,同时计数器减1。
    • 释放信号量时,计数器加1,并通知等待队列中的执行流。
  • 接口:提供操作信号量的接口。

    • sem_init:初始化信号量,routeParams指定资源共享方式,value指定初始资源数量。
    • sem_wait:执行流等待信号量,减少计数器,若造成负值则阻塞到等待队列。
    • sem_post:执行流释放信号量,增加计数器。
    • sem_destroy:销毁信号量,释放相关资源。
  • 信号量的互斥与同步

    信号量同时支持互斥和同步:

    • 互斥:通过计数器确保只有一个执行流访问资源。 -初始化计数器为1,表示一个资源可用。当执行流获取成功后,计数器变为0,阻止其他执行流立即访问。
    • 同步:不仅限于1的计数,也能支持多个执行流访问。 -执行流先获取信号量,若计数器>0,即可立即访问资源。 -若计数器≤0,则执行流进入等待队列,并待释放后再继续。

    资源竞争与信号量管理

    在资源竞争激烈的环境中,信号量能有效避免资源拥堵:

    • 当一个执行流完成任务后,通过sem_post释放信号量,增加计数器,并通知等待队列中的其他执行流继续使用资源。
    • 允许资源多个执行流同时等待,可以灵活应对资源使用需求波动。

    生产者与消费者模型

    生产者(上图蓝色瓷砖)生成资源,通过信号量通知消费者(上图红色瓷砖)开始消费:

    • 生产者分离空闲信号量,触发消费者的等待。
    • 消费者执行任务后,将信号量释放,进入生产者状态。

    这种模型可扩展到更复杂的生产消费场景,通过信号量实现高效资源调度。

    上一篇:【Linux】读写锁
    下一篇:【Linux】死锁

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月30日 04时45分47秒