操作系统——进程间的通信

目录

1.进程间的通信(Interprocess Communication, IPC)

2.1 竞争条件(Race Conditions)

2.2 临界区(Critical Region)

2.3 生产者-消费者问题

2.4 信号量(Semaphore)

2.5 监控器(Monitor)

2.6 消息传递(Message Passing)

2.线程间的通信(Interthread Communication)

2.1 线程中的互斥锁

2.2 信号量(Semaphores)

1.进程间的通信(Interprocess Communication, IPC)

2.1 竞争条件(Race Conditions)

独立的进程:不受其他进程执行的影响

合作的进程:可能会受到其他进程的影响

进程间的通信:

  • 一种允许进程相互通信并同步其操作的机制

  • 这些进程之间的通信可以看作是它们之间合作的一种方法

2.2 临界区(Critical Region)

临界资源(Critical Resource):指在并发系统中,多个进程或线程需要竞争或互斥访问的共享资源,这些资源通常是在有限的、不可同时被多个进程或线程访问的,需要采取特殊的措施来确保它们在任意时刻只能被一个进程或线程访问,以避免数据不一致或竞态条件

  • 例子:

    • 打印机:在一个网络中多台计算机共享一台打印机。打印机是一个临界资源,因为同时只能由一台计算机打印,而其他计算机需要等待

    • 数据库:多个客户端同时访问数据库,数据库中的数据是关键资源,在执行更新或写入操作时,需要确保数据的一致性和完整性

临界区(Critical Region):指包含了对临界资源访问或操作的代码段,进入该代码的进程或线程必须互斥执行,以确保对临界资源的安全访问

  • 特征:

    • 进入临界区前,通常需要获取一个同步原语(如互斥锁、信号量等),以确保只有一个进程或线程可以进入临界区

    • 在临界区内对临界资源的访问必须是原子的,不可中断的,以防止其他进程或线程同时访问造成的数据不一致问题

  • 例子:

    • 共享变量访问:多个线程同时访问和修改一个全局变量,需要通过互斥锁来保护临界代码,以确保在任意时刻只有一个线程 可以访问和修改该变量

    • FS(文件系统)操作:多个进程同时访问FS中的同一个文件,需要通过文件系统提供的文件锁机制进入临界区,确保每次操作的原子性和一致性

2.3 生产者-消费者问题

概述: 生产者进程会生成一些数据并将其放入缓冲区中,而消费者进程则从缓冲区中取出数据并进行处理,但是,生产者不能再缓冲区已满的情况下继续生产数据,消费者也不能在缓冲区为空的情况下继续消费数据,这就需要一种同步机制来协调它们的操作。

使用信号量或互斥锁来实现同步,基本的算法:

  1. 使用两个信号量或互斥锁来控制对缓冲区区的访问:一个用于表示缓冲区是否为空,另一个用于表示缓冲区是否已满

  2. 如果缓冲区为空,则消费者等待直到有数据可以消费

  3. 如果缓冲区已满,则生产者等待直到有空间可以放入新的数据

  4. 当生产者放入一个数据后,它会增加缓冲区中数据的数量,并可能唤醒一个等待的消费者

  5. 当消费者取出一个数据后,它会减少缓冲区中数据的数量,并可能唤醒一个等待的生产者

2.4 信号量(Semaphore)

概述:信号量,用来协调多个并发进程对共享资源的访问,防止竞争条件和死锁。

两个操作:

  • P(wait):每当一个进程请求资源时,信号量减1,如果信号量的值小于0,进程将进入等待队列(count--)

  • V(signal):当一个进程使用完共享资源后,它执行发信号操作,这会使得信号量的值增加1,并唤醒可能正在等待资源的其他进程。(count++)

保证信号量操作是原子的方法:

  • 让它们成为系统调用,并确保只有P操作或V操作可以在一段时间被一个线程执行。但是同样也容易被中断

  • 使用硬件支持的原子操作指令

两种类型的信号量:

  • 计数信号量:

    • sem被初始化为N,表示具有多个可用单位的资源

    • 允许线程/进程进入,只要有更多的单元可用

  • 二进制信号量(0,1)(又称互斥信号量)

    • sem被初始化为1

    • 保证对资源的互斥访问,一次只允许一个线程/进程进入

    • 可以更简单的实现

信号量的用途:

  • 互斥

    • 信号量的初始值为1

    • 在临界区之前调用P()

    • V()在临界区之后被调用

  • 同步

    • 在进程/线程之间强制某种顺序

    • 信号量的初始值通常为0

信号量在生产者-消费者问题中的解决:

  1. 定义共享资源,例如一个有限大小的缓冲区,用于存放生产者生成的数据

  2. 初始化信号量:初始化三个信号量,一个用于互斥,一个用于表示缓冲区的空闲空间,另一个用于表示缓冲区中已存放的数据数量

  3. 实现生产者和消费者线程:编写生产者和消费者线程的代码它们需要通过信号量来检测协调彼此的操作

  4. 生产者代码:生成一个数据时,首先需要获取空闲空间的信号量,然后将数据放入缓冲区,最后释放数据数量的信号量

  5. 消费者代码:消费一个数据时,首先需要获取数据数量的信号量,然后从缓冲区取出数据,最后释放空闲空间的信号量

信号量作为同步工具:

