一:操作系统简述
定义:用来管理计算机硬件以及软件资源的计算机程序
计算机组成:
存储器+控制器+运算器+输入设备+输出设备
其中 CPU=控制器+运算器
操作系统的功能:
1:进程以及线程的管理:进程以及线程的状态,进程通信,线程同步,资源调度等
2:存储管理:内存的分配以及回收,地址转换,存储保护等
3:文件管理:文件目录,文件操作,文件存取控制等
4:设备管理:设备驱动,分配回收,缓冲技术等
5:用户接口:系统命令,编程接口
操作系统的应用:
1:资源的管理者
2:向用户提供各种服务
3:对硬件机器的扩展
操作系统的特性:
1:并发性
两个或者多个程序在同一时间间隔执行,宏观上是同时执行,微观上是交替执行
这里要注意一下并发性和并行性之间的区别:
并行性:指的是两个程序或者是多个程序在同一时刻同时进行。
如果是单核CPU的话,只存在并发性,不存在并行性;但是多核CPU可能并发性和并行性同时存在。
2:共享性
这里说的共享性也就是资源共享,也就是系统中的资源可以同时供内存中多个并发的程序同时使用。
分类:
1:互斥访问
:系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源——使用QQ和微信视频。同一段时间内摄像头只能分配给其中一个进程
2:同时访问
:某种资源在一段时间内并发地访问多个程序,“同时”指在宏观上是同时的,在微观上是交替进行访问的,只是cpu处理速度很快,我们感觉不到,在宏观上感觉是在同时进行
3:虚拟性
把一个物理实体变成若干个逻辑上面的对应物:只要的实现方式有时分复用以及空分复用
4:异步性
多道程序环境允许多个程序并发执行,但由于资源有限,进程的执行并不是一贯到底的,而是走走停停的,它以不可预知的速度向前推进,
描述这种以不可预知的速度走走停停,何时开始何时结束未知的这种状态叫做异步
比如这个打印机的案例:谁都不知道A释放打印机之后,是b抢占到打印机的资源还是C抢占到打印机的资源,这种不可预知就是异步
二:进程和线程
对于进程以及线程的一些简单概念,可以参考:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
进程以及线程的区别:
进程 | 线程 |
---|---|
资源分配的最小单位 | 资源调度的最小单位 |
进程之间相互独立,并且每个进程有自己的内存空间 | 线程没有,它所使用的资源来源于进程中 |
操作系统中同时运行一个或者多个进程 | 进程中可以同时运行一个或者多个线程,线程又称为轻量级进程 |
进程开销大 | 线程相对较小 |
进程控制块(PCB) | 线程控制块(TCB) |
进程的状态:
- 创建:创建的时候已经拥有了PCB(进程控制块),但是其他资源还没有准备就绪
- 就绪:其他资源都已经分配好了,只剩下CPU没有进行分配
- 执行:CPU和其他资源都已经准备就绪
- 阻塞:进程因为某种原因而放弃CPU的状态,比如资源没有到位导致运行不下去;等待资源到位转为就绪状态,获得CPU之后又可以继续运行
- 终止:执行完毕,归还CPU的状态
进程之间的通信:
什么是进程之间的通信?
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信
常用的通信方法:
1:
管道存在于内存中,进程可以对它进行读写,它提供流控制,保证进程的正确读写,即管道为空时读进程会阻塞,管道为满时写进程会阻塞,以此实现进程之间的通信
分类:
普通管道pipe:半双工通信,单向通信,只能在父子进程之间使用
命名管道FIFO:半双工通信,没有进程关系限制,可以在无关进程之间进行通信
2:消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
3:共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。是进程通信中最快的一种方式
4:信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问
。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
5:套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
进程/线程之间的同步
对竞争资源在多个进程间进行使用次序的协调,使得并发执行的多个进程之间可以有效的时候资源和相互合作
同步就是协同步调,按预定的先后次序进行运行
同步的四大原则:
空闲等待
:这个临界资源没有被占用,操作系统应该允许进程使用这个资源忙则等待
:如果有进程占用这个资源,那么接下来请求这个资源的进程就应该等待有限等待
:就是临界资源被占用,但是要保证请求的进程在有限的时间之内能使用到这个进程,避免一直等待让权等待
:等待临界资源的进程在等待的过程中应该让出CPU的使用权,也就是从运行状态转换为阻塞状态
线程同步的方法:
-
临界区(Critical Section)
:在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。 -
互斥量 (Mutex)
:适合不同进程内多线程访问公共区域或代码段时使用,与临界区相似。 -
事件(Event)
:通过线程间触发事件实现同步互斥 -
信号量(Semaphore)
:与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,但是需要限制在同一时刻访问此资源的最大线程数目,原理与操作系统中PV操作类似,先设置一个访问公共区域的线程最大连接数,每有一个线程访问共享区资源数就减一,直到资源数小于等于零。
进程调度
计算机通过决策决定哪个就绪进程可以获得CPU使用权
调度机制的算法:
1:
先来先服务调度算法
:2:短进程优先调度算法
:优先选择运行时间短的进程,但是不利于长作业进程的操作,得等到短进程运行结束之后再运行
3:高优先权优先调度算法
:进程附带优先权,调度程序优先选择权重高的进程,比如前台进程的优先级会高于后台进程
4:时间片轮转调度算法
:按照先来先服务的原则排列就绪进程,每次从头部取出待执行进程,分配一个时间片执行
5:多级反馈队列调度算法
:不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法
死锁
两个或者两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,他们都将无法推进下去
产生死锁必须满足以下几个条件(四个条件全都满足):
互斥条件
:每次资源只能被一个进程利用,要使用这个资源只能等待这个资源被释放
请求保持条件
:进程至少保持一个资源,又提出新的资源请求;并且新的资源被占用,只能处于阻塞状态;同时这个被阻塞的进程不释放自己保持的资源
不可剥夺条件
:进程获得的资源在未完成之前不可被剥夺,获得的资源只能由进程自身释放
环路等待条件
:发生死锁的时候,存在进程-资源环形链
预防死锁的方法:
破坏请求保持,不可剥夺,环路等待三个条件之一即可
破坏请求保持条件
:系统规定进程运行之前,一次性申请所有需要的资源;所以就不需要在运行的过程中再申请新的资源而产生等待的情况
破坏不可剥夺条件
:当一个进程请求新的资源得不到满足的时候,必须释放所占有的资源,也就是在运行的时候占有的资源可以被释放,意味着可以被剥夺
破坏环路等待条件
:可用资源线性排序,申请必须按照需要递增申请,线性申请不在形成环路,而是线型