Lec13 Sleep Wake up

2023-11-09 06:01
文章标签 sleep wake lec13

本文主要是介绍Lec13 Sleep Wake up,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进程切换的流程

  1. 一个进程出于某种原因想要进入休眠状态,比如说出让CPU或者等待数据,它会先获取自己的锁;
  2. 之后进程将自己的状态从RUNNING设置为RUNNABLE;
  3. 之后进程调用switch函数,其实是调用sched函数在sched函数中再调用的switch函数;
  4. switch函数将当前的线程切换到调度器线程;
  5. 调度器线程之前也调用了switch函数,现在恢复执行会从自己的switch函数返回;
  6. 返回之后,调度器线程会释放刚刚出让了CPU的进程的锁

第1步中获取进程的锁

阻止其他CPU核的调度器线程在当前进程完成切换前,发现进程是RUNNABLE的状态并尝试运行它

在进程切换的最开始,进程先获取自己的锁,并且直到调用switch函数时也不释放锁。而另一个线程,也就是调度器线程会在进程的线程完全停止使用自己的栈之后,再释放进程的锁。释放锁之后,就可以由其他的CPU核再来运行进程的线程,因为这些线程现在已经不在运行了。

xv6系统相关注意点:

  • XV6中,不允许进程在执行switch函数的过程中,持有任何其他的锁

Sleep&Wakeup 接口

UART的驱动

当shell需要输出时会调用write系统调用最终走到uartwrite函数中

uartwrite函数

在这里插入图片描述
对于buffer中的每个字符,我们都会等待UART可以接收下一个字符,之后写入一个字符,将tx_done设置为0,回到循环的最开始并再次调用sleep函数进行睡眠状态,直到tx_done为1

uartintr

UART硬件会在完成传输一个字符后,触发一个uartintr的中断处理程序,当UART传输完了这个字符,uartintr函数会将tx_done设置为1,并唤醒uartwrite所在的线程。所以对于每个字符都有调用一次sleep和wakeup,并占用一次循环。
在这里插入图片描述

exit系统调用

子进程exit的最后,它都没有释放所有的资源,因为它还在运行的过程中,所以不能释放这些资源。相应的其他的进程,也就是父进程,释放了运行子进程代码所需要的资源。这样的设计可以让我们极大的精简exit的实现。

这篇关于Lec13 Sleep Wake up的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/374349

相关文章

shell循环sleep while例子 条件判断

i=1# 小于5等于时候才执行while [ ${i} -le 5 ]doecho ${i}i=`expr ${i} + 1`# 休眠3秒sleep 3doneecho done 参考 http://c.biancheng.net/cpp/view/2736.html

selenium的webdriver三种等待方式(显式等待WebDriverWait+implicitly_wait隐式等待+sleep强制等待)

隐式等待是等页面加载,不是等元素!!! 1、显式等待  一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码。显式等待是等元素加载!!! from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import

java join sleep wait notify notifyAll

sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。  通过调用sleep使任务进入休眠状态,在这种情况下,任务在指定的时间内不会运行。 调用sleep的时候锁并没有被释放。 休眠  Java SE5引入了更加显示的sleep()版本作为TimeUnit类的一部分,这个方法允许你

java线程 yield,sleep,join,synchronized wait notify notifyAll,ReentrantLock lock condition, 生产者消费者

yield,sleep,join yield,join,sleep,join是Thread中的方法,不需要 在synchronized 代码块中调用,和synchronized 没关系,也不会释放锁。 Thread.sleep(100);Thread.yield();Thread t;t.join(); (1)yield()不一定保证让出cpu yield()只是使当前线程重新回

java 注意线程下的 异常捕获,会跳过sleep(10000)休眠,可能会出现死循环

线程 (1)在catch(){} 中的语句要保证不会出现异常,或者catch中的语句再次捕获了异常,    (2) 线程中try中的语句出现异常,会直接跳过try中的sleep,导致不停地循环   (3)线程的while循环中如果不适用try catch 会导致当出现异常时,线程直接挂掉, package com.hlzt.wx.thread;import java.util.Date

65-java中sleep方法和wait方法的区别

‌Java中的sleep()方法和wait()方法的主要区别在于它们的所属类、使用方式、唤醒机制、锁的处理、异常处理以及用途。‌   ‌所属类不同‌:sleep()方法是Thread类的静态方法,可以在任何线程中使用。而wait()方法是Object类的一个实例方法,只能在同步代码块或同步方法中使用。‌12   ‌使用方式不同‌:sleep()方法用于使线程暂停执行指定的时间,不需要任何条件即可

【线程间通信】sleep/wait/notify/notifyAll作用及使用

文章目录 背景wait代码及演示wait、notify代码及演示notifyAll()代码及演示 背景 在多线程开发过程中,由于线程最大的问题就是抢占式执行,随机调度, 因此线程之间执行的先后顺序难以预知。 但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序,让线程主动阻塞,主动放弃CPU,从而控制线程之间的执行顺序 ,去协调完成工作,怎么去控制线程之间的执行

【多线程】并发编程wait和sleep的区别

notyfy、notifyAll、wait的使用:sleep/wait/notify/notifyAll分别有什么作用 背景:之前的博客讲解到了notify的使用,那并发编程的时候,到底该用 sleep还是notify呢?本篇我们来一起梳理一下区别 所属类与方法类型 wait():wait方法是Object类的一个方法。它用于线程间的通信,允许一个线程等待另一个线程的通知(通过no

C# Task.Delay \ Sleep

1.Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。 2.Thread.Sleep()会阻塞线程,Task.Delay()不会。 3.Thread.Sleep()不能取消,Task.Delay()可以。 4.Task.Delay()实质是创建一个运行给定时间的任务,Thread.Sleep()使当前线程休眠给定时间。 Task.Delay()和Thread.Sleep

线程的sleep()方法的简单使用

线程的sleep方法签名位:  public static void sleep(long millis) throws InterruptException,  是静态方法,使目前正在执行的线程休眠millis毫秒 package com.demo;class MyThread implements Runnable{public void run(){ for(int i = 0;