首页 > 其他分享 >几种同步互斥机制的异同

几种同步互斥机制的异同

时间:2023-05-28 12:47:32浏览次数:33  
标签:count Process 同步 异同 lock 信号量 互斥 进程

同步和互斥的区别

同步

某些进程为完成同一任务需要分工协作,由于合作的每一个进程都是独立地以不可预知的速度推进,这就需要相互协作的进程在某些协调点上协 调各自的工作。当合作进程中的一个到达协调点后,在尚未得到其伙伴进程发来的消息或信号之前应阻塞自己,直到其他合作进程发来协调信号或消息后方被唤醒并继续执行。这种协作进程之间相互等待对方消息或信号的协调关系称为进程同步。

例子如下:

process_sync

Process 1Process 2 协作完成任务,该任务分为A、B和C三个部分,其中A和B可以相互独立执行,C依赖B的执行结果;该任务的执行次序如下:

  1. Process 1 Process 2 并发执行子任务 A、B;
  2. Process 1 率先执行完子任务A,由于子任务C,依赖子任务B,所以Process 1 阻塞;
  3. Process 2 完成子任务B,唤醒Process 1 继续执行子任务C;

互斥

有一些共享资源在使用时具有排他性,例如打印机,同一时间内只能被一个进程获得,在该进程使用共享资源时,其他进程只能阻塞,等待该进程释放共享资源,然后从等待进程中唤醒获取该共享资源;

同步机制

互斥实质上可以看作是同步的一个变种,因此同步机制既可以解决同步问题,也可以解决互斥问题;

semaphore(信号量)

struct semaphore {
    // 一般初始化为一个正整数,表示可以被 count 个进程获得;
    // 当初始化为 1 时,认为它是一个互斥的信号量,又称二进制信号量;
    // 当初始化值大于 1 时,认为它是一个计数信号量;
    int count;
    // 当 count 计数等于0时,尝试获取资源的进程都会被添加到此队列中,队列中的进程都处于阻塞状态,等待一个进程释放资源后,从队列头部唤醒进程获取共享资源;
    queueType queue;
}

// 初始化计数
void init(int i) {
    count = i;
}

// 原语,尝试获取资源
void P() {
    count--;
    if (count < 0) {
        // 阻塞此进程,并且将此进程放入等待队列
        process.wait()
        queue.push(process)
    }
}

// 原语,释放资源
void V() {
    count++
    if (count <= 0) {
        // 从等待队列中取出进程,具体取出的是哪一个进程,由操作系统进行调度
        // 唤醒该进程,进程被添加到就绪队列,等待 CPU 执行;
        process = queue.pop()
        process.wakeup()
    }
}

Mutex(互斥体)

mutex 可以等同于 二进制的信号量;

Monitor(管程)

信号量虽然很管用,但是在某些场景下仍然乏力;
例如解决生产者-消费者问题上,信号量机制就较为繁琐;
生产者-消费者问题有三个互斥条件:

  1. 同一时间只有一端能够获得缓冲区资源;
  2. 当缓冲区满时,生产者需要等待缓冲区不满;
  3. 当缓冲区空时,消费者需要等待缓冲区不空;

如果使用信号量就需要在代码中零散地进行三个信号量的 P/V 操作,不利于代码的维护;
管程 实质是对信号量的封装;

struct monitor {
    // 管程锁
    semaphore mutex;
    // 条件变量1
    semaphore condition1;
    // 条件变量2
    semaphore condition2;
}

monitor

使用管程解决生产者消费者问题:

public class BlockedQueue<T> {
    final Lock lock = new ReentrantLock();
    // 条件变量:队列不满
    final Condition notFull = lock.newCondition();
    // 条件变量:队列不空
    final Condition notEmpty = lock.newCondition();

