操作系统概念(黑皮书)阅读笔记

操作系统概念(黑皮书)阅读笔记

进程和内存管理部分章节

  • 导论:

    • 操作系统类似于政府,其本身不能实现任何有用功能,而是提供一个方便其他程序执行有用工作的环境

      个人理解:os是government的作用,有着最高权限,去管理和分配资源,有效且公平

    • 计算机系统的根本目的是,执行用户程序并更容易解决用户程序。

    • 控制和分配I/O设备资源的共同功能被组成一个软件模块:os

    • os是一直运行在计算机上的程序(内核)

    • 除内核外,还有两类程序:

      1. 系统程序:与系统运行有关,但不是内核的一部分

      2. 应用程序:与系统运行无关的其他程序

        个人理解:系统程序是编译器、链接器那种性质的,但不是os;应用程序就是除开系统程序和os

    • os的运行:

      • 计算机开机后,先加载位于只读内存(ROM)上的引导程序,在通过引导程序去定位os内核并加载到内存,一旦内核加载到内存并执行,它就开始为系统和用户提供服务,除了内核,系统程序也提供了一些服务,他们在启动时加载到内存成为系统后台程序。一旦这个阶段完成,系统就完全启动了,等待事件发生
      • 事件发生通常硬件或软件的中断来通知。
        • 硬件通过系统总线发送信号到CPU,来触发中断
        • 软件可通过执行系统调用,来触发中断
    • CPU被中断时,它停止正在做的是事情,立即转到固定位置(中断服务程序的开始地址),执行该中断服务程序结束,再去重新执行中断的计算

    • 存储结构:

      • 内存,也称随机访问内存(Random Access Memory, RAM),通常为动态随机访问内存(DRAM)

        个人理解:内存中的数据就是随机分布并不连续,所以是随机访问

      • 只读内存(Read Only Memory, ROM),数据不可修改

      • 内存特点:易丢失,掉电丢失数据。但是ROM不是这样,ROM已经固化在内存上了

      • 外存(硬盘啥的):数据持久化

    • I/O结构:

      • 每个设备控制器管理一系列特定类型的设备
      • os为每个设备控制器提供了设备驱动程序
    • os是中断驱动的,事件是由中断或陷阱(或异常)引起的

      • 陷阱(或异常)是一种软件生成的中断,或源于出错,或源于用户程序的特定请求
    • 双重模式与多重模式的执行:

      • 为确保os的正确运行,必须区分操作系统代码和用户代码的执行
      • 用户模式和内核模式:
        • 计算机硬件可以通过模式位(mode bit)来表示当前模式:内核模式(0)和用户模式(1)
        • os执行用户应用时,系统处于用户模式,当用户通过系统调用,请求操作系统服务时,系统必须从用户模式切换为内核模式
    • 进程管理:

      • 执行中的程序称为进程
      • 程序本身不是进程,程序是被动实体,进程是主动实体
      • 进程是系统的工作单元。系统由多个进程组成,其中有操作系统进程和用户进程。所有进程并发执行。
    • 内存管理:

      • 内存是以一个大的字节数组
      • 如果CPU需要执行指令,那么这些数据必须首先通过CPU的IO调度从硬盘传到内存
      • 为了改进CPU的利用率和用户的计算机响应速度。计算机在内存中保留了多个程序,这就需要内存管理
    • 存储管理:

      • 操作系统对存储设备的物理属性进行了抽象,并定义了逻辑单元,即文件( File)。os映射文件到物理媒介,并通过存储设备来访问文件
  • 操作系统结构:

    • 用户与os的界面:命令解释程序和图形用户界面(GUI)

      • 有的os内核就包括命令解释程序。解释程序称为Shell(外壳),将用户输入的命令转换为机器指令
      • GUI消耗资源更多,系统更复杂,bug也更多
    • 系统调用提供os服务接口.这些API通常以c 、 cpp 、汇编写的

      • 开发人员根据API来设计程序
      • 系统调用大致分为六大类:
        • 进程控制、文件管理、设备管理、信息维护、通信、保护
    • 随着内核功能越来越多,内核变得更大和难以管理,采用微内核技术对内核进行模块化,即从内核中删除所有不必要的部件,将他们当作系统级与应用级的程序来实现,使得内核变小

    • 微内核的主要功能是为客户端程序和运行在用户空间的各种服务提供通信,通信是通过消息传递来提供的

    • 优点:便于拓展os,更安全,便于移植

    • 缺点:增加系统功能的开销,微内核性能受损

    • 个人理解:把很多原来在内核态运行的服务放出去了,导致调用时频繁切换状态

  • 进程

    • 现代os允许加载多个程序到内存,以便并发执行。这些需求导致进程这个概念的产生,进程即为执行中的程序

    • 程序本身不是进程。程序是被动实体。如存储在磁盘上的包含一系列指令的文件(可执行文件)

    • 而进程是活动实体。当一个可执行文件被加载到内存时,这个程序就成为进程

    • 进程是执行中的程序实体(这话不一定准确)

    • 进程是os进行资源分配和调度的基本单位

    • os中的每个进程采用进程控制块(Process Control Block, PCB)表示

      • PCB保存一系列信息,进程状态、进程编号、pc、寄存器、内存界限、打开文件列表。。。。。
      • PCB存在一个双向链表
      • 进程的上下文采用进程PCB表示
    • 分时系统的目的是在进程之间快速切换CPU,以便用户在程序运行时能与其交互

    • 进程在进入系统时,会被加入作业队列(job queue)

    • 驻留在内存中的,就绪的,等待运行的进程保存在就绪队列上,这个列表,通常用链表实现

    • 等待特定IO设备的进程列表,称为设备列表

    • 上下文切换的时间是纯粹的开销,在这个过程中,CPU没有做任何有用的工作

    • 大多数OS对进程的识别采用唯一的进程标识符(process identifier ,pid),通常是一个整数值。

    • 通过pid可以访问内核中的进程的各种属性

    • 进程间通信:

      1. Soket
        • Socket为通信的端点。通过网络通信的每对进程需要一对Socket,即每个进程各一个Socker
        • 每个Socket由 ip 和端口组成
        • 使用Socket通信,常用且高效,属于是分布式进程之间的一种低级形式的通信。因为通信进程之间交换的是无结构的字节流,客户端和服务器程序需要自己加上数据结构
      2. RPC
      3. 管道
  • 多线程编程:

    • 每个线程是CPU使用的一个基本单元

    • 线程包括线程ID,pc,寄存器组和堆栈。它与同一进程的其他线程共享代码段、数据段和os其他资源

    • 一个进程一般具有多个线程,那么进程能同时执行多个任务

    • 一个进程为什么要创建多个线程?

      1. OS创建多个进程比一个进程中创建多个线程开销大
      2. 进程间通信比线程间通信更复杂
    • 优点:

    • 响应性:如果一个交互程序采用多线程,那么即使部分阻塞或执行冗余操作,它仍然可以继续执行,从而增加对用户的响应速度

    • 资源共享:进程只能通过共享内存和消息传递之类的技术共享资源。而线程默认共享它们所属进程的内存和资源

    • 经济:进程创建所需的内存和资源分配非常昂贵

    • 可伸缩性:对于多处理器体系结构,多线程的优点更大,因为线程可在多处理器核上并行运行

    • 多线程模型:

      • 用户线程:位于内核之上,它的管理无需内核支持
      • 内核线程:由OS来直接支持与管理
  • 进程调度:

    • 调度程序是一个模块,用来将CPU控制权交给由短期调度程序选择的进程。

      • 功能包括:
        • 切换上下文
        • 切换到用户模式
        • 跳转到用户模式的合适位置,以便重启程序
    • 不同的调度算法具有不同的特点

    • 最简单的CPU调度算法是先到先服务(First - Come First - Served, FCFS)调度算法。先请求CPU的进程首先分配到CPU,通过FIFO队列简单实现

      • FCFS调度算法是非抢占的

      • 优点:实现简单

      • 缺点:平均等待时间往往很长

    • 最短作业优先(Shortest - Job - First, SJF)调度算法将每个进程与其下次CPU执行的长度关联起来。当CPU空闲时,它会被赋给具有最短CPU执行的进程

    • SJF算法是最优的,因为平均等待时间最小(CPU更忙碌)

    • SJF调度经常用于长期调度。对于批处理系统的长期调度,可以将用户提交作业指定的进程时限作为长度

    • SJF算法不能在短期CPU调度上加以实现,没法知道下次CPU执行的长度

    • FCFS调度算法是非抢占的或抢占式

    • 优先级调度算法

      • 优先级调度算法是非抢占的或抢占式
      • 它的主要问题是无穷阻塞或饥饿问题
      • 饥饿的解决方案之一是老化,就是说逐渐增加等待很长时间的优先级
    • 轮转(Round - Robin)调度算法专门为分时系统设计

      • 将一个时间单元(10ms ~ 100ms)定义为时间片。就绪队列作为循环队列,为每一个进程分配不超过一个时间片的CPU执行
      • 时间片一到,就会中断OS,进行上下文切换
      • RR调度的平均等待时间通常较长
    • 多级队列调度算法将就绪队列分成多个单独队列

      • 根据进程属性,如内存大小,进程优先级,进程类型等,一个进程永久分到一个队列。每个队列有自己的调度算法
      • 每个队列与更低层队列相比有绝对的优先
      • 缺点:可能存在饥饿问题
      • 允许进程在队列之间迁移
    • 之前讨论的是单处理器的调度问题,如果多个CPU,则负载均衡成为可能,但调度就更复杂

    • 多处理器调度:

      • 非对称多处理:
        • 让一个CPU去处理所有调度决定、IO处理以及其他系统活动,其他CPU只执行用户代码
        • 这样,因为只有一个CPU访问系统数据结构,减少了数据共享的需要
      • 多对称处理(SMP):
        • 每个CPU关系平等
        • 对SMP来说负载平衡很重要
    • 处理器亲和力:

      • 大多数OS避免将一个进程从一个cpu移到另一个cpu,而是试图让它始终运行在一个cpu上
      • 即一个进程对它运行的处理器具有亲和力
      • 个人理解:迁移进程,那么在原先CPU缓存中的数据还要删除和迁移,麻烦耗资源,所以要避免
    • 负载平衡:

      • 分为推迁移和拉迁移
      • 这两个迁移就是方向不一样,高负载CPU到低负载CPU就是推,反之就是拉
      • 在负载平衡中二者是并行实现
    • 实时CPU调度:

      • 软实时
      • 硬实时
    • 延迟:

      • 中断延迟
      • 调度延迟
    • 用于实时OS的调度程序应支持抢占的、基于优先级的算法

  • 同步:

    • 每个进程在执行一段代码可能修改公共变量,那这段代码称为临界区

      • 不能有两个进程在它们的临界区共同执行
    • 硬件同步

      • 基于加锁为前提,通过锁来保护临界区。通过硬件指令来解决临界区问题
    • 软件同步

      • 最简单的是使用互斥锁,防止竞争条件

        • 一个进程在进入临界区的时候得到锁,退出临界区的时候释放锁
        • 忙等待:当一个进程在临界区中,任何其他进程在进入临界区必须不断循环判断。这种互斥锁也叫自旋锁,进程不断旋转,等待锁变得可用
        • 忙等待浪费CPU周期,优点是没有切换上下文
      • 信号量

        • 一个信号量S是一个整形变量。它除了初始化只能通过两个标准原子操作:wait()和signal()来访问

        • wait()最初称为P原语(测试)减一

        • siganl()最初称为V原语(增加)加一

        • OS通常区分技术信号量与二进制信号量

        • 二进制信号量类似于互斥锁

        • 计数信号量可以用于控制访问具有多个实例的某种资源。信号量的初始值为可用资源数

        • 当进程需要使用资源时,对信号量执行wait()操作

        • 进程释放资源时,再对信号量执行signal()操作

        • 多个进程无限等待一个事件,而该事件只能由这些等待进程之一来产生。这种状态称为死锁

        • 内核数据通常是用保护的,较高优先级的进程不得不等待较低优先级的进程用完资源

        • 经典同步问题:

          1. 有界缓存问题:
          2. 哲学家就餐:
  • 死锁:

    • 如果所申请的资源被其他进程占有,那么该等待等待进程有可能再也无法改变状态。这种情况称为死锁
    • 多进程对共享资源的竞争可能导致死锁
    • 系统中可能产生死锁的四个条件:
      • 互斥:这个资源一次只能被一个进程使用
      • 占有并等待:一个进程占有至少一个资源,并等待另一个资 源 ,而该资源被其它进程所占有
      • 非抢占:资源不能被抢占,只能自己资源释放
      • 循环等待
    • 死锁恢复
      • 中止一个或多个进程来打破循环等待
      • 从一个或多个死锁进程那里抢占一个或多个资源
  • 内存管理:

    • 内存由一个很大的字节数组来组成,每个字节都有各自的地址(即内存地址)

    • CPU根据PC的值从内存中提取指令,这些指令可能引起对特定内存地址的额外加载与存储

    • 首先需要确保每个进程都有一个单独的内存空间,单独的空间才能保障不互相影响。

    • 需要确定一个进程可以访问的合法地址的范围,且确保该进程只能访问这个合法地址

    • 通过两个寄存器,通常为基地址和界限地址。

      • 基地址寄存器保存的时最小的合法的物理内存地址。
      • 界限寄存器保存的是范围的大小,也就是偏移量
    • 内存空间保护的实现是通过CPU硬件对在用户模式下产生的地址与寄存器的保存的地址比较来完成的

    • 大多数系统允许用户进程放在物理内存中的任意位置

    • 源程序中的地址通常是用符号表示

    • 编译器将这些符号地址绑定到可重定位的地址(如:“从本模块开始的第14字节”)

    • 链接程序或加载程序再将这些可重定位的地址绑定到绝对地址(如324312)

    • 每次绑定都是从一个地址空间到另一个地址空间的映射

    • 指令和数据绑定到存储器地址可在沿途的任何一步中进行

    • 逻辑地址:CPU生成的地址称为逻辑地址

      • 个人理解:代码加载运行时的变量的地址
      • 本书中,逻辑地址和虚拟地址
    • 虚拟地址到虚拟地址的映射是由MMU内存管理单元

    • 不连续内存分配:

      • 分段:

        • 根据段号去段表查询界限位置和基地址
      • 分页:

        • 避免了外部碎片
        • 分页就是将内存分成固定大小的块
        • 根据页码去页表查询基地址和偏移量,有TCL就先查TCL(缓存)
        • 分页优点之一是可以共享内存。多个分页可以指向同一块内存地址
  • 虚拟内存管理:

    • 虚拟内存将用户逻辑内存与物理内存分开

    • 虚拟内存允许执行进程不必完全处于内存

    • 允许进程轻松实现共享文件和内存

    • LRU算法(Least - Recent - Used)最近最少使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386006.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瑞芯微平台RK3568系统开发(2)Camera 开发1

