`
香煎马鲛鱼
  • 浏览: 109508 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论
阅读更多

进程线程的同步机制

什么是进程/线程间同步机制

多进程的系统中避免不了进程间的相互关系。其实,如果类比于我们的现实生活,我们可以找到很多例子:

如果两个人有一个共同的支付宝,同时取走里面的所有钱,那么这些钱该给谁?

小明和小红同时买某趟火车的最后一张票,那么这个票属于谁?

…………

其实生活中这样的例子比比皆是;要讲线程同步,那么我们就不得不讲什么是线程互斥:

两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可能发生与时间有关的错误,这种现象被称作进程互斥· 也就是说,一个进程正在访问临界资源,另一个要访问该资源的进程必须等待。
      进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。通常的情况是两个或两个以上的进程需要同时访问某个共享变量。我们一般将发生能够问共享变量的程序段称为临界区。两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间有关的错误。解决互斥问题应该满足互斥和公平两个原则:任意时刻只能允许一个进程处于同一共享变量的临界区,而且不能让任一进程无限期地等待

竞争:多个线程或者进程在读写一个共享数据时结果依赖于它们执行的相对时间,这种情形叫做竞争。

竞争条件:多个进程并发访问和操作同一数据且执行结果与访问的特定顺序有关,称为竞争条件。

进程同步是进程之间直接的相互作用,是合作进程间有意识的行为,典型的例子是公共汽车上司机与售票员的合作。只有当售票员关门之后司机才能启动车辆,只有司机停车之后售票员才能开车门。司机和售票员的行动需要一定的协调。同样地,两个进程之间有时也有这样的依赖关系,因此我们也要有一定的同步机制保证它们的执行次序。 

Bernstein条件:并发进程的无关性是进程与时间无关的一个充分条件,这一条件在1966年首先由Bernstein提出,称为Bernstein条件。

间满足以下3条关系:

(1) R(p1) ∩ W(p2) = 

(2) R(p2) ∩ W(p1) = 

(3) W(p1) ∩ W(p2) = 

例如:p1y=z+yp2: z=x+z,假设x=1y=2z=3

如果先运行p1,则最后的结果是x=1y=5z=4;如果先运行p2,则x=1y=6z=4。两次的结果不一样,即程序不可再现,所以p1p2不能并行的执行。

借用上面的例子,p1:y=z+y,那么p1的读集为 R(p1)={z,y},p1的写集为 W(p1)={y}

对进程S1S2Bernstein条件要求R(S1)W(S2)W(S1)R(S2)W(S1)W(S2)={}

多个程序段其实只有一部分代码会引起竞争条件——进程中间对共享数据进行访问的区域(这部分区域就是临界区)

在实际情况下,我们要避免竞争条件,保证一段时间内,临界区只被一个进程占有;

process进入临界区的条件:

1、互斥使用;

2、有空让进;前进性

3、有限等待;

 

(互斥、不空置、不饿死)

 

进程同步方案1(软件方案)

Petersons Solution

Person's solution 是用来一种基于软件的解决关键区域问题的算法(critical-section). 

它并非完美的,有可能不正确地工作。解决的问题存在局限性:解决两个进程同步的问题。 简单,很原始,学习起来也是很轻松的

我们可以类比到现实生活中的十字路口问题:只有两个进程——(横向、纵向),为了保证车辆的有序进行,我们可以才有红绿灯——Petersons Solution

考虑条件1:临界区是否为空(客观条件)

交叉路口中,红绿灯就是横向纵向的共享信号;

——只有等到绿灯,才能行进;

考虑条件2:进程意愿(客观条件)

然而十字路口的红灯并不能判断纵横车道是否有车,但是在解决方案中,我们必须进行一个标识,如果想进入临界区,则设置一个flagtrue,一个进程要进入临界区,首先看看其他进程的flag是否为true,如果其他为ture,就先让其他进;

两个条件必须同时考虑:只考虑1——不满足互斥条件;只考虑2——不满足前进条件(两个进程如果一直让对方的结果是两个都不能进)

do {flag[i] = true;turn = j;while (flag[j] && turn == j);critical sectionflag[i] = false;remainder section} while (true);

 

面包店算法(多进程方案)

在多个进程竞争的情况下,使用面包点算法;

概括:进入临界区之前,每个进程分配一个数字,具有最小数字的进程进入临界区

分配的数字怎么来:分配的数字按不减的方式产生(数字有可能相同),每个进程自行产生,在数字相同的情况下,按下标排列;

Notation<=lexicographical order (ticket #,process id #)

(a,b)<(c,d) a<c or if a=c and b<d

Data:

booleen choosing -----判断是否需要排队;

Number 排队次序;

 

do{

Choosing[i] = true;

Number[i] = max(number[0],number[1]………………);

Choosing[i] = false;

For (j = 0;j<n;j++){

While(choosing[j]);

While((number[j]!=0)&&((number[i],j)<(number[j],i))));

}

Critical section

Number[i] = 0;

remainder section;

}

 

其他算法:Elsenberg alorithm

 

进程同步方案2(硬件方案)

系统对临界区提供硬件支持:

a) 单处理器系统——屏蔽中断:临界区在使用时,关闭中断

不适用于多处理器系统:往往会带来很大的性能损失;

单处理器使用:很多日常任务,都是靠中断的机制来触发的,比如时钟,如果使用屏蔽中断,会影响时钟和系统效率,而且用户进程的使用可能很危险!

使用范围:内核进程(少量使用)

b) 原子硬件指令支持:

测试设置指令:

Process P1{

While(TestAndSet(lock));——临界区入口;保证临界区中只有一个进程

(critical section)

Lock = false;

}

交换指令:

Void Swap(boolean &a,booleann &b)

(多处理器的情况下,测试设置指令和交换指令并不能保证互斥)

 

所以说,软件和硬件方案都是有一定缺陷的,那么我们还有什么更好的方法么,当然啦~~~~~下回我们介绍个非常重要的概念——信号量;

预知后事如何,请听下回分解!

<!--EndFragment-->
2
0
分享到:
评论

相关推荐

    线程同步机制代码,用c++写的,:使用Windows互斥信号量操作函数和同步机制的Peterson,实现进程互斥和同步

    小实验一:编写一个没有线程同步机制的程序,调试程序,观察在执行程序的过程中,出现的问题并解答原因 小实验二:使用Windows互斥信号量操作函数解决上述线程并发问题,并分析、尝试和讨论线程执行体中有关信号量...

    windows线程几种同步方式

    本篇文章将详细探讨在C++环境下,Windows系统中的几种线程同步机制:Mutex、Event以及Semaphore。 1. **Mutex(互斥量)** Mutex是一种基本的线程同步工具,用于保护共享资源免受多个线程同时访问。当一个线程获得...

    操作系统实验报告——线程与进程同步

    实验内容集中在Linux下的多线程同步机制上,具体通过修改生产者-消费者问题的示例程序来实现。在这个问题中,多个生产者线程生成数据,而消费者线程负责消费这些数据。为了保证数据的一致性和正确性,需要防止多个...

    作系统常见的进程或线程同步问题

    操作系统中的进程或线程同步是计算机科学中的一个重要概念,它主要关注的是多个进程或线程在执行时如何协调它们的活动,以确保系统的正确性和效率。在多处理器或多线程环境中,同步机制变得尤为重要,因为资源(如...

    Posix线程同步机制及其在电网监控系统中的应用借鉴.pdf

    Posix线程同步机制及其在电网监控系统中的应用借鉴 Posix线程同步机制是指在 Unix/Linux 平台上,使用多线程技术来实现多计算任务的并发处理,并解决任务间需要大量数据通信的问题。本文对 Posix 线程同步机制进行...

    操作系统实验报告—Windows线程同步机制.doc

    Windows 线程同步机制实验报告 操作系统实验报告—Windows 线程同步机制主要涵盖了 Windows 操作系统中的线程同步机制,包括互斥体、事件、关键区、信号量等。实验报告通过 C++/C# 语言在 Microsoft Visual Studio ...

    进程同步,线程同步类

    线程同步机制包括互斥锁(Mutex)、读写锁(Read-Write Locks)、条件变量(Condition Variables)等,确保了对共享数据的正确访问。 **Semaphore(信号量)**: 信号量是一种经典的同步原语,由P(Wait)和V...

    多线程的同步机制 VC++

    多线程同步机制在软件开发中扮演着至关重要的角色,特别是在多处理器系统或者并发执行的任务中,确保线程间的正确协作和数据一致性是必不可少的。VC++中提供了多种同步机制来处理多线程间的同步问题,其中Event是...

    进程线程通信,线程同步,异步,进程通信经典进程间通信.7z

    在计算机科学中,进程线程通信、线程同步与异步以及进程间的通信是操作系统核心概念,对于理解和优化多任务并行处理至关重要。这些概念在软件开发,尤其是并发编程领域中占据着举足轻重的地位。 首先,让我们来探讨...

    线程同步的五种方法

    在Windows编程中,提供了多种线程同步机制,包括互斥量、临界区、原子操作、事件以及信号量等。以下是对这些方法的详细解释: 1. **互斥量(Mutex)**:互斥量是一种独占式同步对象,一次只有一个线程可以拥有互斥...

    Java多线程同步机制在售票系统的实现

    ### Java多线程同步机制在售票系统的实现 #### 一、引言 随着计算机硬件的发展,多核处理器已经成为主流配置,这为多线程编程提供了更广阔的应用场景。多线程能够充分利用多核处理器的优势,提高程序的并发性和...

    JAVA多线程同步机制及其应用.doc

    Java多线程同步机制及其应用是Java编程中至关重要的一环,尤其在开发高并发、高性能的应用程序时,理解并掌握这些机制是必不可少的。本文档详细介绍了Java中多线程的相关概念、创建方式、线程管理、同步机制以及一个...

    线程同步代码集实例

    在Windows API中,提供了多种线程同步机制,如Event、Mutex、Semaphore和Section。接下来,我们将详细讨论这些同步机制以及它们的应用实例。 1. Event同步:Event对象是一种信号量,可以用来通知线程有特定事件发生...

    操作系统线程同步实验报告

    操作系统线程同步是多线程编程中的核心概念,旨在确保并发执行的线程在访问共享资源时不会引发数据不一致性和竞态条件。本实验报告详细探讨了这一主题,通过一个简单的银行账户转账的示例来揭示临界区问题及其解决...

    线程同步解决火车站售票问题

    在这个“线程同步解决火车站售票问题”的例子中,我们可以通过线程同步机制来实现售票的有序、无冲突的过程。 首先,我们需要理解问题的核心:10个售票处(线程)需要共享1000张票(资源),并且每卖出一张票,必须...

    北京大学操作系统 进程同步机制

    ### 北京大学操作系统 进程同步机制 #### 基本概念 在现代操作系统中,进程同步机制是一项至关重要的技术。它确保了多个进程在访问共享资源时能够正确协调,避免了竞态条件和死锁等问题。进程同步机制不仅提高了...

    VC++线程同步实例

    1. **临界区(Critical Section)**:临界区是一种简单的线程同步机制,用于保护一小段代码,使得在同一时间只有一个线程可以执行这段代码。例如,在公交车上,当司机启动车辆时(临界区),售票员不应同时开启车门...

Global site tag (gtag.js) - Google Analytics