《北大操作系统》学习笔记

1-MOOC-操作系统概述

操作系统原理

操作系统概述

操作系统做了什么?

操作系统的定义与作用

操作系统的主要特征

典型操作系统的架构

操作系统的分类

操作系统做了什么?

#include<stdio.h>

int main(int argc, char *argv[]) {

puts("hello world");

return 0;

}

一个C程序:helloworld

用户告诉操作系统执行helloworld程序(如何告知?)

操作系统:找到helloworld程序的相关信息,检查其类型是否是可执行文件;并通过程序首部信息,确定代码和数据在可执行文件中的位置并计算出对应的磁盘块地址(文件格式?)

操作系统:创建一个新的进程,并将heloworld可执行文件映射到该进程结构,表示由该进程执行helloworld程序

操作系统:为helloworld程序设置CPU上下文环境,并跳到程序开始处(假设调度程序选中hello程序)

执行helloworld程序的第一条指令,发生缺页异常

操作系统:分配一页物理内存,并将代码从磁盘读入内存,然后继续执行helloworld程序

Helloworld程序执行puts函数(系统调用),在显示器上写一字符串

操作系统:找到要将字符串送往的显示设备,通常设备是由一个进程控制的,所以,操作系统将要写的字符串送给该进程

操作系统:控制设备的进程告诉设备的窗口系统它要显示字符串,窗口系统确定这是一个合法的操作,然后将字符串转换成像素,将像素写入设备的存储影像区

视频硬件将像素转换成显示器可接收的一组控制/数据信号

显示器解释信号,激发液晶屏

OK!!!我们在屏幕上看到了“hello world”

从上述步骤中得到了什么?

换个角度看用户程序的执行

操作系统是什么?怎样理解它的作用?… 

操作系统是计算机系统中的一个系统软件,是一
些程序模块的集合——
? 它们能以尽量有效、合理的方式组织和管理计算
机的软硬件资源 
? 合理地组织计算机的工作流程,控制程序的执行
并向用户提供各种服务功能 
? 使得用户能够灵活、方便地使用计算机,使整个
计算机系统高效率运行 

有效:系统效率,资源利用率
 CPU利用率充足与否?I/O设备是否忙碌?
合理: 
 各种软硬件资源的管理是否公平合理 
 如果不公平、不合理,则可能会产生问题? 
方便使用: 
 两种角度:用户界面 与 编程接口 

操作系统的三个作用

? 资源的管理者 → 有效
? 向用户提供各种服务 → 方便使用
? 对硬件机器的扩展 → 扩展能力

OS是资源的管理者

自底向上 → 
 操作系统 是 资源的管理者 
硬件资源:
 CPU,内存,设备(I/O设备、磁盘、时钟、网
络卡等)
软件资源:
磁盘上的文件、各类管理信息等

怎样管理资源?

? 跟踪记录资源的使用状况
? 如:哪些资源空闲,分配给谁使用,允许使
用多长时间等
? 确定资源分配策略——算法
? 静态分配策略
? 动态分配策略
? 实施资源的分配和回收
? 提高资源利用率
? 保护资源的使用
? 协调多个进程对资源请求的冲突

从资源管理的角度--五大基本功能

? 进程/线程管理(CPU管理)
 进程线程状态、控制、同步互斥、通信、调度、……
? 存储管理
 分配/回收、地址转换、存储保护、内存扩充、……
? 文件管理
 文件目录、文件操作、磁盘空间、文件存取控制、……
? 设备管理
 设备驱动、分配回收、缓冲技术、……
? 用户接口
 系统命令、编程接口
OS是各种系统服务的提供者

? 在操作系统之上,从用户角度来看: 操作系统为用户提供了一组功能强大、方便易用的命令或系统调用? 典型的服务 进程的创建、执行;文件和目录的操作;I/O设备的使用;各类统计信息;

OS是硬件之上的第一层软件

 应用程序

----------------------- 虚拟机器界面

操作系统

---------------------- 物理机器界面 

与硬件相关的工作复杂、繁琐

? 请问:下列哪一个操作更简单、方便?
 “从某个文件读一个数据块” 与 “移动磁头、等待放下”
? 例子:软盘I/O操作
? 控制芯片NEC PD765,有16条命令
? 每一条命令向设备控制寄存器写入长度从1 到9 字节的特定数据(读
写数据、移动磁头臂、格式化磁道,及初始化、检测状态、复位、校
准控制器及设备等)
? 以READ为例:13个参数
 要读取的磁盘块地址、磁道的扇区数、物理介质的记录格式、扇区间
