《现代操作系统》读书笔记之——进程间通信

合集下载

操作系统中的进程间通信机制分析

操作系统中的进程间通信机制分析

操作系统中的进程间通信机制分析在操作系统中,进程间通信是必不可少的一项功能。

它使得不同的进程间能够进行信息交换、资源共享等操作,从而提高计算机系统的性能和效率。

在本文中,我们将对操作系统中的进程间通信机制进行分析和探讨。

一、进程间通信的概念进程是指操作系统中正在运行的程序,每个进程都有一个独立的地址空间。

进程间通信(IPC)是指在不同进程之间进行信息传递以及资源共享的机制。

在现代的多任务操作系统中,为了满足不同进程之间的通信需求,通常都会提供一些IPC机制,如信号量、消息队列、管道、共享内存等。

二、IPC机制的分类根据不同的通信方式和实现机制,IPC机制可以分为几类:共享内存、消息队列、信号量等。

共享内存共享内存是一种在多个进程之间共享内存的机制。

在共享内存中,多个进程可以访问同一个内存区域,从而实现数据共享。

共享内存的实现机制比较简单,通常使用的是内核中的一块内存来进行共享。

消息队列消息队列是一种消息传递的机制,即进程通过向消息队列发送消息,而被另一个进程获取。

消息队列的实现非常灵活,可以基于内核、管道或共享内存等来实现。

信号量信号量是一种多进程间协调的机制,可以用来实现进程间的互斥锁、条件变量等。

每个信号量都有一个值,当进程需要对某个资源进行操作时,可以减小信号量的值,当信号量的值等于0时,进程就会进入睡眠状态,等待其他进程唤醒它。

三、IPC机制的优缺点不同的IPC机制都有各自的优缺点,下面我们就来简单分析一下各种IPC机制的优缺点。

共享内存的优点是非常快速和高效的访问,因为共享内存的数据就在进程的地址空间中,不需要复制。

然而,共享内存机制的缺点是需要注意控制并发访问,否则会出现数据冲突、死锁等问题。

消息队列的优点是稳定可靠,因为发送和接收的操作都是原子操作,并且可靠性比较高。

缺点是性能问题,需要进行序列化和反序列化,因此消息队列的速度比较慢。

信号量的优点是效率高,因为它们采用基于操作系统的原语进行实现,很少需要进行上下文切换,而且可以提供多进程之间的同步和互斥锁服务。

学习计算机操作系统中的进程间通信与同步机制

学习计算机操作系统中的进程间通信与同步机制

学习计算机操作系统中的进程间通信与同步机制操作系统是计算机系统中最关键的组成部分之一,它负责管理和协调计算机硬件设备与软件资源的使用。

而在操作系统中,进程是一个核心概念,它代表了正在运行的程序。

在多个进程同时运行时,如何实现进程间的通信和同步是一个重要的问题。

本文将介绍进程间通信和同步的概念、机制以及常见的实现方法,希望能帮助读者更好地理解和应用操作系统中的这些概念。

一、进程间通信的概念在一个操作系统中,不同的进程可能需要互相交换信息或共享资源,这就需要进程间进行通信。

进程间通信(Inter-process Communication,IPC)指的是不同进程之间进行数据交换的过程。

通过进程间通信,不同的进程可以在需要的时候互相发送和接收数据,以实现各种目的。

二、进程间通信的重要性进程间通信在操作系统中起着至关重要的作用。

首先,不同的进程之间可能需要共享资源,比如共享内存区域、文件或者设备等,通过进程间通信,可以实现对这些资源的有效共享和管理。

其次,进程间通信还可以实现进程的协作和数据交换,比如在并发编程中,不同的进程可以通过进程间通信来协调工作,共同完成任务。

因此,进程间通信是操作系统中必不可少的功能。

三、进程间通信的机制在操作系统中,有多种机制可以用来实现进程间的通信。

常见的进程间通信机制包括管道、信号量、消息队列、共享内存和套接字等。

下面将分别对这些机制进行介绍。

