用多进程同步方法演示“生产者-消费者”问题_操作系统之进程管理(2):多进程的组织、交替、合作...

2023-05-16

1.多进程如何组织?

上文中(操作系统之进程管理(1):从CPU如何执行进程说起),我们说过操作系统为每个程序提供了一个叫做PCB(Process Control Block进程控制块)的数据结构。它记录了该程序执行到什么位置,执行过的值的状态、相关寄存器的状态等信息,供CPU再次返回时恢复现场使用。简单来说,PCB就是操作系统为系统进程提供的一种记录进程信息的数据结构

首先,进程有五种状态,PCB记录了进程处于何种状态。

运行态:该进程正在执行。

(运行态--->阻塞态):

遇到IO操作指令时,执行IO指令(如读写磁盘操作),此时进程进入阻塞态。

(运行态--->就绪态):

因为CPU是按照时间片在各进程间来回切换使进程共同推进的,因此当前进程CPU在其上的时间片过了之后,当前进程重新进入就绪态,等待下一次CPU的时间片来临。

就绪态:进程已经做好了准备,有机会得到CPU的资源,然后就开始执行变为运行态。(就绪态--->运行态)

阻塞态:进程在某些事情发生时不能被CPU调度,必须等待阻塞进程的事件完成,然后进入就绪态,才有机会得到CPU的调度执行变为运行态。如当前进程处于IO操作,此时进程不能被调度,只有IO操作完成之后,变为就绪态,才有机会被调度。(阻塞态--->就绪态)

新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中,通常是(PCB)进程控制块已经创建但是还没有加载到内存中的进程。

终止态:操作系统从可执行进程组中释放出的进程,或由于自身或某种原因停止运行。

多进程的组织方式?

1.有一个进程在执行(运行态)

2.有一些进程在等待被调度执行(就绪态):

3.有一些进程在等待某事件结束(阻塞态)

2.多进程如何交替

pCur为当前执行的进程,执行启动磁盘读写指令后,把该进程PCB放入DiskWaitQueue,即把该进程放入上述的磁盘等待队列,此时pCur当前进程由运行态转化为阻塞态,然后执行schedule()函数,在就绪队列中找到一个处于就绪状态的进程,切换到该就绪进程使其转化为运行态,得到CPU调度执行该进程。

进程交替(schedule()函数)涉及两部分:

1.pNew = getNext(ReadyQueue),从就绪队列中找一个就绪态进程

那么getNext(ReadyQueue)到底以什么策略在就绪队列中寻找一个处于就绪态的进程去执行呢?

这个问题就属于进程调度的范畴了,该问题目前仍然处于一个热点研究之中,下面我列举两种比较常见的进程调度策略。

FIFO(先进先出):即每次选择进程调度的时候就从就绪队列中拿出队首的进程去调度,而刚转化为就绪态的进程就放进队列的尾部。很显然FIFO是公平的策略,先变为就绪态的在队首,后变为就绪态的在其后,先调度先变为就绪态的,后调度后变为就绪态的。但是FIFO没有考虑进程执行的任务区别,有的进程需要紧急执行的,有的进程不需要那么急执行的,显然FIFO策略做不到这一点。

Priority(优先级):每次选择进程调度的时候从队列中选出需要紧急执行的(优先级高)进程,但是这样的策略有可能会使某些进程饥饿,即优先级低的可能永远都得不到被调度的机会,一直在就绪队列中等待。

2.switch_to(pCur, pNew),从当前进程切换到上步中找到的就绪进程调度执行:

切换的过程即为保存pCur当前进程的信息,方便下次调度时恢复现场,然后恢复pNew即将执行的进程的现场,调度pNew进程。此时就完成了两个进程的切换。

值得一提的是:

switch_to(pCur, pNew)函数的代码必须是汇编代码,因为C代码没法精细控制寄存器。

3.多进程如何合作

看以下有关生产者——消费者实例。

定义一个buffer缓冲区,只能装10个元素,定义两个进程,一个叫生产者进程,一个叫消费者进程,定义一个共享数据counter,记录缓冲区的元素个数,当缓冲区不满时,生产者进程不停地往buffer中塞数据,当缓冲区不空时,消费者进程不停地从buffer中取数据出来。

b7a1993ce8aeeaed61f74ea40b090fc7.png

图1 生产者往缓冲区塞数据

97ee5f21d21d018e06a3f5f5698011a9.png