隙、对已删除数据地址标识的处理方法
? 操作结束时,控制器芯片在7个字节中返回23个状态及出错字段
? 程序员还要保持注意步进电机的开关状态 

OS对硬件机器的扩展

操作系统在应用程序与硬件之间建立了一个等价
的扩展机器(虚拟机)
? 对硬件抽象,提高可移植性;比底层硬件更容易
编程

明确了操作系统的三个作用

? 有效地管理资源
? 通过命令接口、编程接口等为用户提供各种功能
服务
? 对硬件机器的扩展

操作系统与其他软件比较,其特征是什么? 

操作系统的主要特征 

并发(concurrency):指处理多个同时性活动的能力

由于并发将会引发很多的问题: 活动切换、保护、相互依赖的活动间的同步在计算机系统中同时存在多个程序运行,单CPU上 宏观上:这些程序同时在执行 微观上:任何时刻只有一个程序真正在执行,即这些程序在CPU上是轮流执行的

并行(parallel):与并发相似,但多指不同程序同时在多个硬件部件上 

共享(sharing): 操作系统与多个用户的程序共同使用计算机系统中的资源(共享有限的系统资源) 操作系统要对系统资源进行合理分配和使用 
  资源在一个时间段内交替被多个进程所用? 互斥共享(如打印机)? 同时共享(如可重入代码、磁盘文件) 
问题:资源分配难以达到最优化,如何保护

虚拟(Virtual):? 一个物理实体映射为若干个对应的逻辑实体--分时或分空间? 虚拟是操作系统管理系统资源的重要手段,可提高资源利用率? CPU--每个进程的"虚处理机? 存储器--每个进程都有独立的虚拟地址空间(代码+数据+堆栈)? 显示设备--多窗口或虚拟

