进程管理

进程管理


1.进程的概念与特征

1.为什么引入进程?

为了提高系统的资源利用率,基于多道程序设计技术出现了多道批处理系统。但是由于多道程序环境下,允许程序并发执行,此时程序之间失去封闭性,并且具有间断性和不可再现的特征。程序的运行结果会出现不可预知的结果,所以引进了进程的概念,以便更好的描述和控制进程的并发执行,实现操作系统的并发性和共享性。

2.什么是进程?

为了使参与并发执行的程序能独立运行,因此需要设计一个独立的数据结构,称为进程控制块(PCB),系统通过该数据结构描述进程的基本情况和运行状态,进而管理和控制进程。

进程是程序执行的一个实例,通过PCB描述,是一个包括程序代码、运行过程中的数据以及发生的活动的抽象描述。

PCB是进程存在的唯一标志,其中包括进程PID,上下文环境,进程状态,程序计数器,内存指针等等。

进程是进程实体的运行过程,是系统中进行资源调度和分配的一个基本单位

3.进程的特征?

动态性:创建、活动、暂停、终止等过程,具有生命周期

并发性:多个进程实体同时存储与内存中,能在一段时间内同时运行

独立性:进程间可以独立运行,独立获得资源和独立接受调度,互不干扰

异步性:进程间的推进顺序是不可预知的,因此必须提供一些保证进程同步的机制

2.进程的状态转换

运行态:进程正在处理机上运行

就绪态:进程已获得除处理机之外的所有资源,一旦得到处理机,即可立即运行

阻塞态:又称等待态,进程正在等待某一事件的完成,如果等待的事件处理完毕或I/O设备空闲,则进入就绪态

创建态:正在创建描述进程的数据结构PCB,包括空间申请,PCB初始化,分配运行所必须的资源等等,尚未转到就绪态。

结束态:也称终止态,进程从系统中消失,可以是正常执行完,结果正确,进程退出;执行完,结果不正确,进程退出;进程执行过程出现不可修复的问题导致进程崩溃退出执行。
图片说明

3.进程控制

1.进程控制的主要功能

主要是对系统中的所有进程实施有效的管理,创建新进程、撤销已有进程、实现进程状态切换等。

操作系统中,将进程控制用的程序段称为原语,原语的特点就是执行期间不允许中断,它是一个不可分割的基本单位。

2.进程创建

允许一个进程创建一个新进程。创建者称为父进程,被创建的进程称为子进程,子进程可以继承父进程的所拥有的资源

操作系统中,终端用户登录、作业调度、系统提供服务、用户程序的应用请求都会引起进程的创建。

创建新进程的过程如下:

(1)为新进程申请唯一的进程标识符PID,并申请一个空白的PCB,如果PCB申请失败,则会导致创建进程失败。

(2)为进程分配资源,为新进程的程序和数据以及用户栈分配必要的空间(如果资源不足,则不是创建失败,而是进程处于阻塞状态,等待内存资源)

(3)初始化PCB,初始化PCB中的控制信息

(4)若进程就绪队列能够接纳新进程,则会加入就绪队列(用一句话概括就是创建好之后会将PCB加入调度队列)

Linux中的进程创建如下,调用fork系统调用:

详细参 https://blog.csdn.net/qq_38410730/article/details/81193118

#include <stdio.h>
#include <sys/types.h>

int main(void)
{
    pid_t pid;

    pid = fork();
    if(pid < 0){
        ...                //打印fork()失败信息
    }else if(pid == 0){
        ...                //子进程代码
    }else{
        ...                //父进程代码
    }

    return 0;
}

3.进程终止

引起进程终止的事件:

(1)正常结束,程序执行完毕,任务完成退出运行

(2)异常结束,运行过程中发生了异常事件,比如存储区越界、保护错、非法指令、特权指令错、运行超时、算术运算错、I/O故障等,程序无法继续执行

(3)外界干预,进程应外界请求终止,如操作系统或程序员干预、父进程请求父进程终止

终止的过程如下:

(1)根据终止进程的标识符,检索PCB,读取进程状态

(2)若处于运行态,则立即剥夺处理机,将处理机交给其他进程

(3)若该进程有子孙进程,则终止所有子孙进程

(4)回收该进程的所有资源

(5)将PCB从调度队列中剔除

4.进程的阻塞和唤醒

正在执行的进程,由于期待的某件事没发生,如请求系统资源失败,等待某种I/O的完成,由系统自动执行阻塞原语,使自己由运行态变为阻塞态(自身主动行为)

