临界区

Linux中的各种锁及其基本原理

风流意气都作罢 提交于 2019-12-02 04:56:37
Linux中的各种锁及其基本原理 1.概述 通过本文将了解到如下内容: Linux系统的并行性特征 互斥和同步机制 Linux中常用锁的基本特性 互斥锁和条件变量 2.Linux的并行性特征 Linux作为典型的多用户、多任务、抢占式内核调度的操作系统,为了提高并行处理能力,无论在内核层面还是在用户层面都需要特殊的机制来确保任务的正确性和系统的稳定运行,就如同一个国家需要各种法律条款来约束每个公民的行为,才能有条不紊地运转。 在内核层面涉及到各种软硬件中断、进线程睡眠、抢占式内核调度、多处理器SMP架构等,因此内核在完成自己工作的时候一直在处理这些资源抢占的冲突问题。 在用户层面的进程,虽然Linux作为虚地址模式操作系统,为每个进程开辟了独立的虚拟地址空间,伪独占式拥有资源,但是仍然存在很多场景不得不产生多个进程共享资源的问题,来完成进程间的通信,但是在Go语言中进程间的通信使用消息来完成,处理地更优雅一些。 在线程层面,线程作为进程的一部分,进程内的多个线程只拥有自己的独立堆栈等少量结构,大部分的资源还是过线程共享,因此多线程的资源占用冲突比进程更加明显,所以多线程编程的线程安全问题是个重难点。综上可知,无论在kernel还是user space都必须有一些机制来确保对于资源共享问题的解决,然后这个机制就是接下来要说的:同步和互斥。 3.同步和互斥机制 基本概念

牛客 C++刷题day50

一个人想着一个人 提交于 2019-12-02 03:32:25
1. (1) 进程间通信方法有:文件映射、共享内存、匿名管道、命名管道、邮件槽、剪切板、动态数据交换、对象连接与嵌入、动态连接库、远程过程调用等 (2) 事件、临界区、互斥量、信号量可以实现线程同步 进程中线程同步的四种常用方式:   1、 临界区(CCriticalSection)   当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止。具体应用方式:   1、 定义临界区对象CcriticalSection g_CriticalSection;   2、 在访问共享资源(代码或变量)之前,先获得临界区对象,g_CriticalSection.Lock();   3、 访问共享资源后,则放弃临界区对象,g_CriticalSection.Unlock();      2、 事件(CEvent)   事件机制,则允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。比如在某些网络应用程序中,一个线程如A负责侦听通信端口,另外一个线程B负责更新用户数据,利用事件机制,则线程A可以通知线程B何时更新用户数据。每个Cevent对象可以有两种状态:有信号状态和无信号状态。Cevent类对象有两种类型:人工事件和自动事件。   自动事件对象

智能指针是否线程安全

不问归期 提交于 2019-11-30 19:36:46
1.9 再论shared_ptr 的线程安全 虽然我们借shared_ptr 来实现线程安全的对象释放,但是shared_ptr 本身不是100% 线程安全的。它的引用计数本身是安全且无锁的,但对象的读写则不是,因为shared_ptr 有两个数据成员,读写操作不能原子化。根据文档11,shared_ptr 的线程安全级别和内建类型、标准库容器、std::string 一样,即: 一个shared_ptr 对象实体可被多个线程同时读取; 两个shared_ptr 对象实体可以被两个线程同时写入,“析构”算写操作; 如果要从多个线程读写同一个shared_ptr 对象,那么需要加锁。 请注意,以上是shared_ptr 对象本身的线程安全级别,不是它管理的对象的线程安全级别。 要在多个线程中同时访问同一个shared_ptr,正确的做法是用mutex 保护: MutexLock mutex; // No need for ReaderWriterLock shared_ptr < Foo > globalPtr; // 我们的任务是把globalPtr 安全地传给doit() void doit(const shared_ptr < Foo >& pFoo); globalPtr 能被多个线程看到,那么它的读写需要加锁。注意我们不必用读写锁,而只用最简单的互斥锁,这是为了性能考虑

