当前位置:首页 » 存储配置 » 共享存储区通信

共享存储区通信

发布时间: 2022-12-06 05:01:08

Ⅰ 操作系统——进程通信、线程

进程通信是指进程之间的信息交换。进程的互斥和同步是一种低级的进程通信机制,效率低、所能够传递的信息非常有限。

通过共享数据结构或者共享存储区进行进程之间的通信。

(a)通过共享数据结构。

    比如生产者-消费者问题中的有界的缓冲区。由于数据结构的设置以及同步的处理都是人工的,强度大,是一种比较低级的通信机制。

(b)通过共享存储区。

    在处理器中划分一块共享的存储区域,所有共享该区域的进程通过对共享区域的数据进行读写来进行通信,是一种能够传输较大数量的通行方式。

各需要通信的进程通过格式化的消息进行信息交换。这是最重要的一种进程通信方式。

(a)直接通信方式。

利用操作系统的原语进行通信,发送方直接指定消息的接收方;消息接收方也指定消息的来源。

(b)间接通信方式。

需要借助作为共享数据结构的实体进行通信。该实体一般被称为信箱。

消息传递系统中的主要问题:通信链路、消息格式、进程同步方式。通信链路的建立可以利用系统的“建立链接”原语建立通信链路并显式拆除,也可以利用系统的“发送原语”由系统自动建立通信链路。对于单机系统消息格式则是简单固定,而对于复杂系统的进程通信(比如网络)则可能要将消息分为消息头和消息正文等。进程同步方式主要有3种:发送进程和接受进程都阻塞(两者之间无缓冲区)、发送进程不阻塞接受进程   阻塞(打印进程一直阻塞直到有打印请求)、发送进程和接受进程都不阻塞(两者之间带有缓冲区)。

    管道通信主要借助于管道文件。管道文件是用来连接一个输入进程和输出进程并实现他们输入的一个共享文件。利用管道进行通信时需要注意管道文件的互斥、对管道文件操作的同步以及输入和输出进程必须同时存在。

    发送进程利用OS所提供的发送命令(原语),直接把消息发送给目标进程。此时,发送进程和接收进程都以显式方式提供对方的标识符。通常利用系统通信命令(原语):
 Send(Receiver, message);
 Receive(Sender, message);

    基于共享数据结构的实体用来暂存发送给目标进程的消息;接收进程则从该实体中,取出对方发送给自己的消息。通常把这种实体称为信箱。
    消息在信箱中可以安全地保存,只允许核准的目标用户随时读取。既可实时通信,又可非实时通信。

①通信链路的建立
②消息格式
③同步方式

美国Hansan提出,在RC4 4000系统上实现。
1.不需要管理链路
2.定义简单数据结构(消息格式)
3.实现发送和接收的操作原语

    多道程序管理:追求效率的目的下实现“并发”
    并发性与效率的讨论(利用进程实现的多道程序中):
    进程是一个可拥有资源的独立单位;是一个可独立调度和分配资源的基本单位

    多线程OS中,一个进程包括多个线程,每个线程都是利用CPU的基本单位。
    轻型实体:只需一点必不可少的、能保证独立运行的资源。(TCB)
    独立调度和分派的基本单位:调度切换迅速且开销小。
    可并发执行
    共享进程资源:同进程中的线程可共享相同的进程地址空间、已打开文件、信号量机构等。

    tcb管理的信息:标识符、运行状态、优先级、寄存器状态、堆栈、专有存储器、信号屏蔽等

1.互斥锁
    适用于高频度使用的关键共享数据和程序段(unlock和lock两个锁操作原语)

2.条件变量
    与互斥锁一起使用,锁能保证互斥进入临界区,利用条件变量使线程阻塞
    注意不满足条件时,wait条件变量:
    释放互斥锁,进程阻塞在条件变量指向队列中,被唤醒后要重新再设互斥锁

3.信号量
    私用信号量:用于同进程的线程同步
    公用信号量:用于不同进程间

Ⅱ 进程与线程