1. 管道(Pipe)管道是一种最基本的进程间通信机制,它可以用于在父子进程之间或者兄弟进程之间进行通信。

管道通常是单向的,通过将一个进程的输出连接到另一个进程的输入,实现数据的传输。

管道的优点是简单易用,但是只适用于具有亲缘关系的进程。

2. 信号量(Semaphore)信号量是一种用于进程间同步和互斥的机制。

通过使用信号量,不同的进程可以协调工作,避免资源竞争和死锁的问题。

信号量可以用于对进程的访问权限进行控制,确保在某一时刻只有一个进程能够访问某项资源。

操作系统的进程间通信与同步机制

操作系统的进程间通信与同步机制

操作系统的进程间通信与同步机制操作系统是计算机系统中最核心的软件之一,负责管理和协调计算机硬件和软件资源的使用。

在多道程序设计环境下,操作系统需要管理多个同时运行的进程,而进程间的通信和同步是操作系统中的重要任务之一。

本文将探讨操作系统中的进程间通信和同步机制的基本概念、原理和应用。

一、进程间通信(Inter-process Communication,IPC)进程间通信是指不同进程之间交换信息的机制。

在操作系统中,进程间通信是实现进程协作和数据共享的基础。

常见的进程间通信方式包括管道、消息队列、信号量、共享内存等。

1. 管道(Pipe)管道是一种半双工的通信方式,将一个进程的输出连接到另一个进程的输入,实现进程之间的单向通信。

管道分为有名管道和无名管道,有名管道可以在不同进程之间共享,而无名管道只能在具有父子关系的进程之间使用。

2. 消息队列(Message Queue)消息队列是一种可以在不相关进程之间传递数据的通信机制,它通过将消息放入队列中,实现进程之间的异步通信。

消息队列可以实现进程之间的解耦,提高系统的可维护性和灵活性。

3. 信号量(Semaphore)信号量是一种用于进程间同步与互斥的机制,它可以用来解决临界区问题和进程同步问题。

信号量可以用来控制资源的访问顺序,避免竞争条件和死锁等问题。

4. 共享内存(Shared Memory)共享内存是一种高效的进程间通信方式,它允许多个进程直接访问同一块内存区域,从而实现数据的共享。

共享内存可以提高进程间通信的性能,但需要合理控制访问权限,防止数据的冲突和错误。

二、进程间同步(Process Synchronization)进程间同步是指多个进程之间按照特定的顺序执行,保证数据的一致性和正确性。

在多进程环境下,进程之间的并发执行可能导致竞争条件、死锁和资源冲突等问题,进程间同步机制可以解决这些问题。

1. 互斥锁(Mutex)互斥锁是一种二进制的同步机制,用于保护临界区,避免多个进程同时访问共享资源。

操作系统的进程间通信与同步

操作系统的进程间通信与同步

操作系统的进程间通信与同步进程是计算机系统中的基本执行单位,当多个进程同时运行时,它们之间需要进行通信和同步,以保证数据的正确性和系统的稳定性。

在操作系统中,进程间通信与同步是非常重要的概念和技术,本文将对其进行深入探讨。

一、进程间通信的概念进程间通信(Inter-Process Communication,简称IPC)是指进程之间交换数据和信息的机制和技术。

在现代操作系统中,进程往往是相互独立的,拥有自己的地址空间和资源,它们之间要进行数据传输、共享资源和协同工作,就需要使用进程间通信来实现。

进程间通信的目的是使进程能够共享数据、进行信息交换,并能够相互协调工作,以达到系统整体的高效和稳定。

二、进程间通信的方式在操作系统中,常见的进程间通信方式包括管道、消息队列、共享内存和信号量等。

1. 管道(Pipe):管道是最基本的进程间通信方式之一,它是一种半双工的通信方式,具有先进先出的特点。

在管道中,一个进程作为数据的生产者,而另一个进程则作为数据的消费者。

管道可以实现单向数据流的传输,一般用于父子进程或者兄弟进程之间的通信。