图2 塞进去了

94ceeadc6a95ec3ec4efe686556db84d.png

图3 消费者从缓冲区取数据

生产者——消费者代码

初始化生产者进程和消费者进程的共享数据

counter:记录缓冲区元素个数。

流程:

生产者进程——塞数据,counter + +

消费者进程——取数据,counter - -

生产者进程

消费者进程

因为进程是交替执行的,因此一个可能的执行序列为:

如上图代码,假设当前counter=5,生产者往buffer里塞1个,消费者从buffer取1个,按道理最后counter应该还是等于5,但是按如上图操作序列,最后counter的结果等于4,显然这是不对的。

到底为什么呢?

因为生产者和消费者都对共享变量counter进行了操作!当生产者改变了counter值后,但消费者保存着生产者修改前的值而不是生产者修改后的值,因此造成了共享数据的读写紊乱。

解决该问题的核心在于进程同步(需要合理的进程推进顺序)

当某进程读写共享数据counter时将counter锁住自己用,切断其他进程访问共享数据counter。

还是如上的那个可能的执行序列:

当对共享变量counter进行读写操作的时候,给counter上锁,即生产者访问或者修改counter值时,消费者不得访问或修改counter值,反之,消费者访问或者修改counter值时,生产者不得访问或修改counter值,问题得以解决,这就是进程的同步。

以上就是有关多进程的组织、交替、合作的讲解,各位读者大人若有问题,欢迎后台留言,我将第一时间回复!

微信公众号:IT界的泥石流。 原创不易,多多支持哦!谢谢你们!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用多进程同步方法演示“生产者-消费者”问题_操作系统之进程管理(2):多进程的组织、交替、合作... 的相关文章

  • 关于研究性和工程性

    自己将要往哪个方向发展呢 xff1f 最近一段时间很认真的考虑了一下周围的人 xff0c 有做工程的 xff0c 有做研究的 xff0c 还有做商务的 做工程实际具体 xff0c 相对简单些 xff0c 但是可能薪水也相对低一些 xff1b
  • C#日写点滴(2)

    CTS Common Type System 公共类型系统 C 认可的基本预定义类型并没有内置于C 语言中 xff0c 而是内置于 NET Framework中 例如 xff0c 在C 中声明一个int类型的数据时 xff0c 声明实际上是
  • SQL-关联查询【转】

    T A A表 T B B标 xff0c id为表与表相关联的字段 96 创建相关表结构 span class hljs keyword CREATE span class hljs keyword TABLE Table B span cl
  • char, varchar, nchar, nvarchar (Transact-SQL)

    char 和 varchar Transact SQL 长度固定或可变的字符串数据类型 char n 固定长度 xff0c 非 Unicode 字符串数据 n 用于定义字符串长度 xff0c 并且它必须为 1 到 8 000 之间的值 存储
  • .net中类(class)与结构(struct)的不同

    Class可以被实例化 属于引用类 型 是分配在内存的堆上的 类是引用传递的 Struct属于值类型 是分配在内存的栈上的 结构体是复制传递的 Int32 Boolean等都属于结构体 转载于 https www cnblogs com b
  • Intro to asp.net MVC 简单的小程序(2)

    我们做的很简单 xff0c 就是一个电影的表单 xff0c 显示还有创建 强大的封装真的很好用 xff0c 当我们新建的视图的时候 xff0c 强类型下面都有封装好的 Create List Details 很多 xff0c 我们只要选择一
  • 利用网站上传漏洞使用一句话木马控制服务器

    一句话木马 常用于php asp aspx php lt php echo shell exec GET 39 cmd 39 gt asp lt execute request 34 value 34 gt aspx lt 64 Page
  • 用MotoMidMan给L7批量安装java程序

    在给手机装完驱动后 可以通过MotoMidMan给手机内存安装java程序 需要资源 数据线 MotoMidMan java程序 由一个 jar文件与一个 jad文件组成 操作步骤 1 下载完的是个压缩包 扩展名为 rar 解压完的文件清单
  • 28. Implement strStr()

    public class Solution public int strStr String haystack String needle int next 61 new int needle length generateNextArra
  • Oracle数据库删除了数据如何恢复

    再操作数据库时 xff0c 有时候误删了数据或者更新数据时忘记设置更新条件 xff0c 要是这时候没有提交事务 xff0c 还可以执行回滚操作 要是这时候不小心提交了 xff0c 数据也是可以恢复的 我们只需要执行下面这句sql selec
  • (译)ASP.NET MVC Routing 概述

    ASP NET MVC Routing 概述 在本篇教程中 xff0c 你将会了解到 ASP NET MVC 中一个重要的组件 这个组件叫做 ASP NET Routing xff0c 它负责将客户端请求的路径映射到特定的一个类 Contr
  • eclipse中mysql java驱动的安装

    1 下载mysql connector java x x x zip 2 将压缩包中的mysql connector java x x x bin解压到eclipse中需要导入驱动的工程的根目录下 3 在eclipse中右键该工程选择属性
  • 如何使用gettext, po, mo制作多语言应用程序 (转)

    一 翻译档制作部分 1 制作 po 档 1 生成template文件 xgettext k o ui pref pot ui c pref pot head fuzzy msgid 34 34 msgstr 34 34 34 Project
  • (一) 进程调度

    进程调度算法有FIFO xff0c 优先数调度算法 xff0c 时间片轮转调度算法 xff0c 分级调度算法 xff0c 目前主要是考虑FIFO和优先数调度算法 xff08 静态优先级 xff09 输入 xff1a 进程流文件 xff0c
  • js跳转页面方法(转)

    lt span id 61 34 tiao 34 gt 3 lt span gt lt a href 61 34 javascript countDown 34 gt lt a gt 布丁足迹 秒后自动跳转 lt meta http equ
  • 缓存 ASP.NET 页的某些部分

    生成高性能 可缩放的 Web 应用程序最重要的因素之一是能够在首次请求项时将这些项存储在内存中 xff0c 不管它们是数据对象 页还是页的某些部分 可以将这些项缓存或存储在 Web 服务器上或请求流中的其他软件上 xff0c 如代理服务器或
  • TCP

    RFC 1323 TCP Extensions for High Performance RFC 2488 Enhancing TCP Over Satellite Channels using 传输层端口号定义 https www ian
  • zabbix-proxy安装

    注意 xff0c zabbix proxy的安装和zabbix server的安装不一样 不要混为一谈 xff0c 尤其是数据库的sql结构 rpm ivh http repo zabbix com zabbix 3 0 rhel 6 x8
  • konsole快捷键

    Tab xff1a 自动补全 Ctrl b xff1a 向前移动 xff0c 相当于 lt Left gt Ctrl f xff1a 向后移动 xff0c 相当于 lt Right gt Alt b xff1a 按词向前移动 Alt f x
  • docker中安装了RabbitMQ后无法访问其Web管理页面

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在官网找了 34 docker run d hostname my rabbit name some rabbit p 8080 15672 rabbitmq 3 mana