经典定义:
1.进程是可以并发执行的计算部分



进程的五个特性
1.动态性:创建时产生,由调度而执行,得不到资源而暂停执行,有撤销而消亡
2.并发性:多个进程实体同存于主存中
(引入进程的目的,程序是不能并发执行的)
3.独立性:进程实体是一个能独立运行的基本单位,也是系统中获得资源和独立调度的基本单位
4.异步性:进程按各自独立的,不可预知的速度向前推进(导致程序执行的不可再现性)
5.结构特征:进程实体是由程序段、数据段、进程控制块三部分构成,又称进程映像/进程上下文(context)


进程的基本状态

有些还存在两个额外状态:新状态和终止状态

进程控制块PCB
1.概念:是操作系统用于记录和刻画进程状态及有关信息的 数据结构 ,也是操作系统控制和管理进程的主要依据。

原语:一组系统命令
要么全部执行,要么不执行,不存在中间状态

$$进程创建
egin{cases}
& ext{系统生成时,会创建一些系统进程(用来分配系统资源和管理工作)}
& ext{用户作业,由操作系统的作业调度程序为之创建相应的进程}
end{cases}$$

1.既可撤销具有指定标识符的过程,又可撤销一个优先级中的所有进程
2.一个进程被撤销时,必须从系统队列中移出,释放并归还所有系统资源,同时也有审查是否有子孙进程,如果有子孙进程也有一起予以撤销

1.当一个进程出现等待事件时,该进程调用阻塞原语将自己阻塞

1.必要性:解决多个进程争夺少数CPU资源的问题
2.功能:
(1)记录系统中所有进程的执行情况
(2)选择占有CPU的进程
(3)CPU分配给进程,即进行进程上下文切换
(4)回收CPU
3.进程调度算法
先来先服务/FCFS
按照进程进入就绪队列的先后次序选择占用处理器的进程

优先数调度算法
为每个进程确定一个优先数,进程调度总是让具有最高优先数的进程先使用处理器(若优先数相同则采用FCFS)

时间片轮转调度算法
CPU处理时间分成固定大小的时间片,轮流来,如果时间片用完进程还未结束,也得重新排到就绪队列的末尾等待再次调度

时间片q的选择:
q=R/N(R是系统对响应时间的要求;N是进程数)

多级反馈队列调度算法/MLFQ
设置多个就绪队列
各个队列的优先权不同(第一个队列的优先权最高,逐个降低)
各个队列的时间片大小不同(优先权越高的队列时间片越小)
当前队列的某个进程在时间片内没有完成就进入下一个队列的末尾
当某个队列为空时才会调度下一个队列
处理机在第i队为谋进程服务时,如果有新进程进入优先权较高的队列(i之前),则处理机就去处理i之前的那个新进程了,正在运行的进程被放到i队伍的末尾(可怜哈哈哈哈)

4.调度算法的选择
(1)处理器利用率(尽量让CPU处于忙碌状态)
(2)吞吐量
(3)等待时间(尽可能减少)
(4)响应时间(尽可能减少)

1.进程互斥:若干个进程要使用一个共享资源,任何时刻只允许一个进程去使用,其他要使用的进程必须等待,直到那个进程使用完后释放资源
2.进程互斥的管理办法: PV操作 管程

1.进程同步:并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达时才被唤醒

3.时间上的同步问题

$$进程通信
egin{cases}
低级& ext{PV操作}
高级 egin{cases} 共享存储器系统 消息传递系统 管道通信系统 end{cases}
end{cases}$$

1.基于共享数据结构的通信方式
在这种通信方式中,要求诸进程公用某些数据结构,进程通过它们交换信息。这种通信方式是低效的,只适于传递少量数据。
2.基于共享存储区的通信方式
为了传输大量数据,在存储器中划出了一块共享存储区,诸进程可通过对共享存储区中的数据进行读或写来实现通信。这种通信方式属于高级通信。

消息传递系统中,进程间的数据交换以消息为单位

