DJ2-4 进程同步(第一节课)

目录

2.4.1  进程同步的基本概念

1. 两种形式的制约关系

2. 临界资源(critical resource)

3. 生产者-消费者问题

4. 临界区(critical section)

5. 同步机制应遵循的规则

2.4.2  硬件同步机制

1. 关中断

2. Test-and-Set 指令

3. Swap 指令

4. 小结


进程的异步性必然导致若干进程对系统资源进行无序争夺,从而导致系统混乱。为保证多个进程能有条不紊地运行,在多道程序系统中,必须引入进程同步机制。

进程同步进制的主要任务:是使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。

2.4.1  进程同步的基本概念

1. 两种形式的制约关系

1)间接相互制约关系。由于共享系统资源。

2)直接相互制约关系。由于进程之间的相互合作。  

2. 临界资源(critical resource)

一次仅允许一个进程访问的资源为临界资源 。

3. 生产者-消费者问题

1)问题描述

有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有 n 个缓冲区的缓冲池,生产者进程将其所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。

2)解决方法

变量定义如下:

int in = 0;        //数组单元输入指针
int out = 0;       //数组单元输出指针
int count = 0;     //记录缓冲池产品数
item buffer[n];    //具有n个缓冲区的缓冲池

缓冲池是被组织成循环缓冲的。

在生产者进程中使用一个局部变量 nextp,用于暂时存放每次刚刚生产出来的产品;而在消费者进程中,则使用一个局部变量 nextc,用于存放每次要消费的产品。

生产者

void producer() {
    while(1) {

        //produce an item in nextp

        while(count == n);      //缓冲池已满,do no-op

        buffer[in] = nextp;     //放入产品
        in = (in + 1) % n;      //指向下一个数组单元
        count = count + 1;      //缓冲池产品数加一
    }
}

消费者

void consumer() {
    while(1) {
        while(count == 0);      //缓冲池已空,do no-op

        nextc = buffer[out];    //取出产品
        out = (out + 1) % n;    //指向下一个数组单元
        count = count - 1;      //缓冲池产品数减一

        //consume the item in nextc
    }
}

3)存在问题

虽然上面的生产者程序和消费者程序在分别看时都是正确的,而且两者在顺序执行时其结果也会是正确的,但若并发执行时就会出现差错,问题就在于这两个进程共享变量 count 。

假设 count 初值为 5 。生产者对它做加 1 操作,消费者对它做减 1 操作,这两个操作在用机器语言实现时,分别可用以下形式描述。

reg1 = count;       |reg2 = count;
reg1 = reg1 + 1;    |reg2 = reg2 - 1;
count = reg1;       |count = reg2;

祖传计组图。

实际执行时,由于时间片完可能导致两段程序中各语句穿插执行。

reg1 = count;        (reg1=5)
reg1 = reg1 + 1;     (reg1=6)
reg2 = count;        (reg2=5)
reg2 = reg2 - 1;     (reg2=4)
count = reg1;        (count=6)
count = reg2;        (count=4)

倘若再将两段程序中各语句交叉执行的顺序改变,将可看到其它答案。这表明程序的执行已经失去了再现性。为了预防产生这种错误,解决此问题的关键是把变量 count 作为临界资源处理,亦即,令生产者进程和消费者进程互斥地访问变量 count 。

4. 临界区(critical section)

把在每个进程中访问临界资源的那段代码称为临界区。

把一个访问临界资源的循环进程描述如下:

while(true) {
    进入区:检查有无进程进入。
    临界区:进程访问临界资源。
    退出区:将访问标志复位。
    剩余区:其它部分的代码。
}

5. 同步机制应遵循的规则

1)空闲让进

当无进程处于临界区时,应允许一个请求进入临界区的进程立即进入自己的临界区。

2)忙则等待

当已有进程进入临界区时,其它试图进入临界区的进程必须等待。

3)有限等待

对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入 “死等” 状态。

4)让权等待

当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入 “忙等” 状态。

2.4.2  硬件同步机制

利用计算机硬件指令来解决临界区问题。对临界区管理时,将标志看作一把 “锁” 。

  • 初始时锁是打开的。
  • 进入临界区前,进程必须先进行 “锁测试” 。
  • “锁开” 则进入,“锁关” 则等待。
  • “锁开” 进入时,应立即将其锁上,以防止其它进程进入。
  • “锁测试” 和关锁操作必须是连续的(原子操作)。

计算机硬件提供了三大指令:关中断、Test-and-Set 指令、Swap 指令。

