操作系统学习笔记

2023-05-16

1.1.5 中断和异常

早期的计算机:各程序只能串行执行,系统资源利用率低。为了解决这个问题,人们发明了操作系统,引入中断机制,实现了多道程序并发执行。发生中断就意味着需要操作系统介入,开展管理工作。

1、过程

CPU收到计时部件发出的中断信号,切换为核心态对中断进行处理。

2、

当中断发生时,CPU会立即进入核心态

当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理

对于不同的中断信号,会进行不同的处理

发生了中断,就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(比如进程切换,分配I/O设备等)需要使用特权指令,因此CPU要从用户态转换为核心态。中断可以使CPU从用户态转换为核心态,使操作系统获得计算机的控制权。有了中断,才能实现多道程序并发执行。

3、用户态、核心态之间的切换是怎么实现的?

答:用户态->核心态是通过中断实现的。并且中断是唯一的途径。核心态->用户态的切换是通过执行某个特权指令,将程序状态字(PSW)的标志位设置为用户态。

4、中断的分类

内中断(信号来源:CPU内部与当前执行的指令有关)(异常、例外、陷入):

外中断:

2.1.1 进程的定义、组成、组织方式

1、进程的定义

程序:就是一个指令序列,早期的计算机(只支持单道程序);

2、内存中同时放入多道程序,各个程序的代码、运算数据存放的位置不同,操作系统要怎样才能找到程序的存放位置呢?

系统为每个运行的程序配置一个数据结构,称为进程控制块(PCB),用来描述进程的各种信息(例如程序代码存放位置等。)引入多道程序技术之后,为了方便操作系统管理,完成各程序并发执行,引入了进程、进程实体的概念。PCB、程序段、数据段三部分构成了进程实体。

程序段、数据段、PCB三部分组成了进程实体(进程映像)。一般情况下,我们把进程实体就简称为进程,例如,所谓创建进程,实质上就是创建进程实体中的PCB,而撤销进程,实质上是撤销进程实体中的PCB。

程序段:程序代码

数据段:程序运行时使用,产生的运算数据、如全局变量、局部变量、宏定义的常量,就存放在数据段内。

3、从不同的角度,程序可以有不同的定义

1.进程是程序的一次执行

2.进程是一个程序及其数据在处理机上顺序执行时所发生的活动

3.进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

4、引入进程实体的概念之后,可以把进程定义为:

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

注:严格来说,进程实体和进程并不一样,进程实体是静态的,进程是动态的。不过,除非题目专门考察两者区别,否则可以认为进程实体就是进程。因此我们也可以说“进程由程序段、数据段、PCB三部分组成。”

5、进程的组成

进程实体:程序段、数据段、PCB

PCB:

  • 进程描述信息:
  • 进程控制和管理信息
  • 资源分配清单
  • 处理机相关信息

 程序段:存放要执行的代码

数据段:存放程序运行过程中处理的各种数据

5、进程的组织

在一个系统中,通常有数十、数百乃至数千个PCB,为了能对他们加以有效的管理,应当用适当的方式将他们组织起来。

注:进程的组成讨论的是一个进程内部由哪些部分构成的问题,而进程的组织讨论的是多个进程之间的组织方式问题。

进程的组织方式:

  • 链接方式:按照进程状态将PCB分为多个队列,操作系统持有指向各个队列的指针。
  • 索引方式:根据进程状态的不同,建立几张索引表,操作系统持有指向各个索引表的指针

进程状态:运行态、就绪态、阻塞态

 6、进程的特征

进程和程序是两个截然不同的概念,相比于程序,进程拥有以下特征:

动态性:进程是程序的依次执行,是动态地产生、变化和消亡的。

并发性:内存中有多个进程实体,各个进程可以并发执行

独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位

异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题。

结构性:每个进程都会配置一个PCB,结构上看,进程由程序段、数据段、PCB组成

2.1.2 进程的状态和转换

进程是程序的一次执行,在这个执行过程中,有时候进程正在被CPU处理,有时又需要等待CPU服务,可以预见,进程的状态是会有各种变化的。为了方便对各个进程的管理,操作系统将进程合理的划分为几种状态。

