信号量

进程互斥与同步

℡╲_俬逩灬. 提交于 2020-01-04 04:53:08
解释并发与并行,并说明两者关系。 进程间有哪几种关系?分别要采取什么策略? 为什么说进程的互斥也是一种同步? 解释死锁与“饥饿”,并说明两者关系 。 什么叫做临界区?如何解决进程对临界资源的访问冲突? 信号量的物理意义是什么? 理解五个哲学家吃面问题,并能盲写出伪代码。 一个超市有n个顾客购物,只有一个收银员,试用信号量P、V操作描述顾客进程和收银员之间的关系。写伪代码。 答: 1、并行性是指两个或多个事件在同一时刻发生。并发性是指两个或多个事件在同一事件间隔内发生。 在多道程序环境下,并发性是指在一段时间内,宏观上有多个程序同时运行,但在单处理器(CPU)系统每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理器,则这些可以并发执行的程序便被分配到多个处理器上,实现并行执行,即利用每个处理器来处理一个可并发执行的程序。 2、进程间有竞争关系、协作关系。竞争关系会产生死锁、饥饿问题,解决死锁问题,系统规定一种打印机分配策略:总是把打印机分配给所打印文件最短的进程;解决饥饿问题的策略是FCFS资源分配策略。 3、进程互斥是指若干进程因相互争夺独占型资源而产生的竞争制约关系。进程同步是指为完成共同任务的并发进程基于某个条件来协调其活动,因为需要在某些位置上排定执行的先后次序而等待、传递信号或消息所产生的协作制约关系

同步与异步区别

 ̄綄美尐妖づ 提交于 2020-01-04 04:44:43
1、我们的生活中存在着很多同步异步的例子。 比如:你叫我去吃饭,我听到了就立刻和你去吃饭,如果我们有听到,你就会一直叫我,直到我听见和你一起去吃饭,这个过程叫同步;异步过程指你叫我去吃饭,然后你就去吃饭了,而不管我是否和你一起去吃饭。而我得到消息后可能立即就走,也可能过段时间再走。如果我请你吃饭,就是同步,如果你请我吃饭就用异步,这样你比较省钱。 2、在计算机领域 同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去; 异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。 同步是阻塞模式,异步是非阻塞模式。 我的理解:同步是指两个线程的运行是相关的,其中一个线程要阻塞等待另外一个线程的运行。异步的意思是两个线程毫无相关, 自己运行自己的。 举个例子:普通B/S模式(同步)AJAX技术(异步) 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 请求通过事件触发->服务器处理(这时浏览器仍然可以作其他事情)->处理完毕 当应用程序在对象上调用一个需要花费很长时间来执行的方法的时候,并且不需要让程序等待对方返回, 这时就应该使用异步编程。 3、而我们平时经常讨论的

操作系统之进程/线程通信

家住魔仙堡 提交于 2020-01-03 03:26:38
进程适用于多核、多机(socket)分布;线程适用于多核。 一、进程间通信 1、管道 1.1 半双工管道PIPE 1)半双工,数据只能在一个方向流动,具有固定的读端和写端 2)只能用于父子进程或者兄弟进程 3)不属于任何文件系统,只存在于内存中 1.2 命名管道FIFO 1)FIFO可以在无关的进程之间交换数据 2)FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中 2、系统IPC 2.1 消息队列 消息队列是消息的链接表,存放在内核中。特点: 1)消息队列是面向于记录的,其中的消息具有特定的格式以及特定的优先级 2)消息队列独立于发送和接收进程。进程终止时,消息队列及其内容并不会被删除 3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。 2.2 信号量semaphore 它是一个计数器,可以用来控制多个进程对共享资源的访问。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。特点: 1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。 2)信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作。 3)每次对信号量的PV操作不仅限于对信号量的加1减1,可以加减任意正整数。 4)支持信号量组 2.3 信号signal 信号是比较复杂的通信方式,用于通知接收进程某个时间已经发生。 2.4

操作系统 练习题