1. 关中断

原理:在进入锁测试之前关闭中断,直到完成锁测试并上锁之后才能打开中断。这样,进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度。

缺点:

  • 滥用关中断权利可能导致严重后果(与系统安全相关的中断无法被响应)
  • 关中断时间过长会影响系统效率
  • 不适用于多 CPU 系统(这个关了还有那个)

2. Test-and-Set 指令

TS 指令的一般性描述如下:

boolean TS(boolean * lock) {
    boolean old;
    old = * lock;
    * lock = true;
    return old;
}

利用 TS 指令实现互斥的循环进程结构可描述如下:

do {
    //...

    while TS(&lock);    //entry section
    //...               //critical section
    lock = false;       //exit section
    //...               //remainder section
} while(true);

do ... while ... 记得最后的分号。

在进入区,若恒有 lock == true,则代表临界区已上锁,其它试图进入临界区的进程必须等待。

3. Swap 指令

Swap 指令在 8086/8088 中又称为 XCHG 指令,用于交换两个字的内容。

Swap 指令的一般性描述如下:

void swap(boolean * a, boolean * b) {
    boolean temp;
    temp = * a;
    * a = * b;
    * b = temp;
}

为每个临界资源设置一个全局的 boolean 变量 lock,其初值为 false(代表没有上锁)。再设置一个局部的 boolean 变量 key 。利用 Swap 指令实现互斥的循环进程结构可描述如下:

do {
    key = true;
    do {                //entry section
        swap(&lock, &key);
    } while(key != false);
    //...               //critical section
    lock = false;       //exit section
    //...               //remainder section
} while(true);

由于 lock 的初值为 false,因此第一个进入临界区的进程内循环一次即退出循环。此时,lock 值为 true,其它试图进入临界区的进程将一直在内循环中循环。直到第一个进入临界区的进程执行到退出区,lock 值被设置为 false 。

4. 小结

利用上述硬件指令能有效地实现进程互斥,但当临界资源忙碌时,其它访问进程必须不断地进行测试,处于一种 “忙等” 状态,不符合 “让权等待” 原则,造成处理机时间的浪费,同时也很难将它们用于解决复杂的进程同步问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/1779.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能前沿知识

本来想着初试完学习一下李沐大神的《动手学深度学习》这本书的,但是时间仓促,完全来不及。只能先自行了解一些知识,之后再深入了解。 这里为面试应答,问了chatgpt一些关于AI前沿的知识: 还需要再了解一番:…

网站经常被DDOS攻击的原因有哪些

过去这几年,互联网创业热潮非常火,几乎所有行业都向互联网转型。很多互联网公司都会经历被 DDoS 攻击,导致网站服务瘫痪,用户流失以及公司信用度的负面影响。什么是 DDOS 攻击呢?DDOS 攻击是通过控制大量僵尸网络向服务…

人工智能的几个研究方向

人工智能主要研究内容是:分布式人工智能与多智能主体系统、人工思维模型、知识系统、知识发现与数据挖掘、遗传与演化计算、人工生命、人工智能应用等等。 其中热门研究有以下几种。 一、计算机视觉 就包括图像识别,视频识别,具体应用有人…

Python 基础教程【3】:字符串、列表、元组

本文已收录于专栏🌻《Python 基础》文章目录🌕1、字符串🥝1.1 字符串基本操作🍊1.1.1 字符串创建🍊1.1.2 字符串元素读取🍊1.1.3 字符串分片🍊1.1.4 连接和重复🍊1.1.5 关系运算&…

Java序列化与反序列化

优秀博文:IT-BLOG-CN 序列化:把对象转换为字节序列存储于磁盘或者进行网络传输的过程称为对象的序列化。 反序列化:把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化。 一、序列化对象 【1】必须实现序列化接口Serializabl…

RK3568平台开发系列讲解(驱动基础篇)I2C协议介绍

🚀返回专栏总目录 文章目录 一、I2C基本读写过程二、通讯的起始和停止信号三、数据有效性四、地址及数据方向五、响应沉淀、分享、成长,让自己和他人都能有所收获!😄 📢I2C的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。 一、…

《网络安全入门到精通》 - 2.1 - Windows基础 - DOS命令Windows防火墙Windows共享文件

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「订阅专栏」:此文章已录入专栏《网络安全入门到精通》 Windows基础一、DOS命令1、目录文件操作dir 列出目录文件cd 切换目录md 创建目录rd 删除目录move 移动文件或目…