随机: 操作系统必须随时对以不可预测的次序发生的事件进行响应并处理? 进程的运行速度不可预知:多个进程并发执行,“走走停停”,无法预知每个进程的运行推进的快慢 
? 难以重现系统在某个时刻的状态(包括重现运行中的错误

Windows、UNIX、Linux操作系统都有哪些功能?

Windows操作系统的体系结构

 

unix架构

unix操作系统

linux架构

linux内核组件

android系统的整体架构

 传统分类、Tenenbaum的分类 

 操作系统的发展历程

? 操作系统发展是随着计算机硬件技术、应用
需求的发展、软件新技术的出现而发展的
 
 目标:充分利用硬件
 提供更好的服务
大型机 → 个人计算机 → 网络 → 移动
计算 → 云计算 → 泛在计算(物联网)
→ 机器人

传统操作系统的分类

? 批处理操作系统
? 分时系统
? 实时操作系统
? 个人计算机操作系统
? 网络操作系统
? 分布式操作系统
? 嵌入式操作系统

1. 批处理操作系统

工作方式
1. 用户将作业交给系统操作员
2. 系统操作员将许多用户的作业组成一批作业,
输入到计算机系统中,在系统中形成一个自动
转接的连续的作业流
3. 启动操作系统
4. 系统自动、依次执行每个作业
5. 由操作员将作业结果交给用户
? 追求目标:
提高资源利用率,增加作业处理吞吐量

批处理系统中的作业包括:
? 用户程序
? 数据
? 作业说明书(用作业控制语言编写)
? 成批:通常由若干个作业组成,用户提交作业后只能等
待处理结果,不能干预自己作业的执行
? 批作业处理:
 对一批作业中的每个作业进行相同的处理:从磁带读入
用户作业和编译链接程序,编译链接用户作业以生成可
执行程序;启动执行;执行并输出结果

典型的FMS JOB结构


 

问题:
 慢速的输入输出处理直接由主机来完成,输入输出时,
CPU处于等待状态
? 解决方案:
 卫星机:完成面向用户的输入输出(纸带或卡片),
中间结果暂存在磁带或磁盘上 

早期批处理系统

? 单道批处理系统(simple batch processing, uniprogramming) 
? 多道批处理系统(multiprogramming system)

Spooling系统(技术)

批处理系统的实现通常采用的技术
? 1961年,英国曼彻斯特大学,Atalas机
? Simultaneous Peripheral Operation On-Line
(同时的外围设备联机操作 ,又称假脱机技术)
? 思想
 利用磁盘作缓冲,将输入、计算、输出分别组
织成独立的任务流,使I/O和计算真正并行

spooling系统工作原理

用户作业加载到磁盘上的输入井
? 按某种调度策略选择几个搭配得当的作业,调入内存
? 作业运行的结果输出到磁盘上的输出井
? 运行结果从磁盘上的输出井送到打印机

多道批处理操作系统

以spooling方式使用外设

现代计算机系统的打印过程通常采用的是SPOOLing技术

2. 分时系统time-sharing system

时间片(time slice)
 操作系统将CPU的时间划分成若干个片段,称为时间片
? 操作系统以时间片为单位,轮流为每个终端用户服
务,每次服务一个时间片
? 其特点是利用人的错觉,使用户感觉不到计算机在
服务他人
追求目标: 
 及时响应(依据是响应时间) 
响应时间: 
 从终端发出命令到系统给予回答所经历的时间 

通用操作系统

分时系统与批处理系统结合
? 原则:分时优先,批处理在后
 “前台”:需要频繁交互的作业
 “后台”:时间性要求不强的作业

3. 实时操作系统

是指使计算机能及时响应外部事件的请求,在规
定的严格时间内完成对该事件的处理,并控制所
有实时设备和实时任务协调一致地工作
分类:
? 第一类:实时过程控制
 工业控制、航空、军事控制、...
? 第二类:实时通信(信息)处理
 电讯(自动交换机)、银行、飞机订票、股市行情

 追求目标:
? 对外部请求在严格时间范围内作出响应
? 高可靠性
特征: 
 关键参数 是 时间 
 例子:工业过程控制系统——汽车装配线 
? 硬实时系统(例子?) 
 某个动作绝对必须在规定的时刻或时间范围完成 
? 软实时系统(例子?) 
 接受偶尔违反最终时限 

4.个人计算机操作系统

? 计算机在某一时间内为单用户服务
? 追求目标:
 界面友好,使用方便
 丰富的应用软件

5.网络操作系统

基于计算机网络
 在各种计算机操作系统上
 按网络体系结构协议标准开发的软件
? 功能:
 网络管理,通信,安全,资源共享和各种网
络应用
? 追求目标:相互通信,资源共享

6.分布式操作系统

分布式系统:或以计算机网络为基础,或以多处理机
为基础,基本特征是处理分布在不同计算机上
? 分布式操作系统:是一个统一的操作系统,允许若干
个计算机可相互协作共同完成一项任务。操作系统可
将各种系统任务在分布式系统中任何处理机上运行,
自动实现全系统范围内的任务分配、自动调度、均衡
各处理机的工作负载
? 处理能力增强、速度更快、可靠性增强、具有透明性

7.嵌入式操作系统

? 嵌入式系统
? 在各种设备、装置或系统中,完成特定功能的软硬件系统
 汽车、手机、电视机、MP3播放器
? 它们是一个大设备、装置或系统中的一部分,这个大设备、
装置或系统可以不是“计算机”
? 通常工作在反应式或对处理时间有较严格要求环境中
? 嵌入式操作系统(Embedded Operating System)
运行在嵌入式系统环境中,对整个嵌入式系统以及它所操作、
控制的各种部件装置等等资源进行统一协调、调度、指挥和控
制的系统软件

操作系统的另一种分类(Tanenbaum)

大型机操作系统
? 服务器操作系统
? 多处理机操作系统
? 个人计算机操作系统
? 掌上计算机操作系统
? 嵌入式操作系统
? 传感器节点操作系统
? 实时操作系统
? 智能卡操作系统

智能卡操作系统

智能卡:一种包含有一块CPU芯片的卡片
? 特点
 非常严格的运行能耗和存储空间的限制
 有些智能卡只有单项功能,诸如电子支付
? 专用的操作系统
有些智能卡是面向Java的,即在智能卡的ROM中有一个
Java虚拟机解释器。Java 程序被下载到卡中并由JVM解释
器解释。有些卡可以同时处理多个Java 小程序,这就是
多道程序,并且需要对它们进行调度。在两个或多个小
程序同时运行时,资源管理和保护就成为突出的问题。
这些问题必须由卡上的操作系统处理

本讲重点

? 掌握操作系统的概念? 理解操作系统的不同作用? 理解操作系统的主要特征? 掌握重要的操作系统技术? SPOOLing技术? 了解操作系统架构? 了解操作系统的

? 重点阅读教材 第1章相关内容:1.1、1.2、1.4 第10章相关内容:10.2.5 第11章相关内容:11.3.1? 重点概念操作系统定义 操作系统的三个作用并发 共享 虚拟 随机 SPOOLing技术 
Windows、Linux、UNIX的架构

2-MOOC-操作系统运行环境与运行机制

回顾-操作系统的主要工作

 程序的执行 
 启动程序、执行程序以及程序结束的工作 
? 完成与体系结构相关的工作 
? 完成应用程序所需的共性任务 
 提供各种基本服务 
? 性能、安全、健壮等问题 

本讲主要内容

处理器状态(模式)

中央处理器(cpu)

处理器由运算器、控制器、一系列的寄存器
以及高速缓存构成
? 两类寄存器:
? 用户可见寄存器:高级语言编译器通过优化算
法分配并使用之,以减少程序访问内存次数
? 控制和状态寄存器:用于控制处理器的操作
 通常由操作系统代码使用

 控制和状态寄存器

用于控制处理器的操作
? 在某种特权级别下可以访问、修改
? 常见的控制和状态寄存器
? 程序计数器(PC:Program Counter),记录将要取
出的指令的地址
? 指令寄存器(IR:Instruction Register),记录最近
取出的指令
? 程序状态字(PSW:Program Status Word),记录
处理器的运行状态如条件码、模式、控制位等信息

操作系统的需求--保护

从操作系统的特征考虑
 并发、共享
? 提出要求 → 实现保护与控制
 
 需要硬件提供基本运行机制:
? 处理器具有特权级别,能在不同的特权级
运行的不同指令集合
? 硬件机制可将OS与用户程序隔离

处理器的状态(模式MODE)

现代处理器通常将CPU状态设计划分为两种、三
种或四种
? 在程序状态字寄存器PSW中专门设置一位,根据
运行程序对资源和指令的使用权限而设置不同的
CPU状态

 例:X86架构中的EFLAGS寄存器
描述符中也设置了权限级别

特权指令和非特权指令

操作系统需要两种CPU状态
? 内核态(Kernel Mode):运行操作系统程序
? 用户态(User Mode):运行用户程序

特权(privilege)指令:只能由操作系统使用、用
户程序不能使用的指令

非特权指令:用户程序可以使用的指令

 实例:X86处理器

特权环:R0、R1、R2和R3


? 从R0到R3,特权能力由高到低
? R0相当于内核态;R3相当于用户态;R1和R2则
介于两者之间
? 不同级别能够运行的指令集合不同
? 目前大多数基于x86处理器的操作系统
 只用了R0和R3两个特权级别

 CPU状态之间的转换

用户态 → 内核态 
 唯一途径 → 中断/异常/陷入机制
? 内核态 → 用户态 
 设置程序状态字PSW

一条特殊的指令:陷入指令(又称访管指令)因为内核态也被称
为supervisor mode
 提供给用户程序的接口,用于调用操作系统的
功能(服务)
 例如:int,trap,syscall,sysenter/sysexit

操作系统的驱动力

中断与异常机制

中断/异常 对于操作系统的重要性
 就好比:汽车的发动机、飞机的引擎
→→ 可以说 操作系统
 是由“中断驱动”或者 “事件驱动”的

主要作用
? 及时处理设备发来的中断请求
? 可使OS捕获用户程序提出的服务请求
? 防止用户程序执行过程中的破坏性活动
? … … 等等

中断/异常的概念

CPU对系统发生的某个事件作出的一种反应
? CPU暂停正在执行的程序,保留现场后自动转去
执行相应事件的处理程序,处理完成后返回断点,
继续执行被打断的程序

事件的发生改变了
处理器的控制流 
特点: 
? 是随机发生的
? 是自动处理的
? 是可恢复的

为什么引入中断和异常?历史背景

中断的引入:为了支持CPU和设备之间的并行操作
? 当CPU启动设备进行输入/输出后,设备便可以独立工作,
CPU转去处理与此次输入/输出不相关的事情;当设备完成
输入/输出后,通过向CPU发中断报告此次输入/输出的结
果,让CPU决定如何处理以后的事情
? 异常的引入:表示CPU执行指令时本身出现的问题
? 如算术溢出、除零、取数时的奇偶错,访存地址时越界或
执行了“陷入指令” 等,这时硬件改变了CPU当前的执行
流程,转到相应的错误处理程序或异常处理程序或执行系
统调用

事件

中断:外部事件,正在运行的
程序所不期望的 
异常:由正在执行的指令引发 

中断与异常的小结

 硬件怎么做,软件怎么做?

中断|异常机制工作原理

中断/异常机制是现代计算机系统的核心机制之一
 硬件和软件相互配合而使计算机系统得以充分
发挥能力

硬件该做什么事? —— 中断/异常响应
捕获中断源发出的中断/异常请求,以一定方式
响应,将处理器控制权交给特定的处理程序
? 软件要做什么事? —— 中断/异常处理程序
识别中断/异常类型并完成相应的处理

中断响应

中断响应: 
 发现中断、接收中断的过程 
 由中断硬件部件完成 

处理器控制部件中 设有 中断寄存器
CPU何时响应中断?

中断响应示意

 中断向量表

中断向量: 
 一个内存单元,存放中断处理程序入口地址和
程序运行时所需的处理机状态字

 执行流程按中断号/异常类型的不同,通过中断向量表
转移控制权给中断处理程序 

linux中的中断向量表

 中断响应示意图 

中断处理程序

设计操作系统时,为每一类中断/异常事件编好相
应的处理程序,并设置好中断向量表

系统运行时若响应中断,中断硬件部件将CPU控
制权转给中断处理程序:
? 保存相关寄存器信息
? 分析中断/异常的具体原因
? 执行对应的处理功能
? 恢复现场,返回被事件打断的程序

软件提前设置好
硬件部件来执行

中断/异常机制小结

以设备输入输出中断为例:硬件
? 打印机给CPU发中断信号
? CPU处理完当前指令后检测到中断,判断出中断
来源并向相关设备发确认信号

? CPU开始为软件处理中断做准备:硬件
? 处理器状态被切换到内核态
? 在系统栈中保存被中断程序的重要上下文环境,
主要是程序计数器PC、程 序状态字PSW

小结

硬件

CPU根据中断码查中断向量表,获得与该中断相关的
处理程序的入口地址,并将PC设置成该地址,新的指
令周期开始时,CPU控制转移到中断处理程序

软件
? 中断处理程序开始工作
? 在系统栈中保存现场信息
? 检查I/O设备的状态信息,操纵I/O设备或者在设备
和内存之间传送数据等等

硬件
? 中断处理结束时,CPU检测到中断返回指令,从系统
栈中恢复被中断程序的上下文环境 ,CPU状态恢复成
原来的状态,PSW和PC恢复成中断前的值,CPU开始
一个新的指令周期

举例:I/O中断处理程序

通常分为两类处理:
? I/O操作正常结束
? 若有程序正等待此次I/O的结果,则应将其唤醒
? 若要继续I/O操作,需要准备好数据重新启动
I/O
? I/O操作出现错误
? 需要重新执行失败的I/O操作
? 重试次数有上限,达到时系统将判定硬件故障

x86处理器对中断/异常的支持

中断/异常机制实例

基本概念--x86处理器

中断
? 由硬件信号引发的,分为可屏蔽和不可屏蔽中断
? 异常
? 由指令执行引发的,比如除零异常
? 80x86处理器发布了大约20种不同的异常
? 对于某些异常,CPU会在执行异常处理程序之前
产生硬件出错码,并压入内核态堆栈
? 系统调用
? 异常的一种,用户态到内核态的唯一入口

x86处理器对中断的支持

中断控制器(PIC或APIC)
? 负责将硬件的中断信号转换为中断向量,并引发
CPU中断
? 实模式:中断向量表 (Interrupt Vector)
? 存放中断服务程序的入口地址
? 入口地址=段地址左移4位+偏移地址
? 不支持CPU运行状态切换
? 中断处理与一般的过程调用相似
? 保护模式:中断描述符表 (Interrupt Descriptor Table)
 采用门(gate) 描述符数据结构表示中断向量

中断向量表/中断描述符表
? 四种类型门描述符
? 任务门(Task Gate)
? 中断门(Interrupt Gate)
? 给出段选择符 (Segment Selector)、中断/异常程
序的段内偏移量 (Offset)
? 通过中断门后系统会自动禁止中断
? 陷阱门(Trap Gate)
? 与中断门类似,但通过陷阱门后系统不会自动
禁止中断
? 调用门(Call Gate)

 中断/异常的硬件处理过程:
? 确定与中断或异常关联的向量i
? 通过IDTR寄存器找到IDT表,获得中断描述符
(表中的第i项)
? 从GDTR寄存器获得GDT的地址;结合中断描述
符中的段选择符,在GDT表获取对应的段描述
符;从该段描述符中得到中断或异常处理程序
所在的段基址
? 特权级检查

检查是否发生了特权级的变化,如果是,则进行
堆栈切换(必须使用与新的特权级相关的栈)
? 硬件压栈,保存上下文环境;如果异常产生了硬
件出错码,也将它保存在栈中
? 如果是中断,清IF位
? 通过中断描述符中的段内偏移量和段描述符中的
基地址,找到中断/异常处理程序的入口地址,
执行其第一条指令

操作系统向用户程序提供的接口

 系统调用机制

系统调用(system call)

Linux操作系统提供多少个系统调用?

系统调用是什么?
系统调用的作用
典型系统调用
举例
系统调用:用户在编程时
可以调用的操作系统功能 
? 系统调用是操作系统提供给
编程人员的唯一接口
? 使CPU状态从用户态陷入内
核态
每个操作系统都提供几百种系
统调用(进程控制、进程通信、
文件使用、目录操作、设备管
理、信息维护等)

系统调用、库函数、API、内核函数

系统调用机制设计与执行过程

 参数传递过程问题

怎样实现用户程序的参数传递给内核?
常用的3种实现方法:
? 由陷入指令自带参数:陷入指令的长度有限,且
还要携带系统调用功能号,只能自带有限的参数
? 通过通用寄存器传递参数:这些寄存器是操作系
统和用户程序都能访问的,但寄存器的个数会限
制传递参数的数量
? 在内存中开辟专用堆栈区来传递参数

系统调用举例

高级语言视角

#include <unistd.h>
int main() {
    char string[5] = {'H', 'e','l','l','o','!','\n'}
    write(1, string, 7);
    return 0;
}

输出结果:Hello!

 系统调用的执行过程

当CPU执行到特殊的陷入指令时:
? 中断/异常机制:硬件保护现场;通过查中断向量表把
控制权转给系统调用总入口程序
? 系统调用总入口程序:保存现场;将参数保存在内核堆
栈里;通过查系统调用表把控制权转给相应的系统调用
处理例程或内核函数
? 执行系统调用例程
? 恢复现场,返回用户程序

基于x86处理器

例子:linux系统调用实现

sched_init()中set_system_gate(0x80, &system_call)

陷入指令选择128号
 int $0x80
? 门描述符
? 系统初始化时:对IDT表中的128号门初始化
? 门描述符的2、3两个字节:内核代码段选择符
 0、1、6、7四个字节:偏移量(指向system_call())
? 门类型:15,陷阱门,为什么?
? DPL: 3,与用户级别相同,允许用户进程使用该门描述符

系统调用号示例

#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
#define __NR_open 5
#define __NR_close 6
#define __NR_waitpid 7
#define __NR_creat 8
#define __NR_link 9
#define __NR_unlink 10
#define __NR_execve 11
#define __NR_chdir 12
#define __NR_time 13

系统执行INT $0X80指令

由于特权级的改变,要切换栈
 用户栈 → 内核栈
 CPU从任务状态段TSS中装入新的栈指针(SS︰ESP),指向
内核栈
? 用户栈的信息(SS︰ESP)、EFLAGS、用户态CS 、EIP 寄存器
的内容压栈(返回用)
? 将EFLAGS压栈后,复位TF,IF位保持不变
? 用128在IDT中找到该门描述符,从中找出段选择符装入代码
段寄存器CS
? 代码段描述符中的基地址 + 陷阱门描述符中的偏移量 → 定
位 system_call()的入口地址

linux系统调用执行流程

中断发生后OS底层工作步骤

1. 硬件压栈:程序计数器等
2. 硬件从中断向量装入新的程序计数器等
3. 汇编语言过程保存寄存器值
4. 汇编语言过程设置新的堆栈
5. C语言中断服务程序运行(例:读并缓冲输入)
6. 进程调度程序决定下一个将运行的进程
7. C语言过程返回至汇编代码
8. 汇编语言过程开始运行新的当前进程

本讲重点

理解计算机系统的保护机制
? 掌握处理器状态
? 掌握特权指令与非特权指令
? 掌握中断/异常机制
? 掌握中断/异常的基本概念
? 理解中断/异常机制的工作原理
? 掌握系统调用机制
? 掌握系统调用设计原理
? 掌握系统调用执行过程

本周要求

重点阅读教材
 第1章相关内容:1.3、1.6
 第2章 第52页 图2-5及说明该图思路的段落
? 重点概念
CPU状态 内核态/用户态 特权指令/非特权指令
中断 异常 中断响应 中断向量 中断处理程序
系统调用 陷入指令 系统调用号 系统调用表

第3讲

进程/线程模型

进程模型
? 多道程序设计
? 进程的概念、进程控制块
? 进程状态及转换、进程队列
? 进程控制
 进程创建、撤销、阻塞、唤醒、……
? 线程模型
? 为什么引入线程?
? 线程的组成
? 线程机制的实现
 用户级线程、核心级线程、混合方式

进程基本概念

多道程序设计(mutliprogramming)

多道程序设计
 允许多个程序同时进入内存并运行,其目的
是为了提高系统效率

并发环境与并发程序

并发环境:
 一段时间间隔内,单处理器上有两个或两个以
上的程序同时处于开始运行但尚未结束的状态,
并且次序不是事先确定的 

并发程序:在并发环境中执行的程序

 进程的定义

定义:Process 对cpu的抽象

进程是具有独立功能的程序关于某个数据集合上的
一次运行活动,是系统进行资源分配和调度的独立
单位
 又称 任务(Task or Job)

如何查看当前系统中有多少个进程?ps -ef 

程序的一次执行过程
? 是正在运行程序的抽象
? 将一个CPU变幻成多个虚拟的CPU
? 系统资源以进程为单位分配,如内存、文件、……
 每个具有独立的地址空间
? 操作系统将CPU调度给需要的进程

进程控制块PCB

PCB:Process Control Block
? 又称 进程描述符、进程属性
? 操作系统用于管理控制进程的一个专门数据结构
? 记录进程的各种属性,描述进程的动态变化过程
? PCB是系统感知进程存在的唯一标志
 → 进程与PCB是一一对应的
? 进程表:所有进程的PCB集合

PCB的内容应该包括什么呢?

进程描述信息

进程控制信息

所拥有的资源和使用情况

CPU现场信息

进程描述信息

进程标识符(process ID),唯一,通常是一个整数
? 进程名,通常基于可执行文件名,不唯一
? 用户标识符(user ID)
? 进程组关系

进程控制信息
?当前状态
?优先级(priority)
?代码执行入口地址
?程序的磁盘地址
?运行统计信息(执行时间、页面调度)
?进程间同步和通信
?进程的队列指针
?进程的消息队列指针

所拥有的资源和使用情况
?虚拟地址空间的状况
?打开文件列表

进程不运行时,操作系统要保存哪些硬件执行状态呢?

CPU现场信息
?寄存器值(通用寄存器、程序计数器PC、程序状态字PSW、栈指针)
?指向该进程页表的指针

换个角度看PCB的内容

 linux task_struct(1)

 

 solaris的进程控制块与进程表

 三状态模型、五状态模型、七状态模型

进程状态及状态转换

进程的三种基本状态

运行态、就绪态、等待态

运行态(Running)

占有CPU,并在CPU上运行

就绪态(Ready)

已经具备运行条件,但由于没有空闲CPU,而暂时不能运行

等待态(Waiting/Blocked)阻塞态、封锁态、睡眠态

因等待某一事件而暂时不能运行

如等待读盘结果

三状态模型及状态转换

进程的其他状态

五状态进程模型

 七状态进程模型

 linux状态示意图

进程队列

 操作系统为每一类进程建立一个或多个队列
? 队列元素为PCB
? 伴随进程状态的改变,其PCB从一个队列进入另一
个队列

多个等待队列等待的
事件不同
? 就绪队列也可以多个
? 单CPU情况下,运行
队列中只有一个进程 

五状态进程模型的队列模型

 创建、撤销、阻塞、唤醒

进程控制

进程控制操作完成进程各状态之间的转换,由具有特
定功能的原语完成
? 进程创建原语
? 进程撤消原语
? 阻塞原语
? 唤醒原语
? 挂起原语
? 激活原语
? 改变进程优先级
? …… 

原语(primitive)

完成某种特定功能的一段程序,具有不可
分割性或不可中断性

即原语的执行必须是连续的,在执行过程
中不允许被中断

原子操作(atomic)

1.进程的创建

给新进程分配一个唯一标识以及进程控制块
? 为进程分配地址空间
? 初始化进程控制块
? 设置默认值 (如: 状态为 New,...)
? 设置相应的队列指针
 如: 把新进程加到就绪队列链表中

UNIX:fork/exec WINDOWS:CreateProcess

2.进程的撤销

结束进程
? 收回进程所占有的资源
? 关闭打开的文件、断开网络连接、回收分配的内存、……
? 撤消该进程的PCB

UNIX:exit
WINDOWS:
TerminateProcess

3.进程阻塞

处于运行状态的进程,在其运行过程中
期待某一事件发生,如等待键盘输入、等待
磁盘数据传输完成、等待其它进程发送消息,
当被等待的事件未发生时,由进程自己执行
阻塞原语,使自己由运行态变为阻塞态

UNIX:wait
WINDOWS:WaitForSingleObject

4.unix的几个进程控制操作

fork() 通过复制调用进程来建立新的进程,是
最基本的进程建立过程
? exec() 包括一系列系统调用,它们都是通过用
一段新的程序代码覆盖原来的地址空间,实现
进程执行代码的转换
? wait() 提供初级进程同步操作,能使一个进程
等待另外一个进程的结束
? exit() 用来终止一个进程的运行

系统调用

unix的fork()实现

为子进程分配一个空闲的进程描述符
 proc 结构
? 分配给子进程唯一标识 pid
? 以一次一页的方式复制父进程地址空间
? 从父进程处继承共享资源,如打开的文件和当前工
作目录等
? 将子进程的状态设为就绪,插入到就绪队列
? 对子进程返回标识符 0
? 向父进程返回子进程的 pid

Linux采用了写时复制技术COW加快创建进程Copy-On-Write

使用fork()的示例代码

 深入理解进程概念

关于进程的讨论

进程和程序的区别

进程更能准确刻画并发,而程序不能
? 程序是静态的,进程是动态的
? 进程有生命周期的,有诞生有消亡,是
短暂的;而程序是相对长久的
? 一个程序可对应多个进程
? 进程具有创建其他进程的功能

 生活中类比例子

进程地址空间

操作系统给每个进程都分配了一个地址空间

先看一段程序

int myval;
int main(int argc, char *argv[])
{
myval = atoi(argv[1]);
while (1)
printf(“myval is %d, loc 0x%lx\n”,
myval, (long) &myval);
}

同时运行两个Myval程序 
? Myval 7
? Myval 8

输出?

输出结果如下

变量myval的值不同,但地址相同

进程地址空间

 进程映像(image)

对进程执行活动全过程的静态描述
 由进程地址空间内容、硬件寄存器内容及与该进程
相关的内核数据结构、内核栈组成
? 用户相关:进程地址空间(包括代码段、数据段、
堆和栈、共享库……)
? 寄存器相关:程序计数器、指令寄存器、程序状态
寄存器、栈指针、通用寄存器等的值
? 内核相关:
? 静态部分:PCB及各种资源数据结构
? 动态部分:内核栈(不同进程在进入内核后使用
不同的内核栈)

上下文(context)切换

将CPU硬件状态从一个进程换到另一个进程的过程称
为上下文切换
? 进程运行时,其硬件状态保存在CPU上的寄存器中
 寄存器:程序计数器、程序状态寄存器、栈指针、
通用寄存器、其他控制寄存器的值
? 进程不运行时,这些寄存器的值保存在进程控制块
PCB中;当操作系统要运行一个新的进程时,将
PCB中的相关值送到对应的寄存器中

线程的引入

为什么在进程中再派生线程?

三个理由

应用的需要

开销的考虑

性能的考虑

应用的需要--示例1

 应用的需要--示例2

典型的应用
 Web服务器
? 工作方式
? 从客户端接收网页请求(http协议)
? 从磁盘上检索相关网页,读入内存
? 将网页返回给对应的客户端
? 如何提高服务器工作效率?
 网页缓存(Web page Cache)

示例2--如果没有线程?

两种解决方案:
? 一个服务进程
 顺序编程;性能下降
? 有限状态机
 编程模型复杂;采用非阻塞I/O

 构造服务器的三种方法 

模型 特性 
多线程 有并发、阻塞系统调用 
单线程进程 无并发、阻塞系统调用 
有限状态机 有并发、非阻塞系统调用、中断 

2.开销的考虑

进程相关的操作: 
? 创建进程 
? 撤消进程 
? 进程通信 
? 进程切换 
 
 → 时间/空间开销大,
限制了并发度的提高 

线程的开销小 
? 创建一个新线程花费时间少
(撤销亦如此) 
? 两个线程切换花费时间少 
? 线程之间相互通信无须调
用内核(同一进程内的线程
共享内存和文件)

3.性能的考虑

多个线程,有的计算,有的I/O
? 多个处理器

如何提高软件运行性能? 

线程的基本概念

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值