信号量

计算机操作系统第二章测试题及答案

霸气de小男生 提交于 2019-12-02 10:06:27
题目 1 of 28 1.0/ 1.0 得分 下列的进程状态变化中,( )变化是不可能发生的。 A. 等待→执行 B. 等待→就绪 C. 执行→等待 D. 执行→就绪 答案: A 反馈: 等待→执行 题目 2 of 28 1.0/ 1.0 得分 用P、V操作管理临界区时,信号量的初值应定义为( )。 A. 任意值 B. 1 C. 0 D. -1 答案: B 反馈: 1 题目 3 of 28 1.0/ 1.0 得分 分配到必要的资源并获得处理机时的进程状态是( )。 A. 执行状态 B. 就绪状态 C. 阻塞状态 D. 撤消状态 答案: A 反馈: 执行状态 题目 4 of 28 1.0/ 1.0 得分 下面对进程的描述中,错误的是( )。 A. 进程是指令的集合 B. 进程是动态的概念 C. 进程是有生命期的 D. 进程执行需要处理机 答案: A 反馈: 进程是指令的集合 题目 5 of 28 1.0/ 1.0 得分 在操作系统中,进程是一个具有一定独立功能的程序在某个数据集上的一次( )。 A. 运行活动 B. 等待活动 C. 单独操作 D. 关联操作 答案: A 反馈: 运行活动 题目 6 of 28 1.0/ 1.0 得分 P、V操作是( )。 A. 两组不同的机器指令 B. 两条高级进程通信原语 C. 两条低级进程通信原语 D. 两条系统调用命令 答案: C 反馈:

并发 信号量 Semaphore

