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 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Python Invoke自动化任务库的使用

《PythonInvoke自动化任务库的使用》Invoke是一个强大的Python库,用于编写自动化脚本,本文就来介绍一下PythonInvoke自动化任务库的使用,具有一定的参考价值,感兴趣的可以... 目录什么是 Invoke?如何安装 Invoke?Invoke 基础1. 运行测试2. 构建文档3.