信号量

生产者与消费者

ε祈祈猫儿з 提交于 2019-11-30 02:19:10
生产者信号量producer(100); 消费者信号量consumer(0); 生产者是盛饭的,A桌子上有100个空碗就相当于有100个信号量。获得一个信号量相当于别人从桌子拿起一个碗递给他,他盛了1碗饭。A桌子总的碗数减1(A.acquire())A--。B桌子上有1碗可以吃(B.release())B++。 消费者是吃饭的,B桌子多少碗可以吃的饭就是多少个信号量,一开始B桌子上没有饭,所以他一开始的信号量为0。获得一个信号量相当于吃了1碗饭(B.acquire())B--。吃完空碗放到A桌(A.release())A++。A多了一个可以用来盛饭的碗。 来源: https://www.cnblogs.com/xpylovely/p/11546413.html

第十五章、Python多线程之信号量和GIL

孤街浪徒 提交于 2019-11-30 02:14:38
目录 第十五章、Python多线程之信号量和GIL 1. 信号量(Semaphore) 2. GIL 说明: 第十五章、Python多线程之信号量和GIL 1. 信号量(Semaphore) 信号量用来控制线程并发数的,Semaphore管理一个内置的计数 器,每当调用acquire()时-1,调用release()时+1。计数器不能小于0,当计数器为 0时,acquire()将阻塞线程至同步锁定状态,直到其他线程调用release()。其实就是控制最多几个线程可以操作同享资源。 import threading import time semaphore = threading.Semaphore(5) def func(): if semaphore.acquire(): print (threading.currentThread().getName() + '获取共享资源') time.sleep(2) semaphore.release() for i in range(10) t1 = threading.Thread(target=func) t1.start() -------------------------------------------------- Thread-1获取共享资源 Thread-2获取共享资源 Thread-3获取共享资源 Thread

信号量Semaphore

孤者浪人 提交于 2019-11-30 01:01:48
信号量Semaphore 同进程的一样 Semaphore管理一个内置的计数器, 每当调用acquire()时内置计数器-1; 调用release() 时内置计数器+1; 计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。 from threading import Thread,currentThread,Semaphore import time def task(): sm.acquire() print(f'{currentThread().name}在执行') time.sleep(3) sm.release() sm=Semaphore(5) for i in range(15): t=Thread(target=task) t.start() 来源: https://www.cnblogs.com/aden668/p/11542639.html

System V信号量

柔情痞子 提交于 2019-11-29 22:25:36
目录 1. System V IPC 概述 IPC键和ftok函数 ipc_perm结构 创建与打开IPC对象 ipcs和ipcrm命令 2. System V信号量 计数信号量集 semget semop semctl 3. 测试程序 代码实现 semcreate.c semrmid.c semsetvalues.c semgetvalues.c semops.c 运行测试 1. System V IPC 概述 以下三种类型的IPC合称为System V IPC: System V信号量 System V消息队列 System V共享内存 System V IPC在访问它们的函数和内核为它们维护的信息上有一些类似点,主要包括: IPC键和ftok函数 ipc_perm结构 创建或打开时指定的用户访问权限 ipcs和ipcrm命令 下表汇总了所有System V IPC函数。 信号量 消息队列 共享内存 头文件 sys/sem.h sys/msg.h sys/shm.h 创建或打开IPC的函数 semget msgget shmget 控制IPC操作的函数 semctl msgctl shmctl IPC操作函数 semop msgsnd msgrcv shmat shmdt IPC键和ftok函数 三种类型的System V IPC都使用IPC键作为它们的标识

进程通信/线程同步方式总结

杀马特。学长 韩版系。学妹 提交于 2019-11-29 22:17:18
Linux进程间通信IPC 1. 套接字socket:用于不同机器之间的进程间通信。 2. 信号(signal):信号用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。 3. 管道(pipe):半双工,父子进程间单向传输。 4. 有名管道FIFO(mkfifo):半双工,可在无亲缘关系进程间传输。 5. 流管道(popen/pclose):可双向传输。 6. 文件锁:flock。 7. 内存文件映射(mmap) 8. 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。 9. 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 10. 消息队列:消息队列是消息的链接表,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。 消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 System V IPC与Posix IPC 1. System V IPC: 共享内存:shmget/shmat/shmdt/shmctl 信号量: semget/semctl/semop 消息队列:msgget/msgctl/msgrcv/msgsnd 2. Posix IPC: 共享内存:shm_open/shm_unlink/ftruncate/fstat 信号量:

