【pintos学习笔记】(2)睡眠“忙等待”

本文分析了pintos中timer_sleep函数导致的忙等待问题,并提出解决方案。通过对timer_sleep的改造,引入计时器机制,将进程从准备队列移除并原子操作,以定时唤醒进程,从而消除忙等待,保证系统资源的有效利用。
摘要由CSDN通过智能技术生成

一、问题描述

在pintos里,实现进程睡眠是依靠timer_sleep(ticks)函数。
timer_sleep()
该函数的实现是将进程“睡眠”后,利用Polling的机制不断中断当前CPU内的进程,使得CPU时间不能够让给别的进程,造成一个”忙等待”的现象。
这有点像一个俗语——“站着茅坑不拉shi”,把CPU时间一直紧紧攥着,然后也不让别的进程去完成任务了。而且这个进程也并没有真正睡着,一直在问我到底还有多久才醒过来,你说是不是很傲娇。


二、问题分析

-为了解决这个傲娇的问题,毫无疑问,我们需要将进程安抚睡着,并帮它掐好表,准时告诉它醒过来。
但不管怎样,我们从timer_sleep这个函数分析起。

/* Sleeps for approximately TICKS timer ticks.  Interrupts must be turned on. */
void timer_sleep (int64_t ticks) 
{
  int64_t start = timer_ticks ();
  ASSERT (intr_get_level () == INTR_ON);
  while (timer_elapsed (start) < ticks) 
    thread_yield ();
}

-首先,我们看下面这条语句,它返回了当前timer从os启动后的tick次数。

int64_t start = timer_ticks ();

-然后这个ASSERT()宏定义为了确保系统允许中断,即别的进程可以抢茅坑。

ASSERT (intr_get_level () == INTR_ON);
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值