pintos (4) --Mesa vs. Hoare style

【pintos学习笔记】(2)睡眠“忙等待” 一、问题描述 在pintos里,实现进程睡眠是依靠timer_sleep(ticks)函数。 该函数的实现是将进程“睡眠”后,利用Polling的机制不断中断当前CPU内的进程,使得CPU时间不能够让给别的进程,造成一个”忙等待”的现象。 这有点像一个俗语——“站着茅坑不拉shi”,把CPU时间一直紧紧攥着,然后也不让别的进程去完成任务了。而且这个进程也并有真正睡着,一直在问我到底 阅读详情
在阅读pintos/src/threads/synch.c的时候,发现了一个令人疑惑的地方:
/* Down or "P" operation on a semaphore. Waits for SEMA's value
to become positive and then atomically decrements it.
This function may sleep, so it must not be called within an
interrupt handler. This function may be called with
interrupts disabled, but if it sleeps then the next scheduled
thread will probably turn interrupts back on. */
void
sema_down (struct semaphore *sema)
{
    enum intr_level old_level;

    ASSERT (sema != NULL);
    ASSERT (!intr_context ());

    old_level = intr_disable ();
    while (sema->value == 0)
    {
        list_push_back (&sema->waiters, &thread_current ()->elem);
        thread_block ();
    }
    sema->value--;
    intr_set_level (old_level);
}
这个函数是信号量的P操作,完成的功能就是
  1. 关中断
  2. 判断信号量是否为0
    • 如果为0,当前进程加入该sema等待队列
    • 不为0,sema–,继续执行
  3. 还原中断

第16行使用了while而不是if,为什么要在这里循环呢?
sema为0陷入阻塞之后,一定是被V操作唤醒的,既然是V操作,那么sema一定不为0,while的意义在哪里呢?


先来看一下V操作:

/* Up or "V" operation on a semaphore.  Increments SEMA's value
   and wakes up one thread of those waiting for SEMA, if any.
   This function may be called from an interrupt handler. */
void
sema_up (struct semaphore *sema) 
{
  enum intr_level old_level;

  ASSERT (sema != NULL);

  old_level = intr_disable ();
  if (!list_empty (&sema->waiters)) 
    thread_unblock (list_entry (list_pop_front (&sema->waiters),
                                struct thread, elem));
  sema->value++;
  intr_set_level (old_level);
}
V操作做了如下的事情
  1. 关中断
  2. 如果waiters队列有进程,执行thread_unblock()
  3. sema++
  4. 还原中断

好像没什么不对的

再来看一下thread_unblock()的实现:
/* Transitions a blocked thread T to the ready-to-run state.
   This is an error if T is not blocked.  (Use thread_yield() to
   make the running thread ready.)
   This function does not preempt the running thread.  This can
   be important: if the caller had disabled interrupts itself,
   it may expect that it can atomically unblock a thread and
   update other data. */
void
thread_unblock (struct thread *t) 
{
  enum intr_level old_level;

  ASSERT (is_thread (t));

  old_level = intr_disable ();
  ASSERT (t->status == THREAD_BLOCKED);
  list_push_back (&ready_list, &t->elem);
  t->status = THREAD_READY;
  intr_set_level (old_level);
}
thread_unblock()做了如下的事情
  1. 关中断
  2. 将进程添加到ready_list,设置状态为READY
  3. 还原中断

竟然没有进行调度!


OK进入正题:

Mesa vs. Hoare style
  • Hoare style:V操作后立即进行调度。
  • Mesa style:V操作后只将进程unblock,然后继续运行等待系统进行调度。

显然PintOs采用的是Mesa style,所以,被unblock的进程在被调度的时候,sema并不一定可用,比如其他进程又进行了P操作,所以必须再次检查sema,如果不可用则继续block,这就是使用while而不是if的理由。

为什么不立即调度呢?这就是他的优点,不立即调度而是等待系统调度,就减少了调度次数,而每次切换上下文都是繁重的工作,进而降低了系统开销。


相关链接:

http://blog.youkuaiyun.com/xiaoguobaf/article/details/52174285
http://blog.chinaunix.net/uid-20545494-id-1929545.html
https://github.com/windr0id/pintos/issues/1

