操作系统设计与实现(二)

本系列于6年前所记录摘取,现已做些许修改,删掉了一些过于简单的东西

@author QYX

双重模式和多重模式的执行

操作系统需要区分系统代码和用户代码的执行,所以大部分的计算机系统使用硬件支持,来区分各种执行模式

一般而言,我们至少需要两种单独运行模式,用户模式和内核模式(也可称为系统模式、监视模式、特权模式),计算机硬件可以通过一个模式位来表示当前模式,内核模式(0)和用户模式(1)。有了模式位,便可以区分操作系统执行的任务和用户执行的认为

当系统执行用户应用时,则处于用户模式,如用户应用需要使用系统调用,请求操作系统服务时,系统就会从用户模式切换到内核模式

当系统引导式,硬件从内核模式开始,操作系统开始加载,然后开始在用户模式下执行用户模式,一旦有陷阱和中断,硬件会从用户模式切换到内核模式(模式位变为0),所以,每当操作系统能够与控制计算机时,它就会处于内核模式,在将控制权交给用户程序前,系统会切换到用户模式

双重模式提供保护手段:将可能引起损害的机器指令作为特权指令,并且只有硬件在内核模式下才允许执行特权指令,如果在用户模式下试图执行特权指令,则硬件不仅不会执行,而且会认为该指令非法,并以陷阱的形式通知操作系统

常见的特权指令有:切换到用户模式、I/O控制、定时器管理和中断管理

模式概念可以扩展,因为可以超过两个,这样CPU在设置和检测模式时,就会用到多个位。常见的,Intel 64系列的CPU就有四种特权级别

现在我们来看系统中指令的执行周期,首先,操作系统进行控制,此时处于内核模式,将控制权转交给一个用户时,模式也被设置为用户模式,最终通过中断或者陷阱或系统调用,控制权又返回给操作系统

系统调用为用户程序提供手段,以便请求操作系统完成某些特权任务。系统调用可有多种方式,但最终还是取决于底层处理器所提供的功能,不论哪种方式,它都是进程请求操作系统执行功能的方法,系统调用通常会陷入中断向量的某个指定位置。这一般由trap指令来完成,也有的系统使用syscall来进行系统调用

当要执行系统调用时,硬件通常会将它作为软件中断。控制通过中断向量转到操作系统的中断服务程序,并且模式位也设为内核模式,系统调用时操作系统的一部分,内核检查中断指令,判断发生了什么系统调用,参数表示用户程序请求何种服务,请求所需的其他信息也可以通过寄存器,堆栈或内存来传递,内核首先验证参数是否合法,然后执行请求,最后控制返回到系统调用之后的指令。

补充:陷阱如同中断一样,通过中断向量可将控制转移到操作系统,当一个程序出错时,可由操作系统来进行异常终止。

定时器

操作系统使用定时器维持控制CPU,以防止用户程序陷入死循环,或不调用系统服务并且不讲控制返给操作系统

定时器可在指定周期后中断计算机,指定周期可以是固定的也可以是可变的,可变定时器可以使用一个固定速率的时钟和计数器来实现

修改定时器指令是特权的,定时器可以防止用户程序运行过长,一种简单的实现方法:采用程序所允许执行的时间来初始化执行计数器

进程管理

进程释义
进程是正在计算机中运行的程序,它不仅包括程序(代码段),还包括程序计数器、寄存器内容、堆栈段以及数据段。因为进程是在运行的程序,与时间相关,所以通过一个程序,在计算机中可以有多个进程。

进程的状态:
新的:进程正在被创建
运行:进程得到CPU的控制权,CPU正在执行进程的指令
等待:进程等待某个事件发生
就绪:进程等待获得CPU的控制权
终止:进程指令执行完成

执行的程序被称之为进程,进程是系统的工作单元,系统由多个进程组成,进程也可称之为作业或分时系统程序,进程可以通过系统调用创建子进程来并发执行

进程需要一定的资源来完成任务,包括CPU时间、内存、文件、I/O设备,这些在进程被创建时赋予,进程也可能需要一些初始化数据,当进程中止时,系统会收回所有可再利用的资源

重点:程序本身不是进程,程序是个被动实体,如同磁盘上的文件内容,而进程是主动实体程序计数器指定了下一个要执行的治疗,这样一个进程的执行应该是顺序的,CPU会一个接着一个执行

单线程线程有一个程序计数器,多线程进程有多个程序计数器

一般而言,所有的进程都会并发执行,例如单CPU通过多路复用来实现

