0%

操作系统第七节课笔记-进程通信

进程通信概念及分类

进程通信

实现机制

  • 进程通信概念
    • 指进程之间的信息交换
  • 实现机制
    • 低级进程通信:效率低,针对控制信息的传送。典型为信号量机制。
    • 高级进程通信:能传送大量数据,效率高,进程通信实现细节由操作系统提供,整个通信对用户透明,通信程序编制简单 ### 类型
  • 共享存储器系统(操作系统提供相应的系统调用)
    • 基于共享数据结构的通信方式
    • 基于共享存储区的通信方式
  • 信息传递系统
    • 直接/间接通信方式
  • 管道通信系统
    • 管道概念
    • 协调机制:互斥、同步、通信前提
共享内存示例下载 管道示例下载

消息传递通信实现方式

直接通信方式

  • 通信原语
    • Send(Receiver,message);
    • Receive(Sender,message);
      • 不知道发送者是谁
        • 典型例子是打印机
  • 一个接收进程可以与多个发送进程通信
    • 打印进程
    • Sender无法事先制定,故为变参性质

间接通信方式

  • 信箱
    • 进程间通信有关共享数据结构的中间实体
    • 有操作系统或用户进程创建
    • 私有/公有/共享信箱
    • 可实现实时/非实时通信
  • 通信原语
    • 信箱的创建和撤销、消息的发送和接收
  • 发送/接收金层间存在的四种关系
    • 一对一、多对一、一对多、多对多

信息传递系统中的几个问题

  • 通信链路
    • 显式/隐式建立(计算机网络/单机)
    • 点-点或多点连接通信链路
    • 单/双向通信链路
    • 无容量/有容量通信链路(缓冲区)
  • 消息格式
    • 有消息头和效益正文构成,分定长/变长两种
  • 进程同步方式
    • 发送/接受进程阻塞与否(三种情况)

消息缓冲队列通信机制

缓冲队列是通过数据结构实现的

消息缓冲队列是一种临界资源,应该设计相应的信号量进行访问控制

消息缓冲区

1
2
3
4
5
6
7
8
9
10
type MassageBuffer=record
Sender;
//发送者进程标识符
Size;
//消息长度
Text;
//消息正文
Next;
//指向下一缓冲区的指针
END;

PCB通信数据项

1
2
3
4
5
6
7
8
9
type PCB=record
massageQueue;
//队首指针
mutexOfMQ;
//消息队列互斥信号量
semphoreOfMQ;
//消息队列资源信号量
...
END;

假设A发送消息给B,A使用发送原语,把消息队列挂接到B的进程控制块的消息缓冲区,B使用接收原语,从PCB上接收数据队列,拷贝到本进程的接收区中

发送原语

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure Sender(Receiver,SA)
Begin
getBuf(SA.Size,Buffer_i);
//创建缓冲区
Buffer_i.Sender:=SA.Sender;Buffer_i.Size:=SA.Size;
Buffer_i.Text:=SA.Text;Buffer_i.Next:=0;
//把数据拷贝到缓冲区中
getid(PCB_Set,Receiver,PID);
//从PCB区通过进程名解析目标进程ID
wait(PID.mutexOfMQ);
//因为是对临界资源的操作,所以要使用互斥信号量
insert(PID.massageQueue,Buffer);
//挂接缓冲区到目标进程的PCB上
signal(PID.mutexOfMQ);
//使用完毕,释放互斥信号量
signal(PID.semphoreOfMQ);
//添加资源信号量,使可用资源数增加
End;

接收原语

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure Receive(RB)
Begin
PID:=InternalNameOfProcess();
//获取本进程的PID号
wait(PID.semphoreOFMQ);
//先确认有没有可用资源
wait(PID.mutexOfMQ);
//对资源进行操作,上锁
remove(PID.messageQueue,Buffer_i);
//从缓冲区取下消息
signal(PID.mutexOfMQ);
//释放互斥信号量
RB.Sender:=Buffer_j.Sender;
RB.Size:=Buffer_j.Size;
RB.Text:=Buffer_j.Text;
//复制到接收区
putbuf(Buffer_j);
//释放缓冲区
End;

线程

线程的概念

线程的引入

  • 进程并发机制缺陷分析
    • 进程并发执行基础(资源拥有与调度的基本单位)
    • 进程创建、切换和撤销等操作的时空开销较大
    • 进程并发执行程度及进程间通信效率受限
  • 系统并发进一步提高客观需求
  • 对策
    • 资源的拥有与调度分派两种属性的分离
      • 进程拥有资源、内存空间
      • 线程拥有处理器调度

线程的特征

  • 轻型实体及共享进程资源
  • 独立调度和分派的基本单位
  • 创建、撤销、切换等系统开销
  • 地址空间及通信效率
  • 系统的并发执行程度大大提高

线程的控制、同步与通信

线程的控制

  • 线程的基本属性
    • 线程标识符、寄存器状态、堆栈及专有存储器
    • 线程状态、优先级与信号屏蔽
  • 线程的创建和终止
    • 初始化线程
    • 线程创建函数或系统调用
    • 线程完成型终止与被被迫强制性终止
    • 被终止线程重新恢复运行

线程间的同步和通信

  • 信号量机制
    • 私有信号量/共有信号量
  • 互斥锁
    • 实现资源互斥使用的简单极致
    • lock/unlock 两种状态和原语操作
    • 适合于高频使用的关键共享数据程序段
  • 条件变量与互斥锁
    • 互斥锁与特定条件变量相联系
    • 互斥锁用于短期锁定,保证互斥进入临界区
    • 条件变量用于长期等待,直至所得呢个资源可用

基于互斥锁和条件变量的线程同步

访问请求资源入口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Lock(mutex);
//互斥锁上锁
Check data structure of Resource;
//检查是否可以使用
if Resource is busy
begin
Unlock(mutex);
//方便其他线程检查状态,能够对资源进程访问
wait(condition_variable);
//这条语句会等待到资源不忙结束,执行下面的操作
Lock(mutex);
//非常关键,因为下面要进行对资源的操作
end

Mark resource as busy;
Unlock(mutex);

访问资源结束

1
2
3
4
Lock(mutex);
Mark resource as free;
Unlock(mutex);
wakeup(condition_variable);

线程实现方式

线程实现方式

  • 内核支持线程
    • 依赖于内核及其中的线程控制块(任务数据区:PTDA)
      • 可以真正实现处理机的调度和分配在线程级别上
  • 用户级线程
    • 仅存在于用户空间之中,与内核无关
      • 没办法实现处理机和调度分配在线程级别
  • 实现方式比较
    • 操作系统要求、系统开销与性能、调度算法灵活性、并发线程数量及书记效果
    • 系统调用阻塞连锁效应
    • 时钟中断与轮转调度可行性
    • 线程调度与执行时间

用户级线程模型1-运行管理系统(Run-Time System)

用户级线程模型2-轻型进程(Solaris)

恰饭,恰饭