1.管道,是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称为pipe文件
2.为了协调双方的通信,管道通信机制必须提供以下三方面的协调能力:(1)互斥;(2)同步;(3)对方是否存在。

1.需要线程的目的:保持系统的并发性
2.为了减少额外开销,系统把进程的资源申请与调度执行分开,线程是调度的基本单位,进程是资源申请与拥有的基本单位
3.概念:线程(Thread)是进程中的一个实体,是可独立参与调度的基本单位
4.属性:
并发
一个线程可以创建另一个
动态性(生命周期)
TCB(进程是PCB)
同一进程内的线程共享同一地址空间
一个进程的线程对另外一个进程是不可见的
线程的通信是基于全局变量进行的
5.状态(与进程类似)

时间片轮转算法
优先权算法

1.进程作为资源的申请与拥有单位,线程作为调度的基本单位
2.线程在调度和切换上所花费的开销比进程小得多
3.进程是独立拥有资源的的一个基本单位,线程只拥有一点点运行中必要的资源
4.进程作为独立拥有资源的基本单位,线程是独立参与调度的基本单位

1.概念:死锁是多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进
2$$产生原因egin{cases} 竞争资源 进程推进顺序非法(请求与释放资源顺序不当) end{cases}$$

3.$$产生死锁必要条件 egin{cases} 互斥条件(进程互斥使用资源) 占有且等待条件(得不到需要的资源就不释放占有的资源) 不剥夺条件(进程不能从另一进程抢夺资源) 循环等待条件(每个进程都在等待另一个进程所持有的资源) end{cases}$$


4.对策:预防 避免 检测 解除
预防
(1)静态分配策略//破坏第二个必要条件
所谓静态分配是指一个进程必须在执行前就申请它所要的全部资源,并且直到它所要的资源都得到满足后才开始执行
(2)层次分配策略//破坏第四个必要条件
当一个进程获得了某一层的一个资源后,它想再申请该层中的另一个资源,必须先释放该层中的已占用资源。

避免

检测
操作系统中的每一时刻的系统状态都可以用进程—资源分配图来表示,进程—资源分配图是描述进程和资源间申请及分配关系的一种有向图,可用以检测系统是否处于死锁状态。

Ⅲ 操作系统用共享存储区通信怎样生成一个512字节的文本文件

1。多道程序系统
2。A
3。个进程中访问一次仅允许一个进程使用的共享资源的那段代码
4。基于共享存储区的通讯方式
5。内存管理方法
6。I/O设备
7。BIOS

二:
1。空闲让进;忙则等待;让权等待;有限等待
2。互斥使用(资源独占)、不可强占(不可剥夺) 、请求和保持(部分分配,占有申请) 、循环等待
3。。。。
不想写了,自己看看书吧还是。

Ⅳ 消息通信,共享存储区,管道通信各有什么特点

队列通信中的消息有明显的生命周期,消息有传递的过程,有通知的过程,消息有失效性,有先后关系。
而共享内存没有上面这些特点。共享内存在使用时要解决互斥的问题。

Ⅳ Android跨进程通信-共享内存

还是先看共享内存的使用方法,我主要介绍两个函数:

通过 shmget() 函数申请共享内存,它的入参如下

通过 shmat() 函数将我们申请到的共享内存映射到自己的用户空间,映射成功会返回地址,有了这个地址,我们就可以随意的读写数据了,我们继续看一下这个函数的入参

共享内存的原理是在内存中单独开辟的一段内存空间,这段内存空间其实就是一个tempfs(临时虚拟文件),tempfs是VFS的一种文件系统,挂载在/dev/shm上,前面提到的管道pipefs也是VFS的一种文件系统。

由于共享的内存空间对使用和接收进程来讲,完全无感知,就像是在自己的内存上读写数据一样,所以也是 效率最高 的一种IPC方式。

上面提到的IPC的方式都是 在内核空间中开辟内存来存储数据 ,写数据时,需要将数据从用户空间拷贝到内核空间,读数据时,需要从内核空间拷贝到自己的用户空间,
共享内存就只需要一次拷贝 ,而且共享内存不是在内核开辟空间,所以可以 传输的数据量大

