您好、欢迎来到现金彩票网!
当前位置:2019正版免费全年资料 > 同步通信量 >

进程间通信信号量

发布时间:2019-07-17 11:20 来源:未知 编辑:admin

  这两个名词咱们从字面上就能理解。举个例子吧,在创建子进程时,你是怎么保证父子进程执行的先后顺序呢?我在以前的时候是通过sleep()函数来实现的,比如我想让子进程先运行再让父进程运行,那么我就在父进程的程序中加一个sleep()函数,让父进程先睡眠,这样子就能先执行子进程了。有的时候咱们事先无法知道父进程和子进程哪一个先执行,但是要向我那样使用sleep()函数,只能保证先执行子进程,但是不能保证子进程执行完后再执行父进程,这样说能理解吧。所以如果我们想要子进程完全执行完后再执行父进程,就可以利用信号量来解决它们之间的同步问题。还不理解也没关系,我会在后面的实验中再结合实际讲。再举个更通俗的例子,一条食品生产线上,假设A、B共同完成一个食品的包装任务,A负责将食品放到盒子里,B和C负责将盒子打包。必须得是A先装食品B再打包吧,要是B不按规则先打包,那A还装啥,所以就需要一种机制方法保证A先进行B再进行,“信号量”就是这种机制方法,AB之间的关系就是同步关系;再假设打包要用到刀子,而车间就有一把刀子,这时候B和C就构成了互斥关系。

  不瞒你说,我刚开始学的时候所理解的就是“信号量是很多个信号”,当然这是错误的哈!光从英语上看就不一样:信号量是 Semaphore,而信号是 Signal 。其实,信号和信号量是不同的。它们虽然都可以实现同步和互斥,但是前者是使用信号处理器来进行的,而后者是使用P,V操作来实现的。(PV操作后边有讲)

  在多任务操作系统环境下,多个进程会同时运行,并且一些进程间可能会存在一定的关联。多个进程可能为了完成同一个任务相互协作,这就形成了进程间的同步关系。而且在不同进程间,为了争夺有限的系统资源(硬件或软件资源)会进入竞争状态,这就是进程间的互斥关系。

  进程间的互斥关系与同步关系存在的根源在于临界资源。临界资源是在同一时刻只允许有限个(通常只有一个)进程可以访问(读)或修改(写)的资源,通常包括硬件资源(处理器、内存、存储器及其它外围设备等)和软件资源(共享代码段、共享结构和变量等)。访问临界资源的代码叫做临界区,临界区本身也会称为临界资源。

  信号量是用来解决进程间的同步与互斥问题的一种进程间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(P/V操作)。其中,信号量对应于某一种资源,取一个非负的整形值。信号量值(常用sem_id表示)指的是当前可用的该资源的数量,若等于0则意味着目前没有可用的资源。

  ●  P操作:如果有可用的资源(信号量值0),则此操作所在的进程占用一个资源(此时信号量值减1,进入临界区代码);如果没有可用的资源(信号量值=0),则此操作所在的进程被阻塞直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。

  ●  V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程;如果没有进程等待它,则释放一个资源(即信号量值加1)。

  图1中的非临界区和临界区在咱们这里就是代码,具体这张图的理解还要结合着后面的实验才能理解。

  最简单的信号量只能取0和1值,这种信号量叫做二维信号量,在本节中,主要讨论二维信号量。二维信号量学好了,比较容易扩展到使用多维信号量的情况。

  ①  创建信号量或获得在系统中已存在的信号量,此时需要调用 semget() 函数。不同进程通过使用同一个信号量键值来获得同一个信号量。

  ②  初始化信号量,此时使用 semctl() 函数的SETVAL操作。当使用二维信号量时,通常将信号量初始化为1。

  ③  进行信号量的PV操作,此时,调用 semop()函数。这一步是实现进程间的同步和互斥的核心工作部分。

  ④  如果不需要信号量,则从系统中删除它,此时使用semctl()函数的 IPC_RMID操作。需要注意的是,在程序中不应该出现对已经被删除的信号量的操作。

  这两个实验主要是练习熟悉一下信号量的概念和基本用法,首先,我先在实验1的代码中不添加与信号量相关的代码,观察运行结果,实验代码如下

  这个运行结果是有点意思哈,由结果可以看到父进程先结束,然后子进程结束,但是我本意不是这样啊,我想让子进程先执行,父进程再执行,也就是父进程等待子进程结束。下面咱们就用信号量来实现它。

  本实验使用信号量来解决上面实验1的多进程间存在的同步问题,完成的功能是使父进程等待子进程结束。因为信号量相关的函数调用接口比较复杂,咱们将它们封装成二维单个信号量的基本函数,分别为信号量初始化函数(或者信号量赋值函数)init_sem()、P操作函数sem_p()、V操作函数sem_v()及删除信号量函数 del_sem()等,具体实验代码如下

  由实验2的第47~49行可以看出,47行的 P操作和49行的 V操作决定了48行的代码为图1中的临界区(资源R)。

  程序执行流程就是,先将信号量值初始化为0(第31行),假设程序先执行父进程,通过前边讲的P操作的特点可知,由于信号量值为0,该进程被阻塞,也就是转而去执行子进程,由V操作可知,执行完子进程后,由于信号量的等待队列中有进程(这里是父进程)在等待资源,则唤醒一个阻塞进程(这里是父进程)。

  这篇文章将讲述别一种进程间通信的机制——信号量。注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物。下面就进入信号量的讲解。一、什么是信号量为了防止出现因多个程序同时访问一个共享资源...博文来自:ljianhui的专栏

  临界资源:具有排他性的资源临界区:访问临界资源的代码段信号量的本质就是计数器互斥访问 操作系统的P操作就是上锁,V操作就是解锁上锁()                          解锁() { ...博文来自:enjoymyselflzz的博客

  Linux/Unix系统IPC是各种进程间通信方式的统称,但是其中极少能在所有Linux/Unix系统实现中进行移植。随着POSIX和OpenGroup(X/Open)标准化的推进呵护影响的扩大,情况...博文来自:tf_apologize的博客

  史上最全面剖析进程间通信下的信号量机制,细谈信号量,从基础学起,逐步深入。欢迎各位博友来访,交流学习,共同进步........博文来自:Xiao__Tian__的博客

  信号量(semaphore)是一种用于提供不同进程之间或者一个给定的不同线程间同步手段的原语。信号量多用于进程间的同步与互斥,简单的说一下同步和互斥的意思:同步:处理竞争就是同步,安排进程...博文来自:Master-TJ的个人博客

  学习环境centos6.5Linux内核2.6进程间通信概述进程通信机制一般情况下,系统中运行着大量的进程,而每个进程之间并不是相互独立的,有些进程之间经常需要互相传递消息。但是每个进程在系统中都有自...博文来自:春风来不来的博客

  共享内存共享内存是最快的进程通信方式。因为不同于消息队列和管道,需要调用内核函数切换运行环境,而是直接在自己进程的虚拟地址空间里操作。创建或打开共享内存intshmget(key_tkey,intsi...博文来自:漫鱼

  1、为什么要用信号量    管道和消息队列都是两个或多个进程访问一个共享资源,而为了防止出现因多个线程同时访问一个共享资源而引发的一系列问 题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一...博文来自:Scenlyf的博客

  进程间通信:进程之间的沟通交流进程间为什么要沟通交流?在实际工作中往往会出现在一个系统中好几个进程协同工作,那么这些进程就需要沟通交流,完成协作,而由于进程的独立性,进程间的沟通变得困难,复杂。因此就...博文来自:sophia__yu的博客

  1.互斥锁多个线程的IPC,需要同步,同步有隐式的和显示的:比如unix提供的管道和FIFO,由内核负责同步,比如read发生在write之前,那么read就会被内核阻塞,这中同步是由内核负责的,用户...博文来自:见贤思齐

  1. 基本特点 1)相当于计数器,用于限制多个进程对有限共享资源的访问。 2) 多个进程获取有限共享资源的操作模式 A. 测试控制该资源的信号量; B. 若信号量大于0,则进程可以使用该资源, 为了表...博文来自:meetings的专栏

  概念1、临界资源:同一时刻,只允许一个或有限个进程或线程访问的资源。例如:(1)多个人同时用一个笔签字,此时只能有一个人用笔写字,其他人只有等他写完才可以使用这支笔。(2)若商场试衣间可以有3个试衣间...博文来自:yishizuofei的博客

  1.背景本文将介绍进程通信中的共享内存,信号量和套接字方法。2.共享内存共享内存是最快的IPC(进程间通信)方式。共享内存是一个程序向内存写数据,另一个程序读数据,共享内存牵扯到同步的问题,一般有三种...博文来自:ljp1919的专栏

  2017/11/4进程间通信,进程池进程间通信(IPC,inter-processcommunication):生产进程生产食物,消费进程购买食物,消费进程一直监视生产状况,只要一有食物就将其取出来,...博文来自:sinat_27864123的博客

  /*1,进程间通信(IPC)Inter-ProcessCommunication比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息。2,linux下IPC机制的分类:管道、信号、共享内...博文来自:数学物理方法

  今天,给大家来在父子间使用共享内存实现通信,使用信号实现同步。  1.进程的创建     1)对于进程的创建,使用的函数为fork();       函数原型为pid_tfork(void);    ...博文来自:xld_hung的博客

  Linux进程间的通信方式:管道、有名管道、信号量、消息队列、共享内存、信号、socketWindows进程间的通信方式:管道、信号量、消息队列、共享内存、socketLinxu线程间的通信方式:互斥...博文来自:ldw662523的博客

  需求如下:当配置文件发生改变时,广播配置信息给所有的进程,通知其重装配置.   1.WM_COPYDATA传递消息  windows下最简单进程通信方式,利用WM_COPYDATA事件,该事件能够...博文来自:specialsun的专栏

  完成量1完成量概述很多情况下,我们需要让某一个线程等待另一个线程执行完某个操作后,才能继续执行后续操作。Linux内核中提供完成量这种机制可实现这个同步过程。当然,信号量也是可以完成同步操作。但是完成...博文来自:santapasserby的博客

  一点区别:systemv信号量只能用于进程间同步,而posix信号量除了可以进程间同步,还可以线程间同步。systemv信号量每次PV操作可以是N,但Posix信号量每次PV只能是1。除此之外,pos...博文来自:NK_test的博客

  一、什么是信号量信号量本质是一个用于描述资源数目的计数器。主要用于同步和互斥。相关概念:1.临界资源:两个或多个进程看到的一份公共资源叫做临界资源。2.临近区:各个进程访问临界资源的代码叫做临界区。3...博文来自:a_struggling_monkey的博客

  点击此处阅读原文进程间通信的本质就是让不同的进程额能够看到同一份公共的资源。进程间通信的方式管道管道是Linux操作系统下的一种文件类型,该文件类型的文件就是为了给不同进程之间提供可以进行通信的文件资...博文来自:h___q的博客

  更多linux知识点:linux目录索引1.什么是信号量   信号量的本质是数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源...博文来自:zhangye3017的博客

  (一)信号量信号量是IPC的一种,可以看做是一个计数器,计数值为可用的共享资源的数量,信号量可用于多进程的同步,为多个进程提供对共享资源的访问。linux下的信号量的接口函数如下:/*(1)获取信号量...博文来自:poetteaes的博客

  无名管道无名管道是半双工的,只能读或者写;无名管道只能在相关的,有共同祖先的进程间使用;一个fork()或者exec()调用创建的子进程继承了父进程文件描述符;打开和关闭管道:intpipe(intf...博文来自:慎薇的博客

  Linux中进程之间通信有,pipe,signal,消息队列,共享内存,信号量,socket.Qt中提供的进程间通信有如下几种:1.TCP/IP跨平台的QNetwork提供了众多的类来实现网络编程.比...

  信号量概述信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于0时,...

  在上篇博客说的共享内存是没有同步与互斥的!但是今天说的信号量主要用于同步和互斥我们先来看看什么是进程互斥由于各进程要求共享资源,而有些资源需要互斥使用,因此个进程间的竞争使用这些资源,进程的这中关系叫...

  消息队列:1.一种从一个进程向另外一个进程发送数据块的方法;          2.每个数据块都被认为是有一个类型,接受者进程接收的数据块可以有不同的类型值;          3.消息队列的读取不一...

  一、问题描述:生产者消费者问题(Producer-consumerproblem),也称有限缓冲问题(Bounded-bufferproblem),是一个多线程同步问题的经典案例。该问题描述了两个共享...

  年底了,有了大把时间,终于着手尝试写写技术博客,跟大家交流下心得。就从进程间通信相关的内容开始吧,在此对以往工作中用到的几种进程间通信方式做一下简单的总结。进程间通信(IPC,InterProcess...

  每一个进程都有着自己独立的地址空间,比如程序之前申请了一块内存,当调用fork函数之后,父进程和子进程所使用的是不同的内存。因此进程间的通信,不像线程间通信那么简单。但是共享内存编程接口可以让一个进程...

  信号是操作系统对中断机制的模拟发生信号的命令是kill信号量是线程间同步的东西...

  /*名称:无名信号量实现相关进程同步说明:此处使用的是实现相关进程同步的实验程序(改编自教材)。有几点需要强调下1.两个进程之间有不同的地址空间(即使是用fork生成的相同的进程,它们中的内容相同但是...

  jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...

  PHP是能让你生成动态网页的工具之一。PHP网页文件被当作一般HTML网页文件来处理并且在编辑时你可以用编辑HTML的常规方法编写PHP。最近在折腾那个安卓扫码登录的功能,然后网页端是用php的做了,...

  朱培(知浅_ZLH)600多个微信小程序源码涵盖各个行业大部分带后台持续更新中

  今天把本人花费一个月左右整理的600多款小程序源码发布出来,以后每个月还会持续更新,很大一部分都带有后台源码并包含有小程序上线教程,帮你分分钟上线自己的小程序,下面我们来看看目录截图,最后面会把源码目...

  明礼馨德的博客Spring Boot集成持久化Quartz定时任务管理和界面展示

  前言本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot。本工程所用到的技术或工...

http://disyu.com/tongbutongxinliang/520.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有