操作系统
基础篇
多道程序设计
- 早期批处理系统只能一次处理一个任务,多道程序设计可以让计算机一次处理多个任务
- 多道程序设计是指在计算机内存中同时存放多个程序
- 多道程序在计算机的管理程序下相互穿插运行
操作系统概览
- 是管理计算机硬件和软件资源的计算机程序
- 是管理硬件、提供用户交互的软件系统
- 通过管理配置内存、决定资源供需顺序、控制输入输出设备等来管理
- 提供让用户和系统交互的操作界面
基本功能
-
操作系统统一管理着计算机资源
- 处理器资源
- 存储器资源
- IO设备资源
- 文件资源
-
操作系统实现了对计算机资源的抽象
IO设备管理软件,提供读写接口 -->> 用户无需面向硬件接口编程
比如:文件管理软件,提供操作文件接口
-
提供了用户与计算机之间的接口
- 图像窗口形式
- 命令形式
- 系统调用形式
相关概念
-
并发性
并行?并发?
并行是指两个或多个事件可以在同一个时刻发生
并发是指两个或多个事件可以在同一个时间间隔发生
多道程序设计:
对于单处理器来说,程序都是并发进行的。
-
共享性
操作系统中的资源可供多个并发的程序共同使用 -->> 资源共享
根据属性可分为两种方式
-
互斥共享形式
当资源被程序A占用时,其他程序想使用的话只能等待进程A结束后才能使用
比如:打印机
-
同时访问形式
某种资源在一段时间内并发地被多个程序访问
这种“同时“是宏观的,从宏观去看该资源可以被同时访问
比如:硬盘
-
-
虚拟性
把一个物理实体转变为若干个逻辑实体
物理实体是真是存在的,逻辑实体是虚拟的
虚拟的技术主要有时分复用技术和空分复用技术
-
时分复用技术
资源在时间上进行复用,不同程序并发使用
多道程序分时使用计算机的硬件资源
提高资源的利用率
-
虚拟处理器技术
借助多道程序设计技术
为每个程序建立进程
多个程序分时复用处理器
-
虚拟设备技术
物理设备虚拟为多个逻辑设备
每个程序占用一个逻辑设备
多个程序通过逻辑设备并发访问
-
-
空分复用技术
实现虚拟磁盘、虚拟内存等
提高资源的利用率,提升编程效率
-
虚拟磁盘
物理磁盘虚拟为逻辑磁盘(比如一个硬盘可以虚拟为C盘D盘…
使用起来更加安全、方便
-
虚拟内存技术
在逻辑上扩大程序的存储容量
大大提升编程效率
-
-
-
异步性
在多道程序环境下、允许多个进程并发执行
进程在使用资源时可能需要等待或放弃
进程以走走停停的形式推进
进程实体
- 为什么需要进程?
- 进程是系统进行资源分配和调度的基本单位
- 进程作为程序独立运行的载体保障程序正常执行
- 进程的存在使操作系统资源的利用率大幅提升
- 进程的实体
主存中的进程形态
进程控制块(process control block) PCB
-
标识符
唯一标记一个进程,用于区别其他进程
比如:进程ID 就是常见的标识符
-
状态
标记进程的进程状态,如运行态、阻塞状态
-
程序计数器
进程即将被执行的下一条指令的地址
-
内存指针
程序代码、进程数据相关指针
-
上下文数据
进程执行时处理器存储的数据
-
IO状态信息
被进程IO操作所占用的文件列表
-
记账信息
使用处理器时间、时钟数总和等
对调试或者获取状态都是很有用的
可以分为四类:
-
进程标识符
-
处理机状态
-
进程调度信息
-
进程控制信息
进程控制块(PCB)
-
用于描述和控制进程运行的通用数据结构
-
记录进程当前状态和控制进程运行的全部信息
-
PCB使得进程是能够独立运行的基本单位
-
PCB是操作系统进行调度经常会被读取的信息
-
PCB是常驻内存的,存放在系统专门开辟的PCB区域内
进程与线程
进程(Process) 线程(Thread)
一个进程可以有一个或多个线程
线程是操作系统进行运行调度的最小单位
进程是系统进行资源分配和调度的基本单位
(操作系统对进程的调度实际上是对进程中的线程的调度)
线程包含在进程中,是进程中实际运行工作的单位
一个进程可以并发多个线程,每个线程执行不同的任务
进程的线程共享进程资源
五状态模型
就绪、阻塞、执行
创建、终止
-
就绪状态
-
当进程被分配到除了CPU以外所有必要的资源后
-
只要再获得CPU的使用权就可以立即运行
-
其他资源都准备好、只差CPU资源的状态为就绪状态
-
在一个系统中多个处于就绪状态的进程通常排成一个队列
-
-
执行状态
- 进程获得CPU,其程序正在执行称为执行状态
- 在单处理器机中,在某个时刻只能有一个进程处于执行状态
-
阻塞状态
-
进程因某种原因如:其他设备未就绪而无法继续执行
-
从而放弃CPU的状态成为阻塞状态
比如:请求打印机未就绪而无法执行
-
-
状态间如何切换的呢?
-
就绪 <----> 执行
当进程发生进程调度的时候就会从就绪态转为执行态
当分配给进程的CPU时长用完后就会从执行态转为就绪态
-
阻塞 <----> 执行
当执行状态发送IO请求的时候就有可能转为阻塞状态
当某个进程在执行的时候需要IO设备,但此时IO设备还没有准备好,那么这个进程就有可能调出CPU变成阻塞状态
-
阻塞 <----> 就绪
当IO设备准备完成后,就会从阻塞状态转为就绪状态
IO设备准备好后会向进程发送一个中断来唤醒进程,从而进入就绪状态
-
-
创建状态
创建进程时拥有PCB但其他资源尚未就绪的状态称为创建状态
操作系统提供fork函数接口创建进程
- 终止状态
进程结束由系统清理或者归还PCB的状态称为终止状态
进程同步
为什么需要进程同步?
单从生产者程序或消费者程序看是没问题的
两者并发执行时就可能出错
筷子 ——>> 临界资源
哲学家 ——>> 进程
根源问题: 彼此间没有通信 ——>> 需要进程间的同步
- 进程同步的意义:
- 对竞争资源在多进程间进行使用次序的协调
- 使得并发执行的多个进程之间可以有效使用资源和相互合作
进程间同步的原则:
临界资源:临界资源指的是一些虽作为共享资源却又无法同时被多个线程共同访问的共享资源。当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释放该共享资源才可重新竞争使用共享资源。
四个原则:
- 空闲让进:资源无占用,允许使用
- 忙则等待:资源有占用,请求进程等待
- 有限等待:保证有限等待时间能够使用资源
- 让权等待:等待时,进程需让出CPU
进程间同步的方法:
- 消息队列
- 共享存储
- 信号量
线程同步
-
当多个线程并发使用进程资源时,会发生什么?
- 也会发生生产者问题和哲学家吃饭问题
- 所以进程内多线程也需要同步
-
线程同步的方法?
-
使用互斥量
保证多线程可以互斥使用临界资源的一个锁
-
读写锁
为了应对多读少些或者多写少读的情况
-
自旋锁
-
条件变量
-
Linux的进程管理
Linux进程的相关概念
进程的类型
-
前台进程
终端shell
前台进程就是就有终端,可以和用户交互的进程
-
后台进程
与前台进程相对,没有占用终端的就是后台进程
后台程序基本不和用户交互,优先级比前台进程低
将需要执行的命令以&符号结束就会启动后台进程
-
守护进程(daemon)
是特殊的后台进程
很多守护进程在系统引导的时候启动,一直运行直到系统关闭。
Linux有很多典型的守护进程:进程名字以d结尾的一般都是守护进程
比如:crond 定时任务的守护进程
httpd HTTP服务的守护进程
sshd 用ssh登陆时的守护进程
mysqld 数据库的守护进程
进程的标记
-
进程ID
进程的唯一ID,每个进程拥有不同的ID
表现为非负整数,最大值由操作系统限定
-
进程的状态标记