信号量

OS2 进程的描述与控制

心已入冬 提交于 2019-12-01 07:18:14
OS-2 进程的描述与控制 【进程的定义】: 进程(process)是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。它是系统进行资源分配和调度的基本单位。 【进程的特性】: 动态性:进程具有动态的地址空间,地址中间的大小和内容都是动态变化的。 并发性:指多个进程实体同存于内存中,且能够在一段时间内同时运行。 独立性:各进程的地址空间相互独立,除非采用进程间通信手段,否则不能相互影响。 异步性:指进程以各自独立的、不可预知的速度向前推进。 【进程的三种基本状态】: v 进程在从创建到终止的全过程中一直处于一个不断变化的过程。为了刻画进程的这个变化过程,所有操作系统都把进程分成若干种状态,约定各种状态间的转换条件。 就绪状态(Ready) :进程已获得除处理器外的所需资源,等待分配处理器资源,只要分配了处理器进程就可执行的状态。 执行状态(Running): z 用户态(目态) z 系统态(内核态、管态) v 阻塞状态(Blocked):当进程由于等待I/O操作或进程同步等条件而暂停运行时,它处于阻塞状态。在条件满足之前,即使把处理器分配给该进程,它也是无法继续执行的。也称为“等待状态”、“封锁状态”、“睡眠状态”。 【具有挂起状态的进程状态转换】: 挂起操作的引入是因为操作系统中引入了虚拟内存技术,即将外存的一部分空间用作存放进程和数据程序等等

2-8 信号量 Event 定时器

…衆ロ難τιáo~ 提交于 2019-12-01 06:48:23
一 信号量 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群路人争抢公共厕所,公共厕所有多个坑位,这意味着同一时间可以有多个人上公共厕所,但公共厕所容纳的人数是一定的,这便是信号量的大小 from threading import Thread,Semaphore import threading import time def func(): sm.acquire() print('%s get sm' %threading.current_thread().getName()) time.sleep(3) sm.release() if __name__ == '__main__': sm=Semaphore(5) for i in range(23): t=Thread(target=func) t.start() 解析 Semaphore管理一个内置的计数器, 每当调用acquire()时内置计数器-1; 调用release() 时内置计数器+1; 计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。 二 Event 线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其

Python中线程同步与线程锁