1、三种基本状态:

  • 运行态:占有CPU,并且在CPU上运行(注:单核处理机环境下,每一个时刻最多只有一个进程处于运行态。)(双核环境下,可以同时有两个进程处于运行态。)
  • 就绪态:已经具备运行条件,但是由于没有空闲CPU,暂时不能运行(进程已经拥有了除了处理机之外所需的资源,一旦获得处理机,即可以进入运行态开始运行,万事具备,只欠CPU)
  • 阻塞态(等待态):因等待某一事件而暂时不能运行(注:等待操作系统分配打印机,等待磁盘操作的结果。CPU是计算机中最昂贵的部件,需要先将其他进程需要的资源分配到位,才能得到CPU的服务。)

2、另外两种状态

创建态:进程正在被创建,操作系统为进程分配资源,初始化PCB

终止态:进程正在从系统中撤销,操作系统回收进程拥有的资源,撤销PCB

3、进程状态的转换

 创建态->就绪态:系统完成创建进程的一系列工作(操作系统为进程分配资源,初始化PCB)

就绪态->运行态:进程被调度

运行态->就绪态:时间片到,或者处理机被抢占

运行态->阻塞态:进程用系统调用的方式申请某种系统资源,或者请求等待某个事件发生

运行态->阻塞态是进程自身做出的主动行为

阻塞态->就绪态:申请的资源被分配,或者等待的事件发生

阻塞态->就绪态不是进程自身控制的,是一种被动行为。

注意:不能由阻塞态直接转换成为运行态,也不能由就绪态直接转换为阻塞态。(因为进入阻塞态是进程主动请求的,必然要求进程在运行的时候才能发出这种请求)

2.1.3 进程控制

1、

 创建进程:需要初始化PCB,分配系统资源。

创建态->就绪态:需要修改PCB内容和相应的队列

就绪态->运行态:需要恢复进程运行环境,修改PCB内容和相应队列

运行态->终止态:需要回收进程资源,撤销PCB

运行态->就绪态:进程切换,需要保存进程运行环境、修改PCB内容和响应队列

运行态->阻塞态:需要保存进程运行环境,修改PCB内容和相应队列

阻塞态->就绪态:需要修改PCB内容和响应队列,如果等待的是资源,还需要为进程分配系统资源。

2、如何实现进程控制

用原语实现进程控制。原语的特点是执行期间不允许中断,只能一气呵成。

这种不可被中断的操作即原子操作。

原语采用关中断指令和开中断指令实现。

原语:

  • 是一种特殊的程序
  • 处于操作系统的最底层,最接近硬件的部分
  • 这种程序的执行具有原子性,运行只能一气呵成,不可以中断
  • 运行时间较短、调用频繁

显然:关/开中断的权限非常大,必然是在核心态下执行的特权指令。

原语所作的事情:

1.更新PCB中的信息

2.将PCB插入合适的队列

3.分配/回收资源

2.1.4 进程通信

1、什么是进程通信?

顾名思义:进程通信就是指进程之间的信息交换

进程是分配系统资源的单位(包括内存地址空间),因此各个进程拥有的内存地址空间相互独立。

为了保证安全,一个进程不能直接访问另一个进程的地址空间。但是进程之间的信息交换是必须实现的,为了保证进程之间的安全通信,操作系统提供了一些方法。

进程通信:

  • 共享存储
  • 消息传递
  • 管道通信

1、共享存储

基于数据结构的共享:比如共享空间内只能放一个长度为10的数组,这种共享方式速度慢、限制多、是一种低级通信方式。

基于存储区的共享:在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统,相比之下,这种共享方式速度更快,是一种高级通信方式。

两个进程对共享空间的访问必然是互斥的(互斥访问通过操作系统提供的工具实现)。操作系统只负责提供共享空间和同步互斥工具(如P、V操作)。

2、管道通信

管道是用于连接读写进程的一个共享文件,又名pipe文件,其实就是在内存中开辟一个大小固定的缓冲区。

1.管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。

2.各进程要互斥地访问管道

3.数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待进程将数据取走,当读进程将数据全部取走之后,管道变空,此时读进程的read()系统调用将被阻塞。

3、消息传递

