进程的描述与控制
- 6.进程的通信-高级通信
- 进程通信是指进程之间的信息交换,根据交换信息量的多少分为:
- 低级进程通信:交换信息量较少,特点为
- 效率低
- 通信对用户不透明
- 高级进程通信:交换信息量较多,效率高,又分为
- 共享存储器系统:互相通信的进程通过共享某些数据结构或者存储区读写来交换数据,前者是低级通信(基于共享数据结构的通信方式),只适用于少量数据的交换,后者是高级通信(基于共享存储区的通信方式),通过在内存中划分一块共享存储区,诸进程通过这个共享存储区来进行读写数据实现进程通信
- 消息传递系统:指进程之间以消息为单位,程序员通过通信原语,在进程间实现数据交换,按照实现方式的不同分为
- 直接通信方式:发送进程利用OS提供的发送原语,直接将消息发送给接受进程
- 要求:发送进程和接受进程都以显示方式提供对方的标识符
- OS提供的通信原语
- Send(Receiver,message)
- Receiver(Sender,message)
- 间接通信方式:发送进程和接受进程通过共享一个中间实体(信箱)来实现进程通信。系统提供的若干条原语:
- 信箱创建和撤销原语
- 两条通信原语:①Send(Mailbox,message) 将消息发送给指定邮箱②Receive(mailbox,message)从指定邮箱接受消息
- 信箱的分类:①私用邮箱(进程是自己创建)②公用邮箱(OS创建)③共享邮箱(某进程创建,但指定为共享的)
- 发送进程和接受进程之间,存在四种相对关系:①一对一关系:发送进程和接受进程之间建立一条专用的通信链路②多对一关系:允许提供服务的进程与多个用户进程进行交互,也称为客户/服务器交互(C/S interaction)③一对多关系:允许一个发送进程与多个接受进程进行交互,使发送进程可用广播方式,发送消息④多对多关系:允许建立一个公用邮箱,让多个进程都能向邮箱中投递消息,也能取走自己的消息
- 消息传递系统实现中的若干问题
- 通信链路:为了在发送进程和接受进程间实现通信,需建立一条通信链路在两个进程间,建立链路有两种方式:
- 显示建立链路(发送进程需要在通信前用显示"建立连接"原语命令请求OS为之建立一条通信链路,用完后就拆掉链路)
- 隐式建立链路(发送进程只需要利用OS提供的发送原语,OS会自动为之创建一条链路)
- 通信链路的链接方式:①点-点②多点
- 通信方式:①单向通信链路:只允许发送进程向接受进程发送消息,或者相反②双向通信链路:允许进程A和进程B同时互发消息
- 通信链路的容量:①无容量②有容量
- 消息格式
- 消息头
- 消息正文
- 进程的同步方式
- 发送进程和接受进程均堵塞:紧密同步,无缓冲
- 发送进程不堵塞,接受进程堵塞:应用广
- 发送和接受进程均不堵塞:较常见,即发送和接受进程都在忙自己事情,仅当发生某事件使他无法继续进程,才会堵塞
- 通信链路:为了在发送进程和接受进程间实现通信,需建立一条通信链路在两个进程间,建立链路有两种方式:
- 直接消息传递系统实例
- 消息缓存队列通信机制中的数据结构
-
消息缓存区
typedef struct message_buffer{ int sender; // 发送消息的进程名称或标识符 int size; // 发送消息的长度 char *text; // 发送消息的正文 struct message_buffer *next; // 指向下一个消息缓存区的指针 }
-
在进程PCB中设计通信的数据结构
typedef struct processcontrol_block { struct message_buffer *mq; //消息队列队里的首指针 semaphore mutex; // 消息队列互斥信号量,初值为1 semaphore sm; // 消息队列资源信号量 }
-
- 发送原语send
- 申请一个消息缓存区,将发送区内容(发送消息正文,进程标识符等)复制到这个缓存区;找到接受区的PCB,执行互斥操作P(mutex),把缓存区挂到接受进程消息队列的尾部,执行V(mutex),然后执行V(sm),即消息数加1
- 接受原语receive
- 执行P(sm),查看是否有信件,执行互斥操作P(mutex),从消息队列中摘下第一个消息,执行V(mutex),把消息缓存区内容复制到接收区,释放消息缓存区
- 消息缓存队列通信机制中的数据结构
- 直接通信方式:发送进程利用OS提供的发送原语,直接将消息发送给接受进程
- 低级进程通信:交换信息量较少,特点为
- 进程通信是指进程之间的信息交换,根据交换信息量的多少分为:
- 管道通信系统
- 发送进程(写进程)通过一个管道(*管道:连接一个读进程和一个写进程之间实现通信的共享文件*)以字符流形式将大量的数据送入管道,接受进程(读进程)从管道接受数据
- 7.线程的基本概念
- 引入线程的目的
- 使多个程序能并发执行
- 改善资源利用率,提高系统吞吐量
- 减少程序并发执行时,所付出的时空开销
- 使OS具有更好的并发性
- 线程的定义
- 线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程基本上自己不拥有系统资源,只拥有少部分在运行中必不可少的资源,但他可与同属一个进程中的其他线程共享进程所拥有的全部资源
- 一个线程可以创建和撤销另一个线程
- 同一个进程中的多个线程可以并发执行
- 当一个线程改变了存储器中的一个数据项时,当其他线程访问这一项时,能够看到修改后的结果
- 若一个线程为读操作打开一个文件时,同一个进程中其他线程也能从该文件中读
- 线程的属性
- 线程是轻型实体。基本上不拥有系统资源,只有一点必不可少的、能保证独立运行的资源
- 线程是独立调度和分配的基本单位
- 可并发执行。一个进程中的多个线程可并发执行;不同进程中的线程也能并发执行
- 共享进程资源。同一个进程中的多个线程,都可以共享该进程所拥有的资源
- 引入线程的目的
- 多线程
- 指OS支持在一个进程中执行多个线程的能力
- 传统的进程中只有一个线程在执行
- MS-DOS 是支持单用户进程和单线程的OS
- UNIX支持多用户进程,但只支持每个进程一个线程(即多进程单线程)
- 单进程多线程的例子:JAVA运行环境
- 多进程多线程的例子:Windows 2000
- 多线程OS中*进程*的属性
- 作为系统资源分配的单位
- 可包括多个线程。至少包括一个线程,这些线程可并发执行。OS中所有线程都只能属于某一个特定的进程
- 进程并不是一个可执行的实体了,线程是独立运行的基本单位
- 线程间的同步
- 互斥锁
- 比较简单的、用于实现线程间对资源互斥访问的机制
- 条件变量
- 为避免互斥锁造成的死锁问题,在创建互斥锁时就联系着一个条件变量
- 单纯的互斥锁用于短期锁定,用来保证互斥进入CS
- 条件变量用于线程的长期等待,知道所等资源的可用
- 信号量机制
- 私用信号量
- 公用信号量
- 多读、单写锁
- 线程的实现方式
- 内核支持线程KST(kernel Supported Threads)的实现:如Apple的MAC OS
- 用户级线程ULT(User Level Threads):一些数据库管理系统
- 组合方式:把ULT和KST两种方式进行组合,提供了组合方式ULT/KST线程
Snip20170113_4.png
Snip20170113_5.png
网友评论