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

news2024/11/13 16:46:45

并发与同步

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

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

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

        单处理器任务+中断:

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

 

临界区、锁、死锁

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

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

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

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

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

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

如何解决死锁:

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

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

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

自旋锁的实现

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

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

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

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

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

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

自旋锁的使用:

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

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

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

其他同步技术 

  

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言指针详解-包过系列(一)目录版

C语言指针详解-包过系列(一)目录版 1.内存和地址1.1内存1.2 深入理解编址 2.指针变量和地址2.1 取地址操作符(&)2.2 指针变量和解引用操作符(*)2.2.1 指针变量2.2.2 指针变量各部分理解2.2.3 解引用操作…

重启顺风车的背后,是高德难掩的“野心”

以史鉴今,我们往往可以从今天的事情中,看到古人的智慧,也看到时代的进步。就如西汉后期文学家恒宽曾说的,“明者因时而变,知者随事而制”。 图源来自高德官方 近日,高德就展现了这样的智慧。在网约车市场陷…

团队比赛活动如何记分?

团队比赛时如何记分? 在当今快节奏的社会中,团队合作和竞争已成为推动个人和集体发展的重要方式。无论是在学校的体育赛事、公司的团建活动,还是社区的娱乐竞赛中,团队比赛都扮演着不可或缺的角色。然而,组织一场成功的…

ubuntu 安装配置 ollama ,添加open-webui