操作系统原理,使用管程封装操作系统共享资源,hoare管程模型与mesa管程模型 O、进程中信号量机制的不足:程序编写困难、容易出错 引入管程,管程也是一种进程间的高级同步机制。一、管程定义:有一个明确定义的操作集合,通过它且只能通过它才能操作某共享数据类型的实例。分析: 1、这里管程这个机制维护了共享资源的数据结构和操作过程,等价于c++中将数据结构和函数封装为一体的类 2、参考同一进程中的多个线程可以共享数据,往底层看,操作系统和进程的关系就像进程和进程内线程的关系,操作系统的视角中共享资源等价于进程中的全局变量。二、进程和管程的调用关系: 进程只能通过管程中的过程(函数)来间接的访 阅读详情

相关推荐

操作系统小组实验

操作系统小组实验mission1 组长 杨晓军 16281272 组员 巫 勐 16281271 王昊飞 16281269 张天悦 16281153 孙睿 16281079 一、环境配置 1.安装bochs 指令: Install bochs $ tar zxvf bochs-2.4.5.tar.gz $ cd bochs-2.4.5 $./configure --enable-g...

warmllll的博客 933

Mesa & Hoare Monitor

Monitor 相当于一个封闭的盒子,Monitor对里面的东西进行监控。 Java的Monitor,类似于Mesa。以前只知道Java里面同不用synchronized,但是其实每一个Object可以被当作Monitor,控制里面所有synchronized 方法,variable。 当有一个process 进入synchronized 函数后,其它的process,都会被block

caeser1234的专栏 2403

操作系统:Pintos Project 1

也是借鉴了网上一些实现,勉勉强强将Project1过了,不过感觉代码中还是有些问题的。alarm测试集这个测试集要求重新实现timer_sleep()函数,将原来的忙等待改为非忙等待。 思路跟阻塞线程类似: 1.为线程增加一个新的状态,表示线程正处在sleep中。 thread.h:在文件靠前添加宏定义: #define THREAD_SLEEP THREAD_BLOCKED 2.在内核中增加一

HOH_mizukun的博客 8960

浅谈从Google Mesa到百度PALO

最近在研究OLAP相关的技术,正好看到Google 2014年的论文《Mesa: Geo-Replicated, Near RealTime, Scalable Data Warehousing》,以及百度最近2017年开源的基于Mesa+Impala的实现系统PALO,本篇就尝试结合起来看下二者,主要是学习介绍性质的文章。 1. Mesa Mesa是一个Google内部使用的数据仓库系统,从论文的标题可以抓住几个关键词:可实现跨DC复制的、近实时的、可扩展的。这几点算是Mesa的特色所在,同时和Mes

renq的专栏 819

斯坦福大学课程设计project pintos-project4满分例程

斯坦福大学课程设计pintos-project4满分例程,ubuntu16.04 qemu 满分(修改userprog/Make.vars 默认qemu)。注释不多,部分内容参考github。代码仅供参考,请勿直接搬运。

四旋翼无人机控制算法实战:从PID到MPC的路径跟踪

本文深入探讨了四旋翼无人机控制算法的演进路径,从基础的PID控制到高级的MPC算法,详细解析了各类算法的原理、实现技巧及适用场景。通过实战案例对比分析,为开发者提供从算法选型到参数调优的全方位指导,助力提升无人机飞行控制的精度与稳定性。

weixin_29090917的博客 239

mesa(OpenGL)安装

环境: centos 7 安装: 步骤 问题: 在“./configure“时报告以下错误: Requested ‘libdrm_intel >= 2.4.61’ but version of libdrm_intel is 2.4.60 解决方法:安装libdrm更高版本,找到这个程序的pc文件,在控制台添加: export PKG_CONFIG_PATH=/usr/lib/pk

大鹏的专栏 1万+

【深度学习】通俗易懂讲解循环神经网络LSTM

目录 1、循环神经网络(Recurrent Neural Networks) 2、长依赖存在的问题 3、LSTM 网络 4、LSTMs的核心思想 5、一步一步理解LSTM 6、LSTM的变种 7、总结 1、循环神经网络(Recurrent Neural Networks) 人对一个问题的思考不会完全从头开始。比如你在阅读本片文章的时,你会根据之前理解过的信息来理解下面看到的文字。...

Nieson2012的专栏 2726

Java并发编程模拟管程(霍尔Hoare管程、汉森Hansan管程、MESA管程)

​ 在前面个两篇博文中,我们使用Java模拟了AND型信号量和信号量集,本文将使用Java来模拟管程,关于管程的一些理论知识,可以参考另一篇博客。 ​ 对于管程,在这里我们不做具体的讨论了。不过对于Java和管程之间的一些事,还是很有意思的。Java中,每个对象其实都一个Monitor(java中翻译为监视器),Java中提供的synchronized关键字及wait()、notify()、not...

