一、计算机系统概述
操作系统的目标和功能
- 操作系统是计算机资源的管理者
a. 处理机管理(进程控制、进程同步、进程通信、死锁处理、处理机调度)
b. 存储器管理(提高内存利用率,内存的分配与回收、地址映射、内存保护与共享、内存扩充)
c. 文件管理(计算机中的信息都是以文件的形式存在的)
d. 设备管理(完成用户的I/O请求,方便用户使用设备、并提高设备的利用率) - 操作系统为用户提供使用计算机硬件系统的接口
a. 命令接口(用户通过控制台或终端输入操作命令,向系统提供各种服务要求)
b. 程序接口(由系统调用组成,用户在程序中使用这些系统调用来请求操作系统为其提供服务)
c. 图形接口最常见的图形用户界面GUI(最终还是通过调用程序接口实现的) - 操作系统用作扩充机器
没有任何软件支持的计算机称为裸机,实际呈现在用户面前的计算机系统是经过若干层软件改造的计算机。操作系统将裸机改造成功能更强、使用更方便的机器。我们将覆盖了软件的机器称为扩充机器或虚拟机。
内核态和用户态的区别 ※
CSDN链接
- 用户态可以执行cpu调用的非特权指令
- 内核态可以执行特权指令和非特权指令
- 用户态到内核态的切换是通过中断实现的
- 内核态到用户态的切换是通过特权指令实现的
内核态 → 用户态:执行一条特权指令——修改PSW的标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权
用户态 → 内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权
操作系统的运行机制
中断 ※
- 中断的引入——为了支持CPU和设备之间的并行操作
中断也称外中断,指来自CPU执行指令以外的事件的发生,如设备发出的I/O结束中断、时钟中断等。这一类中断通常是与当前执行的指令无关的事件。 - 当发生中断时,CPU立即进入内核态
- 当发生中断后,当前进程暂停运行,并由操作系统内核对中断进行处理
- 对于不同的中断信号,会进行不同的处理
- 中断分为内中断和外中断。
异常
异常的引入——表示CPU执行指令本身时出现的问题
异常也称内中断、例外或陷入,指源自CPU执行指令内部的事件,如程序的非法操作码、地址越界、算术溢出、缺页异常等。对异常的处理一般要依赖与当前程序的运行现场,不能被屏蔽。
中断和异常的联系与区别
二、进程管理
进程和线程的区别 ※※
- 进程(Process)是系统进行资源分配和调度的基本单位,线程(Thread)是CPU调度和分配的基本单位;
- 线程依赖于进程而存在,一个进程至少有一个线程;
- 进程有自己的独立地址空间,线程共享所属进程的地址空间;
- 进程是拥有系统资源的一个独立单位,而线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),和其他线程共享本进程的相关资源如内存、I/O、cpu等;
- 在进程切换时,涉及到整个当前进程CPU环境的保存环境的设置以及新被调度运行的CPU环境的设置,而线程切换只需保存和设置少量的寄存器的内容,并不涉及存储器管理方面的操作,可见,进程切换的开销远大于线程切换的开销;
- 线程之间的通信更方便,同一进程下的线程共享全局变量等数据,而进程之间的通信需要以进程间通信(IPC)的方式进行;
- 多线程程序只要有一个线程崩溃,整个程序就崩溃了,但多进程程序中一个进程崩溃并不会对其它进程造成影响,因为进程有自己的独立地址空间,因此多进程更加健壮
进程和程序的区别 ※
(1) 程序是永存的;进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;
(2)程序是静态的观念,进程是动态的观念;
(3)进程具有并发性,而程序没有;
(4)进程是竞争计算机资源的基本单位,程序不是。
(5)进程和程序不是一一对应的: 一个程序可对应多个进程即多个进程可执行同一程序; 一个进程可以执行一个或几个程序
进程的通信方式 ※
- 共享内存
顾名思义,共享内存就是两个进程同时共享一块内存,然后在这块内存上的数据可以共同修改和读取,达到通信的目的。 - 无名管道
无名管道是半双工的通信方式;并且只能在具有亲缘关系的进程之间使用(亲缘关系是指进程间的父子关系,兄弟关系等),具有亲缘关系的进程在创建时同时拥有一个无名管道的句柄,可以进行读写;无名管道不存在磁盘节点,只存在与内存中用完即销毁。 - 命名管道
命名管道也是半双工的通信方式;可以在不具有亲缘关系的进程间通信;有名管道存在磁盘节点,有对应的FIFO文件,凡是可以访问该路径的文件的进程均可以进行通信。 - 消息队列
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 - 套接字
套接字是网络编程的api,通过套接字可以让不同的机器间的进程进行通信,常用于客户端进程和服务器进程的通信。 - 信号
信号是Unix系统中使用的最古老的进程间通信的方法之一。操作系统通过信号来通知进程系统中发生了某种预先规定好的事件(一组事件中的一个),它也是用户进程之间通信和同步的一种原始机制。一个键盘中断或者一个错误条件(比如进程试图访问它的虚拟内存中不存在的位置等)都有可能产生一个信号。Shell也使用信号向它的子进程发送作业控制信号。
进程的五种状态及转换过程 ※
进程的调度算法有哪些? ※※
- 先来先服务 first-come first-serverd(FCFS)
按照请求的顺序进行调度。非抢占式,开销小,无饥饿问题,响应时间不确定(可能很慢);
对短进程不利,对IO密集型进程不利。 - 短作业优先 shortest job first(SJF)
按估计运行时间最短的顺序进行调度。非抢占式,吞吐量高,开销可能较大,可能导致饥饿问题;
对短进程提供好的响应时间,对长进程不利,如果一直有短作业过来,那么长作业就会永远得不到调度。 - 最高响应比优先
响应比 = 1+ 等待时间/处理时间。同时考虑了等待时间的长短和估计需要的执行时间长短,很好的平衡了长短进程。非抢占,吞吐量高,开销可能较大,提供好的响应时间,无饥饿问题。 - 优先级调度算法
为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。 - 时间片轮转
将所有就绪进程按 FCFS 的原则排成一个队列,用完时间片的进程排到队列最后。抢占式(时间片用完时),开销小,无饥饿问题,为短进程提供好的响应时间;
若时间片小,进程切换频繁,吞吐量低;若时间片太长,实时性得不到保证。 - 多级反馈队列调度算法
设置多个就绪队列1、2、3…,优先级递减,时间片递增。只有等到优先级更高的队列为空时才会调度当前队列中的进程。如果进程用完了当前队列的时间片还未执行完,则会被移到下一队列。
抢占式(时间片用完时),开销可能较大,对IO型进程有利,可能会出现饥饿问题。