临界区

进程同步与通信

倾然丶 夕夏残阳落幕 提交于 2020-01-21 00:06:55
进程同步与通信 操作系统教程: http://c.biancheng.net/cpp/html/2592.html 进程的同步与互斥是指进程在推进时的相互制约关系。 # 进程同步 :它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。为进程之间的直接制约关系。如生产者-消费者问题,哲学家进餐问题。 # 进程互斥 :它主要源于资源共享,是进程之间的间接制约关系。在多道系统中,每次只允许一个进程访问的资源称为临界资源,进程互斥就是保证每次只有一个进程使用临界资源。如访问控制台、打印机。 为禁止两个进程同时进入临界区,同步机制应遵循以下准则: 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区。 让权等待:当进程不能进入临界区时, 应立即释放处理器,防止进程忙等待 。 进程同步和互斥在不同的系统中有不同的实现。 Windows中的进程同步方法有信号量、事件,互斥方法有临界区、互斥锁。 Linux中的进程同步方法有?? 互斥方法有?? 信号量是一种功能较强的机制, 可用来解决互斥与同步 的问题,它只能被两个标准的原语wait(S)和signal(S)来访问,也可以记为“P操作”和“V操作”。 Wait 原语的实现 void

Operating Systems-tep Chapter4和Chapter5 读书笔记

筅森魡賤 提交于 2020-01-17 01:47:32
Chapter4 插曲:线程API pthread_create 线程创建 pthread_join 等待线程执行完成,可以接收等待线程执行完后的返回值 一个创建多个线程去并行执行特定任务并行程序会用join来确保所有的工作都完成,才退出或进入下一阶段工作。 phread_mutex_lock 是对一个锁变量上锁,pthread_mutex_unlock是对一个锁变量进行解锁。pthread_mutex_init 是初始化锁变量 phread_mutex_trylock 会在锁已经被持有时返回失败,phread_mutex_timedlock 会在得到了锁或者超时之后返回,因此,timelock函数在超时值为0时会退化成trylock函数。 pthread_cond_wait 会使调用线程休眠,等待其他线程唤醒它,wait函数会在线程休眠前释放这个锁。 书中列举了一些tips: Chapter5 锁 评估锁 评估锁的几个条件: 锁能够实现基本的任务,即提供互斥量。基本地,这个锁有效吗,能够阻止多线程进入同一个临界区吗? 公平。一旦锁空闲了,是否每个竞争该锁的线程都被公平对待?是否有竞争该锁的线程处于饥饿状态而一直得不到锁? 性能。一个是没有竞争的情况:当只有一个线程在运行、获取、释放锁,锁的开销有多少?另一个是多线程在单CPU上竞争同一个锁的情况,是否需要担心其性能?最后一点

进程的同步与互斥

帅比萌擦擦* 提交于 2020-01-15 05:39:49
在操作系统中,进程是占有资源的最小单位。 临界资源是指系统中一次只允许一个进程使用的资源(可以是硬件资源像打印机,也包括软件资源,如程序中的数据结构、表格和变量、文件等。)访问临界资源的那段代码称为临界区。 进程同步:它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。为进程之间的直接制约关系。 比如说进程A需要从缓冲区读取进程B产生的信息,当缓冲区为空时,进程B因为读取不到信息而被阻塞。而当进程A产生信息放入缓冲区时,进程B才会被唤醒。 进程互斥:主要源于资源共享,是进程之间的间接制约关系。 进程互斥就是保证每次只有一个进程使用临界资源。 比如进程B需要访问打印机,但此时进程A占有了打印机,进程B会被阻塞,直到进程A释放了打印机资源,进程B才可以继续执行。 同步和互斥这两种制约关系的区别: 进程的互斥是进程间竞争共享资源的使用权,这种竞争没有固定的必然关系;而进程同步时,涉及到共享资源的并发进程之间有一种必然的依赖关系。 使用系统中的临界资源时,诸进程应采取互斥方式,实现对资源的共享。为实现进程互斥的进入自己的临界区,可用软件方法,但更多的是在系统中设置专门的同步机制来协调各进程间的运行。所有的同步机制都应遵循以下四条准则: (1)空闲让进:因为,当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区

linux多线程同步

