-
互斥访问、临界区、线程同步
2018-07-04 14:29:44临界区的使用原则:尽晚使用,尽早退出记得释放临界区:每个进程中访问临界资源的那段代码称为临界区。一般线程同步都是使用临界区来实现的,临界区是系统级的API,是最高效的一种方法。当对一个Buffer写入数据时,...- 临界区的使用原则:
尽晚使用,尽早退出。
记得释放资源。
临界区:每个进程中访问临界资源的那段代码称为临界区。
一般线程同步都是使用临界区来实现的,临界区是系统级的API,是最高效的一种方法。
当对一个Buffer写入数据时,如果不加入临界区,则会导致写乱,即ABBBBAAAAABBBBBBB....。我们想要的结果为AAAAAAAAA......,或者BBBBBBBBBBBB........
无临界区代码如下(XThread类可以在之前的文章中找到,本文不做赘述):
#include <iostream> #include "XThread.h" #include "windows.h" using namespace std; static char buffer[1024] = { 0 }; class Mythread :public XThread { public : void Main() { for (;;) { int size = sizeof(buffer); for (int i = 0; i < size; i++) { buffer[i] = c; Sleep(1); } buffer[size - 1] = '\0'; cout <<'['<< buffer<<']'<<endl; Sleep(500); } } char c; }; int main() { Mythread s1; Mythread s2; s1.c = 'A'; s2.c = 'B'; s1.Start(); s2.Start(); getchar(); return 0; }
使用临界区:
1. 定义临界区变量
CRITICAL_SECTION section;
2. 初始化临近区
InitializeCriticalSection(§ion);
3. 进入和离开临界区
EnterCriticalSection(§ion);
LeaveCriticalSection(§ion);
使用临界区后的main代码如下:
#include <iostream> #include "XThread.h" #include "windows.h" using namespace std; static char buffer[1024] = { 0 }; CRITICAL_SECTION section; class Mythread :public XThread { public : void Main() { for (;;) { int size = sizeof(buffer); EnterCriticalSection(§ion); for (int i = 0; i < size; i++) { buffer[i] = c; } buffer[size - 1] = '\0'; cout <<'['<< buffer<<']'<<endl; LeaveCriticalSection(§ion); Sleep(500); } } char c; }; int main() { InitializeCriticalSection(§ion); Mythread s1; Mythread s2; s1.c = 'A'; s2.c = 'B'; s1.Start(); s2.Start(); getchar(); return 0; }
-
临界区
2008-08-02 17:02:002、进程进入临界区的调度原则是:① 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须...1、什么是临界区?
答:每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。
2、进程进入临界区的调度原则是:
① 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。③进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。④如果进程不能进入自己的临界区,则应让出 CPU,避免进程出现“忙等”现象。
互斥对象是一种最简单的内核对象,用它可以方便的实现对某一资源的互斥访问。因为它是内核对象,因此可以产生信号,实际上,程序中就是利用这一点实现互斥的。
如果没记错的话,临界区并不是内核对象,而是系统提供的一种数据结构,程序中可以声明一个该类型变量,之后用它来实现对资源的互斥访问。当欲访问某一临界资源时,先将该临界区加锁(如果临界区不空闲,等待),用完该资源后,将临界区释放。
一般,将他们用于线程间的同步,而且通常可以互换使用。
如果要实现复杂互斥,应使用其它方法,如信号量内核对象等。临界区对象不能跨越进程,是线程间共享数据区的同步对象;互斥对象可以作为进程间共享数据区的同步对象。
-
临界区管理
2020-04-25 23:07:31一.临界区与临界资源 (一)、概念 并发进程中与共享变量有关的程序段叫“临界区”, ...二、实现临界区的管理 (一)、Peterson算法 •bool inside[2]; •inside[0]=false; •inside[1]=false; ...一.临界区与临界资源
(一)、概念
并发进程中与共享变量有关的程序段叫“临界区”,
共享变量代表的资源叫“临界资源”
(二)、临界区调度原则:
互斥使用,有空让进
忙则等待,有限等待
择一而入,算法可行
二、实现临界区的管理
(一)、Peterson算法
•bool inside[2];•inside[0]=false;•inside[1]=false;•enum {0,1} turn;•cobegin•process P0( ) {• inside[0]=true;• turn=1;• while(inside[1]&&turn==1);• /*临界区*/;• inside[0]=false;• }• process P1( ) {• inside[1]=true;• turn=0;• while(inside[0]&&turn==0);• {临界区};• inside[1]=false;• }(二)、实现临界期管理的硬件设施关中断
1、关中断:最简单的方法
2、测试并设置指令:
TS指令管理临界区时,可把一个临区与一个布尔变量s相连,由于变量s代表了临界资源的状态,可把它看成一把锁。
3、对换指令
-
freertos学习之临界区处理
2020-12-01 21:07:57简介 每个进程中访问临界资源的那段代码称为临界区(Critical Section)...进程进入临界区的调度原则是: 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。 任何时候,处于临界区内的进程不可多于一个。简介
每个进程中访问临界资源的那段代码称为临界区(Critical Section) (临界资源是一次仅允许一个进程使用的共享资源)。
每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。
多个进程中涉及到同一个临界资源的临界区称为相关临界区。注:多线程并发访问全局变量也是临界区问题
程序调度法则
进程进入临界区的调度原则是:
- 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。
- 任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
- 进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
- 如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象
FreeRTOS解决方法
访问一个被多任务共享,或是被多任务和中断共享的资源时,需要采用“互斥”技术以保证数据在任何时候都保持一致性。这样做的目的是要确保任务从开始访问资源就具有排它性,直到这个资源又恢复到完整状态。
基本临界区
基本临界区是指宏taskENTER_CRITICAL()和taskEXIT_CRITICAL()之间的代码区间。也被称为Critical Section或者Critical Regions. 使用方法如下:
// 为了保证PORTA的访问不被中断,将访问操作放入临界区运行 taskENTER_CRITICAL(); //进入基本临界区 // 在taskENTER_CRITICAL()和taskEXIT_CRITICAL()之间不会切换到其他任务,中断可以执行,也允许嵌 //套,但只是针对优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的任务,而且这些中断不允许访问 //FreeRTOS的API函数。 PORTA |= 0x01; taskEXIT_CRITICAL(); //退出基本临界区
临界区是提供互斥功能的一种非常原始的实现方法。临界区的工作 仅仅是简单的把中断全部关掉,或者是关掉优先级在configMAX_SYSCALL_INTERRUPT_PRIORITY以下的中断-依赖具体使用的FreeRTOS移植。抢占式的上下文切换只可能在某中断中完成,因此调用taskENTER_CRITICAL()可以在中断关闭的时段一直保持持续运行状态直到退出临界区。
临界区必须具有很短的时间,否则会反过来影响中断的响应时间。在每次使用taskENTER_CRITICAL()之后必须尽快的配套一个taskEXIT_CRITICAL()来退出临界区。
使用信号量或者互斥量
推荐使用互斥量,因为互斥量解决了优先级翻转的问题
void process_data(void) { if(xSemaphoreTake(xSemaphore, 10) == pdTRUE) { x++; xSemaphoreGive( xSemaphore ); } }
信号量和互斥量的最大区别是
(1)用于互斥的信号量必须归还
(2)用于同步的信号量在完成同步后变丢弃,不需要归还禁止任务调度
vTaskSuspendAll(void); //挂起调度器创建临界区(禁止任务调度 suspend the scheduler) /* 通过vTaskSuspendAll()来挂起调度器。挂起调度器可以停止上下文切换而不用关中断,如果某个中断在调 度器挂起过程中要求进行上下文切换,则这个要求也会被挂起,直到调度器被唤醒后才会得到执行。 */ vTaskResumeAll(void); //(解除禁止任务调度 resuming the scheduler; 成对使用) /* 返回值:pdTRUE: 在调度器挂起过程中,上下文切换请求也会被挂起,直到调度器唤醒才被执行,如果一个挂起的上下文切换请求在vTaskResumeAll()返回前得到执行,则返回pdTRUE. 返回值:pdFALSE: 如果是其他情况,则返回pdFALSE. */ // 注意1:两个函数成对使用; // 注意2:两者之间不能调用FreeRTOS系统API.
如果一段临界区太长而不适合简单的关中断来实现,可以考虑采用挂起调度器的方式
唤醒调度器是一个相对较长的操作
基本临界区是保护一段代码区间不被其他任务或中断打断。而由挂起调度器实现的临界区只能保护一段代码不被其他任务打断,并不能约束中断,因为在这种方式下,中断是使能的。
调度器处于挂起状态时,不能调用FreeRTOS的API函数。 -
操作系统临界区
2011-02-24 23:07:00进程进入临界区的调度原则是: ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须... -
什么是临界区
2010-10-28 15:53:00<br /> <br />2、进程进入临界区的调度原则是: ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,... -
操作系统 之 临界区 浅析
2015-11-20 11:42:01进程进入临界区的调度原则 ①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。②任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。... -
进程管理——临界区和锁
2019-08-27 22:32:20一、临界资源与临界区 临界资源 一次只允许一个进程独占访问(使用)的资源 临界区 进程中访问临界资源的程序段 访问特点 ...进程进入临界区的请求应在有闲时间内得到满足 让权等待 等待进程放弃CP... -
进程互斥访问临界区
2019-10-21 20:17:352、忙则等待:临界区被访问时,其余想访问他的进程必须等待; 3、有限等待:等待的进程在外等待的时间必须是有限的; 4、让权等待:若等待进程一直等待,迟迟进不到临界区时,应该让出cpu处理机,防止忙等。 下面... -
【转】临界区、互斥对象
2015-01-02 20:06:002、进程进入临界区的调度原则是:①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。 ②任何时候,处于临界区内的进程不可 多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程... -
Windows多线程——临界区、事件、互斥量、信号量详解加代码
2020-03-25 11:07:20一、【临界区】 每个进程中访问临界资源的那段代码称为临界区(Critical Section)(临界 资源是一次仅允许一个进程使用的共享资源)。...【进程进入临界区的调度原则】 如果有若干进程要求进入空闲的临界区,一... -
CRITICAL_SECTION临界区同一线程和不同线程能不能重入?
2020-06-26 14:40:37编者:李国帅 qq:9611153 微信lgs9611153 ...多个线程之间频繁的使用,可能用多了会出现搞不清楚临界区是否已经锁定,到底是那个线程锁定了。这里并不讨论这问题。这里验证一个基本原则问题。 通.. -
OS-互斥和同步
2020-12-22 15:11:341. 什么是临界资源、临界区,临界区的使用原则有哪些? 进程间在竞争控制中会面临互斥问题。假设两个或者更多的进程需要访问一个不可共享的资源,如打印机,在进程的执行过程中,每个进程都给该I/O设备发命令,接收... -
同步机制遵循的原则
2019-11-14 19:10:15进程在并发执行时为了保证结果的可再现性,各进程执行序列必须加以限制以保证互斥地使用临界资源,相互合作... 当无进程进入临界区时,相应的临界资源处于空闲状态,因而允许一个请求进入临界区的进程立即进入自己... -
进程互斥(一)相关概念
2015-06-28 20:44:061.进程互斥 由于各个进程需要使用共享资源(变量,文件等),而这些资源需要排它性使用,各个进程之间竞争使用这些资源,这一关系称为进程互斥。...临界区的使用原则: (本文内容整理自coursera上陈 -
同步机制
2018-11-08 23:10:46文章目录进程互斥临界资源与临界区临界区的使用原则进程互斥的软件解决方案错误解法Dekker算法Peterson算法进程互斥的硬件解决方案“测试并加锁”指令&amp;amp;quot;交换&amp;amp;quot;指令进程同步... -
《软件技术基础》之《操作系统习题解析》
2020-09-03 08:57:29《软件技术基础》之《操作系统习题解析》作业什么是临界资源、临界区,临界区的使用原则有哪些?简述信号量的含义及作用请用P、V操作描述下列过程图书馆有N个座位,一张登记表,要求(1)阅读者进入时登记,取得座位号... -
Linux自旋锁与互斥锁的区别与选用原则
2020-11-02 00:45:04一、区别 1.实现方式上的区别:互斥锁是基于自旋锁实现的,所以自旋锁相较于互斥锁更加底层。 2.开销上的区别:获取不到互斥锁时会发生上下文切换并休眠,而自旋锁...1.当需要保护的临界区较小时,宜选用自旋锁,否则 -
操作系统第二章(二)
2019-11-25 21:54:412.4 进程的互斥 1.互斥的定义:对某个系统资源,一个进程正在...3.临界区使用原则:每次至多有一个进程处于临界区; 当有若干个进程欲进入临界区时,应在有限的时间内使其进入; 进程在临界区内仅逗留有限的时间... -
唯快不破:【多线程】使用信号量进行同步
2018-01-02 19:23:30很显然,我们规定在sem大于等于零的时候代表可供并发进程使用的资源实体数,sem小于零的时候,表示正在等待使用临界区的进程的个数。根据这个原则,在给信号量附初值的时候,我们显然就要设初值大于零。 p操作和v... -
【多线程】使用信号量进行同步
2013-11-03 22:24:26很显然,我们规定在sem大于等于零的时候代表可供并发进程使用的资源实体数,sem小于零的时候,表示正在等待使用临界区的进程的个数。根据这个原则,在给信号量附初值的时候,我们显然就要设初值大于零。 p操作和v... -
十三、进程互斥的软件实现方法
2021-02-06 16:11:39算法思想:**两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程,也就是说每个进程进入临界区的权限只能被另一个进程赋予。 **单标志法所存在的问题:**只能按照P0–>P1–>P0–>P1…这样轮流... -
[多线程]使用信号量进行同步
2013-06-19 18:53:00很显然,我们规定在sem大于等于零的时候代表可供并发进程使用的资源实体数,sem小于零的时候,表示正在等待使用临界区的进程的个数。根据这个原则,在给信号量附初值的时候,我们显然就要设初值大于零。 p操作和v... -
线程同步与互斥
2018-07-21 15:29:40进程进入临界区的调度原则是: 如果有若干进程要求进程空闲的临界区,每次只允许一个进程进入临界区,进入后不允许其他进程进入。 任何时候,处于临界区内的进程不可多余一个。如已有进程进入自己的临界区,则其他... -
849 进程同步
2020-10-08 10:09:45退出区:将正在访问临界区的标志清除 剩余区:代码中剩余部分 同步 直接制约关系:为了完成某种任务而建立的多个进程,相互合作,所以要进行通信同步 遵循的原则 1)空闲让进:临界区空闲时间,允许一个请求进入临界区的进程... -
进程同步互斥以及通信机制
2020-08-16 20:37:50进程之所以会产生同步和互斥问题,一切源于进程的并发执行。...没有进程在临界区时,想进入临界区的进程可以进入 不允许两个进程同时处于临界区 临界区外运行的进程不得阻塞其他进程进入临界区 不得 -
自旋锁
2019-12-10 13:54:05临界区使用原则: 空闲让进:没有进程在临界区时,想进入临界区的进程可进入; 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待; 有限等待:对请求访问的进程,应保证能在有限时间内进入... -
操作系统第四章作业
2020-04-06 21:14:05什么是临界资源?什么是临界区?对临界资源的访问有哪些原则? 临界资源:一次仅允许一个进程使用的共享资源。 临界区:每个进程中访问临界资源的那段程序。...有限等待,进入临界区的进程要在有限时间内退出...
-
镉的硫硒碲化物在玻璃中的光吸收特性
-
vb判断txt内是否空行.txt
-
歌声合成从入门到精通
-
CIO/CTO 必读 | 数字转型时代,企业存储支出知多少
-
NSGA-3.zip
-
android电话!轻松获得一线大厂面试offer,已整理成文档
-
【Hadoop】Hdfs和Yarn的高可用配置
-
2、第二天作业
-
hightopo HT for Web(hightopo.zip)
-
springboot测试类中遇到Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration
-
工程制图 AutoCAD 2012 从二维到三维
-
Python _Basic.pdf
-
《流畅的Python》读书笔记 键的次序取决于添加顺序
-
android架构图!我三年开发经验,从字节跳动抖音离职后,内容太过真实
-
Python中的匿名函数
-
android机器人!含泪狂刷Android基础面试118题,附答案
-
波士顿动力公司机器人组团跳舞?科研脑洞由此大开
-
vb控件自动移动到指定位置.txt
-
SANGFOR_GAP_V3.0安全隔离与信息交换系统_用户手册.pdf
-
通知栏打开对应Acitvity.rar