《转载》
互斥
:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步
:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
互斥是指两个实体的动作不允许同时发生,如果同时发生就会产生不可以预期的结果。互斥是同步的前提,如果两个动作不是互斥的,就不可能保证其发生的顺序。
-----------------------------------
生产者、消费者问题
产者-
消费者(
Producer-Consumer
)问题是著名的进程同步问题。它描述一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。以下用信号量解决生产者
-
消费者问题。
假如缓冲池中有n
个缓冲区,每个缓冲区存放一个消息,可利用互斥信号量
mutex
使诸进程对缓冲池实现互斥访问;利用
empty
和
full
计数信号量分别表示空缓冲及满缓冲的数量。又假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。

其中,mutex
,
empty
,
full
的初始值分别为
1
,
n
,
0
;
基本概念
进程互斥:指在多道程序环境下,每次只允许一个进程对临界资源进行访问。
进程同步:指多个相关进程在执行次序上的协调。
临界资源:在一段时间内只允许一个进程访问的资源。
临界区:每个进程中访问临界资源的那段代码。
、、、、、、、、、、、、、、、、、、、、、、、、、
4.
7.2 进程运行状态
一个进程在其生存期内,可处于一组不同的状态下,称为进程状态,如图5-21所示。进程状态保存在进程任务结构的state字段中。当进程正在等待
系统中的资源而处于等待状态时,则称其处于睡眠等待状态。在Linux系统中,睡眠等待状态分为可中断的和不可中断的等待状态。
|
(点击查看大图)图5-21 进程状态及转换关系 |
(1)运行状态(TASK_RUNNING)。当进程正在被CPU执行,或已经准备就绪随时可由调度程序执行,则称该进程为处于运行状态
(running)。若此时进程没有被CPU执行,则称其处于就绪运行状态。见图5-21中3个标号为0的状态。进程可以在内核态运行,也可以在用户态运
行。当一个进程在内核代码中运行时,我们称其处于内核运行态,或简称为内核态;当一个进程正在执行用户自己的代码时,我们称其为处于用户运行态(用户
态)。当系统资源已经可用时,进程就被唤醒而进入准备运行状态,该状态称为就绪态。这些状态(图中中间一列)在内核中表示方法相同,都被称为处于
TASK_RUNNING状态。当一个新进程刚被创建出后就处于本状态中(最下一个0处)。
(2)可中断睡眠状态(TASK_INTERRUPTIBLE)。当进程处于可中断等待(睡眠)状态时,系统不会调度该进程执行。当系统产生一个中断或者释放了进程正在等待的资源,或者进程收到一个信号,都可以唤醒进程转换到就绪状态(即可运行状态)。
(3)不可中断睡眠状态(TASK_UNINTERRUPTIBLE)。除了不会因为收到信号而被唤醒,该状态与可中断睡眠状态类似。但处于该状态
的进程只有被使用wake_up()函数明确唤醒时才能转换到可运行的就绪状态。该状态通常在进程需要不受干扰地等待或者所等待事件会很快发生时使用。
(4)暂停状态(TASK_STOPPED)。当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状
态。可向其发送SIGCONT信号让进程转换到可运行状态。进程在调试期间接收到任何信号均会进入该状态。在Linux
0.12中,还未实现对该状态的转换处理。处于该状态的进程将被作为进程终止来处理。
(5)僵死状态(TASK_ZOMBIE)。当进程已停止运行,但其父进程还没有调用wait()询问其状态时,则称该进程处于僵死状态。为了了让
父进程能够获取其停止运行的信息,此时子进程的任务数据结构信息还需要保留着。一旦父进程调用wait()取得了子进程的信息,则处于该状态进程的任务数
据结构就会被释放。
当一个进程的运行时间片用完,系统就会使用调度程序强制切换到其他的进程去执行。另外,如果进程在内核态执行时需要等待系统的某个资源,此时该进程
就会调用sleep_on()或interruptible_sleep_on()自愿地放弃CPU的使用权,而让调度程序去执行其他进程。进程则进入睡
眠状态(TASK_UNINTERRUPTIBLE或TASK_INTERRUPTIBLE)。
只有当进程从"内核运行态"转移到"睡眠状态"时,内核才会进行进程切换操作。在内核态下运行的进程不能被其他进程抢占,而且一个进程不能改变另一个进程的状态。为了避免进程切换时造成内核数据错误,内核在执行临界区代码时会禁止一切中断。
分享到:
相关推荐
(1) 通过编写程序实现进程同步和互斥,掌握有关进程(线程)同步与互斥的原理,以及解决进程(线程)同步和互斥的算法,从而进一步巩固进程(线程)同步和互斥等有关的内容。 (2) 了解Windows2000/XP中多线程的...
在操作系统的学习中,进程同步与互斥是极其重要的概念,它们是多任务环境下保证程序正确执行的关键机制。在这个"操作系统实验之进程同步与互斥课件"中,我们可以深入理解并实践这两个关键概念。 首先,我们要明白...
进程同步与互斥实验报告 操作系统实验报告《进程同步与互斥》实验的主要目的是掌握基本的进程同步与互斥算法,了解生产者-消费者问题,并学习使用 Windows 2000/XP 中基本的同步对象,掌握相关 API 的使用方法。...
进程的同步与互斥习题 本文将对进程的同步与互斥习题进行详细的解释和分析,涵盖了多种不同的场景和问题,包括进程的同步、互斥、信号量、缓冲区、生产者消费者问题、读者写者问题、司机与售票员问题、汽车过桥问题...
C语言中实现进程同步,可以借助于信号量(Semaphore)、管程(Monitor)以及条件变量(Condition Variable)等工具。 信号量是一种经典的同步机制,分为二进制信号量和计数信号量。二进制信号量只有0和1两个状态,...
操作系统进程同步和互斥是操作系统中至关重要的概念,它们确保了多进程或多线程环境下的资源有效管理和安全访问。本实验报告详细介绍了如何通过编程实现这一机制,并以生产者-消费者问题为实例进行演示。 实验的...
进程的同步与互斥习题(含参考答案) 进程的同步与互斥是操作系统中的一种机制,用于管理多个进程之间的资源竞争和协作。本文将通过20个习题,详细解释进程的同步与互斥问题,并提供相应的解决方案。 1. wait 与 ...
在Java编程中,线程同步和互斥是多线程编程中的重要概念,它们用于解决多个线程同时访问共享资源时可能出现的问题。本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费...
通过本次实训,不仅加深了对进程同步和互斥理论的理解,还学会了如何将理论应用于实际编程中解决问题。此外,在解决设计过程中遇到的各种问题时,还锻炼了独立思考和解决问题的能力,同时也提高了查找资料和自我学习...
实验8 进程同步与互斥.c
操作系统实验是计算机科学教育中的重要组成部分,它帮助学生理解和掌握操作系统的基本原理,特别是多线程同步与互斥的概念。在Java编程环境下,这些概念可以通过实际的代码实现来深入理解。 多线程是现代操作系统中...
### 解决多线程编程中的同步互斥问题 在现代软件开发中,多线程编程是一种常见的技术,它能够充分利用计算机系统的多核处理能力,提高应用程序的执行效率。然而,多线程编程也带来了一系列复杂的问题,其中最典型的...
### 进程同步与互斥:生产者与消费者问题 #### 一、基础知识与概念解析 **1.1 操作系统的基本概念** 操作系统(Operating System, OS)是计算机系统的核心软件,负责管理和协调计算机硬件资源及软件资源。它通过...
操作系统\同步与互斥.ppt 操作系统\同步与互斥.ppt
这个模拟操作系统的进程同步与互斥问题是根据生产者-消费者问题来实现的。该问题是一个经典的进程同步问题,由 Dijkstra 提出,用以演示他提出的信号量机制。生产者线程生产物品,然后将物品放置在一个空缓冲区中供...
进程的同步与互斥是操作系统中的核心概念,用于管理和协调多任务执行的顺序和资源访问。在MFC(Microsoft Foundation Classes)框架下,我们可以利用其丰富的界面和消息处理机制来模拟这一过程,以便更好地理解这些...
《PV操作论文——进程的同步与互斥》 在计算机操作系统中,进程是系统资源分配的基本单位,也是并发执行的基本实体。进程管理是操作系统的核心功能之一,涉及进程的创建、撤销、状态转换以及调度。进程状态包括就绪...
P、V操作对应于信号量,信号量是一种特殊的变量,用于实现进程间的互斥和同步。信号量的值代表资源的可用数量,P操作将信号量减一,V操作将信号量加一。 进程互斥的实现部分详细讲解了通过P、V操作来保证进程对临界...