但是 共享内存最大的缺点就是没有并发的控制,我们一般通过信号量配合共享内存使用,进行同步和并发的控制

共享内存在Android系统中主要的使用场景是 用来传输大数据 ,并且 Android并没有直接使用Linux原生的共享内存方式,而是设计了Ashmem匿名共享内存

之前说到有名管道和匿名管道的区别在于有名管道可以在vfs目录树中查看到这个管道的文件,但是匿名管道不行, 所以匿名共享内存同样也是无法在vfs目录中查看到 的, Android之所以要设计匿名共享内存 ,我觉得主要是为了安全性的考虑吧。

我们来看看共享内存的一个使用场景,在Android中,如果我们想要将当前的界面显示出来,需要将当前界面的图元数据传递Surfaceflinger去做图层混合,图层混合之后的数据会直接送入帧缓存,送入帧缓存后,显卡就会直接取出帧缓存里的图元数据显示了。

那么我们如何将应用的Activity的图元数据传递给SurfaceFlinger呢?想要将图像数据这样比较大的数据跨进程传输,靠binder是不行的,所以这儿便用到匿名共享内存。

从谷歌官方提供的架构图可以看到,图元数据是通过BufferQueue传递到SurfaceFlinger去的,当我们想要绘制图像的时候, 需要从BufferQueue中申请一个Buffer,Buffer会调用Gralloc模块来分配共享内存 当作图元缓冲区存放我们的图元数据。

可以看到Android的匿名共享内存是通过 ashmem_create_region() 函数来申请共享内存的,它会在/dev/ashmem下创建一个虚拟文件,Linux原生共享内存是通过shmget()函数,并会在/dev/shm下创建虚拟文件。

匿名共享内存是通过 mmap() 函数将申请到的内存映射到自己的进程空间,而Linux是通过*shmat()函数。

虽然函数不一样,但是Android的匿名共享内存和Linux的共享内存在本质上是大同小异的。

要使用一块共享内存

Ⅵ 共享存储区通信有哪些优点使用上有哪些限制

共享存储区通信的优点有:常用的集中式多处理机使用的通信机制兼容。

限制有:是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

共享存储是指两个或多个处理机共用一个主存储器的并行体系结构。每一个处理机都可以把信息存入主存储器,或从中取出信息。处理机之间的通信通过访问共享存储器来实现。

系统结构

1、无高速缓冲存储器的集中式

这种结构的处理机没有高速缓冲存储器,多个处理机通过交叉开关或多级互联网络等直接访问共享存储器。由于任一存储单元在系统中只有一个备份,这类系统不存在高速缓冲存储器一致性问题,系统的可伸缩性受限于交叉开关或多级互联网络的带宽。

2、基于高速缓冲存储器的集中式

在这种结构的系统中,每个处理机都有高速缓冲存储器,多个处理机一般通过总线与存储器相连。每个处理机的高速缓冲存储器通过侦听总线来维持数据一致性。

3、具有高速缓冲存储器一致性的分布式

这种结构称为高速缓冲存储器一致的非均匀存储访问结构。这类系统的共享存储器分布于符结点之间。结点之间通过可伸缩性好的互联网络相连,每个处理机都能缓存共享单元,高速缓冲存储器一致性的维护是这类系统的关键,决定着系统的可伸缩性。

4、唯高速缓冲存储器的分布式

在这种结构中,每个结点的存储器相当于一个大容量的高速缓冲存储器,数据一致性也在这一级维护。这种系统的共享存储器的地址是活动的。存储单元与物理地址分离,数据可以根据访存模式动态地在各结点的存储器间移动和复制。

5、无高速缓冲存储器一致性的分布式

这种结构称为无高速缓冲存储器一致性的非均匀存储访问结构。它的特点是虽然每个处理机都有高速缓冲存储器,但硬件不负责维护高速缓冲存储器一致性,而由编译器或程序员来维护。