大憨熊 提交于 2020-01-14 00:21:31
1. 互斥量 是线程同步的一种机制,用来保护多线程的共享资源。同一时刻,只允许一个线程对临界区进行访问。互斥量的工作流程:创建一个互斥量,把这个互斥量的加锁调用放在临界区的开始位置,解锁调用放到临界区的结束位置。当内核优先把某个线程调度到临界区的开始位置时,线程执行这个加锁调用,并进入临界区对资源进行操作。此时其他线程再被内核调度到这里的时候,由于该互斥量已被加锁状态,得不到锁会一直阻塞在这里,导致其他线程不能进入临界区,直到刚刚那个进入临界区的线程离开临界区并执行解锁调用。 2. 条件变量 与互斥量不同,互斥量是防止多线程同时访问共享的互斥变量来保护临界区。条件变量是多线程间可以通过它来告知其他线程某个状态发生了改变,让等待在这个条件变量的线程继续执行。通俗一点来讲:设置一个条件变量让线程1等待在一个临界区的前面,当其他线程给这个变量执行通知操作时,线程1才会被唤醒,继续向下执行。 3. 读写锁 与互斥量的功能类似,对临界区的共享资源进行保护!互斥量一次只让一个线程进入临界区,读写锁比它有更高的并行性。读写锁有以下特点: 如果一个线程用读锁锁定了临界区,那么其他线程也可以用读锁来进入临界区,这样就可以多个线程并行操作。但这个时候,如果再进行写锁加锁就会发生阻塞,写锁请求阻塞后,后面如果继续有读锁来请求,这些后来的读锁都会被阻塞!这样避免了读锁长期占用资源,防止写锁饥饿

Linux线程(三)

假装没事ソ 提交于 2020-01-11 23:48:26
Linux线程(三) 一、互斥量 根据前面的分析,得到的结果不是我们想要的原因是–ticket操作不是原子操作,这个共享资源可能并发的切换大其他线程,导致有多个线程同时影响到这个共享资源,所以导致得到的结果不对。 1.解决方法(加锁—>Linux中叫这把锁为互斥量): 代码必须有互斥行为:当有一个执行流(有一个线程)进入临界区时,不允许其他线程进入该临界区 如果多个线程同时要求执行临界区的代码,并且临界区内没有线程在执行,那么只允许一个线程进入该临界区 如果线程不在临界区内执行,那么该线程不能阻止其他线程进入临界区 二、.互斥量的接口: 1.初始化互斥量 方法一:静态分配 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER 方法二:动态分配 int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 功能:初始化互斥量 参数:pthread_mutex_t *restrict mutex:要初始化的互斥量 const pthread_mutexattr_t *restrict attr:指定了新建互斥锁的属性。如果参数attr为NULL,则使用默认的互斥锁属性,默认属性为快速互斥锁 返回值

线程同步机制的区别与比较及进程通信方法