进程间的数据交换以格式化的信息为单位。进程通过操作系统提供的“发送消息、接收消息”两个原语进行数据交换。

2.1.5 线程概念和多线程模型

1、什么是进程,为什么要引入线程?

有的进程需要同时做很多事情,而传统的进程只能串行地执行一系列程序。为此引入了线程,来增加并发度。

传统的进程是程序执行流的最小单元。引入了线程之后,线程成为了程序执行的最小单元。

2、引入线程机制后,有什么变化?

可以把线程理解为“轻量级进程”。线程是一个基本的CPU执行单元,也是程序执行流的最小单位。引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发。从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ、视频、文字聊天、传文件等)。

引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。

带来的变化:

  • 资源分配、调度:
  • 并发性:
  • 系统开销:传统的进程间并发,需要切换进程的运行环境,系统开销很大。线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小。引入线程后,并发所带来的系统开销减小。

3、线程的属性

  • 线程数是处理机调度的单位
  • 多CPU计算机中,各个线程可以占用不同的CPU
  • 每个线程都有一个线程ID、线程控制块(TCB)
  • 线程也有就绪、阻塞、运行三种基本状态
  • 线程几乎不拥有系统资源
  • 同一进程的不同线程之间共享进程的资源
  • 由于贡献内存地址空间,同一进程中的线程间通信甚至无需系统干预
  • 同一进程中的线程怯寒,不会引起进程切换
  • 不同进程中的线程切换,会引起进程切换
  • 切换同进程内的线程,系统开销很小
  • 切换进程,系统开销很大

4、线程的实现方式

1)用户级线程:用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责(包括线程切换),用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。在用户看来,是有多个线程,但是在操作系统看来。并不意识到线程的存在。(用户级线程对用户不透明,对操作系统透明)

2)内核级线程:内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此,内核级线程的切换必然需要在核心态下才能完成。可以这样理解,内核级线程就是从操作系统内核视角能看到的线程。

3)在同时支持用户级线程和内核级线程的系统中,可以采用两者组合的方式:将n个用户级线程映射到m个内核级线程上(n>=m)

重点:操作系统只看得见内核级线程,因此只有内核级线程才是处理机分配的单位。

5、线程实现方式优缺点分析

多对一模型:多个用户及线程映射到一个内核级线程,每个用户进程只对应一个内核级线程。

优点:用户级线程的切换在用户空间即可以完成,不需要切换到核心态,线程管理的系统开销小,效率高。

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并发运行。

一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。

优点:当一个线程被阻塞之后,别的线程还可以继续执行,并发能力强。多线程可以在多核CPU上并发执行。

缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

多对多模型:n用户级线程映射到m级内核级线程(n>=m)。每个用户进程对应m个内核级线程。

克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级进程,开销太大的缺点。

2.2.1 处理机调度的概念、层次

当有一堆任务需要处理,但是由于资源有限,这些事情没办法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是调度要研究的问题。

在多道程序系统中,进程的数量往往是多于处理机的数量,这样不可能同时并行地处理各个进程。处理机调度:就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。

1、高级调度:

由于内存空间有限,无法将用户提交的全部作业放入内存,这就需要确定某种规则来决定将作业调入内存的顺序。

高级调度。按照一定的原则从外存上处于后备队列的作业中挑选一个作业,给他们分配内存等必要资源,并建立相应的进程(PCB),以使他们获得竞争处理机的权利。

