第三章 进程互斥与同步 进程通信 Communication.

Slides:



Advertisements
Similar presentations
作者 : 陳鍾誠 單位 : 金門技術學院資管系 URL : 日期 : 2016/7/21 行程的同步 註:本章學術性較重,但考試常考。
Advertisements

进程管理习题 设有一个可以装 A 、 B 两种物品的仓库,其 容量无限大,但要求仓库中 A 、 B 两种物品 的数量满足下述不等式: -M ≤ A 物品数量 -B 物品数量 ≤N 其中, M 和 N 为正整数。试用信号量和 P 、 V 操作描述 A 、 B 两种物品的入库过程。
第二章 进程的描述与控制管理.
作業系統 第六章 同步與死結.
Chapter 7: Process Synchronization 进程同步
数据结构(C语言版) Data Structure
进程管理习题 图书馆有100个座位,有一张登记表,要求: 用P、V原语描述一个读者的使用过程 阅读者进入时登记,取得座位号; 出来时,注销;
多核体系结构与并行编程模型 计算机科学导论第八讲
第6章 資料庫管理系統 6-1 關聯式資料庫管理系統 6-2 SQL Server資料庫管理系統
第二章 进程管理.
第三章 鏈結串列 Linked List.
第4章 VHDL设计初步.
第七章 固定资产 第一节 固定资产概述 第二节 固定资产的确认和初始计量 第三节 固定资产的后续计量 第四节 固定资产清查与期末计价
第五章 设 备 管 理 5.1 I/O系统 5.2 I/O控制方式 5.3 缓冲管理 5.4 I/O软件 5.5 设备分配
PURSUING EXCELLENCE / TOWARD SUCCESS WUCHANG UNIVERSITY OF TECHNOLOGY
Chapter 13 輸入/輸出系統 (I/O Systems)
Chapter 6 同步 (Synchronization)
中央广播电视大学计算机课程 操 作 系 统.
第一章 引论 1.1操作系统的概念 计算机系统: 计算机硬件 计算机软件 计算机硬件:运算器、控制器、存储器、输入设备和 输出设备
1.1信号与系统.
Operating System Process Management - 4 Monday, August 11, 2008.
操作系统 (并发进程) 徐锋 南京大学计算机科学与技术系 2018年9月18日3时52分.
Chapter 7 Search.
Operating System Concepts 作業系統原理 Chapter 3 行程觀念 (Process Concept)
中国科学技术大学计算机系 陈香兰 2013Fall 第五讲 进程同步和通信(part II) 中国科学技术大学计算机系 陈香兰 2013Fall.
多线程编程基本概念 2008.
佇列 (Queue).
Basis基本操作、使用者 管理與權限設定
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
经典同步问题.
作業系統 第六章 同步與死結.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
Chapter 3 行程觀念 (Process Concept)
欢迎参加VHDL培训 VHDL培训教程 浙江大学电子信息技术研究所 电子设计自动化(EDA)培训中心
ICT RTOS Research Group 胡伟平,王剑
职责链模式.
进程及进程管理 第4章 进程及进程管理.
计算机操作系统 第二章 进程管理 高校教师、高级项目经理 任铄 QQ:
第三章 进程互斥与同步.
嵌入式系统及应用.
进程操作.
操作系统原理 Operating System Principles
李元金 计算机与信息工程学院 第 4 讲 进程管理(2) 李元金 计算机与信息工程学院 1/
邹佳恒 第十八届全国科学计算与信息化会议 • 威海,
佇列(queue) Lai Ah Fur.
PubMed整合显示图书馆电子资源 医科院图书馆电子资源培训讲座.
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
最大公约数 ——解题报告 作者:宋含章 七(12)班 1.
第2章 进程管理 2.1 进程概念 2.2 线程 2.3 进程管理 2.4 进程间通信 2.5 经典进程同步问题 2.6 管程
第2章 进程和线程 内容提要: 2.1 进 程 概 念 2.2 进程的状态和组成 2.3 进 程 管 理 2.4 线 程.
Web Server 王宏瑾.
第三章 进程互斥与同步.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
Operation System(OS).
第四章 存储器管理 4.1 存储器的层次结构 4.2 程序的装入和链接 4.3 连续分配方式 4.4 基本分页存储管理方式
<Insert Picture Here>
作業系統 第四章 行程.
第7章 進階的同步 觀念與實務.
導 論 教學投影片.
中五級電腦科 PASCAL檔案處理.
CHAPTER 6 Concurrency:deadlock And Starvation
高级操作系统 Advanced Operating System
第一章 操作系统引论 1.1 操作系统的目标和作用 1.2 操作系统的发展过程 1.3 操作系统的基本特性 1.4 操作系统的主要功能
第9章 多 线 程.
怎樣把同一評估 給與在不同班級的學生 How to administer the Same assessment to students from Different classes and groups.
Race Conditions and Semaphore
Chapter 2 Entity-Relationship Model
由一个佯谬看涡旋电流的存在 PB 田鸿翔 指导老师 万树德.
第四章第二節 天氣的要素 P103.
Presentation transcript:

