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

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复