信号量

操作系统知识

百般思念 提交于 2019-12-03 03:48:00
操作系统知识   操作系统的内核   操作系统的五大管理功能:进程管理、存储管理、设备管理、文件管理、作业管理。   网络操作系统和嵌入式操作系统基础知识   操作系统的配置    从历年的考试情况来看,本章主要考查进程状态转换图、信号量与PV操作、死锁问题、银行家算法、段页式存储、页面置换算法、磁盘调度、树形文件系统。    进程管理:   1. 进程状态转换图        图     从该图可以看出,五态模型中的五态为:执行状态(运行状态)、活跃就绪状态、活跃阻塞状态、挂起就绪状态、挂起阻塞状态。其中前三种状态组成了三态模型。      执行状态 :指进程占有处理机正在CPU上执行的状态。在单CPU系统中,每一时刻只有一个进程处于执行状态。      活跃就绪状态 :指进程分配到除处理机以外的必需的资源(已经具备了执行的条件)的状态。进程被创建后处于就绪状态,处于就绪状态的进程可以有多个。      活跃阻塞状态 :指进程因等待某个事件的发生而放弃处理机进入等待状态。系统中处于这种状态的进程可以有多个。      挂起就绪状态 :指进程被移至磁盘镜像区中,此时进程只缺处理机资源。      挂起阻塞状态 :指进程被移至磁盘镜像区中,此时进程除了缺处理机资源,还缺其它资源。   2. 信号量与PV操作     在操作系统中,进程之间经常会存在互斥和同步两种关系

操作系统复习笔记

匿名 (未验证) 提交于 2019-12-03 00:32:02
一、什么是进程、线程 进程定义:1、一个正在执行的程序实体 线程:一个进程中可以有多个线程,多个线程共享进程的资源,线程相互独立,有自己的执行态,上下文,可视为在进程内一个独立的程序计数器。 个人理解:进程是个团队,有团队资源,团队内部纪律(进程控制块),线程是团队成员,团队成员彼此独立,共享团队资源 进程资源:处理器时间、存储器、文件、I/O设备 二、并发性:互斥和同步 1、并发原理 伪并行: 单处理器多道程序设计的交替执行。(利用中断,调度到另一个程序) 1)方法:控制中断,控制资源的访问, 2)进程的交互 竞争、通过共享合作、通过通信合作 这里主要讨论竞争关系面临的控制问题:互斥、死锁、饥饿。 临界资源, 使用临界资源的程序称为临界区 3、互斥的要求:一次只准一个进入临界区,不会出现死锁和饥饿,驻留时间有限制・・ 2、几种互斥的硬件实现方法。 1)中断禁用 单个处理器上不能被中断 缺点:多处理器不能保证互斥,且执行速度慢 2)专用机器指令 3、信号量 1)信号量类别 2)原语操作: semWait() 信号量-1 semSignal() 信号量+1 信号量初始化只能为非负值 信号量若为正数,则其值等于执行完semWait后可执行进程的数目(例:s=1,执行完semwait后只可以执行一个进程,若s=0,则semwait后所有进程堵塞) 4)二元信号量操作: 相差的是

PV操作--经典问题分析

匿名 (未验证) 提交于 2019-12-03 00:32:02
为了提高在 实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解 PV 操作,这也是中的重点和难点。本文将会先简要介绍下 PV 操作的来源和基本使用方法,然后再通过两道经典的计算机考研真题――放水果和安全岛来示范如何运用 PV 操作。 先讲讲 PV 操作的起源和用法。 1962 年,荷兰学者 Dijksrta 在参与 X8 计算机的开发中设计并实现了具有多道程序运行能力的操作系统 ――THE Multiprogramming System 。为了解决这个操作系统中进程(线程)的同步与互斥问题,他巧妙地利用火车运行控制系统中的“信号灯”( semaphore ,或叫“信号量”)概念加以解决。信号量的值大于 0 时,表示当前可用资源的数量;当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数。注意,这个信号量的值仅能由 PV 操作来改变。 PV 操作由 P 操作原语和 V 操作原语组成(原语也叫原子操作 Atomic Operation ,是不可中断的过程),对信号量(注意不要和Windows中的 信号量机制 相混淆)进行操作,具体定义如下: P(S) : ①将信号量 S 的值减 1 ,即 S=S-1 ; ②如果 S>=0 ,则该进程继续执行;否则该进程置为等待状态。 V(S) : ①将信号量 S 的值加 1 ,即 S=S+1 ; ②该进程继续执行