1. 前言 1.1 RK3568硬件框图 1.2 开发流程 通过gstreamer/rockit来在rockchip平台上做multimedia的开发: vpu_service--> mpp --> gstreamer/ffmpeg --> app vpu_service:驱动 mpp:rockchip平台的视频编解码中间件,相关说明参考…

vue3+ts+vite+electron+electron-packager打包成exe文件

目录 1、创建vite项目 2、添加需求文件 3、根据package.json文件安装依赖 4、打包 5、electron命令运行 6、electron-packager打包成exe文件 Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron 1、创建vite项目 npm create vitelatest 2、添…

【解决方案】华普微汽车智能钥匙解决方案

一、方案概述 1.什么是被动式无钥匙进入 "被动式无钥匙进入"(Passive Keyless Entry)是一种用于车辆、建筑物或其他设施的访问控制系统。它利用无线射频技术自动判断用户是否接近,并进行身份识别以执行开锁或落锁动作&#xff0c…

LabVIEW操作系列1

系列文章目录 我的记录: LabVIEW操作系列 文章目录 系列文章目录前言五、特殊用法5.1 取值范围表示5.2 对输入值取值范围进行限定5.3 控制多个While循环停止运行。5.4 获取按钮上的文本5.5 获取按钮上的文本【进阶】 六、使用步骤1.引入库2.读入数据 七、其余功能7.…