非 Y 不嫁゛ 提交于 2020-01-07 12:59:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 有关多线程的一些技术问题: 1、 何时使用多线程? 2、 线程如何同步? 3、 线程之间如何通讯? 4、 进程之间如何通讯? 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域之间不是绝对孤立的,他们有可能是重叠的,但是每个程序应该都可以归于某个领域: 1、 offloading time-consuming task。由辅助线程来执行耗时计算,而使GUI有更好的反应。我想这应该是我们考虑使用线程最多的一种情况吧。 2、 Scalability。服务器软件最常考虑的问题,在程序中产生多个线程,每个线程做一份小的工作,使每个CPU都忙碌,使CPU(一般是多个)有最佳的使用率,达到负载的均衡,这比较复杂,我想以后再讨论这个问题。 3、 Fair-share resource allocation。当你向一个负荷沉重的服务器发出请求,多少时间才能获得服务。一个服务器不能同时为太多的请求服务,必须有一个请求的最大个数,而且有时候对某些请求要优先处理,这是线程优先级干的活了。 4、 Simulations。线程用于仿真测试。 我把主要的目光放在第一个领域,因为它正是我想要的。第二和第三个领域比较有意思,但是目前不在我的研究时间表中。 线程的同步机制: 1、 Event 用事件(Event

java并发里的一些基础概念

半世苍凉 提交于 2020-01-04 05:15:15
转载自:https://my.oschina.net/hosee/blog/597934; 摘要: 本系列基于炼数成金课程,为了更好的学习,做了系列的记录。 本文主要介绍 1.高并发的概念,为以后系列知识做铺垫。 2.两个重要的定理 1、关于高并发的几个重要概念 1.1 同步和异步 首先这里说的同步和异步是指函数/方法调用方面。 很明显,同步调用会等待方法的返回,异步调用会瞬间返回,但是异步调用瞬间返回并不代表你的任务就完成了,他会在后台起个线程继续进行任务。 1.2 并发和并行 并发和并行在外在表象来说,是差不多的。由图所示,并行则是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。所以单个cpu是不能做并行的,只能是并发。 1.3 临界区(重要:自己以前都不知道是这么叫) 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。 1.4 阻塞和非阻塞 阻塞和非阻塞通常形容多线程间的相互影响。 比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。 非阻塞允许多个线程同时进入临界区 所以阻塞的方式

Java高并发-概念

末鹿安然 提交于 2020-01-04 05:14:20
一、为什么需要并行 业务要求 http处理多个客户端请求 java虚拟机启动多个线程 进程开销比线程大的多 性能 多线程在多核系统比单线程要好的多 摩尔定律失效 二、几个重要概念 2.1 同步和异步 synchronous,asynchronous 2.2 并发和并行 concurrency,parallelism 2.3 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。 2.4 阻塞和非阻塞 blocking,non-blocking 阻塞和非阻塞通常用来形容多线程音的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。 非阻塞允许多个线程同时进入临界区。 2.5 死锁、饥饿和活锁 deadlock,starvation,livelock 死锁:抢占资源而不释放 饥饿是指某一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行。比如某线程因优先级低获取不到资源。 活锁:电梯遇人 2.6 并行的级别 阻塞:当一个线程进入临界区后,其他线程必须等待 无障碍(Obstruction

系统学习java高并发系列一

僤鯓⒐⒋嵵緔 提交于 2020-01-04 05:13:05
转载请注明原创出处,谢谢! JAVA服务端或者后端需要大量的高并发计算,所以高并发在JAVA服务端或者后端编程中显的格外重要了。 首先需要有几个概念: 1.同步和异步 同步异步是来形容方法的一次调用的,同步必须等等方法调用结束后才可以继续后续的操作,而异步方法调用就会返回(真正的执行一般在另外一个线程中)就可以继续后续操作了。 2.并发和并行 这两个概念都是表示2个或者多个任务一起执行,而并发侧重的是多任务交替执行,就是一个时间点就只有一个任务(时间碎片很小),而并行是真正意义的同时执行(某个时间碎片有大于1个任务在执行)。 3.临界区 临界区这个概念非常重要,就是多个线程都会操作到的,是一个公共资源或者共享的数据,但是每次操作只能一个线程使用而一旦临界区资源被占用其他的线程必须等待该资源的释放,在并行程序中,临界区资源都是受保护的,如果不保护就会出现问题,达不到预期的效果。 4.阻塞和非阻塞 阻塞和非阻塞是形容多个线程之间的相互影响的(前提是多个线程而不是一个),一个线程占用了临界区资源那么其他线程必须在临界区之外等待,阻塞是操作系统层面挂起,上下文切换了,所以性能不高。阻塞如果一个线程一直占用不释放资源,那么其他需要该临界区资源都必须一直等。非阻塞就是运行多个线程同时进入临界区,只要保证不把数据修改坏就行。 由于临界区的存在,多线程并发必须受到控制。 根据控制并发的策略

操作系统-同步互斥

£可爱£侵袭症+ 提交于 2020-01-03 01:15:59
并发性:互斥和同步 基本概念 原子操作: 一个函数或动作由一个或多个指令的序列实现,对外是不可见的;保证指令的序列要么作为一个组执行, 要么都不执行,对系统状态没有可见的影响。 保证了并发的隔离。 临界区:一段代码,在这段代码中进程将访问共享资源,当另一个进程已经在这段代码中运行时,这个进程就不能在这段代码中运行。 临界资源:虽然多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程所使用,我们把一次只允许一个进程使用的资源成为临界资源。包括许多的物理设备如打印机,以及许多的变量和数据。 死锁:两个或两个以上的进程因其中的每个进程都在等待其他进程做完某些事情而不能继续执行。 活锁:两个或两个以上进程为了响应其他进程中的变化而持续改变自己的状态但不做有用的工作。 互斥:当一个进程在临界区访问共享资源的时候,其他进程不能进入该临界区访问任何共享资源。 同步:为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递消息所产生的制约关系。进程间的直接制约关系就是源于他们之间的相互合作。 竞争条件:多个线程或者进程在读写一个共享资源时,结果依赖于它们执行的相对时间,这种情形称为竞争条件 饥饿: 一个可运行的进程尽管能继续执行,但被调度程序无限期地忽视,而不能被调度执行的情形。 忙等待/自旋等待: 进程在得到临界区访问权之前