2. 消息队列(Message Queue):消息队列是一种可以实现进程间异步通信的机制,它的通信方式基于消息缓冲区。

发送方将消息放入消息队列中,而接收方则从消息队列中读取消息。

消息队列可以实现多对多的进程间通信,并且具有消息的缓冲和异步通信的优势。

3. 共享内存(Shared Memory):共享内存是一种高效的进程间通信方式,它允许多个进程共享同一块物理内存。

在共享内存中,多个进程可以直接读写共享的内存区域,从而实现数据的共享和同步。

共享内存适用于需要频繁读写共享数据的进程间通信场景。

4. 信号量(Semaphore):信号量是一种用于进程间同步和互斥的机制,它可以控制对共享资源的访问。

通过对信号量进行加锁和解锁操作,多个进程可以实现对资源的互斥访问,从而避免竞争和冲突。

信号量在进程同步和互斥中起到了重要的作用。

深入理解操作系统中的进程间通信机制

深入理解操作系统中的进程间通信机制

深入理解操作系统中的进程间通信机制进程间通信(Inter-Process Communication,IPC)是操作系统中实现不同进程之间数据传输、共享资源、协同工作的一种机制。

在多进程环境下,各个进程相互独立运行,因此需要一种机制来实现它们之间的通信与协调。

本文将深入探讨进程间通信的概念、分类以及常用的实现方式。

一、进程间通信的概念进程间通信是指在操作系统中,不同进程之间通过一定的方法来交换数据和信息的过程。

它是为了满足进程之间资源共享、信息传递、任务协作等需求而设计的。

通过进程间通信,进程可以相互发送数据、接收数据,实现数据共享、同步、互斥等功能。

二、进程间通信的分类根据通信时是否需要借助操作系统来实现,进程间通信可以分为以下两类:1.隐式通信隐式通信是指不需要借助操作系统提供的特殊通信机制,而是通过共享的文件、数据库、内存等资源来实现进程之间的数据交换。

这种通信方式通常适合于处于同一主机上的进程通信,无需操作系统进行干预。

2.显式通信显式通信是指需要借助操作系统提供的通信机制来实现进程间通信。

其中常见的通信机制包括管道、消息队列、信号量、共享内存等。

这些通信机制是操作系统提供的API,用于实现进程间数据传输和共享资源。

三、常用的进程间通信方式在显式通信中,有多种方式可以实现进程间通信。

下面介绍几种常用的方式:1.管道(Pipe)管道是一种半双工的通信方式,用于在两个进程之间传递数据。

它基于文件描述符实现,包括有名管道和无名管道。

有名管道可以在不相关的进程之间进行通信,而无名管道仅用于相关进程之间的通信。

2.消息队列(Message Queue)消息队列是一种可以在不同进程间传递、保存消息的机制。

它采用先进先出的方式,保证消息的有序发送和接收。

通过消息队列,进程可以发送和接收各种类型的消息,实现数据传递和同步。

3.信号量(Semaphore)信号量是一种用于进程间同步和互斥的机制。

它通常用于解决多个进程之间对共享资源的访问问题。

理解计算机操作系统中的进程间通信与同步

理解计算机操作系统中的进程间通信与同步

理解计算机操作系统中的进程间通信与同步计算机操作系统是指导计算机硬件和软件资源协同工作的核心软件。

在多任务操作系统中,不同的进程需要在特定情况下进行通信和同步。

进程间通信(IPC)和进程间同步是操作系统中的重要概念,它们对于进程之间的合作和资源共享至关重要。

本文将深入探讨计算机操作系统中的进程间通信与同步。

一、进程间通信的概念进程间通信,简称IPC,是指在多进程系统中,不同进程之间进行信息交换和共享数据的过程。

进程间通信是实现多任务操作系统中协同工作的基础。

进程间通信有多种方式,常见的包括管道、消息队列、共享内存、信号量、Socket等。

这些通信方式在不同场景下具有不同的优缺点。

例如,管道适合在父子进程之间进行通信,而消息队列适合多个进程之间进行消息传递。

