RISC-V (十)任务同步和锁

2024-09-08 01:44
文章标签 risc 同步 任务

本文主要是介绍RISC-V (十)任务同步和锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

并发与同步

并发:指多个控制流同时执行。

        多处理器多任务。一般在多处理器架构下内存是共享的。  

        单处理器多任务,通过调度器,一会调度这个任务,一会调度下个任务。  共享一个处                                理器一个内存。        

        单处理器任务+中断:

同步: 是为了保证在并发执行的环境中各个控制流可以有效执行而采用的一种编程技术。

 

临界区、锁、死锁

临界区:在并发执行的程序执行环境中,所谓的临界区(critical section)指的是一个会访问共享资源的代码片段,例如同时访问一个共享设备或者一个共享内存,而且当这样的多指令片段同时访问某个共享资源可能会引发问题,那这些代码片段就叫临界区。 

锁:  是一种常见的用来同步的机制。

        不可睡眠的锁:不可以离开调度。

        可睡眠的锁:可以让锁进入不参与调度的状态。

右边的任务也会抢占到cpu,但是因为左边的任务还没有把锁释放出来,所以右边的指令一直在aquire(lock)处循环。

死锁:当控制流执行路径中会涉及多个锁,并且这些控制流执行路径获取锁的顺序不同时就可能发生死锁。

如何解决死锁:

        调整获取锁的顺序,譬如保持一致。

        尽可能防止任务在持有一把锁的同时申请其它的锁。

        尽可能少用锁,尽可能少并发。 少用多线程。

自旋锁的实现

        自旋锁(spin lock)是一种不可睡眠的锁。

        两个任务被系统交替着调度,任务A拿到锁后将锁取出来看一下,发现是没锁上的,将锁锁上,继续执行临界区的指令。任务B拿到锁后将锁取出来看一下,发现已经上锁了,于是在for循环里面自旋,此时任务B即是参与了调度也是走不下去的。

        但是这段代码是有问题的,因为cpu在调度任务的时候是在机器语言级别的。将锁取出来看一下和锁上这两个动作对应着几条机器码。如果任务调度发生在这几条机器码中,那么有可能任务A将锁取出来看一下的时候,任务B抢占了cpu,将锁取出来看一下,这样两个任务都看到的是锁还没有被锁上。所以希望读取锁和上锁这两个动作可以合为一个原子操作,不可被打断。 于是引入了原子指令

        amoswap指令的效果就是,从源寄存器中获取到新值,读取存储器地址的值,保存到目标寄存器中。将新值存入到存储器地址中。返回目标寄存器中原来存储器中的值。

        思考:既然看锁和上锁这两个操作可以合为一个原子指令,那么原先临界区的代码是否也可以合成一条原子指令呢,从而不需要借助锁。

        另外一种简单粗暴的方式去让临界区代码不被打断:直接关中断。

自旋锁的使用:

        自旋锁可以防止多个任务同时进入到临界区。

        在自旋锁保护的临界区内不能执行长时间的操作。

        在自旋锁保护的临界区内不能主动放弃CPU。 

其他同步技术 

  

这篇关于RISC-V (十)任务同步和锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146766

相关文章

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2