当前位置: 首页 > news >正文

工程建设云网站建设网站企业文化

工程建设云网站,建设网站企业文化,网络设计是不是艺术类,wordpress文字加边框今天实现操作系统互斥锁的时候遇到一个有趣的问题。 场景 有两个进程分别名为 taskA,taskB,采取时间片轮转的方式交替运行——也即维护了一个 ready_queue,根据时钟中断来 FIFO 地调度任务。它们的任务是无限循环调用 sys_print() 来打印自…

今天实现操作系统互斥锁的时候遇到一个有趣的问题。

场景

有两个进程分别名为 taskA,taskB,采取时间片轮转的方式交替运行——也即维护了一个 ready_queue,根据时钟中断来 FIFO 地调度任务。它们的任务是无限循环调用 sys_print() 来打印自己的名称。

我还设置了一个 mutex 互斥锁,它包含一个 0/1 互斥信号量:用于表示锁是否已经被取走,还有一个等待队列 waiting_queue:用于存放正在等待该锁的进程。

为了保证打印出来的字符不错乱,我为 sys_print() 函数设置一个 mutex 对象,我们暂且称之为 print_mutex。在调用 sys_print() 前执行 mutex_lock() 上锁,如果此时锁已经被取走,那么将当前任务加入 print_mutex 的 waiting_queue。调用 sys_print() 后执行 mutex_unlock() 解锁,如果 waiting_queue 中有任务,那么将 print_mutex 直接分配给其中的第一个任务,同时将该任务加入进程的就绪队列,否则将锁归还,由需要该锁的进程主动来取锁。

运行

想一想,这时候运行系统,屏幕上的输出形式是怎么样的呢?

容易想到一些情况:

一、交替连续输出,且无打印出错误,形如以下形式

taskA
taskA
taskA
taskB
taskB
taskB
taskA
taskA
taskA
... ...

二、交替连续输出,但在进程切换的瞬间,有打印错乱的可能,形如以下形式

taskA
taskA
tastaskB
taskB
taskB
ttaskA
taskA
taskA
... ...

三、严格交替输出,且无打印出错误,形如以下形式

taskA
taskB
taskA
taskB
taskA
taskB
... ...

四、严格交替输出,但在进程切换的瞬间,有打印错乱的可能,形如以下形式

tasktaskB
tataskB
taskA
tataskA
... ...

其实还有很多其他可能,碍于篇幅受限,不再列出。

输出

很容易想到,加了互斥锁 print_mutex 后,肯定不会出现打印错乱的情况,因此情况二和情况四首先排除,那么到底是情况一还是情况三呢?大家可以根据场景先思考一下。

好了,公布答案,最终形式其实既不是情况一也不是情况三,而是这样的:

taskA
taskA
taskA
taskA
taskA
taskB
taskA
taskB
... ...

也就是一个任务先连续输出,然后两个任务严格交替输出,如下图:

在这里插入图片描述

分析

假设先上时间片运行的是 taskA,那么在第一个时间片周期中, taskA 可以调用 sys_print() 函数若干次,当时间片发生切换的瞬间,taskA 会被挂起,然后重新加入到 ready_queue 尾部,等待下一次被分配 cpu。

这个任务的功能很简单,可以简化成以下形式:

void taskA(){while(true){metux_lock();   //关中断保证原子操作sys_print();mutex_unlock(); //关中断保证原子操作}
}

其中 mutex_lock() 和 mutex_unlock() 都关中断保证了不会有时钟中断发生, 所以在切换进程的时候,taskA 可能会

  1. 停留在 metux_lock() 之前、mutex_unlock() 之后
  2. 停留在 sys_print() 中

显然,由于sys_print() 需要与外围设备端口交互,包含的指令数也比较多,而情况1 包含的指令数极少,因此 taskA 此时绝大概率停留在 sys_print() 中,也就是 taskA 持有 print_mutex 互斥锁,并在 ready_queue 中等待执行,而这时候 taskB 虽然被分配了时间片,但在执行 mutex_lock() 的时候发现锁已被取走,只能进入 print_mutex 的 waiting_queue 等待。taskA 重新上cpu 运行,执行完上次执行一半的 sys_print() 之后,紧接着执行 mutex_unlock() 将锁分配给锁等待队列中的 taskB,下一轮循环时,taskA 执行 mutex_lock() 发生锁等待被挂起,循环往复,两者就严格交替打印了。

事实上,如果 taskA 在切换时间片的时候遇到的是情况 1,那么也可能出现两个进程交替连续打印的情况,但是这个概率极小。

http://www.yayakq.cn/news/493468/

相关文章:

  • 做网站好处商户网站唯一订单号
  • 一个平台网站开发魔兽7.2国内做插件网站
  • 摄影工作室网站建设模板网站全景看图怎么做
  • 企企业业网网站站建建设设wordpress导航功能
  • 免费搭建网站的平台绍兴免费网站建站模板
  • 网站 建设 基本 数据库室内设计学校考研排名
  • 在线教育网站怎么做做外贸的经常浏览的三个网站
  • 站长工具排行榜从哪方面建设网站
  • 网站虚拟主机空间1g多吗中信建设有限责任公司电子商务平台
  • 列举及简述网站建设的流程wordpress story 模板
  • 保定市住房保障和城乡建设局网站今晚8时兰州全面解封
  • PHP与网站建设的课后笔记确定网站建设的目的
  • 公司的 SEO与网站建设o2o网站线上
  • 电商网站模板引擎制作公司网站一般多久能好
  • 网站制作需要多少钱品牌企业邮箱下载
  • 网站建设后商品进不去详情页浙江网站建设抖音seo优化
  • 微信怎么做链接网站开发小程序平台
  • 如何让新网站太湖网站建设
  • 网站制作教程一般地建网络北京创意网站设计
  • 建个人网站做导购做电商赚钱吗
  • 甜品售卖网站网页设计如何免费申请网站
  • 宣城老品牌网站建设怎样免费注册网站域名
  • 批量网站建设合作协议南昌网站建设赣icp南昌
  • 海南住房与城乡建设网站房产app平台有哪些
  • 网站建设总结经验用织梦软件如何做网站
  • 湖北网站设计制作多少钱网站网络推广企业
  • 网站建设要多少钱品牌网站开发项目案例
  • 网站建设策划完整方案诸城个人网站建设
  • 北京平台网站建设价位做动漫图片的网站
  • 沃尔玛官方网站查余额商标国际分类1到45