十年热恋 提交于 2020-01-03 02:11:22
1. 请画出进程状态转换图。并说明是什么时间引起的每种状态变迁。 2. 操作系统一般分为几个组成部分,各部分都具有什么功能 ? 3. 某个虚拟存储器的用户空间共有 32 个页面,每页为 1KB ,内存为 16KB 。假定某时刻一用户的页表已调入内存的页面号和物理块号对照表如下: 页号 物理块号 0 5 1 10 2 4 3 7 则逻辑地址 0x0A5D 所对应的物理地址是什么? 4. 假定某进程共有 8 个页面,分配了 4 个物理内存块,其页面的使用情况如下列表,如果进程使用了 FIFO 置换算法,请画出进程运行时页面的置换图,并在图上标明进程是否换页。 1, 2, 3, 4, 2, 1, 5, 6, 2, 1, 2, 3, 7, 6, 3, 2, 0 5. 现有一个作业,在段式存储管理的系统中已为其主存分配,建立的段表内容如下: 段号 主存起始地址 段长度 0 120 40 1 760 30 2 480 20 3 370 20 计算逻辑地址( 2 , 15 ),( 0 , 60 ),( 3 , 18 )的绝对地址是多少? 注:括号中第一个元素为段号,第二个元素为段内地址。 6. 有 4 个并发执行的进程 A , B , C , D 。在执行时它们都要读共享文件 F ,但限制进程 A 和进程 B 不能同时读文件 F ,进程 C 和进程 D 也不能同时读文件 F 。请问用 PV

操作系统-同步互斥

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

SylixOS任务调度分析

瘦欲@ 提交于 2020-01-02 19:10:12
1. 任务调度相关链表 SylixOS将任务控制块加入到不同的任务调度链表进行管理,创建一个任务就会把新创建的任务加入到优先级就绪表,等待被调度执行。根据不同的任务阻塞原因会被加入到不同的阻塞表中。 1.1 优先级就绪表 图 1.1 任务优先级就绪表 SylixOS系统启动的过程会初始化一个任务优先级就绪表,当创建新任务时,根据任务的优先级加入到对应的优先级就绪表中,如图 1.1所示。系统启动过程创建一个优先级最低的IDLE任务。 1.2 任务控制块地址表 图 1.2 任务TCB地址表 创建新任务添加到就绪表的同时加入到任务控制块地址表。当调用任务挂起函数API_ThreadSuspend时,把任务控制块从优先级队列中取出,更新TCB地址表中的任务状态。当调用任务恢复函数API_ThreadResume时,从TCB地址表中获取到任务控制块更新到优先级就绪表,等待执行。 1.3 延时阻塞表 图 1.3 任务延时阻塞表 调用任务休眠函数API_TimeSleep时,任务被加入到延时阻塞表,等待任务延时时间到,从延时阻塞表中取出加入到就绪表中。 1.4 事件阻塞表 图 1.4 事件阻塞表 如图 1.4所示,以信号量阻塞为例,创建信号量时获取一个事件控制块,当获取信号量被阻塞就被加入到事件控制块的阻塞表中,如果设置了等待时间同时会被加入到延时阻塞表。当获取到信号量或是等待超时

Linux进程间通信

一曲冷凌霜 提交于 2020-01-01 16:10:02
写在前面 为什么 要进行进程间通信? 因为进程间具有独立性(每一个进程都有自己的虚拟地址空间,进程A并不知道进程B的虚拟地址空间中的内容),因此导致了进程之间协作的问题 进程间通信的 目的 : 数据传输:一个进程需要将它的数据发送给另一个进程 数据共享:多个进程间需要共享同样的数据、资源 进程控制:一个进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变 进程间通信 分类 : 管道 System V IPC POSIX IPC 网络 是当前最大的进程间通信 本篇文章中只针对管道及System V中的共享内存、消息队列和信号量进行解释 管道 概念: 我们把从一个进程连接到另一个进程的一个数据流称为一个管道 管道是Unix中最古老的进程间通信的形式。它本质是一个内核中的内存,也可以将这块内存称为缓冲区,当其中的数据被读走后,管道就为空 管道是半双工的,即数据只能由一个流向 匿名管道 # include <unistd.h> int pipe(int fd[2]); 功能:创建一个匿名管道 参数:fd[]:文件描述符数组,fd[0]表示读端,fd[1]表示写端,使用这一对文件描述符访问内存 返回值:成功返回0,失败返回-1 【注】: 1、pipe()函数的参数是 输出型参数 ,也就是意味着需要传入一个int类型数组,数组大小为2