    // 入队
    void enq(T x) {
        lock.lock();
        try {
            while (队列已满) {
                // 等待队列不满,虽然这里使用的是可重入锁,但是也可以使用不可重入锁,在条件变量执行 wait 方法时,需要释放锁;
                notFull.await();
            }
            // add x to queue
            // 入队后,通知可出队
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    // 出队
    void deq() {
        lock.lock();
        try {
            while (队列已空) {
                // 等待队列不空
                notEmpty.await();
            }
            // remove the first element from queue
            // 出队后,通知可入队
            notFull.signal();
        } finally {
            lock.unlock();
        }
    }
}

通过封装生产者和消费者就不需要关心锁的获得和释放,大大简化了代码编写;

标签:count,Process,同步,异同,lock,信号量,互斥,进程
From: https://www.cnblogs.com/ijkzen/p/17438088.html

相关文章

  • 同步程序中调用异步的方法
    我们平时碰到很多,同步的主程序中需要用到一些工具类是异步的,这样主程序还不能加上异步的task等标识,就会报错.而直接调用似乎又等不到返回结果.将调用包装在Task.Run<>(async()=>awaitFunctionAsync());实际winform项目内参考的下边的例子作为备忘publicclassLo......
  • go语言中如何实现同步操作呢
    1.简介本文探讨了并发编程中的同步操作,讲述了为何需要同步以及两种常见的实现方式:sync.Cond和通道。通过比较它们的适用场景,读者可以更好地了解何时选择使用不同的同步方式。本文旨在帮助读者理解同步操作的重要性以及选择合适的同步机制来确保多个协程之间的正确协调和数据共享......
  • go语言中如何实现同步操作呢
    1.简介本文探讨了并发编程中的同步操作,讲述了为何需要同步以及两种常见的实现方式:sync.Cond和通道。通过比较它们的适用场景,读者可以更好地了解何时选择使用不同的同步方式。本文旨在帮助读者理解同步操作的重要性以及选择合适的同步机制来确保多个协程之间的正确协调和数据共享......
  • ajax乱码问题和异步同步问题
    1. 测试内容: 201.1 发送ajax get请求    发送数据到服务器,服务器获取的数据是否乱码?    - 服务器响应给前端的中文,会不会乱码?1.2 发送ajax post请求    - 发送数据到服务器,服务器获取的数据是否乱码?    - 服务器响应给前端的中文,会不会乱码?1.3 包括还要......
  • 一文教会你用Apache SeaTunnel Zeta离线把数据从MySQL同步到StarRocks
    在上一篇文章中,我们介绍了如何下载安装部署SeaTunnelZeta服务(3分钟部署SeaTunnelZeta单节点Standalone模式环境),接下来我们介绍一下SeaTunnel支持的第一个同步场景:离线批量同步。顾名思意,离线批量同步需要用户定义好SeaTunnelJobConfig,选择批处理模式,作业启动后开始同步数据,当......
  • 同步Linux服务器时间
    0012***/usr/sbin/ntpdate172.17.14.50 https://www.jianshu.com/p/542439e7feb4https://www.cnblogs.com/pipci/p/12844550.html 二、不同机器之间的时间同步为了避免主机时间因为长期运行下所导致的时间偏差,进行时间同步(synchronize)的工作是非常必要的。Linux系统......
  • 【java】同步异步和多线程编程
    Java基本概念并发基于时间段内的,同时发生(处理多个任务的能力,时间段)存在同步和互斥的问题(任务之间的时序问题)同步:前一个处理的结果作为下一个处理的资源(互相之间有依赖)互斥:不能同时使用临界资源。解决时序问题的机制:锁,信号量,原子操作Java中的多线程机制并行(完全......
  • 数据库系列-MYSQL篇之-主从同步
    1主从同步概述mysql主从同步,即MySQLReplication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主从同步功能,经过配置,可以实现基于库、表结构的多种方案的主从同步。可以对MySQL做主从架构并且进行读写分离,让主服务器(Master)处理写请求,从服务器(Sla......
  • 标准化考场时间同步系统(网络时钟系统)规划建设应用
    标准化考场时间同步系统(网络时钟系统)规划建设应用标准化考场时间同步系统(网络时钟系统)规划建设应用京准电子科技官微——ahjzsz近些年,考点时钟不准确等事故频繁发生,这些事件引起了社会对考场时钟同步问题的广泛关注和讨论。2012年6月7日,广元中学理科第13考室时钟失灵,显示的时......
  • 两个MYSQL数据同步的SHELL脚本
    #/!bin/bashHOST=127.0.0.1#ip(127.0.0.1表示本机地址)USER=root#数据库用户名PASSWORD=password#数据库密码DATABASE=pig#数据库名BACKUP_PATH=/home/hdkg/bkdata/#备份目录logfile=/home/hdkg/bklog/data.log#记录日志TABLES="testtest......