独自空忆成欢 提交于 2019-12-02 08:51:14
what: Semaphore是用来控制同时访问特定资源的线程数量,他通过协调各个线程,以保证合理的使用公共资源。 why: 每个资源所能承受的并发负载是有限的。 how: Semaphore可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发的读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有10个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,就可以使用Semaphore来做流量控制,如下所示。 public class SemaphoreTest { private static final int THREAD_COUNT=30; private static ExecutorService threadPool =Executors.newFixedThreadPool(THREAD_COUNT); private static Semaphore s = new Semaphore(10); public static void main(String[] args) { for (int i = 0; i < THREAD_COUNT; i++) { threadPool.execute(new

WaitForSingleObject[转]

大憨熊 提交于 2019-12-02 06:54:37
在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情(比如主线程等待子线程结束完之后,自己再结束),要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待Object被标为有信号(signaled)时才返回的。 那么,信号是什么呢?首先我们可以假设这里存在一个文件和两个线程,我们规定这个文件同一时刻只能被一个线程所访问打开,那么我们的线程该如何知道这个文件现在有没有被别的线程访问呢?我们可以让线程等在一个死循环里,这个循环之一在尝试打开访问这个文件,直到能够打开为止;这样做虽然可以实现目的,但是死循环会占用大量的内存,所以windows就设置了信号量。信号量的作用简单理解就是一个标志位,在我们上述的问题中,这个文件就有一个信号量,初始时我们设信号量为FALSE,而只有当信号量为FALSE时线程才可以打开访问这个文件。那么,当第一个线程到达,信号量为FALSE,线程打开文件进行访问,并将信号量置为TRUE;在第一个线程在访问文件时,第二个线程到来,此时信号量仍未TRUE,所以第二个线程等待,这个等待的过程就是WaitForSingleObject。WaitForSingleObject在等待的过程中会进入一个非常高效的沉睡等待状态,只占用极少的CPU时间片。

软考总结-----PV操作

為{幸葍}努か 提交于 2019-12-02 06:48:11
PV操作是操作系统中一个很重要的内容,小编今天就来给大家就pv操作做一个详细的解析。 首先P代表操作,V代表释放 P操作使S=S-1,若S<0,进程暂停执行,放入信号量的等待队列。 V操作使S=S+1,若S<=0,唤醒等待队列中的一个进程。 注:此时提到了一个新的概念,信号量, 信号量是一种特殊的整型变量,根据控制对象的不同被赋予不同的值。 信号量分为两类: (1)公共信号量。实现进程间的互斥,初值为1或资源的数目 (2)私用信号量。实现进程间的同步,初值为0或某个正整数。 进程同步和进程互斥: 来源: https://blog.csdn.net/YaraRen/article/details/102732825

Linux 的 进程/线程 通信方式总结

旧城冷巷雨未停 提交于 2019-12-02 05:44:29
linux 系统中的进程通信方式主要以下几种: PIPE(FIFO) 消息队列 信号量(Semaphore) 共享存储 SOCKET 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue), 和共享内存(Shared Memory) 网络主机间的进程通信方式 * RPC: Remote Procedure Call 远程过程调用 * Socket: 当前最流行的网络通信方式, 基于TCP/IP协议的通信方式. 各自的特点: 管道(PIPE):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系(父子进程)的进程间使用。另外管道传送的是无格式的字节流,并且管道缓冲区的大小是有限的(管道缓冲区存在于内存中,在管道创建时,为缓冲区分配一个页面大小)。 有名管道 (FIFO): 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 信号(Signal): 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 信号量(Semaphore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此

牛客 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类对象有两种类型:人工事件和自动事件。   自动事件对象

day 30

梦想与她 提交于 2019-12-02 03:19:49
day 30 GIL、死锁现象、信号量、线程队列 01.GIL全局解释器锁(基于Cpython) GIL本质是一个互斥锁 为了阻止同一进程内多线程同时执行(并行) 单个进程下无法实现多线程并行,只能实现并发 在线程处于非阻塞态时,GIL保证了线程对解释器的使用权为串行,遇到线程进入阻塞态时释放它(同时保证其不被垃圾回收机制回收),接收下一个线程进行运行 多线程作用; 在IO密集型的情况下使用多线程可以节省内存和时间(多进程遇到大量的IO操作进入阻塞态,也会变成 保存状态+切换 和多线程的并发相同,还要浪费时间去开辟内存空间) 在计算密集型的程序中使用多进程并行可以节省很多运算时间(有几个核心就有几个进程同时运行) 02.死锁现象 加锁与释放锁分别放在两个线程当中,a的钥匙锁在b里,b的钥匙锁在a里 导致锁解不开,下一个线程就无法抢到该锁,导致程序一致处于等待状态 递归锁RLock;用于解决死锁问题 一把锁可以提供给多个线程去使用,在一个线程内可以上多重该锁 mutex = Rlock() # 创建一个递归锁,用法与互斥锁相同 递归锁必须要在被释放之后才能再次绑定给另一个线程 03.信号量 Semaphore管理这一个内置的计数器 是可以被多个人同时使用的锁,其特点为, from threading import current_thread import time sm =

锁与队列

陌路散爱 提交于 2019-12-02 03:10:53
死锁 - 指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程 from threading import Thread import time mutexA = Lock() mutexB = Lock() class MyThread(Thread): def run(self): self.func1() self.func2() def func1(self): mutexA.acquire() print('\033[41m%s 拿到A锁\033[0m' %self.name) mutexB.acquire() print('\033[42m%s 拿到B锁\033[0m' %self.name) mutexB.release() mutexA.release() def func2(self): mutexB.acquire() print('\033[43m%s 拿到B锁\033[0m' %self.name) time.sleep(2) mutexA.acquire() print('\033[44m%s 拿到A锁\033[0m' %self.name) mutexA.release() mutexB.release() if _

信号量

走远了吗. 提交于 2019-12-02 00:54:58
https://blog.csdn.net/liuxd3000/article/details/17913363 来源: https://www.cnblogs.com/Inko/p/11723704.html

PV操作示例详解

牧云@^-^@ 提交于 2019-12-02 00:10:54
转发自: https://blog.csdn.net/wuxy720/article/details/78936912 信号量机制: 1965年,荷兰学者DIJKSTRA提出的信号量机制是一种卓有成效的进程同步工具。在长期且广泛的应用中,信号量机制又得到了很大的发展。 信号量的作用: 控制共享资源的使用权(满足互斥条件) 标志某事件的发生 使两个或两个以上的进程的行为同步 信号量的实质: 像是一把钥匙,进程要运行下去,需要先拿到这把钥匙,通俗点来讲就是在允许的信号量下,进程才能够执行。 接下来,我们就来看看如何通过操作信号量,来实现控制进程的执行。 PV的操作: pv操作:就是来解决互斥与同步的问题的。PV操作是分开来看的。 首先来看 P操作( 申请资源操作) (等待信号量): 信号量有效(值>0) 信号量值减1 任务继续运行 信号量值=0 等待信号量的进程被列入等待信号量进程列表。 可以理解为: if ( (s = s - 1) >= 0 ) 继续执行本进程; else 挂起本进程/本进程等待; 然后再来看 V操作( 释放资源操作 ) : 没有进程等待信号量 信号量的值加1 有进程等待信号量 信号量的值加1 等待的其中一个进程进入就绪状态 可以理解为: if ( (s = s + 1) >0 ) 不唤醒s的队列中的等待进程; else // (s = s + 1) <= 0