操作系统是什么?
管理计算机硬件和软件资源的程序
内核与外壳分别是什么?
内核是能操作硬件的程序
内核管理 系统的进程、内存、设备驱动程序、文件、网络等,决定着系统的性能和稳定性
外壳就是围绕内核的应用程序
系统调用是什么,有哪几类
根据进程访问资源的特点,可以将进程在系统上的运行分为两个级别:
- 用户态:用户态下的进程可以直接读取用户程序的数据
- 内核态:内核态下的进程几乎可以访问计算机的任何资源,不受限制
我们运行的程序基本都是运行在用户态,如果需要调用操作系统提供的内核态级别的功能的时候,就需要使用系统调用,通过系统调用的方式向操作系统提出服务请求,并由操作系统代为完成。
系统调用
按照功能分类:
- 设备管理。完成设备的请求或释放,以及设备启动等功能。
- 文件管理。完成文件的读、写、创建及删除等功能。
- 进程控制。完成进程的创建、撤销、阻塞及唤醒功能。
- 进程通信。完成进程之间的消息传递或信号传递等功能
- 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。
进程的状态有哪些
- 创建状态(new):进程正在被创建,尚未到就绪状态
- 就绪状态(ready):进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到了处理器资源(处理器分配的时间片)即可运行。
- 运行状态(running):进程正在处理器上运行(单核CPU下任一时刻只有一个进程处于运行状态)。
- 阻塞状态(waiting):又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待IO操作完成。即使处理器空闲,该进程也不能运行。
- 结束状态(terminated):进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运行。
线程有哪些同步方式
- 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,多以可以保证公共资源不会被多个线程同时访问。比如Java中synchronized关键字和各种Lock都是这种机制。
- 信号量(Semphares):它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
- 事件(Event):Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较。
进程有哪些同步方式
- 临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
- 当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止,以此达到使用原子方式操作共享资源的目的。
- 互斥量
- 同步与互斥
- 同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系。
- 互斥:多个进程在同一时刻只有一个进程能进入临界区。
- 同步与互斥
- 信号量
- 信号量(Semaphore)是一个整型变量,可以对其执行down和up操作,也就是常见的P和V操作。
- down:如果信号量大于0,执行-1操作;如果信号量=0,进程睡眠,等待信号量大于0;
- up:对信号量执行+1操作,唤醒睡眠的进程让其完成down操作。
- down和up操作需要被设置成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。
- 如果信号量的取值只能为0或者1,那么就成为了互斥量(Mutex),0表示临界区已经加锁,1表示临界区解锁。
- 信号量(Semaphore)是一个整型变量,可以对其执行down和up操作,也就是常见的P和V操作。
- 管程
- 使用信号量机制实现的生产者消费者问题需要客户端代码做很多控制,而管程把控制的代码独立出来,不仅不容易出错,也使得客户端代码调用更容易。
- 管程有一个重要特性,在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否则其他进程永远不能使用管程。
- 管程引入条件变量以及相关的操作:wait()和signal()来实现同步操作。对条件变量执行wait()操作会导致调用进程阻塞,把管程让出来给另一个进程持有。signal()操作用于唤醒被阻塞的进程。
进程调度算法
批处理系统
批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间
(从提交到终止的时间)
- 先到先服务调度算法(FCFS)
- 非抢占式的调度算法,按照请求的顺序进行调度
- 有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。
- 短作业优先(SJF)的调度算法
- 非抢占式的调度算法,按估计运行时间最短的顺序进行调度。
- 长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。
- 最短剩余时间优先(SRTN)
- 最短作业优先的抢占式版本,按照剩余运行时间的顺序进行调度。当一个新作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。
交互式系统
交互系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应
。
- 时间片轮转调度算法
- 将所有就绪进程按FCFS的原则排成一个队列,每次调度时,把CPU时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟终端,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把CPU时间分配给队首的进程。
- 时间片轮转算法的效率和时间片的大小有很大关系:
- 因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上会花很多时间。
- 如果时间片过长,实时性无法保证。
- 优先级调度
- 为每个进程分配一个优先级,按优先级进行调度。
为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。
- 多级反馈队列调度算法
- 一个进程需要执行100个时间片,如果采用时间片轮转调度算法,那么需要交换100次。
- 多级队列是为了这种连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如1,2,4,8…。进程在第一个队列没执行完,就会被转移到下一个对列。这种方式下,之前进程只需要交换7次。
- 每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
- 可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。
实时系统
实时系统要求一个请求在一个确定时间内得到响应。
分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。
经典同步问题
哲学家进餐问题
五个哲学家围着一张圆桌,每个哲学家面前放着食物,哲学家的生活有两种交替活动,吃饭以及思考。但一个哲学家吃饭时,需要先拿起自己左右两边的两根筷子,并且一次只能拿起一根筷子,如果所有哲学家同时拿起左边的筷子,那么所有哲学家都在等待其他哲学家吃完并释放自己手中的筷子,导致死锁。
为了防止死锁的产生,可以设置两个条件:
- 必须同时拿起左右两根筷子;
- 只有在两个邻居都没有进餐的情况下才允许进餐。
读者-写者问题
允许多个进程同时对数据进行读操作,但是不允许读和写以及写和写操作同时发生。
一个整型变量count记录在对数据进行读操作的进程数量,一个互斥量count_mutex用于对count加锁,一个互斥量data_mutex用于对读写的数据加锁。
生产者消费者问题
一组生产者进程和消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满的时候,生产者才能写入数据,只有缓冲区不为空的时候消费者才能取出数据,缓冲区是临界资源,同时允许一个生产者或一个消费者放入消息。