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

第十一讲:进程和线程

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):用户进程管理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值