nodejs与npm版本对应表

Node.js — Node.js 版本 (nodejs.org)

go语言day20 使用gin框架获取参数 使用自定义的logger记录日志

Golang 操作 Logger、Zap Logger 日志_golang zap-CSDN博客 目录 一、 从控制器中获取参数的几种形式 1) 页面请求url直接拼接参数。 2) 页面请求提交form表单 3) 页面请求发送json数据,使用上下文对象c的BindJSON()方法接…

Java中static静态变量--继承等相关知识

目录 static 继承: 继承的特点: 案例:自己设计一个继承体系练习: 设计思想: 代码: 子类到底能继承父类的哪些类容? 成员变量内存的继承情况: 成员方法的内存继承情况&#x…

示例:WPF中如何处理TabControl页面绑定ItemsSource切换TabItem时UI数据没有持久保存的问题

一、目的:在WPF开发过程中,经常用到TabControl,也会遇到类似问题,用TabControl绑定数据源ItemsSource时,切换TabItem时,UI上的数据没有持久保存,本文介绍一种处理方式,可以做到缓存页…

矩阵管理系统有哪些功能?

在当今快节奏的数字时代,管理多个社交媒体账号或内容渠道可能是一项令人望而生畏的任务。这就是矩阵管理系统大显身手的地方。矩阵管理系统是一种高效的工具,它帮助我们轻松地管理多个内容发布点,就像指挥官控制着整个战场一样。下面&#xf…