ubuntu 安装配置 ollama 下载安装 [https://ollama.com/download](https://ollama.com/download)一 安装方法 1 命令行下载安装一 安装方法 2 , 手动下载安装 二 配置模型下载路径三 运行1 启动 ollama 服务2 运行大模型 四 添加开机自启服务 ollama serve1 关闭 ollama 服务2 …

2158. 直播获奖(live)

代码 #include<bits/stdc.h> using namespace std; int main() {int n,w,a[100000],cnt[601]{0},i,j,s;cin>>n>>w;for(i0;i<n;i){scanf("%d",&a[i]);cnt[a[i]];int x(i1)*w/100;if(!x) x1;for(j600,s0;j>0;j--){scnt[j];if(s>x){cou…

离线语音通断器

很长一段时间没有更新了 这段时间丰富了离线语音通断器的款式&#xff0c;目前成熟的模块包括单路&#xff0c;三路&#xff0c;四路&#xff0c;八路&#xff0c;输出支持无源输出&#xff0c;有源输出&#xff0c;目前主要针对房车改装市场做一些定制化的客户&#xff0c;同…

快排Java

快速排序的复杂度 快排代码 package leetcode;import java.util.Arrays;public class QuickSort {public static void quickSort(int[] array, int low, int high) {if (low < high) {int pivotIndex partition(array, low, high);quickSort(array, low, pivotIndex - 1);…

winserver2012 关闭iis

1&#xff0c;打开控制面板&#xff0c;搜索管理工具 2&#xff0c;打开管理工具 3&#xff0c;双击打开&#xff1a; 3.1&#xff0c;看到服务列表&#xff1a;右键管理网站-浏览&#xff0c;可以查看web服务&#xff1b; 4&#xff0c;如何关闭&#xff1a;右键结束即可。

【Linux】探索进程优先级的奥秘,解锁进程的调度与切换

目录 进程优先级&#xff1a; 是什么&#xff1f; 为什么存在进程优先级的概念呢&#xff1f; Linux为什么调整优先级是要受限制的&#xff1f; PRI vs NICE Linux的调度与切换 概念准备&#xff1a; 那我们到底怎样完成进程的调度和切换呢&#xff1f; 区分&#xff…

2024国赛论文拿奖快对照这几点及评阅要点,勿踩雷区!(国赛最后冲刺,提高获奖概率)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 2024“高教社杯”全国大学生数学建模竞赛已过去第三个夜晚&#xff0c;小伙伴们都累了没…

无法用 FileZilla 传送文件的解决方案

以下内容源于学习过程中的总结&#xff0c;欢迎交流。 参考博客 &#xff08;1&#xff09;无法用FileZilla 传送文件的解决方案_filezilla could not transfer-CSDN博客 连接时的设置如下&#xff0c;可见我没有以root用户身份进行连接。 我打算把某个文件从本地PC机传送到虚…

【重学 MySQL】十四、显示表结构

【重学 MySQL】十四、显示表结构 使用DESCRIBE或DESC命令使用SHOW COLUMNS命令查询information_schema数据库使用SHOW CREATE TABLE命令总结 在MySQL中&#xff0c;查看或显示表结构是一个常见的需求&#xff0c;它可以帮助你了解表中包含哪些列、每列的数据类型、是否允许为空…

GUI编程08:画笔paint

本节内容视频链接&#xff1a;10、画笔paint_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p10&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 package com.yundait.lesson03;import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.…

JdK版本介绍

JDK&#xff08;Java Development Kit&#xff09;是Java开发的核心工具包&#xff0c;它包含了Java运行时环境&#xff08;JRE&#xff09;以及Java开发工具&#xff08;如编译器、调试器等&#xff09;。JDK的版本更新不断&#xff0c;每个版本都带来了新特性、性能改进和安全…

linux基础IO——动静态库——进程编址、进程执行、动态库加载

前言&#xff1a;本节内容为基础IO部分的最后一节&#xff0c; 主要是为了讲一下动静态库里面的动态库如何加载到内存&#xff0c; 动态库的地址等等。 但是&#xff0c;这些内容牵扯到了程序的编址&#xff0c; 程序的加载&#xff0c; 进程的执行等等知识点&#xff0c; 所以…

代码随想录算法训练营第二十天| 39. 组合总和、40. 组合总和Ⅱ、131. 分割回文串

今日内容 leetcode. 39 组合总和leetcode. 40 组合总和Ⅱleetcode. 131 分割回文串 Leetcode. 39 组合总和 文章链接&#xff1a;代码随想录 (programmercarl.com) 题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 本题不太一样的是可以对同一个数…

自己实现一个分布式锁

我的博客大纲 我的后端学习大纲 1.setnx命令&#xff1a; 2.基于Redis实现分布式锁&#xff1a; 2.1.基本实现&#xff1a; 借助于redis中的命令setnx(key, value)&#xff0c;key不存在就新增&#xff0c;存在就什么都不做。同时有多个客户端发送setnx命令&#xff0c;只有一…

20240902-VSCode-1.19.1-部署vcpkg-win10-22h2

20240902-VSCode-1.19.1-部署vcpkg-win10-22h2 软件环境 标签:C++ VSCode mingw gcc13 vcpkg cmake分栏:C++操作系统:Windows10 x64 22h2一、安装VScode-1.19.1 请参考另一篇文章《20240717-VSCode-1.91.1-部署gcc13-C++23-win10-22h2》。 二、安装cmake 本文流程需要安…

【微处理器系统原理与应用设计第八讲】程序设计的开发框架包括编程语言、程序的基本要素、汇编程序结构、集成开发环境

一、编程语言 从处理器的角度看&#xff1a;一个指令只是一个操作&#xff0c;那么执行多条指令构成的程序就是完成一个完整功能的操作。 从程序执行的角度看&#xff1a;处理器读取指令后译码执行&#xff0c;完成所有操作。 从程序设计的角度看&#xff1a;用指令来描述所…

尽快更新!Zyxel 路由器曝出 OS 命令注入漏洞,影响多个版本

近日&#xff0c;Zyxel 发布安全更新&#xff0c;以解决影响其多款商用路由器的关键漏洞&#xff0c;该漏洞可能允许未经认证的攻击者执行操作系统命令注入。 该漏洞被追踪为 CVE-2024-7261&#xff0c;CVSS v3 得分为 9.8&#xff0c;是一个输入验证故障&#xff0c;由用户提…