进程管理
由于笔者要准备参加研究生考试复试,而操作系统这门课程又是复试考试中的一门课程,因此参考笔者报考学校的ppt,特此记录一下自己的学习过程,下面正文开始了:
进程的引入
程序的并发执行使得程序的执行成为一个动态性很强的过程。而程序是一个静态的概念,不再能切实反映程序执行的各种特征。故而要引入新的概念来表示程序执行过程的新特性。
进程的基本概念
- 定义
-
直观的定义:进程就是进展中的程序或者是执行中的程序 进程=程序+执行
-
教材中的定义:进程是程序的一次执行,该进程可以与其他进程并发执行,他是一个动态的实体,在传统的操作系统设计中,进程既是资源的基本分配单元,(也是基本的执行单元)
-
- 继承与程序的区别和联系
- 区别:
- 程序是静态的,是有序代码的集合;进程是动态的,是程序的一次执行。
- 程序是永久的,没有生命周期,可长久保存;进程是暂时的,有生命周期,是一个动态不断变化的过程
- 进程是操作系统资源分配和保护的基本单位, 程序没有此功能。
- 进程与程序的结构不同
- 联系:
通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序
- 区别:
- 进程的组成
- PCB:“Process Control Block”,包含着进程的描述和控制信息,进程存在的唯一标志
- 程序:"纯代码"部分,描述了进程要完成的功能,是进程执行时不可修改的部分
- 数据:进程执行时用到的数据
- 工作区:一片可供进程使用的动态区域(堆栈区),可用于:保存局部变量,传递参数,系统调用时存放返回地址等。
- 进程控制块(PCB)
- 定义:
- 是操作系统用来记录进程详细状态和相关信息的基本数据结构,它和进程是一一对应的,是进程存在的唯一标识
- 进程的档案,描述进程的特征,记载进程的历史,决定进程的命运。
- 作用:
提供进程的各种信息,以便操作系统查询、控制和管理。
- 定义:
进程的执行与控制
- 进程的基本状态及其转换
- 进程的组织管理—队列
- 进程控制
- 系统对进程的控制是通过操作系统内核中的原语实现的。
- 原语
- 由若干条机器指令构成的可完成特定功能的程序段,它是一个“原子操作(atomic operation)”过程,执行过程不能被中断—要么全部完成,要么全都不做
- 原语的原子性主要是通过屏蔽中断保证的
- 原语分类:
- 进程控制原语
- 进程通信原语
- 资源管理原语
进程调度
- 概念
就是按照一定的算法,,从就绪队列中选择某个进程占用CPU的方法 - 原则
- 系统:公平性、较大的吞吐量
- 用户:及时性、较短的周转时间
- 算法:
- 先来先服务调度算法(FCFS,First Come First Served)
- 思想:先来先服务
- 特点:简答、可靠、实现方便、灵活性差
- 基于优先数的调度算法(Priority Scheduing Algorithm)
- 思想:给每一个进程设置一个优先数(优先级),系统在调度时优先选择具有高优先级的进程占用CPU。具有相同优先数的进程按照FCFS算法执行。
- 优先数的确定:
- 静态优先数法:进程创建时就规定好它的优先数,这个数值在进程运行时不变
- 动态优先数法:进程的优先数在执行过程中可以根据情况变化而改变
- 时间片轮转法(RR,Round Robin)
- 思想:系统规定一个时间长度(时间片/时间量)作为允许一个进程运行的时间,如果在这段时间该进程没有执行完,则必须让出CPU等待下一次分配的时间片
- 特点:专门为分时系统设计,较为公平性,对用户反应及时。
- 多级反馈队列调度算法(Multilevel Feedback Queue Scheduling)
- 思想:引入多个就绪队列,通过对个队列区别对待,达到一个综合的调度目标。
- 原理:
- 先来先服务调度算法(FCFS,First Come First Served)
进程间的相互作用
- 进程之间的关系:
- 同步:进程之间相互合作、协同工作,简单来说:多个相关进程在执行次序上的协调,它们之间的制约关系是:直接制约
- 互斥:多个进程因为争夺临界资源而相互排斥的过程,它们之间的制约关系是:间接制约
临界资源:也称独占资源,是指在一段时间内只允许一个进程访问的资源。例如打印机,磁带机,也可以是进程共享的数据、变量等。
- 并发进程的问题
上面这个图会产生不确定性。 - 锁变量法(测试和设置指令)
- 做法:设置一个共享变量W(锁),初值为0。当一个进程想进入其临界区(进程中涉及临界资源的程序段)时,他首先测试这把锁:如果锁的值为0,则进程将其置为1并进入临界区。若锁已经为1,则进程等待直到其变成0
- 实现:
- 加锁原语LOCK(W)
- 解锁原语UNLOCK(W)
- 现象:CPU会一直处于忙等待状态(Busy waiting)
- 信号量(Semaphore)和P、V操作
- 信号量
- 特点:表示资源的实体—是一个与队列有关的整型变量,其值只能通过初始化操作和P、V操作来访问。
- 类型:
- 公用信号量:用于进程间的互斥,初值通常为1
- 私有信号量:用于进程间的同步,初值通常为0或n
- P操作,意味着请求分配一个单位的资源
原语操作,表示如下: - V操作,意味着释放一个单位资源
原语操作,表示如下:
注意:V操作在唤醒别人的同时不会阻塞调用进程
- 信号量
- 互斥案例:
- 同步案例:
- 使用P、V操作时的注意事项
- P、V操作(对同一信号量)总是成对存在的,互斥操作时它们处于同一进程中,同步操作时它们处于不同进程中
- P、V操作的位置和次序十分重要,使用时要注意逻辑关系
管程
- 信号量机制的缺点
信号量机制的引入解决了进程同步的问题,但信号量的大量同步操作分散在各个进程中不便于管理,使用不当还可能造成系统死锁。 - 管程
- 思想:集中和封装针对一个共享资源的所有访问,包括所需的同步操作
- 结构:管程是由一组局部的变量、对局部变量进行操作的一组过程以及对局部变量初始化的语句序列构成的一个软件模块
- 基本特性
- 局部于管程的数据只能被局部于管程内的函数所访问
- 一个进程只有通过调用管程内的函数才能进入管程访问共享数据
- 每次仅允许一个进程在管程内执行某个函数
- 由于管程是一个语言成分,所以管程的互斥访问完全由编译程序在编译时自动添加上,无需程序员关心,而且保证正确。
Windows同步机制
Windows 2000/XP中提供了同步对象来解决线程同步和互斥问题。在任何时刻,同步对象都处于两种状态中的一种:
- 信号态(signaled state)
- 非信号态(non-signaled state)
这些对象包括:事件对象(Event)、信号量对象(Semaphore)、互斥体对象(Mutex)、临界区对象(CriticalSection)、定时器对象(Timer)
- 事件对象(Event)
是最简单的同步对象,它包括有信号和无信号两种状态。在线程访问某一资源前,需要等待某一事件的发生,这是用事件对象最合适。
相关API:- CreateEvent:创建一个事件对象,返回对象的句柄
- OpenEvent:返回一个已存在的事件对象句柄,用于后续访问
- SetEvent:设置指定事件为可用状态
- ResetEvent:设置指定事件对象为不可用状态
- 信号量对象(Semaphore)
信号量对象是同步对象,初值为0至某个最大值之间的正整数,它允许同时对多个线程共享资源进行访问,用于限制并发资源的线程数。
相关API:- CreateSemaphore:创建一个信号量对象,返回对象句柄
- OpenSemaphore:返回一个已存在的信号量句柄,用于后续的访问
- ReleaseSemaphore:释放对信号量对象的占用
- 互斥体对象(Mutex)
互斥体对象的状态在它不被任何线程拥有是才有信号,而当它被拥有时则无信号。互斥体对象适合用来协调多个线程对共享资源的互斥访问,他在同一时刻只能被一个线程占用。
相关API:- CreateMutex:创建一个互斥对象,返回对象句柄
- OpenMutex:打开并返回一个已存在的互斥句柄对象,用于后续访问
- ReleaseMutex:释放对互斥体对象的占用,使之成为可用
- 临界区对象(CriticalSection)
临界区对象只能用于同一进程的线程之间共享资源处理,同一进程内各线程对它的访问时互斥进行的。把变量类型说明为CRITICAL_SECTION,就可作为临界区使用。
相关API:- InitializeCriticalSection:对临界区对象进行初始化
- EnterCriticalSection:等待占用临界区的使用权,得到使用权时返回
- LeaveCriticalSection:释放临界区的使用权
- DeleteCriticalSection:释放与临界区对象相关的所有系统资源
- 用户级等待同步函数
WIN32提供了一组能使线程阻塞其自身执行的等待函数。线程调用函数而被阻塞,知道函数参数中的一个或多个同步对象产生了信号,或者阻塞超过了规定的等待时间才会返回。在等待函数未返回时,线程处于等待状态,此时线程只消耗很少的CPU时间。使用等待函数即可以保证线程的同步,又可以提高程序的运行效率。
最常用的等待函数时用户级等待同步函数:- WaitForSingleObject:可以用来监测单个同步对象
- WaitForMultipleObjects:可以用来监测单个同步对象
进程通信
- 定义:简单来说就是在进程间传输数据(交换信息)
- 进程通信分类:
- 根据通信方式不同,分为:
- 直接通信:信息直接传递给接收方
- 间接通信:借助于收发双方进程之外的共享数据结构作为通信中转
- 根据交换信息量的多少和效率的高低,分为:
- 低级通信:只能传递状态和整数值(控制信息),传送信息量小
- 高级通信:能够传递大量数据,通信效率高。
- 根据通信方式不同,分为:
- 系统提供的高级通信方式(共享内存模式、消息传递模式、共享文件模式)
- 共享内存模式
- 最为快捷有效的方式之一
- 是一种间接通信
- 原理:
- 消息传递模式
- 消息
- 消息的概念:由发送方形成,通过一定的机制传递给接收方的一组信息,它的长度可以固定,也可以变化
- 消息的组成:消息头、消息尾
- 工作原理:
- 消息的传递方式
- 直接通信方式:点到点的发送
- 间接通信方式:以信箱为媒介进行传递,可以广播
- 消息
- 管道(共享文件模式)
- 管道是一种信息流缓冲机构,基于文件系统,可以连接两个进程,以先进先出(FIFO)方式的单向传送数据
- 匿名管道(Anonymous Pipes)
匿名管道是一种未命名的、单向管道。通常用来在父进程和子进程之间传输数据。匿名管道总是本地的,不能在网络之间传递数据。 - 命名管道(Named Pipes)
命名管道是一种有名称的,可在同一台计算机的不同进程之间或跨越一个网络的不同计算机的不同进程之间传输数据的进程通信方式,支持可靠的,单向或双向的数据通信。 - 原理(匿名管道)
- 匿名管道的特点:
- 单向通信信道,如果进程间要进行双向通信,通常需要定义两个管道
- 管道通过系统调用read()、write()函数进行读写操作
- 共享内存模式
线程
- 定义
线程也叫轻型进程,是一个可执行的实体单元,是现代操作系统中处理级调度的基本单位 - 线程和进程的关系
- 线程是进程的一个组成部分,线程由进程创建,因此一个进程中至少存在一个线程,线程还可以创建其他线程
- 进程是资源分配和保护的基本单位,线程只能在进程的地址空间活动,线程只能使用其所在进程的资源
- 线程和线程的关系
- 所有文本拥有相同的程序文本,不同的线程可执行相同或不同的代码段
2 线程可独立运行,也可相互合作 - 每个线程拥有独立上下文(运行环境)
- 所有文本拥有相同的程序文本,不同的线程可执行相同或不同的代码段
- 两种不同线程的实现方式:
- 用户态线程
- 优点:
- 操作系统不再能感知到用户线程的存在,操作系统适应性强
- 线程间切换很迅速
- 缺点:
- 程序设计难度加大
- 并发度降低
- 优点:
- 内核态线程
- 优点:实现简答,并发度高
- 缺点:执行效率低,消耗资源量大
- 用户态线程
下面的是笔者的微信公众号,欢迎关注,会持续更新c++、python、tensorflow、机器学习、深度学习等系列文章