博客
关于我
【Linux】posix版本的信号量
阅读量:502 次
发布时间:2019-03-07

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

信号量及其应用

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

信号量的组成

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

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

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

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

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

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

    资源竞争与信号量管理

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

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

    生产者与消费者模型

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

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

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

    转载地址:http://kiacz.baihongyu.com/

    你可能感兴趣的文章
    Netty工作笔记0014---Buffer类型化和只读
    查看>>
    Netty工作笔记0015---MappedByteBuffer使用
    查看>>
    Netty工作笔记0020---Selectionkey在NIO体系
    查看>>
    Netty工作笔记0022---NIO快速入门--编写客户端
    查看>>
    Vue踩坑笔记 - 关于vue静态资源引入的问题
    查看>>
    Netty工作笔记0024---SelectionKey API
    查看>>
    Netty工作笔记0025---SocketChannel API
    查看>>
    Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
    查看>>
    Netty工作笔记0028---NIO 网络编程应用--群聊系统3--客户端编写1
    查看>>
    Netty工作笔记0034---Netty架构设计--线程模型
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0057---Netty群聊系统服务端
    查看>>
    Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
    查看>>
    Netty工作笔记0063---WebSocket长连接开发2
    查看>>
    Netty工作笔记0068---Protobuf机制简述
    查看>>
    Netty工作笔记0070---Protobuf使用案例Codec使用
    查看>>
    Netty工作笔记0072---Protobuf内容小结
    查看>>
    Netty工作笔记0074---handler链调用机制实例1
    查看>>
    Netty工作笔记0077---handler链调用机制实例4
    查看>>
    Netty工作笔记0081---编解码器和处理器链梳理
    查看>>