清华教授的操作系统-----课程笔记


因为是听课时候记得笔记,所以可能会比较混乱,可以当作了解操作系统来看

操作系统


学习目标:什么是操作系统?

准备

  • 系统启动及中断
  • 物理内存管理
  • 虚拟内存管理
  • 内核线程管理
  • 用户进程管理
  • CPU调度
  • 同步与互斥
  • 文件系统

预备知识:

  • 计算机结构原理
  • 数据结构
  • C和汇编语言

前言

  • 用户角度:操作系统是一个控制软件,用来控制和限制用户的使用

  • 管理应用程序:

    1. 为应用程序提供服务
    2. 杀死应用程序
  • 资源管理:
    管理外设、分配资源

  • Linux.Windows.Android的界面
    属于外壳(Shell),而不是内核(Kernel),Kernel是我们研究重点,在Shell之下

计算机最重要的三部分:
CPU、内存、硬盘

Kernel-操作系统系统(uCore)内部组件,包括:

  • CPU调度器
  • 物理内存管理
  • 虚拟内存管理 - 提供上层更大的更安全的一块空间环境
  • 文件系统管理 - 抽象出来以文件形式存储保存数据
  • 中断处理与设备驱动

OS Kernel的特征:

四个:并发、共享、虚拟、异步

  • 并发:计算机系统中一段时间内,存在多个运行的程序运行,需要OS管理和调度;
    并行:计算机系统中在一个时间点上,存在多个程序同时运行(需要有多核CPU才能完成)
  • 共享:同时访问,互斥共享
  • 虚拟:把CPU虚拟为进程,把硬盘虚拟为文件系统。利用多道程序设计技术,让每个用户都觉得有一个计算机专门为他服务
  • 异步:程序执行不是一贯到底,而是走走停停,向前推进的速度是不可预知。但只要运行环境相同,OS需要保证程序的运行结果也要相同

CODEING
计算机调度方式:分时调度(schedule时间片轮询,中断帮助完成分时调度)

  • 微内核:模块化,消息之间不是以函数方式通信,而是通过消息松耦合的架构通信。
    优点:服务与服务之间模块化,更安全(file system,device driver, network stack, i/o system)
    缺点:数据通信的代价高,服务与服务之间通信要先传给内核,再有内核转发到服务,需要多次拷贝空间,性能差。

计算机组成:CPU,内存,IO外设

操作系统启动过程:
X86:

  • BIOS
    加电自检,检测一些外设,将Bootloader从硬盘第一个扇区(512byte)加载到0x7c00,跳转到CS:IP = 0000:7c00)
  • Bootloader
    1.将操作系统的代码和数据从硬盘加载到内存中
    2.跳转到操作系统的起始位置

系统调用

应用程序主动向操作系统发出服务请求(应用请求)

异常:

  • 非法指令或者其他坏的处理状态(内存出错)

中断:

  • 来自不同的硬件设备的计时器和网络的中断(来源与外设)

1. 处理时间

  • 中断:异步
  • 异常:同步
  • 系统调用:异步或同步(如果操作程序发出请求后阻塞等待—同步;如果程序发出系统调用请求(同步),后去做别的事情,等系统返回结果再去通知程序—异步)

2. 响应

  • 中断:持续,对用户应用是透明的
  • 异常:杀死或者重新执行意想不到的的应用程序指令
  • 系统调用:等待和持续

中断:

  • 保存当前处理状态
  • 中断服务程序处理
  • 清除中断标记
  • 恢复之前保存的处理状态

异常:

  • 保存现场
  • 异常处理:杀死产生异常的程序,重新执行异常指令
  • 恢复现场

系统调用

标准C库的例子:

  • 应用程序调用printf()时,会触发系统调用write()
  • 常见的read、write、ioctl

程序访问主要是通过高层次的API接口而不是直接进行系统调用

win32 API 用于windows(可以直接系统调用)

POSIX API 用于POSIX-based systems(包括UNIX\LINUX\MacOS X的系统)是一套通用可移植的API,只要遵循这个标准都可以执行(可以直接产生系统调用)

JAVA API用于JAVA 虚拟机(JVM)(不能直接残生系统调用,需要再去调用win32/posix)

学习目标:
操作系统是如何完成系统调用的?

  • 通常情况
    在这里插入图片描述

用户态:应用程序的特权比较低,不能直接发送机器指令和直接访问设备IO

