首页 > 其他分享 >条件同步-操作系统

条件同步-操作系统

时间:2025-01-01 22:31:08浏览次数:6  
标签:操作系统 synchronized void item Semaphore 条件同步 public wait

Condition Synchinzation--条件同步

实现同步有两种方式:competition(compete for a variable that two processes all want to read or updata simutaneously)和cooperation(a process want to tell another process that a result needed is avaliable);针对competition主要通过mutual exclusion(At a given time, only one thread could access critical section)实现。

这部分讲解coorperation的实现方法--condition synchinzation


什么是条件同步

条件同步是指多个线程(或进程)在一定条件满足时才能继续执行,否则它们会进入等待状态。

举个简单的例子:想象你和朋友玩一个游戏,只有当你们俩都准备好了,游戏才能开始。如果有一方还没准备好,另一方就需要“等待”。这里的“等待”和“条件满足”就是条件同步的核心。

关键词:synchronized

生产者消费者问题

条件同步中最经典的问题就是生产消费:生产者生产-->通知消费者-->消费者消费

semaphore中讲到,可以通过控制信号量个数来实现有序性,最初资源为0,当资源为1时候,消费者才有东西消费,这就需要先让生产者生产资源。

现在可以用:boolean变量+wait()+notify()来实现

public class Dimension 
{
  private int dim = 0; 
  private boolean done_put = FALSE;

  public void synchronized put(int d) 
      { dim = d; 
        done_put = TRUE;  //标志有可用资源
         notify(); }

   public int synchronized get() { 
     if (!done_put) 
        wait(); //操作系统wait
     return dim;
     done_put = FALSE;}
}

Barrier

processes cannot proceed until otherthreads reach the barrier

Barrier 的核心作用是实现 多线程的协调与同步,确保某些关键点上的线程进度保持一致。Barrier阻拦,目的:实现有序,高优先级的要比低优先级的先执行(这几个线程执行某个区域的代码时候,不能先来的就先执行,必须要在屏障点barrier一下,然后优先级最高的先执行)

public class Barrier {
     public void synchronized pause() {
         wait(); } 
     public void synchronized resume_one(){
          notify(); } 
}

优先级barrier实现

每次放行优先级最高的线程

两部分组成:pause; resume_one

  • public void synchronized pause(){ }用来暂停优先级判断和设置以及放行
    比较最高(替换),比较次高(替换),do wait() while(p>hightest);替换

  • public void synchronied resume_one(){ }用来重开一轮

public class Barrier{
    int hightest=0;
    int next_high=0;
    public void synchronized pause(){
       int p;
       if(p=(getPriority())>hightest){
          next_high=highest;
          hightest=p;
       }
       else if(p=(getPriority())>next_high){
          next_high=p;
       }
        do wait()while(p<highest);
        hightest=next_hight
    }

    public void synchronized resume_one(){
       notifyALL()
   }
}

Bounded Counter

Bounded Counter(有界计数器) 是一种多线程编程中的同步机制,主要用于限制某些资源或操作的最大并发数。它的工作方式类似于信号量(Semaphore),但它更注重的是 计数范围控制

Bounded Counter 是一个计数器,有一个固定的最大值(上界)和最小值(下界)。 它通常用于控制资源的使用量,防止超过最大限制或者减少到小于下限的情况。

给资源数划分了一个区域MIN, MAX

小于MIN,消费者不能消费,生产者可以加

大于MAX,生产者不能生产,消费者可以消费

互相notify动态控制资源个数保持在一定区间

public class BoundedCounter implements IBoundedCounter{
    long count=MIN;
    public void synchronized inc(){
       while(count==MAX) wait();
       if(count++==MIN) notifyAll();//notify 消费者来消费
    } 

    public void synchronized dec(){
       while(count==MIN) wait();
       if(count--==MAX) notifyALL();//notify 生产者生产(还没到MAX呢 你快来生产)
    }
}
  • 条件判断均为等于边界;while()+wait ;if+notifyall()

  • public void synchronized inc()用来增加资源,public void synchronized dec()用来消费资源

Semaphores 实现bounded area

设置三个信号量:

  • privateSemaphore mutex = new Semaphore(1);控制互斥

  • privateSemaphore space_avail =new Semaphore(10);控制空间

  • private Semaphore item_avail =new Semaphore(0);控制item个数

其中space和item是互补的 放了一个item意味着少一个space

最开始space为10,item为0