2019年9月25日星期三(STM32 ucos3)

五迷三道 提交于 2019-11-30 13:30:16
一.UCOS 1.概念 uc/OS-III(Micro C OS Thee),微型C语言编写的操作系统第三版。是一个可升级,可固化,多任务基于优先级的可抢占式实时内核。 ucos的任务个数不限制,实现了操作系统所需求的大部分功能,资源管理,同步,任务之间的通信。除了这些基本的功能以外,还提供一些其他的实时性内核找不到的特色功能,比如完备的运行时间测量,也可以直接发送信号/消息到某个任务,任务也可以同时等待多个内核对象 由于ucos体积微小,功能强悍,可移植性强,在微控制器领域应用广泛 ucos要收费,有时候我们会选择免费的系统,比如freeRTOS....,以及一些其他和物联网结合操作系统(华为liteOS 阿里巴巴.. 腾讯..) 2.ucos移植 (1)源代码结构 EvalBoards ------------ 工程文件 uc-CPU -------------- CPU相关代码 uc-LIB -------------- 和硬件/编译器 无关的库函数(字符串 数学 内存) uCOS-III ----------- ucos操作系统相关代码 (2)将源码拷贝到工程,修改源码(详情见手册) (3)特性 3.ucos的任务调度和任务 合作式调度 -------- 多个任务按照指定时间和顺序依次运行,下一个任务等待上一个任务时间用完再开始运行 抢占式调度 --------

操作系统相关

谁说胖子不能爱 提交于 2019-11-30 12:30:53
一、进程间通信与线程间通信 进程间通信 1、管道 。管道是一种半双工的通信方式,数据只能单向流动,而且只能在有血缘关系的进程间使用,进程的血缘关系通常是指父子进程关系。 2、命名管道。 也是半双工的通信方式,但是它允许无亲缘关系关系进程间通信。 3、信号。 是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。 4、信号量。 信号量是一个计数器,可用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。 5、消息队列。 消息队列是由消息组成的链表,存放在内核中,并由消息队列标识符标识。消息队列克服了信号传递消息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 6、共享内存。 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式 7、套接字。 管道:速度慢、容量有限 消息队列:容量收到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。 信号量:不能传递复杂信息,只能用来同步。 共享内存:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全。 线程间通信 1、锁机制。 互斥锁、条件变量、读写锁 互斥锁提供了以排他方式防止数据结构被并发修改的方法。

操作系统第二章(二)

你说的曾经没有我的故事 提交于 2019-11-30 08:46:46
2.4 进程的互斥 1.互斥的定义:对某个系统资源,一个进程正在使用它,另外一个想用它的进程就必须等待,而不能同时使用 。 2.临界区:进程中访问临界资源的那段程序代码称为临界区或临界段。使用同一临界资源的不同进程中的临界区称为同类临界区或相关临界区。 3.临界区使用原则:每次至多有一个进程处于临界区; 当有若干个进程欲进入临界区时,应在有限的时间内使其进入; 进程在临界区内仅逗留有限的时间。 空则让进:当无进程在互斥区时,任何有权使用互斥区的进程可进入。 忙则等待:不允许两个以上的进程同时进入互斥区。 多中择一:当没有进程在临界区,而同时有多个进程要求进入临界区,只能让其中之一进入临界区,其他进程必须等待。 等则有限:任何进入互斥区的要求应在有限时间内得到满足。 等则让权:当进程不能进入临界区时,应立即释放CPU,避免进程忙等待。 4.用上锁和开锁原语可以解决并发进程的互斥 (1)任何欲进入临界区的进程,必须先执行上锁原语。若上锁原语顺利通过,则进程可进入临界区;当完成对临界区资源的访问后再执行开锁原语,以释放该临界资源。 (2)即在相关进程的程序里由上锁和开锁原语紧夹着临界区,就能保证这些进程互斥地进入各自的临界区。 例如: 但是这种情况会使得CPU忙等,浪费了资源。 2.5信号量机制 1.信号量原理 两个或多个进程可以利用彼此间收发的简单的信号来实现“正确的”并发执行