百般思念 提交于 2019-12-01 03:28:29
文章目录 线程同步与线程锁 线程同步 1.threading.Event对象 2.threading.Timer定时器,延迟执行 3.threading.Lock锁 4.可重入锁RLock 5.Condition条件锁,等待通知 6.therading.Semaphore信号量 7.threading.BoundedSemaphore有界信号量 总结 线程同步与线程锁 线程同步 概念 * 线程同步,线程间协同,通过某种技术,让一个线程访问某些数据时,其他线程不能访问这些数据,直到该线程完 成对数据的操作。 1.threading.Event对象 Event事件,是线程间通信机制中最简单的实现,使用一个内部的标记flag,通过flag的True或False的变化 来进行操作 名称 含义 event.set() 标记设置为True event.clear() 标记设置为False event.is_set() 标记是否为True event.wait(timeout=None) 设置等待标记为True的时长,None为无限等待。等到返回True,未等到超时了返回False 老板雇佣了一个工人,让他生产杯子,老板一直等着这个工人,直到生产了10个杯子 import threading import time import logging logging . basicConfig (

Django 信号量

流过昼夜 提交于 2019-11-30 23:39:24
参考:https://www.cnblogs.com/wupeiqi/articles/5246483.html 一、信号:就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者    如:在执行sql语句前或后,记录一条日志 二、用法 1、位置 2、导入模块 from django.db.models import signals 3、自定义函数 def before_create(*args, **kwargs): print('创建用户前', args, kwargs) # 创建用户前 () {'signal': <django.db.models.signals.ModelSignal object at 0x0000014CB5D41550>, # 'sender': <class 'app01.models.User'>, 'instance': <User: tom>, 'raw': False, 'using': 'default', # 'update_fields': None} def after_create(*args, **kwargs): print('创建用户后', args, kwargs) # 创建用户后 () {'signal': <django.db.models.signals.ModelSignal object at

线程锁、信号量、GIL、线程定时器、进程池与线程池、协程

二次信任 提交于 2019-11-30 22:25:05
目录 一、线程锁(同步锁)(线程的互斥锁) 1.1线程锁 1.2死锁 1.3解决死锁方法(递归锁) 二、信号量Semaphore 三、GIL 3.1 什么是GIL 3.2为什么要有GIL 3.3计算密集型(推荐使用多进程) 3.4IO密集型(推荐使用多线程) 四、线程Queue()队列 1.1 先进先出 1.2 先进后出(堆栈) 1.3优先级取数据 五、线程定时器 六、多线程并发socket服务端 七、进程池和线程池 4.1进程池和线程池的意义 4.2 同步异步 4.2.1同步 4.2.1线程池 4.2.2异步 八、协程 5.1什么是协程 一、线程锁(同步锁)(线程的互斥锁) 1.1线程锁 from threading import Thread,Lock x = 0 mutex = Lock() def task(): global x for i in range(200000): x = x+1 """ 由于没有进程锁,程序切换比较快,例如: t1 的x 刚拿到0 x = 0+1 还没进行运算,保存了状态,就被cpu切换 t2 的 x 拿到0 进行了运算 x = 1 又切换到t1,x = 0+1 x = 1 产生数据安全的问题,所以结果就会随机 """ if __name__ == '__main__': t1 = Thread(target=task) t2 =

进程通信4--信号量(Semaphore)

时光怂恿深爱的人放手 提交于 2019-11-30 19:47:05
信号量是什么? (1) 信号量本质上是一个具有原子性的计数器 ,用来描述临界资源的,不能用全局变量count加加减减替换(因为他 没有原子性 )。 (2)信号量以保护临界资源为目的,但他本身也是个临界资源;他控制多个进程对共享资源的访问,通常描述临界资源当中,临界资源的数量,常常被当做锁来使用,防止一个进程访问另外一个进程正在使用的资源 (3)其中最简单的信号量=1,也叫做 二元信号量(互斥锁) ,可控制单个资源,只能取0和1;信号量>=2为 多元信号量 只要理理解上面三句话,应该结合代码理解就不难了。 代码实现相关函数: # include <sys/types.h> # include <sys/ipc.h> key_t ftok ( const char * pathname , int id ) //pathname:路径名 id:项目id,非0整数(只有低8位有效) //2.semget函数 int semget ( key_t key , int nsems , int semflg ) ; //参数:key-->信号集的名字 //nsems:信号集中信号量的个数 //semflg:由九个权限构成,用法和创建文件时使用的mode模式一样 //返回值:成功返回一个非负整数,即该信号集的标识码;失败返回-1 创建成功后,Linux下通过ipcs

同步之sync.Mutex互斥锁

北战南征 提交于 2019-11-30 17:48:03
同步之sync.Mutex互斥锁 sync包中定义了Locker结构来代表锁。 type Locker interface { Lock() Unlock() } 并且定义了两个结构来实现Locker接口:Mutex 和 RWMutex。 我们可以用一个容量只有1的channel来保证最多只有一个goroutine在同一时刻访问一个共享变量。一个只能为1和0的信号量叫做二元信号量(binary semaphore)。使用二元信号量实现互斥锁,示例如下, var ( // 一个二元信号量 // 缓存为 1 的channel sema = make(chan struct{}, 1) // a binary semaphore guarding balance balance int ) func Deposit(amount int) { // 存钱的时候需要获取一个信号量,以此来保护变量 balance sema <- struct{}{} // acquire token balance = balance + amount <-sema // release token } func Balance() int { sema <- struct{}{} // acquire token b := balance <-sema // release token return b

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的任务调度和任务 合作式调度 -------- 多个任务按照指定时间和顺序依次运行,下一个任务等待上一个任务时间用完再开始运行 抢占式调度 --------

2.3进程的同步概念和经典同步互斥问题

自作多情 提交于 2019-11-30 13:13:59
1.进程同步的概念 在多道程序程序环境下,进程并发执行时,不同进程之间存在不同相互制约的关系; 引入进程同步,协调了进程之间的相互制约关系; 1)临界资源 一次只允许一个进程使用的资源,即临界资源,例:共享变量、共享数据结构、打印设备等; 临界区访问的四个部分:1)进入区;2)临界区;3)推出区;3)剩余区; 2)同步 同步亦是直接制约关系,源于进程之间的相互协作 进程之间在某种任务中,协调工作次序并等待、传递信息的制约关系 ; 注:同步与异步,同步即在一条路上大家先后走,异步即大家各自走不一样的路两路不影响; 3)互斥 互斥是相对 于临界资源的进程排斥关系 ,一个进程在使用临界资源时,另一进程需等待,当前占用临界资源进程退出使用后,才能访问使用临界资源; 互斥原则: 1) 空闲让进 ,临界区空间,允许一个进程进入; 2) 忙则等待 ,以有进程在临界区,其他进程等待; 3) 有限等待 ,等待进程等待时间有限; 4) 让权等待 ,进程不进入临界区,释放处理去,防止“忙等”进程;针对while循环等待; 2.临界区的互斥方法 1)软件实现 1)单标志法, 算法思想:进程与进程之前传递让步标志访问临界资源; 缺点, 违反空闲让进 原则 2)双标志法先检测 和 双标志法后检测 双标志先检测,先检查,再上锁,检查,锁为两个标志 双标志先检测法 违反忙则等待 原则 双标志后检测法,先上锁

操作系统相关

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