二、进程间通信的作用进程间通信主要用于以下几个方面:1. 数据传输:不同进程之间需要传输数据,比如父子进程之间传递参数或结果。

2. 资源共享:多个进程需要访问共享数据,例如多个进程同时对一个文件进行读写操作。

3. 进程协调:不同进程之间需要协调工作,实现任务分配和合作。

三、进程间同步的概念进程间同步是指多个并发执行的进程按一定的顺序和规则共享和操作资源的过程。

进程间同步的目的是保证进程按照特定的顺序进行执行,避免竞争条件和数据不一致的问题。

常见的进程间同步机制包括互斥锁、信号量、条件变量等。

这些机制能够确保在共享资源被访问前进行同步操作,防止多个进程同时读写造成的数据损坏。

四、进程间通信与同步的关系进程间通信主要解决的是如何在不同进程之间传递信息和共享数据的问题,而进程间同步则主要关注的是如何保证进程之间的操作按照特定的顺序进行。

进程间通信和同步密切相关,通信的过程中需要进行同步操作,以保证数据的一致性和正确性。

例如,在多个进程同时读写共享资源时,需要使用互斥锁来保证同一时间只有一个进程能够访问资源,避免数据损坏。

五、进程间通信与同步的应用场景进程间通信与同步在操作系统中有广泛的应用,下面列举几个常见的场景:1. 生产者-消费者模型:多个生产者进程和消费者进程之间通过共享缓冲区进行通信和同步,实现生产者和消费者的协作。

操作系统的消息传递和进程间通信实现进程间的信息传递和通信

操作系统的消息传递和进程间通信实现进程间的信息传递和通信

操作系统的消息传递和进程间通信实现进程间的信息传递和通信操作系统是计算机中非常重要的一个组成部分,它负责管理和控制计算机的硬件和软件资源。

在多道程序设计环境下,操作系统需要负责调度和管理多个进程的执行。

而进程间的信息传递和通信是操作系统中一个关键的功能,它使得不同进程之间能够相互交互、传递数据,从而实现协同工作和资源共享。

本文将探讨操作系统中的消息传递和进程间通信,以及它们的实现方法和技术。

一、消息传递在操作系统中,进程间的信息传递可以通过消息传递的方式来实现。

消息传递是指一个进程向另一个进程发送消息,并由接收进程接收和处理该消息。

消息传递可以用于进程间的同步和通信,从而实现进程之间的交互。

消息传递一般包括以下几个步骤:1. 消息的创建:发送进程首先需要创建一条消息,并在消息中填写相应的内容。

消息可以包含数据、指令等信息,以满足不同的需求。

2. 消息的发送:发送进程将创建好的消息发送给接收进程。

发送进程需要指定接收进程的标识符,以确保消息能够被正确地发送到目标进程。

3. 消息的接收:接收进程通过等待操作等待消息的到达。

当消息到达时,接收进程将检查消息的标识符,以确定该消息是否是自己所期望接收的。

4. 消息的处理:接收进程接收到消息后,会对消息进行处理。

处理的方式取决于消息的内容和接收进程的需求。

消息传递可以有两种方式:直接消息传递和间接消息传递。

直接消息传递是指发送进程直接发送消息给接收进程。

间接消息传递是指通过操作系统的消息队列来传递消息。

不同的方式适用于不同的场景和需求。

二、进程间通信的实现为了实现进程间的信息传递和通信,操作系统提供了多种机制和技术。

以下是几种常见的进程间通信的实现方式:1. 共享内存共享内存是一种在多个进程之间共享同一块物理内存的方式。

通过将一块内存区域映射到多个进程的地址空间中,进程可以通过读写共享内存的方式来进行通信。

共享内存的优点是速度快,但需要进程之间进行同步和互斥操作,以避免数据的冲突和错误。

进程和进程间通信

进程和进程间通信

进程和进程间通信进程是操作系统中的一个基本概念,它代表了一个正在运行的程序实例。