C++·set与map容器(下)

本节把红黑树封装到set与map容器中去主要就是迭代器的自增自减,封装的大部分内容都展示到最后代码中了 1. 红黑树的改造 因为set容器只有关键码值,map容器中不仅要存关键码值,还要存关键码值对应的数据。但是红黑树只有一颗,我们…

【轨物方案】码头卸船机在线监测物联网解决方案

卸船机是利用连续输送机械制成能提升散粒物料的机头,或兼有自行取料能力,或配以取料、喂料装置,将散粒物料连续不断地提出船舱,然后卸载到臂架或机架并能运至岸边运输的地方送机系统去的专用机械。每年都要安排人员定期去现场巡检…

搭建DNS正向解析,反向解析+搭建DNS主从架构+搭建DNS多区域+时间同步

主要在局域网中配置,不存在外网 正向解析:域名解析为IP named.conf 解决权限 named.rfc1912.zones 解决解析方式 环境准备:三台机器都做下面的操作 基础配置:网络配置,关闭安全架构,关闭防火墙&#x…

3D模型可视化引擎HOOPS Luminate功能一览:实时渲染(二)

HOOPS Luminate是一款专为图像可视化设计的C编程工具包。它通过一个统一的集成API,全面覆盖了实时2D、实时3D以及照片级逼真渲染的图形功能。在处理大型数据组件的显示方面,HOOPS Luminate展现出了卓越的性能,并且具备高度的可定制性和灵活性…