新建数据库遇到ORA-27154,ORA-27300,ORA-27301,ORA-27302

匿名 (未验证) 提交于 2019-12-03 00:30:01
环境:在一个系统中有多个数据库,并且processes都设置的很大 解决方案: Not able to create new DB , Errors ORA-27154,ORA-27300,ORA-27301,ORA-27302 (文档 ID 1916074.1) How to increase the number of semaphores ORA-27154,ORA-27300,ORA-27301,ORA-27302 错误原因:processes总数超出操作系统信号量总大小 Applies to: Oracle Database - Enterprise Edition - Version 11.2.0.3 and later Information in this document applies to any platform. ***Checked for relevance on 08-Jul-2016*** Goal While creating a new DB , the following error raised: ORA-27154,ORA-27300,ORA-27301,ORA-27302. -- Kernel Values show the following : 内核参数显示如下: kernel.sem = 250 32000 100 128 ---

经典生产者消费者模型

匿名 (未验证) 提交于 2019-12-03 00:28:02
在对linux 下的进程和线程的学习后,总结一下生产者消费者模型 生产者负责在生产池中进行生产 消费者负责消费生产池中的生产物 同一时刻生产池中只能有一个生产者/消费者 生产池中没有生产物时,消费者阻塞,直到生产者进行生产之后(生产池不未空),系统再唤醒消费者进行消费 生产池为满时,生产者阻塞,直到消费者进行消费之后(生产池未满),系统再唤醒生产者进行生产 一个交易场所(生产池),这里用一个带头结点的单向链表描述 两种角色,这里用若干个线程描述生产者,用若干个线程描述消费者 三种关系 : 生产者与生产者之间为 互斥关系 :消费者与消费者之间为 互斥关系 :生产者与消费者之间为 同步与互斥关系 采用互斥量和条件变量 #include <stdio.h> #include <signal.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> //生产者消费者模型 //生产者和生产者之间为互斥关系 //消费者和消费者之间为互斥关系 //生产者和消费者之间为同步互斥关系 pthread_mutex_t mutex; //互斥量 pthread_mutex_t mutex_con; pthread_cond_t p_cond; int count= 0 ; //1.实现交易场所(带头结点,不带环的单向链表(栈结构))

基于信号量的有界缓存