在现代操作系统中,多个进程可以同时运行,并且需要进行相互之间的通信和协调。

进程间通信(Inter-Process Communication,IPC)是指不同进程之间进行数据交换和共享的机制。

一、进程间通信的需求与作用进程间通信的需求主要体现在以下几个方面:1. 数据共享:不同进程可能需要共享数据,以便实现信息的交换和共同处理。

2. 信息传递:进程之间可能需要进行消息的传递,以便进行协调和同步。

3. 资源共享:进程可能需要共享系统资源,如文件、设备等。

进程间通信的作用主要包括:1. 提高系统性能:进程间通信可以使不同进程并发执行,提高系统整体的运行效率。

2. 实现协作:不同进程之间可以交换信息、协调工作,实现更复杂的任务。

3. 实现分布式计算:通过进程间通信,可以将任务分布到不同的进程或计算机上进行并行处理。

二、进程间通信的方式在实际应用中,进程间通信可以通过多种方式来实现:1. 管道(Pipe):管道是一种半双工的通信方式,可以用于具有亲缘关系的进程之间进行通信。

常见的管道实现有匿名管道和有名管道。

2. 消息队列(Message Queue):消息队列是一种通过系统内核提供的消息缓冲区进行通信的方式,具有高度灵活性和可靠性。

3. 信号量(Semaphore):信号量是一种计数器,用于实现进程之间的同步和互斥操作,常用于控制对共享资源的访问。

4. 共享内存(Shared Memory):共享内存是一种将同一块物理内存映射到多个进程的通信方式,可以实现数据的快速共享。

5. 套接字(Socket):套接字是一种通信机制,可以用于实现不同计算机之间的进程间通信,常用于网络编程。

以上只是进程间通信的一些常见方式,实际上还有其他方式如信号、文件、RPC(远程过程调用)等。

在选择具体的通信方式时,需要根据实际场景需求进行综合考虑。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

很多时候,进程需要和其他的进程进行通信。

比如shell中的管道命令:ps -ef | grep nginx,一个命令的输出,作为另一个进程的输入,这就是进程间通信(Interprocess Communication)。

进程间通信主要需要解决三个问题:1.一个进程如何给另一个进程传递信息2.如何确保进程之间不互相干扰、妨碍3.当进程间出现依赖关系时,该如何处理。

尽管这里讨论的是进程之间的通信,但其实对于线程来说,他们之间的通信需要解决后两个问题。

由于多个线程处在相同的进程,因此也处在同一个地址空间中,所以第一个问题自然很好解决。

但是第二个、第三个问题还是存在的,当然解决的方案其实与进程间通信在处理这两个问题上采取的方案也是类似的。

下面的内容会涉及上面的三个问题。

1.竞争条件(Race Condition)在一些操作系统中,多个进程会共享一部分内存,每个进程都可以对他们进行读写操作。

共享的内存有可能再内存中,也可能是一个共享的文件。

为了看看进程间通信之间的竞争条件,举个简单的例子加以说明:打印池。

假如一个进程想打印一个文件,于是他将文件名输入打印池目录中。

有一个负责打印的进程——打印机守护进程——每隔一段时间会查看一下打印池目录中有没有需要打印的文件。

有的话就打印,没有拉到。

打印机目录的示意图如下:图中的每个小格子可以存放一个待打印的文件名(实际上应该是需要打印的文件的指针,这里只是为了说明问题做的假设)。

同样,还需要假设两个共享的变量:一个叫out存储下一个轮到打印的文件的文件名;另一个叫in存储上图中下一个可以存放待打印文件文件名的小空格。

这两个变量可能被存储再一个文件中,而这个文件共享给了所有的进程。

上图所示的时刻,单元1、2、3已经空了,也就是说,之前存在里面的文件已经打印了。

而5-9号空格还是空的,也就是说接下来需要打印的文件依次存放在下面的单元中。

这一时刻,变量in存储的应该是5。

假设这时候,进程A读取变量in,得到的值是5。