高级调度是辅存与内存之间的调度。每个作业只调入一次,调出一次,作业调入时会建立相应的PCB,作业调出时必须撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但是调出的时机必然是作业运行结束时才调出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统学习笔记 的相关文章

  • Linux Kernel and Android 休眠与唤醒

    Table of Contents 简介 国际化 版本信息 对于休眠 suspend 的简单介绍 Linux Suspend 的流程 相关的文件 准备 冻结进程 让外设进入休眠 Resume Android 休眠 suspend 涉及到的文
  • 浅析linux下键盘设备工作和注册流程

    span style color 000000 a href http qgjie456 blog 163 com blog m 61 0 span style font size 6 http qgjie456 blog 163 com
  • linux内核信号处理

    信号是操作系统中一种很重要的通信方式 近几个版本中 信号处理这部份很少有大的变动 我们从用户空间的信号应用来分析Linux内核的信号实现方式 一 信号有关的数据结构 在task struct中有关的信号结构 struct task stru
  • win7和ubuntu双系统,直接进入windows启动项选择菜单,而不进入grub的解决方案。

    一 Ubuntu 采用 grub 引导 xff0c 首先要将 grub 引导去掉 xff0c 重建 windows mbr 引导 xff0c 下载 MbrFix exe 并将它放到 C 盘根目录 xff08 其他目录也可 xff09 xff
  • 带你搞明白Zookeeper选举机制

    没什么 xff0c 搞不明白别打我就行 xff0c 初学者如有问题请及时指正 xff01 在上一篇文章我们有介绍3种server角色 xff1a Leader Follower以及Observer xff08 不参加选举 xff09 xff
  • windows远程linux桌面

    TigerVNC是一个高性能 平台无关的虚拟网络计算 xff08 Virtual Network Computing xff0c VNC xff09 实现 xff0c 是一个客户端 服务器应用程序 xff0c 允许用户在远程机器上启动并与图
  • 循环队列的介绍与实现

    文章目录 1 循环队列定义2 循环队列基本操作3 循环队列代码实现4 补充 1 循环队列定义 循环队列 xff1a 即顺序存储的队列 xff0c 是为了避免 假溢出 而利用 运算符将队列首尾相接连成一个环状的队列 xff0c 称为循环队列
  • AndroidStudio4.1 升级Kotlin插件不生效问题

    背景 xff0c 在使用SAM转换写Livedata observe 的第二个参数时 xff0c 发现AS报红 xff0c 但编译不出错 xff0c 功能也能正常运行 然后就尝试升级Kotlin插件 AndroidStudio4 1 默认带
  • 一个中科大差生的8年程序员工作总结

    今年终于从大菊花厂离职了 xff0c 离职前收入大概60w不到吧 xff0c 在某乎属于比较差的 xff0c 今天终于有空写一下自己的职场故事 xff0c 也算是给自己近8年的程序员工作做个总结复盘 近8年有些事情做对了 xff0c 也有更
  • 如何一步一步成为一个领域专家

    经常有人问我 xff0c 为什么有的人工作10年仍然平台无奇 xff0c 而有的人只用3年时间 xff0c 就已经脱颖而出 xff0c 成绩斐然 我说 xff0c 是呀 xff0c 有些参加工作多年却仍然只会复制粘贴简单业务代码 xff0c
  • 如何一步一步建立自己的技术影响力

    很多朋友是不是有这样的经历 xff0c 当我们还是一个菜鸟的时候 xff0c 团队里总有1 2个技术大拿 xff0c 每当有技术问题大家争论不休 xff0c 团队成员讨论的面红耳赤 xff0c 技术大牛实在看不下去 xff0c 掐灭手中的烟
  • 一个老程序员的一些职场经验分享

    有一些关于职场的经验 xff0c 当然有一些是以前总结过的 xff0c 现在归类总结一下 xff0c 上半部分是通用职场 xff0c 下半部分是程序员专用 一 通用职场经验 1 xff09 很多人认为事情做得多 xff0c 事情做得好就能晋
  • 第2章 第一个Spring Boot项目

    开发工具选择 工欲善其事必先利其器 xff0c 我们进行Java项目开发 xff0c 选择一个好的集成开发工具 xff08 IDE xff09 对提高我们的开发调试效率有非常大的帮助 这里我们选择大名鼎鼎的IDEA xff0c 它全称 In
  • 第8章 使用注解的方式整合MyBatis 入门详解

    目录 注解方式和配置文件方式的优缺点 使用注解方式整合MyBatis 添加依赖 配置application properties文件 在启动类上添加apperScan注解 创建mapper接口和实体类目录 添加实体类 测试验证 添加参数 直
  • 第9章 Spring Boot整合JPA 与 JpaRepository 基础方法介绍

    参考文章 xff1a 第1章 Spring Boot到底是什么 xff1f 陈小房的博客 CSDN博客 第2章 第一个Spring Boot项目 陈小房的博客 CSDN博客 第3章 Spring Boot项目配置详解 陈小房的博客 CSDN

随机推荐