Ⅶ 进程间和线程间的协作区别在哪为什么需要内核实现通信与同步

进程间和线程间的协作区别:
进程互斥、同步的概念

进程互斥、同步的概念是并发进程下存在的概念,有了并发进程,就产生了资源的竞争与协作,从而就要通过进程的互斥、同步、通信来解决资源的竞争与协作问题。
下面是根据《操作系统教程》3.1.4 中的介绍,整理的进程互斥、同步的概念。
在多道程序设计系统中,同一时刻可能有许多进程,这些进程之间存在两种基本关系:竞争关系和协作关系。
进程的互斥、同步、通信都是基于这两种基本关系而存在的,为了解决进程间竞争关系(间接制约关系)而引入进程互斥;为了解决进程间松散的协作关系( 直接制约关系)而引入进程同步;为了解决进程间紧密的协作关系而引入进程通信。
第一种是竞争关系
系统中的多个进程之间彼此无关,它们并不知道其他进程的存在,并且也不受其他进程执行的影响。例如,批处理系统中建立的多个用户进程, 分时系统中建立的多个终端进程。由于这些进程共用了一套计算机系统资源,因而, 必然要出现多个进程竞争资源的问题。当多个进程竞争共享硬设备、存储器、处理器 和文件等资源时,操作系统必须协调好进程对资源的争用。
资源竞争出现了两个控制问题:一个是死锁 (deadlock )问题,一组进程如果都获得了部分资源,还想要得到其他进程所占有的资源,最终所有的进程将陷入死锁。另一个是饥饿(starvation )问题,这是指这样一种情况:一个进程由于其他进程总是优先于它而被无限期拖延。
操作系统需要保证诸进程能互斥地访问临界资源,既要解决饥饿问题,又要解决死锁问题。
进程的互斥(mutual exclusion )是解决进程间竞争关系( 间接制约关系) 的手段。 进程互斥指若干个进程要使用同一共享资源时,任何时刻最多允许一个进程去使用,其他要使用该资源的进程必须等待,直到占有资源的进程释放该资源。
第二种是协作关系
某些进程为完成同一任务需要分工协作,由于合作的每一个进程都是独立地以不可预知的速度推进,这就需要相互协作的进程在某些协调点上协 调各自的工作。当合作进程中的一个到达协调点后,在尚未得到其伙伴进程发来的消息或信号之前应阻塞自己,直到其他合作进程发来协调信号或消息后方被唤醒并继续执行。这种协作进程之间相互等待对方消息或信号的协调关系称为进程同步。
进程间的协作可以是双方不知道对方名字的间接协作,例如,通过共享访问一个缓冲区进行松散式协作;也可以是双方知道对方名字,直接通过通信机制进行紧密协作。允许进程协同工作有利于共享信息、有利于加快计算速度、有利于实现模块化程序设计。
进程的同步(Synchronization)是解决进程间协作关系( 直接制约关系) 的手段。进程同步指两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于另一
个协作进程的消息或信号,当一个进程没有得到来自于另一个进程的消息或信号时则需等待,直到消息或信号到达才被唤醒。
不难看出,进程互斥关系是一种特殊的进程同步关系,即逐次使用互斥共享资源,也是对进程使用资源次序上的一种协调。
进程通信的概念
下面是根据《操作系统教程》3.5 中的介绍,整理的进程通信的概念。
并发进程之间的交互必须满足两个基本要求:同步和通信。
进程竞争资源时要实施互斥,互斥是一种特殊的同步,实质上需要解决好进程同步问题,进程同步是一种进程通信,通过修改信号量,进程之间可建立起联系,相互协调运行和协同工作。但是信号量与PV操作只能传递信号,没有传递数据的能力。有些情况下进程之间交换的信息量虽很少,例如,仅仅交换某个状态信息,但很多情况下进程之间需要交换大批数据,例如,传送一批信息或整个文件,这可以通过一种新的通信机制来完成,进程之间互相交换信息的工作称之为进程通信IPC (InterProcess Communication)(主要是指大量数据的交换)。进程间通信的方式很多,包括:
信号(signal )通信机制;
信号量及其原语操作(PV、读写锁、管程)控制的共享存储区(shared memory )通信机制;
管道(pipeline)提供的共享文件(shared file)通信机制;
信箱和发信/ 收信原语的消息传递(message passing )通信机制。
其中前两种通信方式由于交换的信息量少且效率低下,故称为低级通信机制,相应地可把发信号/ 收信号及PV之类操作称为低级通信原语,仅适用于集中式操作系统。消息传递机制属于高级通信机制,共享文件通信机制是消息传递机制的变种,这两种通信机制,既适用于集中式操作系统,又适用于分布式操作系统。
进程同步的方法
前面提到,进程互斥关系是一种特殊的进程同步关系,下面给出常见的进程同步的方法,实际上也可用于进程的互斥(个人理解)。
在何炎祥的《计算机操作系统》 3.2 节,将进程同步的机制与解决进程互斥方法看做是一样的,的明确指出互斥的软件解决方法为Dekker算法与Peterson算法,互斥的硬件解决方法为中断方法、以及使用机器指令的方法,后面又给出了信号量、管程、消息传递三种方法。
实际应用中,不同的系统有不同的进程同步方法,CSDN帖子http://bbs.csdn.net/topics/80156687中有一些讨论,Linux 与Windows的主要同步、通信机制如下:
Linux 下:
Linux 下常见的进程同步方法有:SysVIPC 的 sem(信号量)、file locking / record locking(通过 fcntl 设定的文件锁、记录锁)、futex(基于共享内存的快速用户态互斥锁)。针对线程(pthread)的还有 pthread_mutex 和 pthread_cond(条件变量)。