4.网络爬虫—Post请求(实战演示)

网络爬虫—Post请求实战演示POST请求GET请求POST请求和GET请求的区别获取二进制数据爬[百度官网](https://www.baidu.com/)logo实战发送post请求百度翻译实战使用session发送请求模拟登录17k小说网常见问题前言: 📝​📝​此专栏文章是专门针对…

数据结构笔记

文章目录第一章:数据结构与算法第二章:稀疏数组和队列一 、稀疏sparsearray 数组(一)案例需求(二)稀疏数组介绍(三)应用实列(四)代码实现二、队列&#xff08…

动态规划算法

一、前言动态规划是一种常用的算法,在算法领域十分重要,但对于新手来说,理解起来有一定的挑战性,这篇博客将明确步骤来一步一步讲解动态规划到底该如何理解与运用。二、解析动态规划算法1.特点①把原来的问题分解成了【要点相同】…

【Linux】软件包管理器 yum

什么是软件包和软件包管理器 在 Linux 下需要安装软件时, 最原始的办法就是下载到程序的源代码, 进行编译得到可执行程序。但是这样太麻烦了,所以有些人就把一些常用的软件提前编译好, 做成软件包 ( 就相当于windows上的软件安装程序)放在服…

Spring框架中IOC和DI详解

Spring框架学习一—IOC和DI 来源黑马Spring课程,觉得挺好的 目录 文章目录Spring框架学习一---IOC和DI目录学习目标第一章 Spring概述1、为什么要学习spring?2、Spring概述【了解】【1】Spring是什么【2】Spring发展历程【3】Spring优势【4】Spring体系…

java线程之Thread类的基本用法

Thread类的基本用法1. Thread类的构造方法2. Thread的几个常见属性常见属性线程中断等待一个线程小鱼在上一篇博客详细的讲解了如何创建线程,java使用Thread类来创建多线程,但是对于好多没有相关经验的人来说,比较不容易理解的地方在于操作系统调度的执行过程. 我们通过下面代码…

Tomcat部署及优化

目录 1.Tomcat概述 1.Tomcat的概念 2、Tomcat的核心组件 3.Java Servlet 的概念 4.JSP的概念 5.Tomcat中最顶层的容器------server 6.四个子容器的作用 7.Tomcat请求过程 2.Tomcat服务部署 1.Tomcat服务部署的步骤 2.实例操作:Tomcat服务部署 3.Tomcat 虚拟主机配置…

数据清洗是清洗什么?

在搭建数据中台、数据仓库或者做数据分析之前,首要的工作重点就是做数据清洗,否则会影响到后续对数据的分析利用。那么数据清洗到底是做什么事情呢?今天我就来跟大家分享一下。 数据清洗的基本概念 按百度百科给出的解释,“数据清…

Java之链表(不带头结点,带头结点,迭代实现,递归实现)

目录 一.链表 1.什么是链表 2.链表的分类 二.不带头结点单向链表的非递归实现 1.接口的定义 2. 不带头结点单向链表的结构 3.链表的添加操作(头插法和尾插法) 1.头插法 2.尾插法 4. 链表的插入操作 5.链表的删除操作 1.删除指定索引的结点 2.删除指定值的第一个结点…

一文带你领略 WPA3-SAE 的 “安全感”

引入 WPA3-SAE也是针对四次握手的协议。 四次握手是 AP (authenticator) 和 (supplicant)进行四次信息交互,生成一个用于加密无线数据的秘钥。 这个过程发生在 WIFI 连接 的 过程。 为了更好的阐述 WPA3-SAE 的作用 …

Thread的小补丁

Thread小补丁线程状态NewRunnableWaitingTimed_waitingBlocked线程安全线程的抢占式执行同时对同一个变量进行修改指令重排序操作不是原子的解决方案万恶之源优化我们自己的代码Synchronized和Volatile上一篇博客中,我们简单介绍了线程Thread的一些知识,一些基本的使用,但是单单…

数据结构和算法(1):数组

目录概述动态数组二维数组局部性原理越界检查概述 定义 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识 In computer science, an array is a data structure consisting of a col…

文心一言发布,你怎么看?chatGPT

百度全新一代知识增强大语言模型“文心一言”于2021年3月16日正式发布,作为一款自然语言处理技术,它引起了广泛的关注和讨论。 首先,文心一言是一款具有重大意义的自然语言处理技术。在人工智能领域,自然语言处理技术一直是一个难…