操作系统负责进程管理的以下活动:

1 在CPU上调度进程和线程

2 创建和删除用户进程和系统进程

3 挂起和重启进程

4 提供进程同步机制

5 提供进程通信机制

内存管理

内存是现代计算机系统的核心,内存是一个大的字节数组。内存是个快速访问的数据仓库,并为CPU何I/O设备所共享

CPU需要执行指令,指令必须位于内存中

如果一个程序需要执行,那么它必须需要映射到绝对地址,并且加载到内存,随着程序执行,进程可以通过产生绝对地址来访问内存的程序指令和数据,最后程序终止,空间释放,继续执行下一个程序

操作系统负责内存管理的以下活动

1 记录内存的哪部分被使用以及被谁使用

2 决定哪些进程(或其部分)会调入或调出内存

3 根据需要分配和释放内存空间

存储管理

文件系统管理

文件是创建者定义的相关信息的组合,文件内容为程序和数据,文件可以没有格式(如文本文件)或者有严格格式(固定的域),文件可以组织成目录

操作系统负责文件管理的以下活动:

1 创建和删除文件

2 创建和删除目录,以便组织文件

3 提供文件和目录的操作原语(原语:原语通常由若干条指令组成,用来实现某个特定的操作,通过一段不可分割或不可中断的程序实现其功能)

4 映射文件到外存

5 备份文件到稳定(非易失)存储介质

大容量存储器管理

大部分计算机使用硬盘作为在线存储介质,来存储数据,因为内存断电会失去数据

由于硬盘的频繁使用,所以计算机的运行速度与硬盘子系统的运行速度和管理硬盘子系统的算法有很大关系

操作系统对硬盘主要有以下管理

1 空闲空间分配

2 存储空间分配

3 硬盘调度

三级存储

有些存储比外存速度慢,但价格低,也被使用,典型的三级缓存,磁带驱动器、磁带、CD/DVD驱动器和光盘等

三级存储对系统性能并不关键,操作系统对其的功能可以包括:安装卸载设备媒介,为进程互斥使用而分配和释放设备,以及将数据从二级存储移动到三级存储、

高速缓存

高速缓存有时也被称为缓存

缓存的工作原理:信息通常保存在一个存储系统中,使用时,它会被临时复制到更快存储系统,即高速缓存,当需要特定信息时,首先检查是否存在于缓存中,如果是,就使用,如果没有,就使用位于源地的信息,同时复制到缓存中以保证下一次的使用

可编程的内部寄存器(如索引寄存器)为内存提供高速缓存程序员通过寄存器分配和替换算法,决定哪些信息应该存在缓存里,哪些应该存在内存里

因为缓存大小有限,所以高速缓存管理的设计就很重要,慎重选择缓存的大小与置换策略,可以极大提供性能

高速缓存到CPU和寄存器的数据传递,通常由硬件完成,而磁盘到内存的数据传递通常由操作系统控制

重点思考:高速缓存一致性(确保所有的副本应尽可能快的得以更新)

I/O系统

I/O子系统为包括以下几个组件

1 缓冲、高速缓存和假脱机(假脱机即SPOOLingSPOOLing技术是低速输入输出设备与主机交换的一种技术,通常也称为"假脱机真联机",他的核心思想是以联机的方式得到脱机的效果)的内存管理组件

2 设备驱动器的通用接口

3 特定硬件设备的驱动程序

内核数据结构

初中的时候原本写了一堆,现在才发现小学生的玩意,复习的话太过基础,一点就行

1 链表(单向,双向,循环) 堆栈(先进后出) 队列(先进先出)

2 树

二叉查找树(最坏性能O(N)) 平衡二叉树(AVL)(最坏性能O(logN))

Linux在CPU调度算法中就使用了平衡二叉树

3 哈希

哈希表,哈希函数,查找O(1)。处理哈希碰撞的方法:分离链表、开放寻址(平方探测(二次聚集4k+3),线性探测(一次聚集)保护哈希表大小为素数),再散列(rehash),双散列(7)

最新的一些散列方法,布谷鸟散列(两个散列表来回跳),跳房子散列(前面有几位标明冲突的数据保存的位置)【在国外文献中这两个挺火的,可以深入研究一下】

4 位图

位图为n个二进制的串,用于表示n项的状态,磁盘块的可用性就可通过位图来实现,考虑空间效率,位图有优势。

原文地址:https://www.cnblogs.com/qyx66/p/12295422.html