操作系统常见笔试面试题

♀尐吖头ヾ 提交于 2019-11-30 05:51:49
操作系统常见笔试面试题 Yuanke_S 2019年06月04日 50 0 本博客内容 一、进程与线程的关系以及区别 二、Windows下的内存是如何管理的 三、中断和轮询的特点 四、什么是临界区、如何解决冲突? 五、分段和分页的区别? 六、进程间通信有哪些方式?它们的区别? 七、线程间的通信机制 八、什么是死锁?产生条件?如何避免死锁 九、进程间同步与互斥的区别,线程同步的方式? 十、进程的调度算法有哪些? 一、进程与线程的关系以及区别 参考: https://blog.csdn.net/yaosiming2011/article/details/44280797 https://www.cnblogs.com/xymqx/p/4442329.html 1.定义:   进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.   线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 2.关系:   一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.   相对进程而言,线程是一个更加接近于执行体的概念

MFC多线程编程之四——线程的同步

柔情痞子 提交于 2019-11-30 04:18:01
八、线程的同步 虽然多线程能给我们带来好处,但是也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。 使隶属于同一进程的各线程协调一致地工作称为线程的同步。MFC提供了多种同步对象,下面我们只介绍最常用的四种: 临界区(CCriticalSection) 事件(CEvent) 互斥量(CMutex) 信号量(CSemaphore) 通过这些类,我们可以比较容易地做到线程同步。 A、使用 CCriticalSection 类 当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。 CCriticalSection类的用法非常简单,步骤如下: 定义CCriticalSection类的一个全局对象

uCOS-Ⅱ源码分析之uC-CPU文件夹

岁酱吖の 提交于 2019-11-29 14:38:26
此文共连载分析三个uCOS-Ⅱ的三个源码文件夹:uC-CPU 、uC-LIB 、uCOS-Ⅱ uC-LIB文件夹目录: ARM-Cortex-M3 / cpu_a.asm、cpu_c.c、cpu.h cpu_def.h cpu_def.h 这个文件中定义了一些 CPU 有关的宏定义,分为三类: 1、CPU 字节长度的定义,理想情况下 CPU 的字长应该是由 sizeof() 函数计算出来的,但是 sizeof() 函数必须在 CPU 运行中才能进行计算,所以在 uCOS 中直接用宏定义定义了出来 #define CPU_WORD_SIZE_32 4 // 定义 CPU 字节长度为 4 字节 2、CPU 字节顺序的定义,也就是 CPU 的大/小端模式的定义。 #define CPU_ENDIAN_TYPE_NONE 0 // 不知道是大端模式还是小端模式 #define CPU_ENDIAN_TYPE_BIG 1 // 大端模式 #define CPU_ENDIAN_TYPE_LITTLE 2 // 小端模式 3、临界区的定义和配置,临界区是指一个共用资源的程序片段,但共用资源程序片段一次只能被一个线程占用,当有一个线程正在访问临界区时,其他线程或进程就必须等待,以临界区共用资源的互斥使用(举例:打印机的使用,一个用户正在使用打印机,在未使用完成时

多线程相关概率解释

故事扮演 提交于 2019-11-29 05:47:28
1.多线程 条件:在一个进程下,1单cpu下的多线程称之为并发 ;2多cpu下的多线程称之为并行 并发: 并行: 2.竞态条件 当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。 临界区:导致竞态条件发生的代码区称作临界区;在临界区中使用适当的同步就可以避免竞态条件。 来源: https://www.cnblogs.com/wwmiert/p/11457110.html