ucore—11至14讲:进程与线程

2024-02-07 02:18
文章标签 线程 进程 14 ucore

本文主要是介绍ucore—11至14讲:进程与线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 第十一讲:进程和线程
    • 11.1 进程的概念
    • 11.2 进程控制块
    • 11.3 进程状态
    • 11.4 三状态进程模型
    • 11.5 挂起进程模型(重要)
    • 11.6 线程概念
    • 11.7 线程实现之—用户线程实现(重要)
    • 11.8 线程实现之—内核线程实现
    • 11.9 线程实现之—轻量级进程(混合实现)
  • 第十二讲:进程控制
    • 12.1 进程切换
    • 12.2 进程创建
    • 12.3 进程加载
    • 12.4 进程等待与退出
    • 12.5 其他进程控制的系统调用
  • 第十三讲(实验4):内核线程管理
  • 第十四讲(实验5):用户进程管理

第十一讲:进程和线程

11.1 进程的概念

  • 进程概念
    在这里插入图片描述
  • 内存中的进程
    在这里插入图片描述
  • 进程的组成
    这些内容最终构成了进程控制块
    在这里插入图片描述
  • 进程的特点
    动态性:可动态地创建、结束进程
    并发性:进程可以被独立调度并占用处理机运行
    独立性:不同进程的工作互不影响
    制约性:因访问共享数据、资源或进程间同步而产生制约
    => 需要权衡好进程的独立性和制约性
    在这里插入图片描述
  • 进程与程序的关系
    联系
    在这里插入图片描述
    区别
    在这里插入图片描述

11.2 进程控制块

  • pcb基本概念
    在这里插入图片描述
    在这里插入图片描述
  • 进程控制块的内容
    主要包括三方面的信息:
    1.进程标志信息; 2.处理机现场信息; 3.进程控制信息;
    在这里插入图片描述
    进程控制信息主要包括以下内容:
    在这里插入图片描述
  • 进程控制块的组织
    注意就绪和阻塞进程是分开组织的!!!
    在这里插入图片描述

11.3 进程状态

  • 进程生命周期
    创建、执行、等待(阻塞)、抢占、唤醒、结束(此处所说的六个更多地像是五态模型中的六个状态转换,而不是某一段时间所处状态)
    (不同操作系统设定的生命周期不同!) =>更常见的说法:
    三态模型:就绪、执行、阻塞
    五态模型:创建、就绪、执行、阻塞、结束

  • 创建
    创建好后将进程放入就绪队列
    在这里插入图片描述

  • 执行
    如何选择执行的进程? => 涉及到调度算法!
    在这里插入图片描述

  • 等待
    这里的等待就是常说的阻塞
    在这里插入图片描述

  • 抢占
    在这里插入图片描述

  • 唤醒
    在这里插入图片描述

  • 结束
    在这里插入图片描述

  • 进程切换
    在这里插入图片描述

11.4 三状态进程模型

  • 三态模型
    这里其实是五态模型
    在这里插入图片描述

11.5 挂起进程模型(重要)

  • 进程挂起
    为什么需要挂起? => 物理内存不足时,将部分进程从内存换出到外存
    等待挂起:进程在外存并等待某事件的出现
    就绪挂起:进程在外存,并且处于就绪状态.只要进入内存,即可运行
    内存到外存 => 挂起
    外存到内存 => 激活
    在这里插入图片描述
  • 使用队列维护各种状态的进程:状态队列
    在这里插入图片描述
    在这里插入图片描述

11.6 线程概念

  • 为什么需要线程
    …略

  • 线程基本概念
    在这里插入图片描述
    进程是资源分配的基本单位;
    线程是调度的基本单位 => 如何实现以线程为调度的基本单位?让每个线程由自己的栈即可!

  • 进程和线程的关系
    线程=进程 — 共享资源
    在这里插入图片描述
    在这里插入图片描述

  • 线程的优点与缺点
    在这里插入图片描述

11.7 线程实现之—用户线程实现(重要)

  • 线程的三种实现方式
    在这里插入图片描述
  • 用户线程实现
    内核中仍然只有PCB,而没有TCB!操作系统并不感知用户态下有多线程的支持
    在这里插入图片描述
  • 用户线程的特征
    在这里插入图片描述
  • 用户线程的不足
    在这里插入图片描述

11.8 线程实现之—内核线程实现

  • 内核线程实现
    在这里插入图片描述
  • 内核线程的特征
    在这里插入图片描述

11.9 线程实现之—轻量级进程(混合实现)

  • 轻权进程
    solaris有实现轻权进程,不过效果不如预期理想!
    在这里插入图片描述
    仍然不是很懂? => 可参考《深入理解JVM》第12章关于Java线程实现

  • 用户线程与内核线程的对应关系
    通常,一对一是用得较多且理想的
    在这里插入图片描述

第十二讲:进程控制

12.1 进程切换

  • 进程切换基本概念
    在这里插入图片描述
  • 示例
    在这里插入图片描述
  • PCB的组织
    在这里插入图片描述
  • PCB内容
    在这里插入图片描述

12.2 进程创建

  • 创建进程
    在这里插入图片描述

  • 通过系统调用创建子进程示例
    在这里插入图片描述

  • fork()的地址空间复制
    在这里插入图片描述

  • 程序加载和执行
    通过exec加载子进程中将要执行的程序
    在这里插入图片描述
    子进程中程序加载的变化过程
    调用fotrk()后子进程与父进程除pid外基本完全一样
    在这里插入图片描述
    子进程加载新的程序 => 子进程地址空间中的内容发生变换(可参考csapp)
    在这里插入图片描述

  • ucore中fork()的实现
    …略(见代码)

  • 关于fork()的开销问题
    在这里插入图片描述
    Linux使用上述的写时复制,可参考csapp 9.8节

12.3 进程加载

  • exec系统调用进行加载
    这里的加载其实类似于bios加载booloader、bootloader加载系统内核,都需要将程序加载到内存,然后将控制交给加载进来的程序起始处…
    在这里插入图片描述
  • ucore中exec的实现
    …略(见代码)

12.4 进程等待与退出

  • 父进程等待子进程
    在这里插入图片描述
  • 进程退出
    在这里插入图片描述
  • ucore中wait与exit函数的实现
    …略(见代码)

12.5 其他进程控制的系统调用

  • 其他系统调用
    在这里插入图片描述
  • 进程控制vs进程状态
    在这里插入图片描述

第十三讲(实验4):内核线程管理

略…(详见实验指导书与代码)

第十四讲(实验5):用户进程管理

略…(详见实验指导书与代码)

这篇关于ucore—11至14讲:进程与线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

java 进程 返回值

实现 Callable 接口 与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。 public class MyCallable implements Callable<Integer> {public Integer call() {return 123;}} public static void main(String[] args

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之

java线程深度解析(四)——并发模型(Master-Worker)

http://blog.csdn.net/daybreak1209/article/details/51372929 二、Master-worker ——分而治之      Master-worker常用的并行模式之一,核心思想是由两个进程协作工作,master负责接收和分配任务,worker负责处理任务,并把处理结果返回给Master进程,由Master进行汇总,返回给客

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的