第三章 进程互斥与同步 进程通信 Communication

进程通信(Communication) 进程通信:指进程间的信息交换。 按通信内容可以划分为2种 低级通信:进程之间控制信息的交换称为低级通信。 一般只传送一个和几个字节的信息,达到控 制进程执行速度的作用。(进程的同步和互斥) 信号量机制作为同步工具是卓有成效的,但作为通讯工具则不够理想,(效率低。通讯对用户不透明。) 高级通信:用户可以直接利用操作系统所提供的一组通信命令,高效地传送大量数据的一种通信方式。可大大简化通信程序编制上的复杂性。

进程的同步与互斥是一种通讯方式,一进程可通过修改变量或信号量告知另一进程,它是否可以继续执行下去,利用生产者——消费者算法,生产者进程可以传送一批数据给消费进程,或者说生产者通过缓冲区与消费者进行通讯,但P、V操作只能传递信号,信号本身不包含任何数据,而进程不当还容易导致进程死锁,因此,称这些同步机构为低级通讯机构。

进程通信的类型 高级通讯机制类型 1 共享存储器系统(Shared-Memory System) 2 消息传递系统(Message passing System) 3 管道(Pipe)通信系统

1 共享存储器系统 共享存储器系统:相互通讯的进程通过共享数据结构和存储区进行通讯,因而可进一步分为: 基于共享数据结构的通讯方式;(低效,只适于传递少量数据) 基于共享存储区的通讯方式。为了传送大量数据,在存储区中划出一块共享存储区,诸进程可通过对共享存储区进行读或写数据实现通讯。 向系统申请共享存储区中的一个分区 指定该分区的关键字 如果已经给其他进程分配了这样的存储区, 将使用分区的描述符返回给申请者 4 申请者将申请到的共享分区挂到本进程上

2 消息传递系统 在消息传递系统中,进程间的数据交换是以消息(message,在计算机网络中又称报文)为单位。程序员直接利用系统提供的一组通讯命令(原语)来实现通讯。 因其实现方法的不同,又可分为 直接通信方式(消息缓冲机制) 间接通信方式(信箱通信方式)

直接通信方式: 发送进程直接将消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上。接收进程从消息缓冲队列中取得消息。故称为消息缓冲机制。 间接通信方式: 发送进程将消息发送到某个中间实体(一般称为信箱)中,接收进程从中取得消息,所以称为信箱通讯方式,相应地系统称为电子邮件系统。

2.1消息缓冲机制(直接通信) 消息缓冲通讯技术由Hansen 首先提出的,基本思想是:根据“生产者——消费者关系”原理,利用公用消息缓冲区实现进程间的信息交换。 发送进程先申请一个消息缓冲区,写入消息后把该消息缓冲区送入接收进程的消息队列中,通知接收进程。接收进程从消息队列中摘下一消息缓冲区,取出所需要的信息。