class BoundedBuffer{
    private Vector buf=new Vector();
    private Semaphore mutex=new Semaphore(1);
    private Semaphore space=new Semaphore(10);
    private Semaphore mutex=new Semaphore(0);

//put: PP addElement(item) VV 回归(先space后item)
    public void put(int item){
       space.P();
       mutex.P();
       buf.addElement(item);
       mutex.V();
       item.V();
    }

//get: PP removeElementAt(0) VVR (先item后space)
    public int get() { 
         item_avail.P(); 
         mutex. P(); 
         int item =buf.removeElementAt(0); 
         mutex.V(); 
         space_avail.V(); 
         return item; 
       }
}

标签:操作系统,synchronized,void,item,Semaphore,条件同步,public,wait
From: https://www.cnblogs.com/LuKemi3/p/18646419

相关文章

  • THU-rCore 操作系统实验日寄 -2
    THU-rCore操作系统实验踩坑日寄-2PART2第二章主要涉及单道的批处理和特权级的部分,尚不涉及多道程序设计。早先一直提到的RustSBI,实为一个Rust的riscvsupervisorbinaryinterface。若按中科院软件所维护的中文版RISC-VManual翻译,就应该作“RISC-V监管器(SuperVisor)二进......
  • 《操作系统真相还原》实验记录2.4——中断处理程序编写
    零、程序编写初步分析中断处理程序编写初步计划如下【图中关系为:调用者->被调用函数】init_all函数用来初始化所有的设备及数据结构,我们打算在kernel内核的main主函数中调用它来完成初始化工作。init_all首先调用idt_init,它用来初始化中断相关的内容。由于初始化也要......
  • RISC-V 安全操作系统
    1.SELTheseL4MicrokernelAnIntroduction2.ZAYASecureOSZAYAOSensureaprotectedenvironment,defendingagainstexternalattacksandmeetingsafetyrequirements.Inaddition,ZAYAOSemploysadvancedsecuritymechanismsandcontinuousmonitori......
  • day2 Linux操作系统指令
    思维导图在家目录下创建目录文件,dir1、dir下创建dir1和dir22、把当前目录下的所有文件拷贝到dir1中,3、把当前目录下的所有脚本文件拷贝到dir2中4、把dir2打包并压缩为dir2.tar.xz5、再把dir2.tar.xz移动到dir1中6、解压dir1中的压缩包7、使用tree工具,查看dir下的......
  • 用再生龙备份和还原操作系统(一)
    软件简介:Clonezilla(再生龙)是一款免费的硬盘克隆软件。它可以将整个硬盘复制到另一个硬盘,也可以把硬盘中的某个分区复制到另一个硬盘分区,还可以把整个硬盘或某个分区做成镜像文件,在需要的时候再把镜像文件还原到硬盘或分区。一,制作工具盘:网上下载到软件后,运行程序,界面如下......
  • 操作系统复习5——存储器管理
    OS中的存储管理主要是指对内存的管理是为多道程序共享内存提供支持,方便用户(编程)使用存储器,提高存储器的利用率以及从逻辑上扩充存储器存储器的宏观认识-寄存器:极少量的、极快速、极昂贵、易变-Cache(CPU高速缓存):少量的、非常快速、昂贵、易变-内存RAM:中等大小、中等速......
  • 操作系统大题
    一、问候语欢迎你来到我的博客!二、操作系统大题  该图片是我在学习操作系统总结出来可能会涉及到的大题类型,如果有遗漏或有错误的地方欢迎指出三、结束语此随笔内容仅为学习缓冲区溢出攻击的一些感悟、想法与总结,由于本人能力有限,如随笔内容有错误希望能见谅并加指出。-......
  • 如何升级云服务器操作系统而不丢失现有数据?
    问题描述:随着业务的发展和技术的进步,用户希望能够对其云服务器的操作系统进行升级,以享受更高版本带来的新特性和性能改进。然而,担心在升级过程中会导致原有应用程序和服务的数据丢失。请问在不影响业务的前提下,怎样安全地完成操作系统升级?解决方案:当计划对云服务器进行操作系统......
  • linux 操作系统下last命令介绍和使用案例
    linux操作系统下last命令介绍和使用案例last命令是Linux系统中用于显示用户最近登录信息的工具。它通过读取/var/log/wtmp文件,提供有关用户登录和注销的详细记录,包括系统启动和关闭的信息。命令简介基本功能查看用户登录历史:显示当前和过去的用户登录记录。显示系统......
  • 【操作系统】同步
    同步(Synchronization)涉及到在多线程或多进程环境中协调多个执行线程的执行顺序,以确保数据的一致性和完整性。同步的目的是防止多个线程同时访问同一资源(如内存、文件、数据库等)时发生的冲突和数据不一致问题。实现方法:互斥锁(Mutex):一种同步机制,用于保护共享资源不被多个线......