c++面试题(线程与进程篇)

亡梦爱人 提交于 2019-11-29 21:54:44
●多进程和多线程的区别 进程它是具有独立地址空间的,优点就是隔离度好,稳定,因为它是操作系统管理的,进程和进程之间是逻辑隔离的,只要操作系统不出问题的话,一个进程的错误一般不会影响到其它进程,缺点就是信息资源共享麻烦。而线程只是进程启动的执行单元,它是共享进程资源的,创建销毁、切换简单,速度很快,占用内存少,CPU利用率高。但是需要程序员管控的东西也比较多,相互影响出问题的机率较大,一个线程挂掉将导致整个进程挂掉,所以从程序员的角度来讲,我们只能看到某种代码是线程安全的,而没有说进程安全的。 ●在进程和线程上,应该怎么选择 我们平时在写代码的时候一般使用线程会比较多,像需要频繁创建销毁的,要处理大量运算、数据,又要能很好的显示界面和及时响应消息的优先选择多线程,因为像这些运算会消耗大量的CPU,常见的有算法处理和图像处理。还有一些操作允许并发而且有可能阻塞的, 也推荐使用多线程. 例如SOCKET, 磁盘操作等等。进程一般来说更稳定,而且它是内存隔离的,单个进程的异常不会导致整个应用的崩溃,方便调试,像很多服务器默认是使用进程模式的。 ●线程之间是如何通信的 一个是使用全局变量进行通信,还有就是可以使用自定义的消息机制传递信息。其实因为各个线程之间它是共享进程的资源的,所以它没有像进程通信中的用于数据交换的通信方式,它通信的主要目的是用于线程同步

【操作系统】基础知识整理 & 常见面试题

最后都变了- 提交于 2019-11-29 19:06:45
操作系统 1 操作系统概述 操作系统的四个特性 操作系统的五大功能 2 进程 进程的定义 进程的状态 进程的特性 进程的同步、互斥和通信 a 竞争关系 和 进程互斥 b 协作关系 和 进程同步 c 进程通信 3 线程 线程的定义 线程的性质 线程通信 线程同步和互斥 线程机制的优点: 4 进程 VS. 线程 进程与线程之间的关系 进程与线程之间的区别 多进程与多线程之间的区别 5 处理机调度 用户态和核心态 处理机调度的层次 操作系统的常见进程调度算法 6 存储器管理 7 虚拟存储器 定义 特征 实现方法 页面置换算法(服务于分页请求系统) 常见面试题 1 操作系统概述   操作系统是管理和控制计算机系统中各种硬件和软件资源、合理地组织计算机工作流程的系统软件,是用户与计算机之间的接口。 操作系统的四个特性 并发 :同一段时间内多个程序执行(注意区别并行和并发,前者是同一时刻的多个事件,后者是同一时间段内的多个事件); 共享 :系统中的资源可以被内存中多个并发执行的进线程共同使用; 虚拟 :通过时分复用(如分时系统)以及空分复用(如虚拟内存)技术实现把一个物理实体虚拟为多个; 异步 :系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进。   操作系统最基本的特征是并发和共享,两者互为存在条件。 操作系统的五大功能 处理机管理 :处理机分配都是以进程为单位

生产者-消费者问题

