操作系统基础知识
引自:https://www.cnblogs.com/midiyu/p/8065676.html
1、操作系统
操作系统是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。
2、操作系统的四个特性
并发:在同一时间段内,多个进程是同时进行的。
共享:系统中的资源可以被并发执行的进线程共同使用。
虚拟:通过空分复用和时分复用技术实现把一个物理实体虚拟为多个。
异步:系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进。
3、操作系统的主要功能
处理机管理:处理机分配都是以进程为单位,所以处理机管理也被看作进程管理,包括进程控制、进程同步、进程通信和调度。
存储器管理:负责管理内存,内存分配、内存保护、地址映射、内存扩充。
设备管理:管理所有外围设备,包括完成用户的IO请求;为用户进程分配IO设备;提高IO设备利用率;提高IO速度;方便IO使用。
文件管理:管理用户文件和系统文件,方便使用的同时保证安全性。包括文件存储空间管理、目录管理、文件读写管理以及文件共享和保护。
接口管理:提高程序接口(如API)和用户接口(如GUI)
4、进程和线程的区别
进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分派的一个独立单位。
线程是进程的实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程是轻量级的进程。
5、进程的状态及转换
6、进程同步机制
同步机制需要遵循的原则:空闲让进、忙则等待、有限等待、让权等待。
经典的进程同步问题:生产者-消费者问题、哲学家进餐问题、读者-写者问题
进程同步机制:
(1)信号量机制:定义一个信号量并赋予初始值,结合PV(P:信号量+1,V:信号量-1)操作对信号量进行操作实现同步。信号量的初始值决定该资源最多可以被多少对象访问。
(2)互斥体:当一个资源最多被一个对象访问时,信号量机制就成为了互斥体机制。
(3)管程机制:信号量机制功能强大,但对信号量的操作分散,难以控制。于是提出了一种集中式同步进程-管程。其基本思想是将共享变量和对它们的操作集中在一个模块中。管程是可以被多个进程/线程安全访问的对象或模块。管程的特性:安全性、互斥性、共享性。
7、进程之间的通信方式有哪些?
主要分为:管道、系统IPC(包括消息队列、信号量、共享存储器)、SOCKET、远程方法调用RPC。
管道分为:普通管道PIPE、流管道(S_PIPE)、命名管道(NAME_PIPE)
管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
命名管道(named pipe):命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量(semophore ):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列(message queue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号(sinal ):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。
套接字(socket):套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
8、线程同步机制
临界区:通过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问
互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会同时被多个线程访问
信号量:它允许多个线程同一时刻访问同一资源,但是需要限制同一时刻访问此资源的最大线程数目。信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中PV操作相似。
事件(信号):通过通知操作的方式来保持多线程的同步,还可以方便的实现多线程的优先级比较的操作
9、死锁
死锁的定义:所谓死锁就是一个进程集合中的多个进程因为竞争资源,而造成的互相等待现象。
死锁的原因:系统资源不足;多个进程的推进顺序不合理。
死锁的必要条件:
- 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
- 请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
- 不可抢占条件(No pre-emption):进程对于已经申请到的资源在使用完成之前不可以被抢占
- 环路等待条件:发生死锁的时候存在的一个 进程-资源 环形等待链
死锁处理:
- 预防死锁:破坏产生死锁的4个必要条件中的一个或者多个;实现起来比较简单,但是如果限制过于严格会降低系统资源利用率以及吞吐量
- 避免死锁:在资源的动态分配中,防止系统进入不安全状态(可能产生死锁的状态)-如银行家算法
- 检测死锁:允许系统运行过程中产生死锁,在死锁发生之后,采用一定的算法进行检测,并确定与死锁相关的资源和进程,采取相关方法清除检测到的死锁。实现难度大
- 解除死锁:与死锁检测配合,将系统从死锁中解脱出来(撤销进程或者剥夺资源)。对检测到的和死锁相关的进程以及资源,通过撤销或者挂起的方式,释放一些资源并将其分配给处于阻塞状态的进程,使其转变为就绪态。实现难度大
10、进程调度策略
调度策略有FCFS(先来先服务),优先级,时间片轮转,多级反馈。
- 先来先服务调度算法FCFS:既可以作为作业调度算法也可以作为进程调度算法;按作业或者进程到达的先后顺序依次调度;因此对于长作业比较有利;
- 短作业优先调度算法SJF:作业调度算法,算法从就绪队列中选择估计时间最短的作业进行处理,直到得出结果或者无法继续执行;缺点:不利于长作业;未考虑作业的重要性;运行时间是预估的,并不靠谱 ;
- 优先级调度算法PSA:基于作业的紧迫程度,由外部赋予作业相应的优先级,调度算法是根据该优先级进行调度的。
- 高响应比优先调度算法HRNN:响应比=(等待时间+要求服务时间)/要求服务时间=响应时间/要求服务时间。
- 时间片轮转调度RR:按到达的先后对进程放入队列中,然后给队首进程分配CPU时间片,时间片用完之后计时器发出中断,暂停当前进程并将其放到队列尾部,循环 。
- 多级反馈队列调度算法:目前公认较好的调度算法;设置多个就绪队列并为每个队列设置不同的优先级,第一个队列优先级最高,其余依次递减。优先级越高的队列分配的时间片越短,进程到达之后按FCFS放入第一个队列,如果调度执行后没有完成,那么放到第二个队列尾部等待调度,如果第二次调度仍然没有完成,放入第三队列尾部…。只有当前一个队列为空的时候才会去调度下一个队列的进程。