消息的一般形式 发送消息的进程名 struct msg { 接收消息的进程名 消息长度 消息正文 消息缓冲区的数据结构 sender; // 消息发送者名 size; // 消息长度 Text; // 消息正文 Next; //下一个消息的链指针 }

PCB中增加相关数据项 typedef struct process_control_block { .... mq; //消息队列 message queue mutex; //消息队列互斥信号量 sm; //消息队列资源信号量 }

send原语 void send( receiver , a ) { getbuf( a.size , msg ); //申请缓冲区,存入msg msg.sender = a.sender; msg.size = a.size; strcpy( a.text , msg.text) ; msg.next = 0; j = getinternal_name( receiver ); P( j.mutext ); insert( j.mq , msg ); //加入接收者的消息队列 V( j.mutext ); V( j.sm ); //消息个数加1 , 可能会唤醒接收者 }

receive 原语 void receive( b ) { P( j.sm ); //申请取消息,若无则阻塞 P( j.mutext ); // 互斥访问消息队列 remove( j.mq , msg ); //摘下一个消息 V( j.mutext ); b.sender = msg.sender; b.size = msg.size; strcpy(msg.text , b.text ) ; putbuf ( msg ); //释放消息所占空间 }

PA PB PC PD 接收者进程 Receive( b ) b b PCB 发送者进程 准备消息a Send( PB, a) a j OS Send( receiver, a) Receive( b) 消息缓冲区 MSG MSG

用通信原语解决生产者-消费者问题 使用原语 send( A , m1 ) 和 receive( B , m2) cobegin void produceri( void ) // i=1,2...k { msg nextp; while( 1 ) { nextp = produce_an_msg( ); send( consumerj, nextp ); } void consumerj( void ) //j=1,2...m { msg nextc; while ( 1 ) { receive( produceri , nextc ); consumemsg( nextc ) ;

2.2邮箱通信(间接通信) 信(邮)箱 进程间的通信要满足如下条件: 信箱是一种数据结构,逻辑上它分成两部分:信箱头和由若干格子组成的信箱体。 信箱中每个格子存放一封信,信箱中格子的数目和每格的大小在创建信箱时确定。 进程间的通信要满足如下条件: 发送进程发送消息时,邮箱中至少要有一个空格存放该消息。 接收进程接收消息时,邮箱中至少要有一个消息存在。

信箱可由OS创建,也可由用户进程创建,创建者是信箱的拥有者,据此可把信箱分为:私用信箱,公用信箱,共享信箱。 在利用信箱通信时,在发送进程和接收进程之间,存在着四种关系: 一对一关系:即可以为发送进程和接收进程建立一条专用的通信链路; 多对一关系:允许提供服务的进程与多个用户进程进行交互,也称客户/服务器交互; 一对多关系:允许一个发送进程与多个接收进程交互,使发送进程用广播的形式,发送消息; 多对多关系:允许建立一个公用信箱,让多个进程都能向信箱投递消息,也可取走属于自己的消息。

邮箱通信结构 邮箱头 邮箱头:邮箱名称、邮箱大小、拥有该邮箱的进程名 邮箱体:存放消息 …邮箱体 接收进程 发送进程 B A send(mailbox, msg ) receive( mailbox, msg ) 使用邮箱的时候应该满足: 发送进程发送消息时,邮箱中至少要有一个空格能存放该消息 接收进程接收消息时,邮箱中至少有一个消息存在

3 管道(Pipe)通信系统 管道(pipe)通讯由UNIX首创的一种借助文件和文件系统形成的一种通信方式,。由于其有效性,一些系统继UNIX之后相继引入了管道技术,如pc-dos,管道通信将成为进程通讯的一种重要方式。 消息缓冲通信机构是以内存缓冲区为基础。 管道是以文件系统为基础。 管道类型 有名管道 无名管道

管道 是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享方式,又称pipe文件。 向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;而接收管道输出的接收进程(即读进程),可从管道接收数据,由于发送和接收都是利用管道进行通信的,故称为管道通信。

为了协调双方的通信,管道通信机制必须提供以下三方面的协调能力: 互斥。一个进程正在对pipe进行读/写操作时,另一进程必须等待。 同步。当写(输入)进程把一定数量的数据写入pipe后,便去睡眠等待,直到读(输出)进程取走数据将其唤醒;当读进程读一空pipe,也应睡眠等待,直至写进程将数据写入管道,才将其唤醒。 对方是否存在。只有确定对方已存在时,才能进行管道通信,否则会造成因对方不存在而无限期等待。

管道通信的思想 1 发送进程可以源源不断的从pipe一端写入数据流,在规定的pipe文件的最大长度(如4096字节)范围内,每次写入的信息长度是可变的 2 接收进程在需要时可以从pipe的另一端读出数据,读出单位长度也是可变的

第三章 进程互斥与同步 管程 Monitors

管程的引入 用信号量和P、V操作来解决进程互斥同步问题,需在程序中适当位置安排P、V操作,否则会造成死锁错误。为了解决分散编程带来的困难,采用资源集中管理的方法,用某种数据结构表示某类资源,并将这种数据结构以及与资源有关操作集中一起定义为类程或管程,并用类程管理独立资源,用管程管理共享资源,它两个是能被进程调用的实体。

管程定义 一个管程定义了一个数据结构和能为并发进程调用的在该数据结构上的一组操作过程,这组操作过程能同步进程和改变管程中的数据。 管程提供了一种可以允许多进程安全有效地共享抽象数据类型的机制,管程实现同步机制由“条件结构”(condition construct)所提供。 管程中的局部数据仅能被管程入口进程访问(该类过程名前有关键字 entry ) 。局部于管程的入口过程也仅能访问管程内的数据。

实现管程的关键问题-1 互斥 管程必须能有效地实现互斥。管程是被动成分,进程是主动成分。 进程调用管程入口函由一个互斥信号量来实现。 该互斥机制由编译程序来实现,编写管程程序的人无须关心编译程序如何实现互斥,也不会有应用的失误。

实现管程的关键问题-2 同步 管程结构中提供两个同步操作原语wait( )和signal( ) 。

实现管程的关键问题-3 条件变量 为区别等待的原因而引入条件变量。 条件变量数据类型名为 condition 不同的条件变量有不同原因,对应由不同原因的进程阻塞而成的队列。 条件变量上能做wait( ) 和 signal( )原语操作,例某条件变量名为nonbusy, 则调用同步原语的形式为 wait( nonbusy ) 和 signal( nonbusy )

利用管程解决生产者——消费者问题 建立一个管程Producer_Consumer,它包括两个过程put(item)和get(item),它们分别执行将生产的消息放入缓冲池和从缓冲池取出消息的操作。 设置一变量count表示缓冲池已存消息数目,缓冲池大小为n。 当count=n时,put( item )必须等待wait( empty) ,若count++后为1,则表缓冲池中原来并无数据,则执行signal( full ),唤醒一个等待的消费者 当count = 0时,get( item )必须等待wait( full ),当count—后count值为n-1,则表原来缓冲池是满的,需执行signal( empty),唤醒一个等待的生产者。

type producer_consumer = monitor; // 类pascal var in,out, count:integer; buffer: array[0…n-1] of item; full,empty:condition; procedure entry put(var item); begin if count = n then wait(empty); buffer[in]:=item; in:=(in+1) mod n; coutn:=count+1; if count=1 then signal(full); end

procedure entry get(var item); begin if count = 0 then wait(full); item:=buffer[out]; out:=(out+1)mod n; count:=count-1; if count=n-1 then signal(empty); end in:=0; out:=0; count:=0 end if

var pc: producer_consumer; cobegin producer: begin repeat produce an item in x; pc.put(x); … until false; end //--------------------------------------------------------------------- consumer: pc.get(y); consume the item in y; coend

VC++中的同步的机制 CSemaphore, CMutex, CCriticalSection, and CEvent An object of class, CCriticalSection represents a "critical section" - a synchronization object that allows one thread at a time to access a resource or section of code. Critical sections are useful when only one thread at a time can be allowed to modify data or some other controlled resource. Method Lock() Use to gain access to the CCriticalSection object. Unlock() Releases the CCriticalSection object.