操作系统中的进程/线程互斥

在操作系统中,不同的进程和线程之间涉及到一个重要的问题就是互斥,即保证对共享数据的正确修改。

基本的思想就是避免多余一个进程或线程(后面统一用进程来代替)同时读写共享数据。

为了解决这个问题,有很多的想法,为了方便说明各自的问题,按照《现代操作系统》中的思路来叙述。

首先是想到的控制进程的执行顺序,提出了两个方法:一个是严格轮转法,一个是Peterson算法。

严格轮转法就是让进程挨个按序执行,进程0做完了让给进程1,依次下去;缺点就是有忙等待,而且进程0可能会被不在临界区的进程1阻塞(因为两个轮流来);

Peterson算法不再严格轮转,不同进程调用的代码相同,传入各自的进程号来争抢,争抢到的一方可以进入临界区;

除了上述软件上的方法,还提出了一个硬件解决方法,设置一个TSL指令,该指令是原子操作(该操作完成前不允许其他指令访问该内存地址),完成测试和设置内存值的操作。这样可以避免出现两个进程同时修改,然后可利用该内存字来仲裁应该调度哪个进程。

上述方法(其实我觉得TSL使用好了不会)都会导致忙等待的问题,而忙等待会导致出现优先级反转(优先级高的等待优先级低的离开临界区,而优先级低的不能被调度离开临界区)。

为了解决忙等待的问题,又提出了增加wakeup和sleep的方法,即典型的生产者-消费者问题;简单的模型存在wakeup或sleep信号丢失,导致进程不能醒来或睡眠的问题。

然后引入了信号量,信号量要求:检查、修改和唤醒/睡眠操作是一个整体的原子操作,这样避免信号丢失的问题;

信号量其实有两个用法,一个是用来做信号量的计数,一个是用来互斥(当为某个值时会让进程睡眠,当为其他值让进程继续);

如果简化地使用信号量,即不使用它的计数功能,只是用互斥,那么可以一个0或1的”互斥信号量“,这样可以用来支持是否让进程睡眠。

整体上看,由硬件支持的原子操作是非常必须的,只有这样才能真正保证”有效地“(忙等待效率不高)实现进程间互斥,使得进程不会同时修改共享数据。

时间: 2024-10-13 06:49:27

操作系统中的进程/线程互斥的相关文章

操作系统中的进程与线程

操作系统中的进程与线程 转自:http://www.cnblogs.com/CareySon/archive/2012/05/04/ProcessAndThread.html 简介 在传统的操作系统中,进程拥有独立的内存地址空间和一个用于控制的线程.但是,现在的情况更多的情况下要求在同一地址空间下拥有多个线程并发执行.因此线程被引入操作系统. 为什么需要线程? 如果非要说是为什么需要线程,还不如说为什么需要进程中还有其它进程.这些进程中包含的其它迷你进程就是线程. 线程之所以说是迷你进程,是因为

操作系统中作业、线程、进程、内存管理、垃圾回收以及缓存等概念

作业:用户在一次解题或是一个事务处理过程中要求计算机系统所做的工作的集合.它包括用户程序.所需要处理的数据以及控制命令等.作业是由一系列有序的步骤组成. 进程:一个程序在一个数据集合的一次运行过程.所以一个程序在不同数据集合上运行,乃至一个程序在同样的数据集合上的多次运行都是不同的进程. 线程:线程是进程中的一个实体,被系统独立调度和执行的基本单位. 管程:管程实际上是定义了一个数据结构和在该数据结构上的能为并发进程做执行的一组操作,这组操作能同步进程和改变管程中的数据. 操作系统中作业.线程.

操作系统学习笔记----进程/线程模型----Coursera课程笔记

操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进程创建.撤销.阻塞.唤醒.... 0.2 线程模型 为什么引入线程 线程的组成 线程机制的实现 用户级线程.核心级线程.混合方式 1. 进程的基本概念 1.1 多道程序设计 允许多个程序同时进入内存运行,目的是为了提高CPU系统效率 1.2 并发环境与并发程序 并发环境: 一段时间间隔内,单处理器上

死锁现象与解决方案,开启线程的2种方式,守护线程,线程VS进程,线程互斥锁,信号量

死锁现象与解决方案 from threading import Thread,Lock,active_count import time mutexA=Lock() # 锁1 mutexB=Lock() # 锁2 class Mythread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('%s 拿到A锁' %self.name) mutexB.acquire() print('%

操作系统中的进程和线程

进程与进程的作用 当我们双击程序图标,开始运行程序时,就产生了一个进程.所以进程的本质是一个正在执行的程序.进程包含了程序运行的所需要的所有信息,如代码段,数据段,程序计数器(存放下一条指令所在的地址),进程标识符(PID)进程控制块(PCB,用来保存进程退出CPU时的现场信息)等等信息. 所以进程可以看做是容纳程序运行的所有信息的容器. 值得注意的是,一个程序如果运行了两遍,则算是两个进程.如运行了两个word程序,这两个进程除了代码段,其他信息都是不一样的,事实上,这两个进程共享代码段. 进

获取系统中所有进程&线程信息

读书笔记--[计算机病毒解密与对抗] 目录: 遍历进程&线程程序 终止进程 获取进程信息 获取进程内模块信息 获取进程命令行参数 代码运行环境:Win7 x64 VS2012 Update3 遍历系统中所有进程 [cpp] view plain copy print? #include <stdio.h> #include <windows.h> #include <TlHelp32.h> int main() { // 为进程的所有线程拍个快照 HANDLE 

第二十一篇:Linux 操作系统中的进程结构

前言 在 Linux 中,一个正在执行的程序往往由各种各样的进程组成,这些进程除了父子关系,还有其他的关系.依赖于这些关系,所有进程构成一个整体,给用户提供完整的服务( 考虑到了终端,即与用户的交互 ). 本文将详细描述 Linux 中的进程结构. 进程结构 上图所描述的是为了给用户提供一次完整服务( 需要处理用户IO等 )所涉及到的一个完整的进程结构,几个部分解释如下: 1. 控制进程 建立与终端连接的进程称为控制进程( 属于后台进程组之一 ) 2. 前台进程组 控制终端( 处理如Ctrl+C

操作系统中,进程的“死锁”现象

所谓死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程. "死锁"产生的原因: 1.系统资源不足 2.进程运行推进的顺序不合适 3.资源分配不当 "死锁"产生的条件 1.互斥条件:一个进程每次只能被一个进程使用 2.请求与保持条件:一个进程因资源请求被阻塞时,对已获得的资源保持不放 3.不剥夺条件: 进程已获

操作系统原理---操作系统中进程同步和互斥的概念

简介 进程同步是一个操作系统级别的概念,是在多道程序的环境下,存在着不同的制约关系,为了协调这种互相制约的关系,实现资源共享和进程协作,从而避免进程之间的冲突,引入了进程同步. 临界资源 在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源).但对于某些资源来说,其在同一时间只能被一个进程所占用.这些一次只能被一个进程所占用的资源就是所谓的临界资源.典型的临界资源比如物理上的打印机,或是存在硬盘或内存中被多个进程所共享的一些变量