用户使用计算机时,不可能直接操作计算机硬件,就需要用到操作系统。其实操作系统就是管理硬件、提供用户交互的软件系统,它就是一个计算机程序,管理计算机内存,决定计算机资源的供需顺序,控制输入输出等等职责,比如常用的手机操作系统:Android和IOS。电脑操作系统:Windows和Linux,接下来我们从操作系统的五大功能来了解操作系统。
先介绍一些操作系统的基本概念:
- 并发性:并发是指两个或多个事件在同一时间间隔内发生。这里要与并行区别清楚,并行是指两个或多个事件可以在同一个时刻发生,最早学习的时候不是很理解这个概念,但是看到了一个比方很贴切,并发就是一位妈妈去给两个小孩喂奶,一人喝一会,你一口,他一口的;并行就是两个妈妈分别给两个小孩子喂奶,互不影响。这里的妈妈指的就是CPU,小孩子指的就是进程。
- 共享性:表现为操作系统中的资源可供多个并发的程序共同使用,分为两种资源共享的形式:
- 互斥共享形式:一段时间内仅允许一个进程访问该资源,这样的资源被称为临界资源或是独占资源,例如打印机等等
- 同时访问方式:一段时间内允许多个进程访问该资源,只是一个请求分几个时间片间隔完成的效果和连续完成的效果相同,例如磁盘设备等等
- 虚拟性:指把一个物理上的实体变为若干个逻辑上的对应物,物理实体是真实存在的,逻辑实体是虚拟的,虚拟的技术主要有时分复用技术(不同程序并发执行)和空分复用技术(虚拟内存技术)
- 异步性:在多道程序环境下,允许多个程序并发执行,但是由于资源有限,进程的执行不一定是连贯到底,而是走走停停
一、进程管理
- 进程实体
进程(Process)是系统进行资源分配的基本单位,进程作为程序独立运行的载体保障了程序的正常执行,进程的存在使得操作系统资源的利用率大幅提升,进程在主存中是以进程控制块(PCB:Processing Control Block)的形式存在的,主要包含以下信息:
- 标识符:标识符唯一标记一个进程,用于区别其他进程
- 状态:标记进程的进程状态,如:运行、就绪等
- 优先级:优先级用来区分各种进程的先后执行顺序
- 程序计数器:进程即将被执行的下一条指令的地址
- 内存指针:包括程序代码的进程相关数据的指针,以及与其他进程贡献那个内存块的指针
- 上下文数据:进程是需要切换的,切换进程时需要保留进程的上下文信息,以防进程在切换时丢失现场数据
- IO状态信息:被进程IO操作所占用的文件列表
- 记账信息:包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
PCB是用于描述和控制进程运行的通用数据结构,它记录进程当前状态和控制进程运行的全部信息,是使得程序能够独立运行的基本单位; PCB是操作系统进行调度经常会被读取的信息,它是常驻内存的,存放在系统专门开辟的PCB区域内 。
进程(Process)和线程(Thread)的区别:线程是操作系统进行运行调度的最小单位(进程是系统进行资源分配和调度的基本单位),它包含的进程之中,是进程中实际运行工作的单位 ,一个进程可以并发多个线程,每个线程执行不同的任务, 线程不单独分配资源,一个进程的不同线程共享这个进程的资源。
- 五状态模型
进程的状态分为以下五种:
- 创建状态:创建进程时拥有PCB但其他资源尚未就绪的状态称为创建状态(操作系统提供fork函数接口创建进程)
- 就绪状态:进程被分配好了除CPU以外的所有资源后,只需要再获得CPU使用权,就能立即执行,在系统中,多个处于就绪状态的进程通常排成一个队列,称为“就绪队列”;
- 执行状态:进程获得CPU使用权,其程序正在执行称为执行状态
- 阻塞状态:进程因某种原因如:其他设备未就绪而无法继续执行,从而放弃CPU的状态称为阻塞状态
- 终止状态:进程结束由系统清理或者归还PCB的状态称为终止状态
- 进程同步
进程间的同步是对竞争资源在多进程间进行使用次序的协调,使得并发执行的多个进程之间可以有效使用资源和相互合作,虽然多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程所使用,临界资源指的是一些虽作为共享资源却又无法同时被多个线程共同访问的资源(如:打印机等许多物理设备以及许多变量、数据),为了禁止两个进程同时使用临界资源,设置了以下准则:
◆ 空闲让进:资源无占用,允许使用
◆ 忙则等待:资源有占用,请求进程等待
◆ 有限等待:保证有限等待时间能够使用资源
◆ 让权等待:等待时,进程需要让出CPU
- 线程同步
- 互斥量:互斥量是最简单的线程同步的方法,互斥量(互斥锁),处于两态之一的变量:解锁和加锁,保证了一些关键操作的原子性(不被中断),两个状态可以保证资源访问的串行,互斥量会阻塞线程
- 自旋锁:自旋锁的工作原理和互斥锁类似,不同的地方在于它会反复检查锁变量是否可用,自旋锁不会让出CPU,是一种忙等待状态,它避免了进程或者线程上下文切换的开销,操作系统很多地方都是使用的自旋锁。
- 读写锁:读写锁是一种特殊的自旋锁,它主要是针对一些多读少写的临界资源,读锁和读锁是相容的,允许多个线程访问资源以提高性能,而写锁和读锁之间是互斥的,写锁和写锁之间也是互斥的,当需要更改临界资源数据时,不可进行其他线程的读操作和写操作
- 条件变量:条件变量是一种相对复杂的线程同步方法,条件变量允许线程睡眠,直到满足某种条件,当满足条件时,可以向该线程信号,通知唤醒
- 创建进程
fork系统调用是用于创建进程的,使用fork创建的进程初始化状态和父进程一样,系统会为fork的进程分配新的资源,fork系统调用是无参数的,它会返回两次,分别的子进程ID和0,返回子进程ID的是父进程,返回0的是子进程,可以用这个返回值来区别两个进程,分别进行不同的逻辑操作。
- 进程同步
在某种程度上,多进程是共同使用物理内存的,由于操作系统的进程管理,使得进程的内存空间是相互独立的,默认是无法访问进程空间之外的内存空间的,共享内存允许不相关的进程访问同一片物理内存,它是两个进程间共享和传递数据最快的方式,但是共享内存并未提供同步机制,需要借助其他机制管理访问,共享内存分为以下四个步骤:
◆ 申请共享内存
◆ 连接到进程空间
◆ 使用共享内存
◆ 脱离进程空间&删除
二、作业管理
- 进程调度
进程调度是指计算机通过决策决定哪个就绪进程可以获得CPU使用权,将就绪进程按照一定的方式排成队列,以便调度程序可以最快找到就绪进程 ,然后调度程序以一定的策略选择就绪进程,将CPU资源分配给它,保存当前进程的上下文信息,装入被委派执行进程的运行上下文,进程调度的方式分为两种:
◆ 非抢占式调度:处理器一旦分配给某个进程,就让该进程一直使用下去,调度程序不以任何原因抢占正在被使用的处理器
◆ 抢占式调度:允许调度程序以一定的策略暂停当前运行的进程,保存好旧进程的上下文信息,分配处理器给新进程
两种调度方式各有其特点,抢占式调度相对公平,但是频繁切换,开销大,适用于通用系统,非抢占式调度不公平,但是切换次数少,适用于专用系统
进程调度的一些算法:
◆ 先来先服务调度算法
◆ 短进程优先调度算法
◆ 高优先权优先调度算法
◆ 时间片轮转调度算法
- 死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。比如进程A和进程B都需要打印机和传真机,进程A抢占了打印机,而进程B抢占了传真机,两个进程同时等待各自请求的资源释放,而又不释放自己占用的资源。
造成死锁的四个必要条件:
◆ 互斥条件:进程对资源的使用是排他性的使用,某资源只能由一个进程使用,其他进程需要使用只能等待
◆ 请求保持条件:进程至少保持一个资源,又提出新的资源请求,新资源被占用,请求被阻塞,被阻塞的进程不释放自己保持的资源
◆ 不可剥夺条件:进程获得的资源在未完成使用前不能被剥夺 ,获得的资源只能由进程自身释放
◆ 环路等待条件:发生死锁时,必然存在进程-资源环形链
死锁的预防和处理只需要破坏掉这四个条件中了一个就可以,第一条不容易破坏,需要对硬件进行改进,而后面三条可以较为简单的破坏掉。
◆ 破坏请求保持条件:系统规定进程运行之前,一次性申请所有需要的资源,进程在运行期间不会提出资源请求,从而摒弃请求保持条件
◆ 破坏不可剥夺条件:当一个进程请求新的资源得不到满足时,必须释放占有的资源
◆ 破坏环路等待条件:可用资源线性排序,申请必须按照需要递增申请
三、存储管理
- 内存的分配
最简单的内存分配方式就是单一连续分配,只能在单进程、单用户中使用,固定分区分配是支持多道程序的最简单存储分配方式,内存空间被划分为若干固定大小的区域 ,每个分区只提供给一个程序使用,互不干扰,然而,根据进程的实际需要,动态分配内存空间是必不可少的,这就需要相关数据结构和算法。动态分配内存使用的数据结构是动态分区空闲链数据结构,这是一种链表的形式来记录每块的空闲内存。
动态内存的分配算法主要有:
◆ 首次适应算法(FF算法)
◆ 最佳适应算法(BF算法)
◆ 快速适应算法(QF算法)
前面两种算法都比较简单,显而易见,这两种算法在内存分配前期还是很高效的,但是当运行的进程较多时,在空闲链表的前部有较多内存外碎片时,查找效率将会逐渐变低,而快速适用算法要求有多个空闲区链表,每个空闲区链表存储一种容量的空闲区,增加了记录所耗费的空间,但是节约了查找时间。
- 内存的回收
内存的回收较为简单,如回收区前部有空闲区,就将其合并,后部有空闲区,就将其与后部空闲区合并,如果前后都不存在空闲区,就创建成一个新的空闲节点,插入都空闲链表中。
- 段页式存储管理
页式存储管理就是将进程逻辑等分成若干大小的页面,相应的把物理内存空间分成与页面大小的物理块,以页面为单位把进程空间装进物理内存中分散的物理块,通过页表的形式记录进程逻辑空间和物理空间之间的映射关系,这样,如果一个连续的逻辑分布在多个页面中,将大大降低执行效率,而段式存储管理是将逻辑空间非等分的分成若干段,段的程度由逻辑空间的长度决定,主函数MAIN、子函数Y等都是一个逻辑空间,这样子段表需要记录段号和段内偏移(类似首地址和步长),这样内存大小不一,很容易造成内存碎片,段页式存储管理则是将两者结合,先将逻辑空间按段式管理分成若干段,再把段内空间按页式管理等分成若干页,段页地址表包含三个内容:段号、页号、页内地址。
- 虚拟内存
多道程序设计,使得每个进程可用的物理内存更加稀缺,比如有些游戏的内存十几个G,但是物理内存只有4G,这就要用到虚拟内存的技术了,程序的局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。程序运行时,无需加载全部内存,加载部分即可,当访问的页不在内存上时,则发出缺页中断,从辅存中置换页面,从用户的角度看,程序拥有很大的空间,即是虚拟内存, 虚拟内存实际是对物理内存的补充,速度接近于内存,成本接近于辅存,虚拟内存的置换算法有以下几种:
◆ 先进先出算法(FIFO)
◆ 最不经常使用算法(LFU)
◆ 最近最少使用算法(LRU)
这几个算法和高速缓存的置换算法一样,高速缓存是为了解决CPU和主存之间访问速度的问题,而虚拟内存技术是为了解决主存容量不足的问题,采用辅存协助的形式。
四、文件管理
按照逻辑结构类型可以分为流式文件和记录式文件,按照距离的组织形式可以分为顺序文件和索引文件,和数组和链表类似,顺序文件的动态操作(增、删)效率低,而静态操作(查、改)效率高。读取内容速度很快,而索引文件是通过索引表的形式记录其键值与逻辑地址的映射关系。
五、设备管理
- 广义的IO设备
对于CPU而言,凡是对CPU进行数据输入的都是输入设备,凡是CPU进行数据输出的都是输出设备。
- IO设备的缓冲池
为了解决IO设备和CPU之间速率的不匹配,提高CPU和IO设备之间的并行性,操作系统划出可供多个进程共同使用的公共缓冲区,称为缓冲池。
最后的文件管理和设备管理这块感觉可能是理解不够深刻,没有写什么内容,以后再有新的理解了,再补充。