进程通信概念及分类 进程通信 实现机制 进程通信概念 实现机制低级进程通信:效率低,针对控制信息的传送。典型为信号量机制。 高级进程通信:能传送大量数据,效率高,进程通信实现细节由操作系统提供,整个通信对用户透明,通信程序编制简单 ### 类型 共享存储器系统(操作系统提供相应的系统调用)基于共享数据结构的通信方式 基于共享存储区的通信方式 信息传递系统 管道通信系统 共享内存示例下载 管道示例下载 消息传递通信实现方式 直接通信方式 通信原语Send(Receiver,message); Receive(Sender,message); 一个接收进程可以与多个发送进程通信 间接通信方式 信箱进程间通信有关共享数据结构的中间实体 有操作系统或用户进程创建 私有/公有/共享信箱 可实现实时/非实时通信 通信原语 发送/接收金层间存在的四种关系 信息传递系统中的几个问题 通信链路显式/隐式建立(计算机网络/单机) 点-点或多点连接通信链路 单/双向通信链路 无容量/有容量通信链路(缓冲区) 消息格式 进程同步方式 消息缓冲队列通信机制 缓冲队列是通过数据结构实现的 消息缓冲队列是一种临界资源,应该设计相应的信号量进行访问控制
消息缓冲区 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)