目录
概述
1.基本特征
1.并发
并发是指宏观上在一段时间内能同时运行多个程序,而并行则🈯️同一时刻能运行多个指令。
并行需要硬件支持,多如流水线、多核处理器或者分布式计算机系统。
操作系统通过引入进程和线程,使得程序能并发运行。
2.共享
共享是指系统中的资源可以被多个并发进程共同使用。
有两种共享方式:互斥共享和同时共享。
互斥共享的资源成为临界资源,如打印机,在同一时刻只允许一个进程访问,需要同步机制来实现互斥访问。
3.虚拟
虚拟技术把一个物理实体转换为多个逻辑实体。
主要有两种虚拟技术:时分复用技术和空分复用技术。
多个进程能同时在一个处理器上并发执行使用了时分复用技术,让每个进程轮流占用处理器,每次只执行一小个时间片并快速切换。
虚拟内存使用了空分复用技术,他将物理内存抽象为地址空间,让每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当时用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中。
4.异步
异步🈯️进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。
基本功能
1.进程管理
进程控制、进程同步、进程通信、进程死锁、处理机调度等。
2.内存管理
内存分配、地址映射、内存保护与共享、虚拟内存等。
3.文件管理
文件存储空间的管理、目录管理、文件读写管理和保护等。
4.设备管理
完成用户的I/O请求,方便用户使用各种设备,并提高设备的使用率。
主要包括缓冲管理、设备分配、设备处理、虚拟设备等。
系统调用
如果一个进程在用户态使用内核态的功能,就进行系统调用而进入内核,由操作系统代为完成。
Linux的系统调用主要有以下这些:
Task | Commands | 备注 |
---|---|---|
进程控制 | fork(); exit(); wait(); | |
进程通信 | pipe(); shmget(); mmap(); | |
文件操作 | open(); read(); write(); | |
设备操作 | ioctl(); read(); write(); | |
信息维护 | getpid(); alarm(); sleep(); | |
安全 | chmod(); umask(); chown(); |
宏内核和微内核
由于操作系统不断复杂,因此将一部分操作系统移出内核,从而降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立。
在微内核结构下,操作系统被划分成小的、定义良好的模块,只有微内核这一模块运行在内核态,其余模块运行在用户态。因为需要频繁的在用户态和核心态之间切换,所以会有一定的性能损失。
中断分类
1.外中断
由CPU执行指令以外的事件引起,如I/O中断,表示设备输入/输出处理已完成,处理器能够发出下一个输入/输出请求。此外还有时钟中断,控制台中断等。
2.异常
由CPU执行指令的内部事件引起,如非法操作码、地址越界、算法溢出等。
3.陷入
在用户程序使用系统调用
进程与线程
1.进程
进程是资源分配的基本单位。
进程控制块(Process Control Block,PCB)描述进程的基本信息和运行状态,所谓创建进程和撤销进程都是指对PCB的操作。
下图显示了 4 个程序创建了 4 个进程,这 4 个进程可以并发地执行。
2. 线程
线程是独立调度的基本单位。
一个进程中可以有多个线程,它们共享进程资源。
QQ和浏览器是两个进程,浏览器进程里面有很多线程,例如HTTP请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起HTTP请求时,浏览器还可以响应用户其他事件。
3.区别
1⃣️拥有资源
进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
2⃣️调度
线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程的切换,从一个进程的线程切换到另一个进程中的线程时,会引起进程起切换。
3⃣️系统开销
由于创建或撤销进程时,系统都要为之分配和回收资源,如内存空间、I/O设备等,所付出的开销远大于创建或撤销进行时的开销。类似地,在进程切换时,涉及当前执行进程CPU环境的保存及新调度进程CPU环境的设置,而线程切换时只需要保存和设置少量寄存器内容,开销很小。
进程状态的切换
- 就绪状态(ready):等待被调度
- 运行状态(running)
- 阻塞状态(waiting):等待资源
应注意以下内容:
- 只有就绪状态和运行状态可以相互转换,其他都是单向转换。就绪状态的进程通过调度算法从而获得CPU时间,转为运行状态;而运行状态的进程,在分配给它的CPU时间片用完之后就会转为就绪状态,等待下一次调度。
- 阻塞状态只是缺少需要的资源从而由运行状态转换而来,但是该资源不包括CPU时间,缺少CPU时间会从运行态转为就绪态。
进程调度算法
批处理系统没有太多的用户操作,在该系统中,调度算法的目的是保证吞吐量和周转时间。
1.1先来先服务算法first-come first served(FCFS)
非抢占式的调度算法,按照请求的顺序进行调度
有利于长作业,不利于短作业,因为长作业必须一直等待前面的长作业执行完毕才能执行,而长作业有需要执行很长时间,造成了短作业执行时间过长。
1.2短作业优先算法shortest job first(SJF)
非抢占式调度算法,按估计运行时间最短的顺序进行调度。
长作业有可能饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。
1.3最短剩余时间算法shortest remaining time next(SRTN)
最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。当一个新作业到大师,其整个运行时间和当前进程的剩余时间进行比较。如果新进程的运行时间更少,则让新进程运行。否则新进程等待。
2.交互系统
交互系统有大量的用户交互操作,在该系统中调度算法的目标是快速的进行响应。
2.1时间片轮转
将所有的就绪进程按FCFS先来先服务原则排成一个队列。 调度程序把CPU时间分配给队首的进程,该进程会执行一个时间片。执行完一个时间片后,由计时器发出时钟中断,调度程序便停止该程序的运行,把该进程送到就绪队列的队尾,同时继续把CPU时间分配给队首的进程。
时间片轮转算法的效率和和时间片的大小有很大关系:
1.因为进程的切换都要保存进程的信息和载入新进程的信息,如果时间片太小,导致进程切换太频繁,在进程的切换上就会花很多时间
2.时间片过长,实时性又得不到保证
2.2优先级调度
为每个进程分配一个优先级,按优先级进行调度。
为了防止低优先级的进程永远得不到调度,可以随着时间的推移增加等待进程的优先级。
2.3多级反馈队列
多级反馈队列是为了需要多个时间片的进程考虑。设置有多个队列,每个队列的时间片大小都不同。进程在第一个队列没执行完就会被移到下一个队列。这样可以见到进程的交换次数。
没个队列的有次安全不同,最上面的队列优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列的进程。(要等上一队列的调度完)
可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。
3.实时系统
实时系统要求一个请求在一个确定的时间内得到响应
硬实时:必须满足绝对的截止时间
软实时 :可以容忍一定的超时
进程同步
1.临界区
对临界资源进行访问的那段代码成为临界区。
为了护齿访问临界资源,每个进程在进入临界区之前,都要进行检查。
// entry section
// critical section;
// exit section
2.同步与互斥
同步:多个进程因为合作产生的直接制约关系,使得进程有一定的相互执行关系
互斥:多个进程同一时刻只有一个进程能进入临界区
3.信号量
利用PV操作实现进程的互斥
令信号量mutex的初值为1,当进入临界区时执行P操作,退出临界区时执行V操作。这样利用PV操作实现进程互斥的代码段如下:
P(mutex)
临界区
V(mutex)
信号量(Semaphore)是一个整型变量,可以对其执行down和up操作,也就是P和V操作。
down:如果信号量大于0,执行-1操作,如果信号量等于0,进行睡眠,等待信号量大于0.
up:对信号量执行+1操作,唤醒睡眠的进程让其完成down操作。
down和up操作需要被设计成原语,不可分割,通常的操作是在执行这些操作的时候屏蔽中断。