丹丹的后花园 4942

YOLOv11改进 | Conv篇 | 2024最新轻量化自适应提取模块LAE助力边缘设备部署计算(附代码 + 修改教程 + 运行教程)

本文给大家带来的一个改进机制是最新由LSM-YOLO提出的轻量化自适应特征提取(Lightweight Adaptive Extraction, LAE)模块,其是LSM-YOLO模型中的关键模块,旨在进行多尺度特征提取,同时降低计算成本。LAE通过以下方式实现更有效的特征提取:多尺度特征提取、自适应特征提取。LAE模块可以在不增加额外参数的情况下提高了模型对ROI区域的检测性能。​欢迎大家订阅我的专栏一起学习YOLO!YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍。

Snu77的博客 4051

3、无限维系统理论中的算子与半群:概念、定理及应用

本博文深入探讨了无限维系统理论中的两个核心概念:里茨谱算子与卢默-菲利普斯定理。文章首先介绍了里茨基的定义与性质,分析了谱、预解集及特征值在无限维系统中的特性,并详细阐述了里茨谱算子的条件及其生成C0-半群的能力,结合阻尼欧拉-伯努利梁模型展示了其应用。随后,文章介绍了卢默-菲利普斯定理及其推论,通过多个偏微分方程实例(如一阶方程、柔性梁、波动方程和扩散问题)说明如何利用该定理判断算子是否生成压缩半群。此外,还强调了状态空间选择和边界条件对系统适定性的重要影响,并总结了相关问题的解决步骤与方法。

flink9streamer的博客 146

Pintos实验一

