计算机操作系统进程(3)

系列文章目录

第二章:进程的描述与控制


文章目录

  • 系列文章目录
  • 前言
  • 一、进程同步的基本概念:
  • 二、临界资源:
  • 总结


前言

   前面我们学习了进程的定义和特征,进程状态的转换,接下来我们开始学习我们最重要的一点也是相对最难的一点,包括正在写着的我其实也感觉这东西有点抽象,但我尽量表达出来我在这段过程中对此学习的理解(我会举Java例子来更加形象的解释一下)。


一、进程同步的基本概念:

   进程同步机制的主要任务, 是对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能够按照一定的规则(或时序)共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性(可再现性其实可以理解成结果是确定的)。

   间接相互制约关系:

   对于打印机,磁带机这样的临界资源,必须保证多个进程对之只能互斥的访问,由此,在这些进程间形成了源于对该类资源共享的所谓间接相互制约关系。

本质:进程间不需要彼此协调顺序,只是因为资源互斥性而被动等待。

  • 多个进程竞争打印机
    • 进程A和进程B都需要打印文件,但打印机一次只能服务一个进程。
    • 进程A和B之间没有逻辑依赖,仅因资源互斥而等待。
  • 多个线程竞争数据库连接池
    • 线程需要从连接池获取连接,但连接数量有限,未获取的线程需等待。
   直接相互制约关系:

为了完成某任务而建立两个或多个进程。这些进程将为完成同一项任务而相互合作。进程间的直接制约关系就是源于它们之间的的相互合作。

本质:进程间存在逻辑上的依赖关系,需要主动协调彼此的执行顺序

例子:

  • 生产者-消费者问题
    • 生产者需要等待消费者取走数据后才能继续生产(缓冲区满时阻塞)。
    • 消费者需要等待生产者放入数据后才能继续消费(缓冲区空时阻塞)。
  • 读者-写者问题
    • 写者必须独占共享资源,读者可以共享资源(但写者和读者之间需要互斥)。

特点:

  • 依赖对方的操作结果:进程的执行依赖于其他进程的特定动作(如“生产”和“消费”)。
  • 需要显式同步:必须通过同步机制(如信号量、条件变量)协调进程的执行顺序。

  

二、临界资源:

     临界资源就是我们理解的共享资源,如许多硬件资源,打印机,磁带机等,都属于临界资源。诸进程间应采取互斥方式,实现对这种资源的共享。

临界资源也是指 ​一次只能被一个线程或进程访问的共享资源

   临界区:

   

while(TRUE)
{

  进行区 entry section;
  临界区 critical section;
  退出区 exit section;
  剩余区 remainder section;


}

同步机制应遵循的规则:

(1)空闲让进(2)忙则等待(3)有限等待(4)让权等待

  

例子:

package com.yuan5;

/**
 * @author 袁敬尧
 * @version 1.0
 */
public class DeadLock_ {
    public static void main(String[] args) {
        DeadLock deadLock1 = new DeadLock(true);
        DeadLock deadLock2 = new DeadLock(false);
        deadLock1.start();
        deadLock2.start();
    }
}

class DeadLock extends Thread {
    static Object ob1 = new Object();
    static Object ob2 = new Object();//保证多线程,共享一个对象
    boolean flag;

    public DeadLock(boolean flag) {
          this.flag = flag;
    }

    @Override
    public void run() {
        if (flag) {
            synchronized (ob1) {
                System.out.println(Thread.currentThread().getName() + "A线程进入1");
                synchronized (ob2) {
                    System.out.println(Thread.currentThread().getName() + "A线程进入2");
                }
            }
        } else {
            synchronized (ob2) {
                System.out.println(Thread.currentThread().getName() + "B进程进入3");

                synchronized (ob1) {
                    System.out.println(Thread.currentThread().getName() + "B线程进入4");
                }
            }
        }
    }
}

这是一个线程的死锁问题,在java语言当中使用Synchronized作为一个锁,这个锁是一个不公平锁,先给大家补充这么多,下节我们就开始硬软件是如何实现实现同步机制的。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了进程同步的概念和临界资源还有一个Java例子,我简简单单的介绍了一下,下节会详细的实现软硬件如何实现同步机制的。

你可能感兴趣的:(java,linux,windows,idea,开发语言)