内核态:操作系统运行中,操作系统可以执行任何一条指令,包括机器指令,访问设备IO

函数调用和系统调用的区别?

  • 函数调用:实际上是在一个栈空间中的调用和返回

  • 系统调用:应用程序操作系统都拥有各自的堆栈,当应用程序发出系统调用的时候,它需要从用户态的堆栈空间切换到内核态的堆栈空间,同时还需要特权级别的转换(用户->内核);堆栈切换和特权转换都需要一定的开销,也就意味着系统调用的会比函数调用的开销大很多,但这样做目的也为了更加安全和可靠。

知识小结:

跨越操作系统边界的开销

在执行时间上的开销超过程序调用

开销:

1 建立中断/异常/系统调用好与对应服务例程映射关系的初始化开销

2 建立内核堆栈

3 验证参数

4 内核态映射到用户态的地址空间更新页面映射权限

5 内核态独立地址空间TLB


计算机体系结构及内存分层体系

计算机体系结构主要分为三大块:

在这里插入图片描述

CPU:程序和软件上的控制

内存: 主要放置程序的代码和数据

外设:满足一些功能,把数据保存在硬盘中…

内存分层体系组成:
在这里插入图片描述

CPU所访问的数据和指令所存放的位置在哪里?

CPU内部:寄存器->cache

资源很有限

CPU外部:主存->物理硬盘

速度稍慢,但是硬盘可以掉电保存数据,等再启动时CPU读入到内存

在这里插入图片描述

在操作系统中管理内存的不同方法:

  • 程序重定位
  • 分段
  • 分页
  • 虚拟内存
  • 按需分页虚拟内存

内存的实现高度依赖于硬件

  • 必须知道内存架构
  • MMU(内存管理单元):硬件组件负责处理CPU的内存访问请求

地址空间 & 地址空间是如何生成的

  • 地址空间定义
  • 地址空间生成
  • 地址安全检查

在这里插入图片描述

物理地址:硬件真实的地址

逻辑地址(虚拟地址):一个运行程序所拥有的内存地址

在这里插入图片描述

过程: .c -> .s -> .o -> xxx

* 预处理:gcc -E xxx.i xxx.c
* 编译:gcc -S xxx.S xxx.i
* 汇编:gcc -c xxx.o xxx.S
* 链接:gcc -o xxx.elf xxx.o

生成编译->汇编->链接(编译器 符号地址空间)

运行:加载硬盘中的程序,放到内存中运行(CPU中loader,逻辑地址空间)

MMU

在这里插入图片描述

CPU中有一个MMU,MMU有一块区域表示了这个映射关系,正如上图中蓝色区域的地址转换过程。

CPU执行某一条指令时候,它的ALU固件需要这条指令的内容,他会发出这个这个请求,这个请求中带有逻辑地址,CPU中的MMU会去查询这个逻辑地址在对应的表中有没有对应的物理地址,如果有这个物理地址,那么就可以找到。

连续内存分配

在这里插入图片描述

内存碎片问题
  • 分区的动态分配

    第一适配

    最佳适配

    最差适配

  • 压缩式碎片整理

  • 交换时碎片整理

碎片问题

在这里插入图片描述

分区的动态分配

在这里插入图片描述

第一适配

在这里插入图片描述

优势:

  • 简单

  • 易于产生更大空闲块,向着地址空间的结尾

劣势:

  • 外部碎片

  • 不确定性

压缩式碎片整理

在这里插入图片描述

把内存中分布不连续地址空间,重新排序使得连续,从而减少内存碎片。但是会系统的内存拷贝开销会非常大

交换时碎片整理

在这里插入图片描述

换入换出(swap)充分利用硬盘部分,p3在运行时,不够p4在内存中等待所需的空间,把p4一部分移到硬盘中(暂时把没有执行的程序放入硬盘中,等需要执行时再放入内存)

非连续内存分配

连续内存分配的缺点:

分配给一个程序的物理内存时连续的

内存利用率较低

有外碎片、内碎片的问题

非连续内存分配的优点:

一个程序的物理地址空间是非连续的

更好的内存利用和管理

允许共享代码与数据(共享库等…)

支持动态加载和动态链接

非连续内存分配的缺点:

如何建立虚拟地址和物理地址之间的转换

软件方案

硬件方案:

分段:

程序的分段地址