问题:它们可以用来解决任何传统的同步问题,但是:

  • 信号量本质上是共享的全局变量,它们可以从任何地方访问

  • 信号量和它所控制的数据之间没有连接,不能控制它们的使用,不能保证正确使用

2.5 监控器(Monitor)

概述:Monitor是一种同步原语,用于管理并发访问共享资源。Monitor提供了一种机制,使得对共享资源的访问可以被控制和同步,从而避免竞态条件和其他并发问题。

特性和概念:

  • 封装共享资源:Monitor将共享资源及其操作封装在一个单独的数据结构中。这样,对资源的访问必须通过Monitor提供的接口进行,从而保证了对资源的安全访问

  • 互斥访问:Monitor提供了互斥机制,确保在任何时候只有一个线程可以访问共享资源,这避免了多个线程同时访问资源而导致的数据不一致或竞态条件

  • 条件变量:Monitor可以包含一个或多个条件变量,用于线程间的等待和通知。条件变量允许线程在满足条件之前等待,并且可以在条件满足时通知等待的线程继续执行

  • 等待队列:当线程在条件变量上等待时,它将进入Monitor的等待队列中,直到条件满足并且获得了互斥锁才会被唤醒

基本操作:

  • 进入Monitor:线程想要访问Monitor中的资源,首先需要进入Monitor,这通常涉及获取Monitor互斥锁

  • 访问资源:一旦线程进入Monitor,它可以执行操作来访问共享资源

  • 等待条件:如果线程在某个条件上等待,它会释放Monitor互斥锁,并进入相应的等待队列中等待条件满足

  • 通知和唤醒:当条件满足时,其他线程可以唤醒等待的线程

  • 退出Monitor:这通常涉及释放Monitor的互斥锁

应用场景:

  • 并发控制:用于协调并发访问共享资源,如临界区

  • 线程间通信:通过条件变量,Monitor可以实现线程间的同步和通信

  • 同步任务:可以用于同步多个线程执行任务

条件变量:

  • 概述:用于在多线程环境中实现线程之间的等待和通知机制。它允许线程在满足特定条件之前等待,并且可以在条件满足时通知等待的线程继续执行。条件变量通常与互斥锁结合使用,以确保线程在等待和通知过程中的线程安全性。

  • 特点:

    • 等待条件:线程可以在条件变量上等待,当条件不满足时,线程将进入条件变量的等待队列中等待

    • 通知等待线程:当某个线程满足了条件,它可以通知条件变量发送信号(通知)来唤醒等待在条件变量上的线程

    • 安全的等待和通知:条件变量的操作通常需要和互斥锁结合使用

  • 基本操作:

    • wait(c)

      • 解除monitor锁,让别人可以拿到

      • 挂起条件变量c的等待队列上的进程/线程

      • 等待其他人给条件变量c发信号

    • signal(c)

      • 最多唤醒一个等待进程/线程,如果存在多个这样的进程/线程,选择其中一个

      • 如果没有等待的进程/线程,信号丢失,这与信号量不同

    • broadcast(c)

      • 唤醒所有等待的进程/线程

2.6 消息传递(Message Passing)

概述:

  • 进程间通信机制:

    • 对于同一台计算机内的进程

    • 对于网络/分布式系统中的进程

  • 基于两个原语:

    • send(destination, &message)

    • receive(source, &message)

  • 消息格式:

    • 由消息头和消息体组成

    • 控制信息:

      • 序列号

      • 优先级

    • 排队规则:

      • 通常是FIFO,但可以包括优先级3

同步:

  • 消息传递可能是阻塞或非阻塞

  • 阻塞发送者——在消息被接收方接收之前,阻塞发送者

  • 非阻塞发送进程在发送后立即恢复操作

  • 阻塞接收:接收者阻塞直到消息可用

  • 非阻塞接收:接收者检索有效信息或返回错误代码

对于发送方:发出消息后不被阻塞更自然

  • 可以向多个目的地发送几条消息

  • 但是发送者通常期望消息被接收后得到确认

对于接收方:发出接收后被阻塞更自然

  • 接收方在继续之前通常需要消息才能继续

  • 但如果发送方进程在发送之前失败,则可能被无限期阻塞

这里有三种组合是有意义的:

  • 阻塞发送,阻塞接收

  • 非阻塞发送,非阻塞接收

  • 非阻塞发送,阻塞接收——最流行的

通信:

  • 直接:

    • 当特定的进程标识符用于源/目的时

    • 进程之间必须显式命名

  • 间接:

    • 通过端口进行通信

    • 端口是一个抽象对象,可以将消息放入其中或从中删除

    • 进程通过在端口中输入和接收消息进行通信

2.线程间的通信(Interthread Communication)

2.1 线程中的互斥锁

如果是C语言,需要包含pthread头文件

命名约定:

  • 线程库中的所有标识符都以'pthread_'开头

  • 类型:pthread_object_t

  • 功能:pthread_object_action

  • 例子:

    • pthread_t:线程类型

    • pthread_mutex_t:互斥锁的类型

    • pthread_create():创建一个线程

    • pthread_mutex_lock():lock一个互斥锁

2.2 信号量(Semaphores)

私有信号量:

  • 对于同一进程中的线程

  • 操作系统无法管理

公有信号量:

  • 对于同一进程的线程 & 不同进程中的线程

  • 操作系统可以管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值