阻塞原语执行过程如下:

(1)找到相应阻塞态的PCB

(2)如果为运行态,则保护现场,改变PCB中进程状态信息,停止运行

(3)将PCB挂入阻塞队列

如果进程期待的事件发生,唤醒原语执行如下:

(1)阻塞队列中找到相应PCB

(2)从等待队列中剔除,修改状态信息

(3)挂入就绪队列

注:Block阻塞原语和Wakeup原语是一对作用刚好想反的原语,需成对出现,阻塞原语是自我调用实现,而唤醒是别的进程调用实现

5.进程切换

进程的切换过程如下:

(1)保存上下文信息、程序计数器等

(2)更新PCB信息

(3)把PCB移入相应的队列

(4)选择另一个进程执行,更新PCB

(5)更新内存管理的数据结构

(6)恢复处理机上下文

6.进程的组织

进程控制块PCB:

(1)进程PID、用户UID

(2)进程状态

(3)优先级

(4)程序计数器

(5)内存指针

(6)处理机占用时间

(7)信号量使用

(8)资源分配清单

(9)处理机相关信息

进程的组织方式有链接方式索引方式两种:

​ 链接方式是将PCB根据状态划分,链成一个队列,不同状态对应不同的队列;

​ 索引方式是将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB,不同的状态对应不同的索引表。

程序段:进程执行的程序代码段

数据段:存储进程对应程序加工处理的原始数据,或者程序执行期间的中间数据或者执行结束的最终结果

7.进程间通信

1.共享存储

进程之间可以直接访问的共享空间,通过对这个共享空间的信息读写实现进程间的信息交换。低级方式是基于数据结构的共享,高级方式是基于存储区的共享。

2.消息传递

进程间的信息交换是以格式化的消息为单位的。通过发送消息和接收消息的两个原语实现数据交换。

直接通信方式

间接通信方式,又称信箱通信方式,通过中间载体信箱实现信息交换

3.管道通信

本质是一种特殊的文件,用于连接读进程和写进程,实现信息通信,又叫pipe文件

面向字符流、半双工通信、不可靠。

为了实现管道机制,实现双方通信,必须有保证互斥、同步、确认对方存在的能力

管道在Linux中是比较频繁的一种进程间通信方式

8.线程和多线程模型

1.为什么引入线程?

引入进程是为了更好的使多道程序并发,提高资源利用率和系统吞吐量;而引入线程的目的则是为了减小程序并发执行时所付出的时间开销,提高操作系统的并发性能。(另一方面,也可以说将并发粒度进一步细化,进程内部也可以通过线程并发执行提高资源利用率和系统吞吐量,比如QQ进程,其中文件传输、发消息、打视频即可通过线程实现)

2.线程和进程的比较

(1)调度:传统的操作系统中,拥有资源和独立调度的基本单位都是进程;引入线程后,线程是调度的基本单位,进程事资源分配的基本单位。同一进程中的线程切换不会引起进程切换

(2)拥有资源:进程是资源分配的基本单位,而线程可以访问其隶属进程的系统资源

(3)并发性:进程并发,线程并发,大大提高了系统的并发性

(4)系统开销:线程切换所付出的代价远远小于进程切换带来的时间开销

(5)地址空间和其他资源(文件描述符):进程地址空间相互独立,同一进程的线程共享进程的资源。

(6)通信方面:进程间通信需要通过其他机制保证,但线程间可以直接通过读写数据段(全局变量)实现通信

3.线程属性

线程ID,不同线程可以执行不同的程序,同一进程中的线程共享进程的资源,线程被处理机独立调度

4.线程的实现方式

用户级线程:所有线程相关的工作都有应用程序实现,内核意识不到线程的存在(线程库)

内核级线程:线程的管理工作由内核完成,应用程序没有线程管理的代码,只有一个到内核级线程的编程接口。

5.多线程模型

有些系统同时支持用户线程和内核线程,因此产生了不同的多线程模型,即实现用户级线程和内核级线程的连接方式:

(1)多对一模式

优点:线程管理在用户空间,效率高

缺点:一个内核线程阻塞会导致整个进程阻塞,多个线程不能并行执行在处理机上

(2)一对一

优点:当一个线程阻塞后允许另一个线程执行,并发能力强

缺点:线程管理在内核,线程调度开销大

(3)多对多

将n个用户级线程映射到m个内核级线程上,要求m<=n

集前面两者之优点,开销小,效率高

全部评论

相关推荐

totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务