分段寻址方案

分页

分段

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过段号(index)就可以找到对应到段表里面的真实项,就知道了这个项中在物理地址的限制,CPU会判断一下 一个限制是否是一个非法的操作,如果不合法的地址,会产生一个异常,kill这个进程;如果合法就会取出这个物理地址进一步处理。

问题:段表谁来建立?—>操作系统

分页
  • 划分物理内存至固定大小的帧(大小是2的幂,eg:512,4096,8192)

  • 划分逻辑地址空间至相同大小的页(大小是2的幂,eg:512,4096,8192)

  • 建立方案 转换逻辑地址为物理地址(pages to frames)

    • 页表
    • MMU/TLB

在物理地址使用帧
在这里插入图片描述

在这里插入图片描述

在逻辑地址上使用页

  • 一个程序的逻辑地址空间被划分为大小相等的页
    • 页内偏移大小 = 帧内偏移大小
    • 页号大小 <> 帧号大小
      在这里插入图片描述
页寻址机制

在这里插入图片描述

流程分析:

CPU先获取逻辑地址,逻辑地址中记录了两部分:offset偏移量(o)和pages页号

§,页号当做index索引,然后根据页号(page number)在页表基址(page base address)上的偏移, 找到页表(page table)中找到对应的帧号,然后根据帧号(frame number)和offset偏移量(o)找到实际的物理地址。

页表(page table)是谁建立的?

page table 是操作系统建立的,这样才能让程序完成映射关系,才能正常的跑

在这里插入图片描述

  • 页表

    • 页表概括
    • 转换后备缓冲区(TLB)
    • 二级/多级 页表
    • 反向页表
      在这里插入图片描述

地址转换实例

在这里插入图片描述

解释
第一个逻辑地址(4,0)代表在页表中的第5个(01234,都是用0开始计数),flags的resident bit(是否对应物理地址的存在位)为图中标红部分(0->没有对应的帧块,物理地址不存在。1->有对应的帧块,物理地址存在)。

第二个逻辑地址(3,1023),同理即可,对应的页帧号为00100 -> 4,再根据后面的偏移量找到对应的物理地址(4,1023)。

在这里插入图片描述

64位计算机->寻址空间为2^64

一个页的大小 -> 1024byte -> 2^10

一个页表会多大? -> 2^64 / 2^10

  • 页表性能问题:(空间、时间)

    每个应用程序都会有一个页表,会导致栈的空间很大,浪费资源,CPU的cache放不下,需要把页表放到内存中,开销很大

  • 如何解决?

    • 缓存(caching)
    • 间接访问(Indirection)访问
    TLB

在这里插入图片描述

  • 什么是TLB?:

    把我们经常访问的页表项放到TLB中,因为虽然TLB(CPU中)访问很快,但是大小是很有限的,如果TLB中有记录页表项被访问到(TLB命中),可以不经过页表,直接访问物理地址。如果TLB中没有记录页表项被访问到(TLB未命中),CPU会去访问页表,再去访问物理地址。

  • 那会不会经常出现TLB未命中?

    不会的,因为在32位系统中TLB有4K个项,可以被访问4K次。

  • 延伸扩展:

    在我们编程时候,尽量把变量和存储放到一个位置,减小TLB的开销

二级页表
  • 二级页表产生原因?

    由于上节说到页表占用的空间太大,那如何使得页表占用的空间尽量小,引入二级页表。

在这里插入图片描述

  • 寻址流程:

    CPU是知道一级页表的起始地址的,然后根据p1的number作为index查到一级页表中的page table项,一级页表中存的这个值是二级页表的起始位置(如图箭头所示),然后根据p2的number作为Index(一级页表的address+p2Number)查到二级页表的帧号(frame number),再用帧号加上对应的offset偏移量得到相应的物理地址。页的offset与帧的offset是一样的

  • 优点:

    省空间 -> 如果p1中查不到对应的p2映射,那么就不用保留p2在内存中

多级页表

在这里插入图片描述

明白了二级页表进一步也推出多级页表

  • 优点

    省空间,时间换取空间 比如我们的64位操作系统可以用5级页表表示,随着页表的增多开销随之越来越大

反向页表

这里不赘述了,想学习的小伙伴自己学一下

虚拟内存

在这里插入图片描述