匿名 (未验证) 提交于 2019-12-03 00:28:02
1、使用信号量Semaphore来实现有界缓存 2、代码如下: /** * BoundedBuffer * <p/> * Bounded buffer using \Semaphore * * @author Brian Goetz and Tim Peierls */ @ThreadSafe public class SemaphoreBoundedBuffer < E > { private final Semaphore availableItems , availableSpaces ; @GuardedBy ( "this" ) private final E [] items ; @GuardedBy ( "this" ) private int putPosition = 0 , takePosition = 0 ; public SemaphoreBoundedBuffer ( int capacity ) { if ( capacity <= 0 ) throw new IllegalArgumentException () ; availableItems = new Semaphore ( 0 ) ; availableSpaces = new Semaphore ( capacity ) ; items = ( E []) new Object [

【UCOSIII】【信号量】

匿名 (未验证) 提交于 2019-12-03 00:22:01
一、信号量实现 访问共享资源 task4 task5共同需要访问共享资源区,都同时请求信号量 其中一个在访问的时候,另一个只能处于等待状态。 //task4、5:使用信号量访问共享资源区 void task4_task(void *p_arg) { OS_ERR err; u8 str1[] = "task4 using share_resource"; while(1) { OSSemPend(&SEM_share_resource,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信号量 请求 memcpy(share_resource,str1,sizeof(str1)); printf("%s\r\n",share_resource); OSSemPost(&SEM_share_resource,OS_OPT_POST_1,&err); //发送信号量 释放 printf("task4_......\r\n"); } } void task5_task(void *p_arg) { OS_ERR err; u8 str2[] = "task5 using share_resource"; while(1) { OSSemPend(&SEM_share_resource,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信号量 请求

IPC进程间通信(概念简介)

匿名 (未验证) 提交于 2019-12-03 00:22:01
进程间通信发展 Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的。而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同。前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。而Linux则把两者的优势都继承了下来。 进程间共享信息的三种方式 最左边的表示两个进程共享文件系统中某个文件的信息,为了访问其中的信息,必须通过内核。 中间的表示两个进程共享在内核中的某些信息,较为常见的有管道,消息队列,信号量。 最右边的表示在用户空间中有一个两个进程都能访问到的共享内存区,可不通过内核进行消息通讯,是速度最快的一种,其本质是对内核中的内存空间做了映射,映射到用户空间。 IPC对象的持续性 进程持续:一直存在直到打开的最后一个进程结束。(如pipe和FIFO)。 内核持续:一直存在直到内核自举或显式删除(如System V消息队列、共享内存、信号量)。 文件系统持续:一直存在直到显式删除,即使内核自举还存在。(POSIX消息队列、共享内存、信号量如果是使用映射文件来实现)。 文章来源: IPC进程间通信(概念简介)

System V IPC概述

匿名 (未验证) 提交于 2019-12-03 00:22:01
2. System V IPC对象的访问 3.头文件及函数介绍 头文件: # include < sys/types.h > //公共头文件,声明了key_t类型 # include < sys/ipc.h > //公共头文件 # include < sys/msg.h > //消息队列函数的头文件 # include < sys/sem.h > //信号量函数的头文件 # include < sys/shm.h > //共享内存函数的头文件 sysĿ¼ 下的。前面两个是公共的头文件,也就是说三种IPC机制都有用到,而后面三个是和具体的IPC机制相关的,通过头文件的名称我们能发现它们同样满足前面所说的缩写。 ftok()函数: # include < sys/types.h > # include < sys/ipc.h > key_t ftok ( const char *pathname, int proj_id); 的英文可以理解为 的缩写。即将文件转换成key。 “.” );proj_id被称作子id,自己指定一个整型。 注意如果两个进程要通过System V的IPC通信,那么它们的ftok函数的两个参数必须相同,这样才能生成同样的key,从而产出同样的id。 key的31~24位为ftok函数第二个参数 proj_id 的低8位。 key的23

[技术干货] zabbix_agent信号量报错处理方法

匿名 (未验证) 提交于 2019-12-03 00:02:01
Agent报错信息如下: zabbix_agentd [25937]: cannot create Semaphore: [28] No space left on device zabbix_agentd [25937]: unable to create mutex for log file 一、重启操作系统可以释放 二、清除相应用户(nzx_zabbix)的信号量 法1 1.查看具体用户的共享内存的id /usr/bin/ipcs -m | grep nzx_zabbix |awk '{print $2}' 2.删除对应共享内存的标识 /usr/bin/ipcrm -m xxx 法2 1查看具体用户的SemaphoreKey #/usr/bin/ipcs -s | grep nzx_zabbix |awk '{print $1}' 删除由SemaphoreKey 创建的信号标识和与其相关的信号量集和数据结构。 /usr/bin/ipcrm -S xxx 法3 1.查看具体用户的信息量标识 #/usr/bin/ipcs -s | grep nzx_zabbix |awk '{print $2}' 删除信号量标识 SemaphoreID 和与其相关的信号量集及数据结构。 /usr/bin/ipcrm -s xxx 三、增加信号量的上限 1./etc/sysctl.conf文件追加