随机推荐

  • 网络数据包捕获函数库Libpcap安装与使用(非常强大)

    1 Libpcap简介 Libpcap是Packet Capture Libray的英文缩写 xff0c 即数据包捕获函数库 该库提供的C函数接口用于捕捉经过指定网络接口的数据包 xff0c 该接口应该是被设为混杂模式 这个在原始套接子中有
  • STM32F103控制两个步进电机按照一定转速比运动

    这个暑假没有回家 xff0c 在学校准备九月份的电子设计竞赛 今天想给大家分享一下STM32定时器控制两个步进电机按照一定速度比转动的问题 这次做的05年的电子设计竞赛题目 xff0c 运动悬挂系统 本实验是控制两个步进电机通过一个定滑轮用
  • Android 编程下的 Secret Code

    我们很多人应该都做过这样的操作 xff0c 打开拨号键盘输入 4636 等字符就会弹出一个界面显示手机相关的一些信息 xff0c 这个功能在 Android 中被称为 Android Secret Code xff0c 除了这些系统预置的
  • 用vim格式化代码

    格式化全文 xff1a gg 61 G 自动缩进当前行 xff1a 61 61 这个是原文节选 xff1a 14 6 How do I format indent an entire file You can format indent a
  • C# 之 反射性能优化3

    阅读目录 开始用Delegate优化反射的缺点用Delegate优化反射的优点用CodeDOM优化反射的优点如何用好CodeDOM xff1f 用CodeDOM优化反射的缺点能不能不使用委托 xff1f 根据反射密集程度选择优化方法Code
  • 基于用户行为的视频聚类方案

    在个性化推荐系统中 xff0c 通常是由挖掘物品属性来理解用户兴趣 xff0c 从而构建推荐模型 从用户行为去理解物品属性往往做得比较简单 xff0c 通常只是一些简单的标签统计 为了深入到用户行为去理解内容 xff0c 美拍利用用户的点击
  • .html文件调用接口示例

    直接在 html文件中请求接口的写法示例 span class hljs meta lt DOCTYPE html gt span span class hljs tag lt span class hljs name html span
  • mac os 环境下配置VMware Fusion虚拟机的互通网络

    安装环境 本文基于macOS Sierra 10 12 6系统为例 虚拟机应用VMware Fusion 10 1 3 系统Linux redhat 镜像rhel server 7 4 x86 64 dvd iso VMware Fusio
  • webpack的proxyTable无效的解决方案

    最近遇到这个需要单页访问跨域后台的问题 遇到了网上很多人说的 xff0c proxyTable无论如何修改 xff0c 都没效果的现象 经过几轮测试 xff0c 总结出一下几种解决方案 xff1a 1 xff08 非常重要 xff09 确保
  • 单个LottieAnimationView加载不同的lottie动画

    需求 最近做了一个单个LottieAnimationView根据用户点击选项的不同 xff0c 加载不同的lottie动画的需求 网上的一些demo和博客大多只是单独的加载一个lottie动画 xff0c 普遍不会有问题 xff0c 但是如
  • 使用element-ui中的table中的合计行的show-summary方法总结

    表尾结束景行统计的的问题 使用show summary 和 summary method 61 34 getSummaries 34 这两个方法搭配使用 逻辑处理 在最后必须使用return 出去就行 其中的逻辑可以自行定制 实现后达到的效
  • 如何下载网页所有资源(附源码)

    nodejs扒取html页面中所有链接资源 前言 xff1a 总有些人 xff0c 想下载一个插件 xff0c 能直接获取浏览器显示页面的所有资源 也就是下载一个其他人的网站 xff0c 但是不想一个个复制链接的内容 xff0c 原因大致有
  • Python 实现简单的登录注册界面

    Python 实现简单的登录注册界面 注意 xff1a 编写代码之前需要导入很重要的包 import tkinter as tk import pickle from tkinter import messagebox 主要实现的功能 首先
  • VC窗口抖动源码

    窗口抖动实例 CPoint CurrentPos 抖完还要回到这个位置 xff0c 不要乱跑 CRect rect 这一段计算主要是为了满足SetWindowPos 的参数要求 不解释吧 GetClientRect amp rect Cli
  • Ubuntu编译驱动程序的准备(转)

    ubuntu不带linux内核源码 xff0c 需要自己下载安装 1 xff0c 查看自己的内核版本 uname r 2 xff0c 查看源内的内核源码类表 apt cache search linux source 3 xff0c 下载安
  • 树莓派练习程序(雨水检测)

    水滴检测模块如下 xff1a 树莓派的引脚如下图 xff1a 我们将Vcc引脚连接物理接口2 xff0c GND引脚连接物理接口39 xff0c DO引脚连接物理接口40 实物连接如下图 xff1a 编程使用WiringPi库 xff0c
  • 从C# 3.0说以人为本(三)—— 扩展方法

    说完了LINQ的语言支持和语法灵活 xff0c 下面就是一个非常有用的东东 扩展方法 xff08 Extension Method 还记得我们看了好几遍的LINQ吧 xff0c 下面这个 xff1a var numQuery 61 from
  • linux下查看用户及用户组的方法

    linux下查看用户及用户组的方法 whois 功能说明 xff1a 查找并显示用户信息 语 法 xff1a whois 帐号名称 补充说明 xff1a whois指令会去查找并显示指定帐号的用户相关信息 xff0c 因为它是到Networ
  • 计算机图形学在GIS中的应用,GIS在交通中的应用与发展-

    xff27 xff29 xff33 在交通中的应用与发展 摘 要 xff1a 地理信息技术的日臻成熟为 xff27 xff29 xff33 在交通领域内的广泛应用创造了一定基础 本文总结了 xff27 xff29 xff33 技术的特点 x
  • 用多进程同步方法演示“生产者-消费者”问题_操作系统之进程管理(2):多进程的组织、交替、合作...

    1 多进程如何组织 xff1f 上文中 操作系统之进程管理 1 xff1a 从CPU如何执行进程说起 xff0c 我们说过操作系统为每个程序提供了一个叫做PCB Process Control Block进程控制块 的数据结构 它记录了该程