在这里插入图片描述

  • 如果在计算机系统中,尤其是在多道程序运行的环境下,可能会出现内存吃紧问题,怎么办?
    • 如果是程序太大,超过内存容量,可以采用手动覆盖(overlay)技术,只把需要的指令和数据保存在内存中
    • 如果是程序太多,可以采用自动的交换(swpping)技术,把暂时不能执行的程序送到外存中
    • 如果想在有限容量的内存中,以更小的页颗粒度为单位装入更多更大的程序,可以采用自动的虚拟存储技术

进程

  • 进程的描述
    • 进程的定义
    • 进程的组成
    • 进程的特点
    • 进程控制结构

进程的定义

在这里插入图片描述

由静态的程序,加载到内存中,成为动态的进程

进程的组成

一个进程应该包含:

程序的代码
程序处理的数据
程序计数器中的值,指示下一条将运行的指令
一组通用的寄存器的当前值,堆、栈
一组系统资源(如打开的文件)

  • 程序与进程的区别?

    • 进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行,进程有核心态/用户态

      • 为什么进程有核心态和用户态的区分?

        一个进程不止在用户态上操作,比如需要读写硬盘这些外设,都需要由操作系统去完成

    • 进程是暂时的,程序是永久的:进程是一个变化的过程,程序是可以永久保存

    • 进程与程序的组成不同,进程的组成包含:程序、数据、进程控制块(即进程状态信息)

在这里插入图片描述

进程运行不是一直执行的,会被优先级更高的进程打断,然后再进行执行

  • 进程的特点:
    • 动态性:可动态的创建,结束进程
    • 并发性:进程可以被独立调度并占用处理机运行;并发并行(多核)
    • 独立性:不同进程的工作不相互影响(页表来保证)
    • 制约性:因访问共享数据/资源或进程间同步而产生制约

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfNQrvL2-1660920031852)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209125839929.png)]

  • a:动态
  • b:独立
  • c:调度切换
    在这里插入图片描述

进程控制块(Process Control Block)

这部分挺有用的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进程的生命周期

  • 进程生命期管理
    • 进程创建 -> 初始化
    • 进程运行 -> 执行
    • 进程等待 -> 等待
    • 进程唤醒 -> 就绪
    • 进程结束 -> 消亡

进程创建

引起进程创建的3个主要过程:

系统初始化

用户请求创建一个新进程

正在运行的进程执行了创建进程的系统

进程等待
在这里插入图片描述
进程唤醒

在这里插入图片描述

进程结束
在这里插入图片描述

  • 为什么会从running变为ready?

    因为系统的内存资源和CPU的处理是有限的,当有多个程序在运行时,如果一个程序在规定的时间片内没有完成,就会被切换为下一个进程去执行,也就是从running变为ready。

  • 可能的状态变化如下:

    NULL->New:一个新进程被产生出来执行一个程序

    New->Ready:当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态。是否会持续很久->不会,因为OS创建pcb是很快的

    Ready->Running:处于就绪状态的进程被进程调度程序选中后,就分配到处理机上来运行。

    Running->Exit:当进程便是它已经完成或者因出错,当前运行进程会有操作系统作结束处理

    Running->Ready:处于运行状态在其运行过程中,由于分配给它的处理机时间片用完而让出处理机谁完成?->操作系统

    Running->Blocked:当进程请求某样东西且等待时

    Blocked->Running:当进程要等待某事件到来时,它从阻塞状态到就绪状态

进程挂起

实质:把进程暂时放到外存中
在这里插入图片描述

挂起状态

  • 阻塞挂起状态(Blocked-suspend):进程在外存并等待某事件的出现
  • 就绪挂起状态(Ready-suspend):进程在外存,但只要进入内存,即可运行

线程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIOrDwlj-1660920031857)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209135112740.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4uSXYbb-1660920031857)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209135301624.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BBFOLIyy-1660920031857)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209135706333.png)]

  • 程序分析:
    • 单进程: 播放声音可能不连贯,因为是单进程,read是阻塞读取,可能比较慢,而play比较快,当play完成后,read读耗费时间,导致卡顿
    • 多进程: 如果使用多进程的话,
      • 1.存在一个cpu调度,内存占用(维护进程的系统开销较大;创建进程时,分配资源,建立PCB;撤销进程时,回收资源,撤销PCB;进程切换时,保存当前进程的状态信息)
      • 2.IPC(进程间通信复杂)的问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nDm8hqiH-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209141341809.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbQxKfYn-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209141653807.png)]