Linux 下常见的进程通信的方法有 :pipe(管道),FIFO(命名管道),socket(套接字),SysVIPC 的 shm(共享内存)、msg queue(消息队列),mmap(文件映射)。以前还有 STREAM,不过现在比较少见了(好像)。
Windows下:
在Windwos中,进程同步主要有以下几种:互斥量、信号量、事件、可等计时器等几种技术。
在Windows下,进程通信主要有以下几种:内存映射、管道、消息等,但是内存映射是最基础的,因为,其他的进程通信手段在内部都是考内存映射来完成的。
线程的同步/通信与进程的同步/通信有区别吗?
对于该问题,教材上没有明确的回答,教材上给出的一般是进程而非线程的同步、通信方式。但网络上很多说法将两者混为一谈。根据教材,以及网上的说法,个人的理解为:
同步机制:
信号量、管程、互斥是进程的同步机制,而信号量、互斥也可用于线程的同步,但管程只在进程同步中被用到;
线程的同步除了信号量、互斥外,还有临界区、事件,没有看到教材上将这两种方式作为进程的同步方式;
通信机制:
管道、FIFO、消息队列、信号量、共享内存是进程的同步机制,教材上没有线程的通信机制这样的说法,但可以肯定这几种方法是进程的通信方式,且其中的信号量既可用于进程的同步,又可用于进程的通信,在网络上还有说可以用于线程同步的。
管道与管程是不同的,管程是进程同步的方式,而管道则是进程通信的方式。
进程的同步/通信
下面是常见的线程之间的同步方式的详细介绍。
(注:下面转自网络,下面的同步、通信方式对于进程与线程分的不是很清楚,关于进程还是线程的解释见上面——线程的同步/通信与进程的同步/通信有区别吗?)
一、进程/线程间同步机制。
临界区、互斥区、事件、信号量四种方式
临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
2、互斥量:采用互斥对象机制。
只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .
信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
PV操作及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用共享资源的进程数。
P操作申请资源:
(1)S减1;
(2)若S减1后仍大于等于零,则进程继续执行;
(3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。

V操作 释放资源:
(1)S加1;
(2)若相加结果大于零,则进程继续执行;
(3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度。
4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 .
总结:
1. 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。因为互斥量是跨进程的互斥量一旦被创建,就可以通过名字打开它。
2. 互斥量(Mutex),信号灯(Semaphore),事件(Event)都可以被跨越进程使用来进行同步数据操作,而其他的对象与数据同步操作无关,但对于进程和线程来讲,如果进程和线程在运行状态则为无信号状态,在退出后为有信号状态。所以可以使用WaitForSingleObject来等待进程和线程退出。
3. 通过互斥量可以指定资源被独占的方式使用,但如果有下面一种情况通过互斥量就无法处理,比如现在一位用户购买了一份三个并发访问许可的数据库系统,可以根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操作,这时候如果利用互斥量就没有办法完成这个要求,信号灯对象可以说是一种资源计数器。
二、进程间通信方式
由于比较容易混淆,我们把进程间通信方法也列在这里做比较。
进程通信也就是所谓的IPC问题,主要是指进程间交换数据的方式。进程通信包括高级通信与低级通信,其中进程同步与互斥属于低级通信,主要用于插U农地控制信号;高级通信包括三种:共享存储系统(有的地方称作共享内存区)、消息传递系统(有的地方称作消息队列)、管道。
信号量是进程同步与互斥的常用方法,也可以作为低级的进程通信方法,用于传递控制信号。
简而言之,进程间通信方式主要包括管道、FIFO、消息队列、信号量、共享内存。
1.管道,还有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式
2.消息队列,是用于两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据。需要注意的是,消息队列是用创建文件的方式建立的,如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据!!!!
3.信号量,它与WINDOWS下的信号量是一样的,所以就不用多说了
4.共享内存,类似于WINDOWS下的DLL中的共享变量,但LINUX下的共享内存区不需要像DLL这样的东西,只要首先创建一个共享内存区,其它进程按照一定的步骤就能访问到这个共享内存区中的数据,当然可读可写
以上几种方式的比较:
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:
(1)测试控制该资源的信号量;
(2)若此信号量的值为正,则允许进行使用该资源,进程将进号量减1;
(3)若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1);
(4)当进程不再使用一个信号量控制的资源时,信号量值加1,如果此时有进程正在睡眠等待此信号量,则唤醒此进程。
套接字通信并不为Linux所专有,在所有提供了TCP/IP协议栈的操作系统中几乎都提供了socket,而所有这样操作系统,对套接字的编程方法几乎是完全一样的
三、进程/线程同步机制与进程间通信机制比较
很明显2者有类似,但是差别很大
同步主要是临界区、互斥、信号量、事件
进程间通信是管道、内存共享、消息队列、信号量、socket
共通之处是,信号量和消息(事件)
小结:
进程互斥、同步与通信的关系:进程竞争资源时要实施互斥,互斥是一种特殊的同步,实质上需要解决好进程同步问题,进程同步是一种进程通信,由此看来,进程互斥、同步都可以看做进程的通信;
信号量是进程同步与互斥的常用方法,也可以作为低级的进程通信方法,用于传递控制信号;
管道与管程是不同的,管程是进程同步的方式,而管道则是进程通信的方式;

热点内容
如何区分安卓原装充电器 发布:2024-05-05 01:41:23 浏览:71
怎么从苹果转移到安卓 发布:2024-05-05 01:41:20 浏览:720
支付宝付款码怎么设置密码 发布:2024-05-05 01:27:36 浏览:877
qtp录制的脚本 发布:2024-05-05 01:14:04 浏览:366
如何安装卡罗拉安卓系统 发布:2024-05-05 01:09:00 浏览:984
sql创建表查询表 发布:2024-05-05 01:00:12 浏览:799
食色抖音上传 发布:2024-05-05 00:55:56 浏览:657
java图片下载 发布:2024-05-05 00:50:45 浏览:598
唱吧如何上传伴奏 发布:2024-05-05 00:49:04 浏览:444
什么配置单反拍视频最好 发布:2024-05-05 00:30:56 浏览:478