一文带你读懂TCP

文章目录 1 TCP协议1.1 TCP 基础1.1.1 TCP 特性1.2.2 TCP连接数 1.2 TCP 头1.2.1 TCP 头格式1.2.2 MTU,MSS,分片传输 1.3 TCP 连接三路握手1.4 TCP 断开四次挥手1.5 SYN攻击和防范1.6 重传机制1.6.1 超时重传1.6.2 快速重传1.6.3 SACK 1.7 滑动窗口1.8 流…

VScode使用Github Copilot插件时出现read ECONNREST问题的解决方法

文章目录 read ECONNREST查看是否仍是 Copilot 会员查看控制台输出网络连接问题浏览器设置问题笔者的话 read ECONNREST 最近使用 Copilot 时一直出现 read ECONNREST 问题,这个表示连接被对方重置了,就是说在读取数据时连接被关闭。 我首先怀疑是不是…

springboo 整合 redis

springBoot 整合 redis starter启动依赖。—包含自动装配类—完成相应的装配功能。 引入依赖 <!--引入了redis整合springboot 的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis&…

PostgreSQL的pg-collector工具

PostgreSQL的pg-collector工具 pg-collector 是一个用于 PostgreSQL 数据库的监控和数据收集工具。它主要用于收集 PostgreSQL 实例的性能指标、查询统计和日志信息&#xff0c;以便进行数据库性能分析和故障排查。通过收集这些数据&#xff0c;管理员可以更好地了解数据库的运…

盘点2024年网上很火的4个语音识别转文字工具。

语音识别转文字是一项非常实用的技术&#xff0c;可以帮助我们在会议记录中省去手动记录&#xff0c;在采访中迅速得到文字稿&#xff0c;在学习中快速生成课堂笔...运用十分广泛。但是很多人不知道要怎么转换&#xff0c;在这里我便给大家介绍几款效率非常高的语音转文字的工具…

python 裁剪图片

情况&#xff1a; 有时候看视频&#xff0c;看到一个漂亮的妹子&#xff0c;按下 Alt PrintScreen 进行截图之后&#xff0c;会把整个屏幕都截图。 需要适当剪裁一下。 每次打开 PS &#xff0c; 也太慢了。 所以写个代码&#xff0c; 快速处理。 效果对比&#xff1a; 原始…

轨道式智能巡检机器人,助力综合管廊安全运维

1 引言 当前城市综合管廊建设已经成为世界范围内的发展趋势&#xff0c;2017年5月住建部、发改委联合发布《全国城市市政基础设施建设“十三五”规划》&#xff0c;截至2017年4月底国内地下综合管廊试点项目已开工建设687 km&#xff0c;建成廊体260 km&#xff0c;完成投资40…