系统资源分配的最小单位,系统调度的最小单位?

如何理解这句话:

进程主要就是负责资源的管理(打开文件,访问网络…)

线程成为了进程组成的重要部分,一个进程中的所有线程共享该进程的所有资源

一个线程组成:code(代码段),Initialized data(数据段),stack(堆栈)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7lJ0RifA-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209142213138.png)]

如何理解线程的缺点:

​ 线程能够共享一个进程的所有资源,若某个线程由于意外破坏了某个资源,其他线程访问这个资源也会出错.如果一个线程崩溃了,所有线程都会崩溃,进程也会挂掉.

什么时候用线程什么时候用进程?

强调性能使用线程,强调安全性使用进程

eg:你浏览器创建的所有网页都是线程,如果一个线程崩溃了,会导致所有网页不能打开,浏览器都崩溃了,这样的设计就不好!!!!!!!! ---> chrome都是使用进程模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1LWBbMsz-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209143200417.png)]

线程与进程的比较

  • 进程时资源分配单位,线程是CPU调度单位

    资源:内存,文件,网络…

    cpu调度单位:一些控制流所需要的信息

  • 进程拥有一个完整的资源平台,而线程只独享必不可少的资源

  • 线程同样具有就绪,阻塞和执行三种基本状态,同样具有状态之间的转换关系

  • 线程能减少并发执行的时间和空间开销

    1 线程的创建时间比进程短

    因为进程要创建内存去管理,创建文件去管理

    ​ 线程直接使用进程已经创建好的内存和文件

    2 线程的终止时间比进程短

    同上同理

    3 同一进程内的线程切换时间比进程短

    因为同一个进程中的线程拥有相同的页表,所以切换快

    切换进程时它们的页表都是不同的

    4 由于同一进程的各线程间共享内存和文件资源,可直接进行不通过内核通信

    同一个线程它们使用的地址是相同的,直接访问地址即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlrM1f2k-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145105828.png)]

  • 用户线程:CPU的调度单位为进程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aV0RHi6g-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145250601.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPW6HhpY-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145353390.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwrDq0rA-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145628846.png)]

  • 内核线程:CPU调度单位为线程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M4HATWru-1660920031860)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145802784.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sEdONlJU-1660920031860)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145839329.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d5iKAdGS-1660920031860)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150106717.png)]

上下文切换context

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iPkdGiI5-1660920031861)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150334203.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-elNecVkS-1660920031861)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150453952.png)]

什么时上下文切换?

process P0运行时要上下文切换,它要把进程寄存器信息保存在PCB中,把另一个进程process p1寄存器信息的PCB恢复CPU中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmxt4Fzk-1660920031862)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150722211.png)]

进程的创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wBMFWjsC-1660920031862)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151001342.png)]

exec会把另外一个程序覆盖之前的进程代码段,PCB时不变的,如果执行了why would I execute证明exec执行失败

  • 执行fork

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Im1IiSS7-1660920031862)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151513125.png)]

​ |

​ |

  • 执行exec

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7DOqjOuB-1660920031863)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151623736.png)]

  • 执行fork

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jrz7Unte-1660920031863)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151704753.png)]

  • 执行exec

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHxg9QAV-1660920031864)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151823996.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJnU10aN-1660920031864)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151849806.png)]

  • 这是很方便去执行一个新的进程

  • fork优化

    因为fork会拷贝父进程的资源,开销大,你要执行exec是不需要之前父进程的资源,所以拷贝过程是多余的 使用vfork:不会复制所有的资源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gtD8pN7U-1660920031865)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209152001586.png)]

现在系统基本都是COW


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLkaI261-1660920031865)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209154050685.png)]

调度

  • 上下文切换

    • 切换CPU的当前任务,从一个进程/线程到另一个
      • 保存当前进程/线程在PCB/TCP中的执行上下文
        • 读取下一个进程/线程的上下文
  • CPU调度

    • 从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程
    • 调度程序:挑选进程/线程的内核函数(通过一些调度)
    • 什么时候进行调度?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g81CdttI-1660920031866)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211215211452357.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YUmBuMIW-1660920031866)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211215211622392.png)]

文件系统

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oufOa0z6-1660920031866)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211215213740242.png)]

虚拟文件系统:/proc…

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值