并发技术、进程、线程和锁拾遗

点点圈 提交于 2020-01-01 00:48:07
并发技术、进程、线程和锁拾遗 Part1. 多任务 计算机发展起初,CPU 资源十分昂贵,如果让 CPU 只能运行一个程序那么当 CPU 空闲下来(例如等待 I/O 时),CPU 资源就会被浪费,为了使 CPU 资源得到更好的利用,先驱编写了一个监控程序,如果发现某个程序暂时无需使用 CPU 时,监控程序就把另外的正在等待 CPU 资源的程序启动起来,以充分利用 CPU资源。这种方法称为 - 多道程序(Multiprogramming) 对于多道程序,最大的弊端是各程序之间不区分轻重缓急,对于用户交互式的程序来说,对 CPU 计算时间的需求并不多,但是对于响应速度却有比较高的要求。而对于计算类程序来说则相反,对响应速度要求低,但需要长时间的 CPU 计算。想象一个场景:我在同时在浏览网页和听音乐,我们希望浏览器能够快速响应,同时也希望音乐不停,这时候 多道程序 就没法达到我们的要求了。 于是人们改进了 多道程序 ,使得每个程序运行一段时间之后,都主动让出 CPU 资源,这样每个程序在一段时间内都有机会运行一小段时间。这样像浏览器这样的交互式程序就能够快速地被处理,同时计算类程序也不会受到很大影响。这种程序协作方式被称为 分时系统(Time-Sharing System) 。 在分时系统的帮助下,我们可以边用浏览器边听歌了。 但是 如果某个程序出现了错误,导致了死循环

信号量与条件变量的区别

。_饼干妹妹 提交于 2020-01-01 00:22:59
注意信号量与条件变量的区别 信号量内容可见:http://www.cnblogs.com/charlesblc/p/6142868.html 信号量、共享内存,以及消息队列等System V IPC三剑客主要关注 进程间通信 ; 而条件变量、互斥锁,主要关注 线程间通信 。 下面内容参考: http://blog.chinaunix.net/uid-27164517-id-3282242.html pthread_cond_wait指的是 条件变量 ,总和一个 互斥锁结合使用 。在 调用pthread_cond_wait前要先获取锁 。pthread_cond_wait函数执行时先 自动释放 指定的锁,然后等待条件变量的变化。在函数调用返回之前,自动将指定的互斥量 重新锁住 。 int pthread_cond_signal(pthread_cond_t * cond); pthread_cond_signal通过条件变量 cond发送消息 ,若多个消息在等待,它 只唤醒一个 。 pthread_cond_broadcast可以唤醒所有。调用pthread_cond_signal后要 立刻释放互斥锁 ,因为pthread_cond_wait的最后一步是要将指定的互斥量重新锁住,如果pthread_cond_signal之后没有释放互斥锁,pthread_cond_wait仍然要阻塞

J.U.C并发工具类

你。 提交于 2019-12-30 02:50:26
目录 目标 CountDownLatch Semaphore CyclicBarrier Runnable和Callable fork/join并发处理框架 目标 并发工具类:CountDownLatch Fork/Join的使用 Futrue的使用 CountDownLatch 倒计数器。共享锁。由AQS共享锁实现。 countDown();-》倒计数器减一,并阻塞。 await();当countDown();为0时唤醒所有线程。 使用场景:希望n个线程同时执行某一操作。 基本使用 /* 没隔1s开启一个线程,共开启6个线程 若希望6个线程 同时 执行某一操作 可以用CountDownLatch实现 */ public static void test01 ( ) throws InterruptedException { CountDownLatch ctl = new CountDownLatch ( 6 ) ; for ( int i = 0 ; i < 6 ; i ++ ) { new Thread ( ) { @Override public void run ( ) { ctl . countDown ( ) ; try { ctl . await ( ) ; System . out . println ( "here I am..." ) ; } catch (