操作系统
一. 为什么要有操作系统
现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。
一般而言,现代计算机系统是一个复杂的系统。
其一:如果每位应用程序员都必须掌握该系统所有的细节,那就不可能再编写代码了(严重影响了程序员的开发效率:全部掌握这些细节可能需要一万年....)
其二:并且管理这些部件并加以优化使用,是一件极富挑战性的工作,于是,计算安装了一层软件(系统软件),称为操作系统。它的任务就是为用户程序提供一个更好、更简单、更清晰的计算机模型,并管理刚才提到的所有设备。
总结:
程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的,有了他,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件的编写就可以了,应用软件直接使用操作系统提供的功能来间接使用硬件
二. 什么是操作系统
操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序。操作系统位于计算机硬件与应用软件之间,本质也是一个软件。操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成,所以,单纯的说操作系统是运行于内核态的,是不准确的。
内核态和用户态
1.操作系统需要两种CPU状态
内核态(Kernel Mode):运行操作系统程序,操作硬件
用户态(User Mode):运行用户程序
2.指令划分
特权指令:只能由操作系统使用、用户程序不能使用的指令。
非特权指令:用户程序可以使用的指令.
3.特权级别
特权环:R0、R1、R2和R3
R0相当于内核态,R3相当于用户态;
不同级别能够运行不同的指令集
4.CPU状态之间的转换
用户态--->内核态:唯一途径是通过中断、异常、陷入机制(访管指令)
内核态--->用户态:设置程序状态字PSW
5.内核态与用户态的区别
(1) 内核态与用户态是操作系统的两种运行级别,当程序运行在3级特权级上时,就可以称之为运行在用户态.
(2) 当程序运行在0级特权级上时,就可以称之为运行在内核态.
(3) 运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态(比如操作硬件).
(4) 这两种状态的主要差别是
- 处于用户态执行时,进程所能访问的内存空间和对象受到限制,其所处于占有的处理器是可被抢占的
- 处于内核态执行时,则能访问所有的内存空间和对象,且所占有的处理器是不允许被抢占的。
6. 通常来说,以下三种情况会导致用户态到内核态的切换
- 系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。
- 异常
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
- 外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
操作系统应该分成两部分功能:
1. 隐藏了丑陋的硬件调用接口,为应用程序员提供调用硬件资源的更好,更简单,更清晰的模型(系统调用接口)。应用程序员有了这些接口后,就不用再考虑操作硬件的细节,专心开发自己的应用程序即可。
2. 将应用程序对硬件资源的竞态请求变得有序化.
多道技术
多道技术中的多道指的是多个程序,多道技术的实现是为了解决多个程序竞争或者说共享同一个资源(比如cpu)的有序调度问题,解决方式即多路复用,多路复用分为时间上的复用和空间上的复用.
1. 空间上的复用:
同一时间,加载多个任务到内存中,多个进程之间内存区域需要相互隔离,这种隔离是物理层面的隔离,其目的是为了保证数据安全
2. 时间上的复用:
多个任务复用cpu的时间片,通俗地讲就是cpu在多个程序之间来回切换
什么时候切换?
1. 当一个任务遇到IO,肯定要切换-》提升效率
2. 一个任务没有遇到IO但是占用CPU时间过长,也要切换=》降低效率
串行: 自上而下顺序执行
并发: 多个任务看起来是同时执行 ,但是本质是在不同进程间切换执行,由于速度非常快所以感觉是同时运行
并行: 是真正的同时运行,必须具备多核CPU ,有几个核心就能并行几个任务,当任务数量超过核心数还是并发执行
分时操作系统CTTS:多用户多任务
它是应用多道技术来实现多个任务的并发的运行.
进程和线程
进程是指的是程序的一次执行。在用户下达运行程序的命令后,就会产生进程。进程是操作系统资源分配的基本单位
线程是CPU的基本执行和调度单位,每个线程执行的都是进程代码的某个片段。
对于操作系统来说,一个任务就是一个进程。由于每个进程至少要做一件事,所以每个进程至少有一个线程。多个线程的执行方式和多进程执行方式一样,是由操作系统在多个线程间切换执行的,切换速度极快导致我们感觉多个线程是同时执行的.
进程与线程间的关系:
- 一个进程至少有一个线程,可以有多个线程,但不可有过多的线程,否则性能下降
- 一个进程内的多个线程可以并行运行在多核多线程的处理器上
- 一个线程只属于一个进程,不可能两个或多个进程拥有同一个线程
- 进程是操作系统资源分配的基本单位,一个进程内的多个线程共享该进程的资源
- 线程是操作系统调度和执行的基本单位,即cpu分配给线程,真正在cpu上执行的是线程
进程的三种状态
1:就绪状态 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
2:运行状态 当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
3:阻塞状态 正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信号等。
三种状态的转换:
(1) 就绪→运行
处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成运行状态。
(2) 运行→就绪
处于运行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机或者有优先级更高的任务抢走了CPU权限,于是进程从运行状态转变成就绪状态。(一旦再次分配到时间片就可以立即执行)
(3) 运行→阻塞
正在运行的进程因等待某种事件发生而无法继续运行时,便从运行状态变成阻塞状态.例如:等待I/O完成等。
(4) 阻塞→就绪
处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。