目录 一、实验简介 二、实验环境的安装与搭建 三、Mission 1:重新实现timer_sleep()函数 1、相关函数介绍 2、具体实验过程 四、Mission 2:在Pintos中实现优先级调度 五、Mission 3:实现多级队列反馈调度 一、实验简介 Pintos是Standford大学为操作系统课程专门开发的一个基于80x86架构的简单操作系统框架(A simp...

Yue的小部落格 1万+

DataEase 未授权+远程代码执行漏洞复现(CVE-2025-49001、CVE-2025-49002)

DataEase 是一款开源的数据分析平台,提供丰富的数据可视化和分析功能,帮助用户轻松地进行数据探索和决策支持。近日,有关DataEase 被爆出多个漏洞,其中 CVE-2025-49001 是由于JWT校验机制错误导致攻击者可伪造JWT令牌绕过身份验证流程,CVE-2025-49002 是由于H2数据库模块没有严格过滤用户输入的JDBC连接参数,可使用大小写绕过补丁。攻击者可利用这些漏洞实现未授权代码执行,威胁用户数据和系统的安全。

李同學AI安全 1947

pintos (2) --Priority Scheduling

为Pintos建立优先级调度机制,并确保任何时刻CPU上运行的都是最高优先级线程。 为确保最高优先级的线程运行,需要重新计算调度的时刻有:创建新线程,设置线程优先级。故将ready_list改为有序队列,优先级较高在前,同时在thread_yield()时,如果下个线程的优先级小于当前线程,则不进行调度。 信号量和条件变量的优先级,均可通过保证waiters list 按优先级排列实现唤醒优先级最高

windroid.xyz 4819

mjlab 入门教程(一)MuJoCo 人形机器人强化学习训练 sim-to-real 部署框架

摘要:mjlab是一个结合IsaacLab API与MuJoCo简洁性的GPU加速机器人仿真框架,专为强化学习和机器人研究设计。它提供快速安装(支持uv、pip、conda和Docker)、核心功能(域随机化、NaN守护、观测历史/延迟、执行器/传感器系统)以及从IsaacLab的迁移指南。相比IsaacLab,mjlab更轻量、启动更快,直接构建在MuJoCo Warp上,避免了Omniverse开销。其哲学强调裸机性能、开发者体验和核心领域专注,适合需要快速迭代和直接MuJoCo控制的用户,而Isaac

2506_90492529的博客 2724

CT探测器普遍采用“星形拓扑+多ADC模组”架构的TDC(时间数字转换器)设计方案

本文提出一种基于TDC反馈机制的CT探测器时钟同步方法,通过延时测量、偏差计算和动态补偿三步硬件流水线,实现高精度同步。系统采用Xilinx Kintex UltraScale FPGA内置CARRY8进位链构建3.5ps分辨率的TDC,结合多级比较器和延迟单元,形成闭环反馈控制。实验表明,在512通道、1.28m传输距离下,同步精度稳定在10ps以内,较传统方案提升两个数量级,并能动态补偿干扰抖动。该方案解决了传统方法在CT旋转腔体环境下精度不足的问题,为下一代超高清CT提供了有效的时钟同步解决方案。

whm128的博客 274

操作系统课程设计——pintos源码的分析与修改

本文章主要介绍了standford大学的操作系统课程设计内容-pintos源码修改,这只是其中的一个小的task。

lhyer的专栏 6653

Google Earth Engine:计算逐年全球潜在蒸发量(PET)的 ERA 数据

通过获取温度、湿度和降水数据,并使用Penman-Monteith公式,我们可以得到每年的潜在蒸发量。在本文中,我们将使用Google Earth Engine平台和ERA(欧洲再分析气象数据集)数据来计算逐年全球的潜在蒸发量(PET)。接下来,我们需要对ERA数据进行预处理,以获取我们需要的潜在蒸发量数据。有了温度、湿度和降水数据,我们可以使用Penman-Monteith公式来计算每年的潜在蒸发量。最后,我们可以将计算得到的潜在蒸发量数据进行可视化,以便更好地理解全球的水汽蒸发情况。

VwajAlgorithm的博客 729

如何设计 HTTP 接口异常状态的返回

如何设计 HTTP 接口异常状态的返回 上周五,我在做一个 HTTP 接口的迁移。刚好跟同事进行了一场关于 HTTP 接口的状态返回的讨论。很巧合地是,我们的观点互不相同,在他看来: 所有业务返回的响应状态码都应该是200,包含业务异常的响应状态码也是200,错误的消息放在 Body 里面描述;未到达业务层的请求,例如:5XX, 403...

weixin_34121282的博客 1003

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android TabHost的用法浅析

简单的做了一个android上的标签页面,想记录一下自己的学习以供以后的查看学习,我只是一个android初学者所以对于TabHost的理解可能不是太全面还是简单的做个小笔记。 <RelativeLayout   xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fil

paipaikaka的专栏 641

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

使用互斥量和条件变量实现线程同步控制

管程(monitor)说明 在并发编程中,管程(monitor)是一个同步构件,管程实现了同一时间点,最多只有一个线程可以执行管程的某个子程序。与那些通过修改数据结构实现互斥访问的并发程序设计相比,管程的实现很大程度上简化了程序设计。 管程可以确保一次只有一个进程执行管程中的程序,因此程序员不需要显式地编写同步代码,但是如果需要就某些特定条件上的同步,则需要定义一些条件结构(condition...

weixin_33811961的博客 284

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

十一. 线程同步

乱序输出前面完成了多线程之后,那么肯定会涉及到线程的同步问题。因为线程的执行是随机的,乱序的。虽然我们这个小kernel实现的调度器算法比较简陋,它的随机性没那么强,但是每次进行线程切换的时候,还是有可能产生问题。并且问题已经产生了。int main(void) { put_str("I am kernel\n"); init_all(); thread_start("thr

cw312644167的博客 281

锁和条件变量

一直对于条件变量的原理不是特别清楚,今天google了下,搜到了斯坦福大学os

boyhailong的专栏 1730

Pintos-斯坦福大学操作系统Project详解-Project1

前言:  本实验来自斯坦福大学cs140课程,只限于教学用途,以下是他们对于Pintos系统的介绍:  Pintos is a simple operating system framework for the 80x86 architecture. It supports kernel threads, loading and running user programs, and a

业精于勤,荒于嬉;行成于思,毁于随。 2万+

Diving into Mesa

In my last post I gave a quick introduction to the Linux graphics stack. There I explained how what we call a graphics driver in Linux is actually a combination of three different drivers: the us

小猪爱拱地 952

Java并发编程实战_Java并发编程中的管程(Monitor)模型

简述 A Monitor defines a lock and zero or more condition variables for managing concurrent access to shared data.管程(Monitor)是一种和信号量(Sophomore)等价的同步机制。它在Java并发编程中也非常重要,虽然程序员没有直接接触管程,但它确实是synchronized和wai...

weixin_40003451的博客 383
上一篇: pintos (3) --Priority Inversion
下一篇: pintos (5) --Advanced Scheduler
windroid
博客等级 码龄12年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值