于是,进程A将这个值存储到他的局部变量 next_free_slot中,这时候,恰好CPU时间片到了,进程A重新回到可运行状态,而此时进程B获得了时间片,开始运行,它也有文件需要打印,那么它读取in,获得的值是5,于是它也将5这个值存储进他的局部变量next_free_slot中。

然后它根据这个变量的值,将它需要打印的文件的文件名,假设是ccc.txt存储进单元格5中。

等待打印。

然后进程B开始干别的事情了。

又过了一段时间,进程B的CPU时间片用完了。

而进程A又获得了 CPU时间片。

它开始继续运行,先读取next_free_slot的值,得到的是5,于是,可怕的事情发生了,它把自己需要打印的文件名写入单元格5,也就是说,覆盖掉了进程B之前放置的需要打印的文件ccc.txt。

进程B可能一直在等待打印的输出,但是永远都等不到了。

2.临界区(Critical Regions)如何避免竞争条件?避免出现这种麻烦,或者说在任何涉及到共享内存、文件或者其他一切共享资源的情况下的处理策略是防止多于一个进程在同一时刻读写共享数据。

换句话说,互斥(Mutual Exclusion)。

对于大多数的操作系统来说,选择合适的原语来实现互斥是一个主要的涉及手段。

临界区(Critical Region/Critical Section)是指进程中那些访问共享内存并且可能导致竞争状态的部分。

要防止竞争状态的出现,我们可以理解成要防止两个需要共享同一块内存的进程不要同时进入自己的临界区。

但是仅仅如此是不够的,需要坚持下面的四个原则:不允许两个进程同时进入各自的临界区不要对任何关于CPU速度和CPU数量的假设不允许运行在自己临界区外的进程阻塞别的进程不允许任何进程无休止的等待进入自己的临界区上面描述的是一种抽象的解决问题的思路,可以简单的使用一个图作为例子来描述使用临界区则个概念来体现互斥操作。

3.实现互斥的几种方案之——禁用中断(Disable Interrupt)在单处理器系统中,这时最为简单的方案。

也就是当进程进入临界区后,禁用中断,等它离开临界区再开启。

CPU能够切换进程的前提是可以发生时钟中断或者其他中断。

这就意味着,当一个进程进入临界区,他就不可能被剥夺CPU使用权,直到它离开临界区。

这种方案显然没有吸引力,其缺点有两点:给用户进程权利去禁用中断是不明智的,如果有进程禁用了中断并且再也不开启,那系统最后将会死掉。

如果多个CPU,当一个进程禁用中断,只是它正在使用的CPU会被影响,而此时,另外的CPU上的进程可能还是会访问临界区,进入修改共享内存的内容尽管如此,对于操作系统的内核来说,这却是一个很方便的技巧。

当内核正在更新就绪进程表时,它可能会在几个指令的时间内禁用中断。

此外,现在使用这种方式实现互斥越累越少了,毕竟,现在的机器都是多核的。

4.实现互斥的几种方案之——锁变量(Lock Variables)这种方案的原理是设计一个所变量,初始化为0,某个进程要进入临界区,先查看该变量的值,如果是0,则可以进入临界区,并且将该变量的值设置为1,等它离开临界区再将这个变量设置为0.简而言之,这个变量为0代表没有进程正处在临界区,1代表有进程处在临界区。

但是这个方案存在的问题和前面举例的那个打印机问题一样。

5.实现互斥的几种方案之——严格变更(strict alternation)这个方案的基本原理如下面的两段代码所示:1 while(TRUE) {2 while(turn != 0) {3 }4 critical_region();5 turn = 1;6 noncritical_region();7 }89 while(TRUE) {10 while(turn != 1) {11 }12 critical_region();13 turn = 0;14 noncritical_region();15 }复制代码整型变量turn,用来跟踪到底那个进程当前可以进入自己的临界区。

对于进程0来说,不断检测turn是否等于0,如果是则它可以进入自己的临界区,如果 turn不等于0,那么它就继续等待,并且持续的检测这个变量的值。

