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

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2

MySQL主从同步延迟原理及解决方案

概述 MySQL的主从同步是一个很成熟的架构,优点为: ①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力; ②在从主服务器进行备份,避免备份期间影响主服务器服务; ③当主服务器出现问题时,可以切换到从服务器。 相信大家对于这些好处已经非常了解了,在项目的部署中也采用这种方案。但是MySQL的主从同步一直有从库延迟的问题,那么为什么会有这种问题。这种问题如何解决呢? MyS

Flink任务重启策略

概述 Flink支持不同的重启策略,以在故障发生时控制作业如何重启集群在启动时会伴随一个默认的重启策略,在没有定义具体重启策略时会使用该默认策略。如果在工作提交时指定了一个重启策略,该策略会覆盖集群的默认策略默认的重启策略可以通过 Flink 的配置文件 flink-conf.yaml 指定。配置参数 restart-strategy 定义了哪个策略被使用。常用的重启策略: 固定间隔 (Fixe

第49课 Scratch入门篇:骇客任务背景特效

骇客任务背景特效 故事背景:   骇客帝国特色背景在黑色中慢慢滚动着! 程序原理:  1 、 角色的设计技巧  2 、克隆体的应用及特效的使用 开始编程   1、使用 黑色的背景: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d74c872f06b4d9fbc88aecee634b074.png#pic_center)   2

AsyncTask 异步任务解析

1:构建AsyncTask 子类的回调方法: A:doInBackground:   必须重写,所有的耗时操作都在这个里面进行; B: onPreExecute:     用户操作数据前的调用; 例如:显示一个进度条 等 ; C: onPostExecute:    当doInBackground 执行完成后;会自动把数据传给onPostExecute方法;也就是说:这个方法是处理返回的数据的方法

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

mysql创建新表,同步数据

import os import argparse import glob import cv2 import numpy as np import onnxruntime import tqdm import pymysql import time import json from datetime import datetime os.environ[“CUDA_VISIBLE_DEVICE

三.海量数据实时分析-FlinkCDC实现Mysql数据同步到Doris

FlinkCDC 同步Mysql到Doris 参考:https://nightlies.apache.org/flink/flink-cdc-docs-release-3.0/zh/docs/get-started/quickstart/mysql-to-doris/ 1.安装Flink 下载 Flink 1.18.0,下载后把压缩包上传到服务器,使用tar -zxvf flink-xxx-