烂漫一生 提交于 2019-11-29 16:28:12
目录 1. 概述 定义 缓冲区 2. 典型模型 模型一 模型二 可选需求 3. 数据结构队列C语言实现 4. 代码实现——互斥锁 + 条件变量 5. 代码实现——互斥锁 + Posix有名信号量 6. 代码实现——互斥锁 + Posix无名信号量 7. 效率对比 结论 奇怪的问题 1. 概述 定义 生产者消费者问题是线程同步的经典问题,也称为有界缓冲区问题,问题描述大致如下: 生产者和消费者之间共享一个有界数据缓冲区 一个或多个生产者(线程或进程)向缓冲区放置数据 一个或多个消费者(线程或进程)从缓冲区取出数据 缓冲区 生产者消费者问题中的缓冲区,包括队列缓冲区和环形缓冲区,它们都按照先进先出的顺序处理数据,我们现在只考虑队列缓冲区: 队列缓冲区通常使用普通的队列数据结构 队列内部实现可以是链表或数组 缓冲区有两个极端状态:缓冲区空,缓冲区满。链表队列和数组队列缓冲区空的含义相同,都是队列中没有一个元素的情形,但两者缓冲区满的含义不同: 数组队列在初始化时就必须指定最大容量,缓冲区满的条件很清晰 链表队列没有最大容量的概念,需要人为指定 此外,Posix消息队列也可以作为队列缓冲区,Posix当以无优先级消息的方式使用时,也是按照先进先出的顺序进行处理的。 本文只讨论第一种数据结构队列缓冲区,基于Posix消息队列缓冲区的生产者消费者问题,会在后续Posix消息队列中单独讲解。 2

Posix信号量

孤街浪徒 提交于 2019-11-29 15:39:37
目录 1. Posix IPC 概述 IPC名字 创建与打开IPC 读写权限与创建标志 用户访问权限 IPC对象的持续性 2. 信号量概述 信号量定义及分类 信号量操作 信号量、互斥锁和条件变量的差异 3. Posix有名信号量 创建和打开 关闭和删除 等待和挂出 获取信号量的值 4. Posix无名信号量 5. Posix信号量限制 1. Posix IPC 概述 以下三种类型的IPC合称为Posix IPC: Posix信号量 Posix消息队列 Posix共享内存 Posix IPC在访问它们的函数和描述它们的信息上有一些类似点,主要包括: IPC名字 创建或打开时指定的读写权限、创建标志以及用户访问权限 下表汇总了所有Posix IPC函数。 信号量 消息队列 共享内存 头文件 semaphore.h mqueue.h sys/mman.h 创建、打开或删除IPC的函数 sem_open sem_close sem_unlink sem_init sem_destroy mq_open mq_close mq_unlink shm_open shm_unlink 控制IPC操作的函数 mq_getattr mq_setattr ftruncate fstat IPC操作函数 sem_wait sem_trywait sem_post sem_getvalue mq_send

SylixOS定时器测试误差分析

元气小坏坏 提交于 2019-11-29 14:38:41
测试模型 1.1 测试流程 图 1.1 运行流程 如图 1.1所示为测试代码运行流程,通过GPIO拉高到拉低的时间来判断定时器的精准度。 1.2 测试方法 1.2.1 测试模型 利用ZYNQ内部私有定时器,设置定时时间250μs并绑定中断。在中断服务程序中拉高GPIO,下一次进入中断服务程序时拉低GPIO并且发送二进制信号量。在应用程序中创建高优先级任务接收二进制信号量并且模拟负载,创建10个中优先级任务模拟负载,连接示波器测量时间。 1.2.2 测试干扰项 其他不同优先级的中断; 其他负载程序; 二进制信号量; 1.3 测试结果 程序运行时会产生如图 1.2所示波形。 图 1.2 正常波形 使用示波器抓波功能,如图 1.3图 1.4所示抓取电平拉低与拉高的时间间隔,经过12小时抓取小于242μs的的波形未出现,经过12小时抓取大于258μs的波形未出现。 图 1.3 抓取小于242μs波形 图 1.4 抓取大于258μs波形 测试结果可以看到误差范围在242μs到258μs之间,所以误差大小为±8μs。 误差分析 从程序运行流程来看,到达定时时间250μs后: ○1中断产生; ○2响应中断服务程序; ○3拉GPIO; (一) 如果到达250μs定时时间时,中断产生之前发生系统关中断,则中断无法响应;SylixOS最大关中断时间7μs;此时则可能产生误差; (二)