如果进程0进入了临界区,当它出来之后,它将turn设置为1,也就是轮到进程1(另外的一个进程)进入临临界区了。

对于进程1来说,它执行的是第二段代码,但是原理一样。

对于进程来说,必须不断的检查一个变量的值来判断是否轮到自己进入临界区,这种情况叫做忙等待(busy waiting)。

这种情况是应该被避免的,因为它很浪费CPU的时间。

使用忙等待实现的锁,叫做自旋锁(spin lock)。

这种方案还有一个问题。

如果两个进程执行的速度差距很大。

我们假设进程0执行速度远远快于进程1。

一开始,turn的值为0,进程0进入临界区,很快,进程0离开临界区,将turn设置为1,这时候,进程1开始进入临界区,而此时进程0可能会已经离开非临界区,并且又持续监测turn的值。

进程1一离开临界区,将turn再次设置为0,进程0又进入临界区,而进程1进入非临界区。

由于进程0执行速度很快,它很快再次执行完临界区的代码,将turn设置为 1,然后执行非临界区代码。

由于进程0非常快,进程1很慢,很可能进程1还在第一次的非临界区,这时,进程0已经执行完第二次非临界区的代码,而此时 turn还是它刚才设置的值——0,而其实另一个进程,进程1,并没有在临界区,而是在非临界区挣扎。

这种情况下,进程0却只能干等。

所以,很明显,这种方案非常不适合多个进程之间执行速度差距很大的情况。

而我们这一节的标题叫做strict alternation,举个例子说,就是像前面提到的打印池,strict alternation不允许一个进程一次提交大于1个需要打印的文件。

这可能也是为了不要是进城之间的执行速度差距过大吧。

6.实现进程互斥的几种方案之——Peterson方案这个方案的历史我们这里略过不说,其基本原理如下面的实例代码:16 #define FALSE 017 #define TRUE 118 #define N 21920 int turn;21 int interested[N];2223 void enter_region(int process) {24 int other;25 other = 1 - process;26 interested[process] = TRUE;27 turn = process;28 while(turn==process && intrested[other] == TRUE)29 }30 void leave_region(int process) {31 intrested[process] = FALSE;32 }复制代码进程在进入临界区之前,需要执行enter_region函数,并将自己的进程号作为参数传递进去。

当进程离开临界区,需要执行和leave_region函数。

我们具体看看原理:对于进程0和进程1。

一开始谁都没有在临界区,现在进程0调用enter_region函数。

首先,进程0将对应于自己的数组元素 intrested[0]设置为TRUE,并且将turn的值设置为自己的进程号,也就是0。

然后这一步很关键,做一个循环的检查,如果轮到了自己(turn==process)但是另一个进程也很感兴趣(intrested[other]==TRUE)。

如果使这样的话,那么什么也不做,等着。

否则的话,真正开始进入临界区。

如果进程0执行完了临界区代码,那么就将intrested[0]设置为FALSE,也就是说表示自己此刻不需要再进入临界区了。

这种方案会不会发生两个进程都在干等着,最后死锁呢?我们看看。

假设进程0和进程1几乎同时执行到turn=process代码,假设进程0先执行这条语句,紧接着进程1也执行这条语句,从而擦除之前进程0设置的值。

那么接下来进程0就只能在那个while循环里面等着了,而进程1则真的进入自己的临界区。

这也是为什么我在上面说这个里层的while循环很重要了。

7.实现进程互斥的几种方案之——TSL指令前面介绍了几种方案,都是通过软件的方式实现互斥,下面的这种方式需要借助硬件设计的帮助来实现互斥。

这一点在多CPU电脑的设计中尤其普遍。

这种方案需要引进一条指令:1 TSL RX,LOCK复制代码这条指令的含义是,读取内存单元LOCK中的内容到寄存器RX中,并且为内存单元LOCK重新设置一个非0值。

TSL指令的操作被设计为不可分的,也就是 说,整个读写操作都完成之前,其他进程是没办法访问LOCK这个内存单元的。

相关文档
最新文档