操作系统(二)进程基础

认识进程

定义

当引入多道批处理技术后,程序可以并发执行,这时,操作系统需要区分不同的程序。

那么怎么进行区分呢?

每个程序都会被放入内存中,包括程序段和数据段,但是还需要一个区分不同程序的信息,也就是 PCB(程序控制块,Process Control Block)

程序段、数据段、PCB 三部分组成了进程实体(进程映像)。一般情况下,我们把进程实体就简称为进程。所谓创建进程,实质上是创建进程实体中的 PCB;而撤销进程,实质上是撤销进程实体中的 PCB。
注意:PCB 是进程存在的唯一标志!

image-20220911202630118

进程可以有不同的定义:

1.进程是程序的一次执行过程。
2.进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3.进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。

组成

进程(进程实体)由程序段、数据段、PCB 三部分组成。

image-20220911203219662 image-20220911203319156

组织方式

进程的组成讨论的是一个进程内部由哪些部分构成的问题,而进程的组织讨论的是多个进程之间的组织方式问题。

  • 链接方式:按照进程状态将 PCB 分为多个队列,操作系统持有指向各个队列的指针
  • 索引方式:按照进程状态建立几张索引表,操作系统持有指向各个索引表的指针
image-20220911205339008 image-20220911205406430

特征

  • 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的。
  • 并发性:内存中有多个进程实体,各进程可并发执行。
  • 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
  • 异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供 “进程同步机制” 来解决异步问题。
  • 结构性:每个进程都会配置一个 PCB。结构上看,进程由程序段、数据段、PCB 组成。

动态性是进程最基本的特征。

进程是资源分配、接受调度的基本单位!

进程状态

  • 运行态
  • 就绪态
  • 阻塞态
  • 创建态
  • 终止态

其中,运行态、就绪态、 阻塞态是三种基本状态

image-20220911211321150

创建态:进程正在被创建,操作系统为进程分配资源、初始化 PCB。

终止态:进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销 PCB。

image-20220911212229860

这部分知识非常重要!!!

image-20220911212424036

进程控制

什么是进程控制

进程控制就是要实现进程状态转换

image-20220912150115817

这里会产生一个问题,如果更改了相应队列时,PCB 的状态还未改变,就会出现错误。

因此,需要用原语实现进程控制。原语的特点是执行期间不允许中断,只能一气呵成。这种不可被中断的操作即原子操作。

原语采用 “关中断指令” 和 “开中断指令” 实现。

当关中断后,再次发来的外部中断信号将被拒绝,因此会始终执行当前程序。

image-20220912151023307

显然,关/开中断指令的权限非常大,是只允许在核心态下使用的特权指令

相关原语

无论哪种原语,要做的无非是以下几点:

  1. 更新 PCB 中的信息(如修改进程状态标志、将运行环境保存到 PCB、从 PCB 恢复运行环境)

    a.所有的进程控制原语一定都会修改进程状态标志

    b.剥夺当前运行进程的 CPU 使用权必然需要保存其运行环境

    c.某进程开始运行前必然要恢复期运行环境

  2. 将 PCB 插入合适的队列

  3. 分配/回收资源

image-20220912151828058 image-20220912151854554 image-20220912152031617 image-20220912152121962

进程通信

进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。

为了保证安全,一个进程不能直接访问另一个进程的地址空间,但是进程之间的信息交换又是必须实现的。

进程通信就是指进程之间的信息交换。

共享存储

image-20220912155217204

消息传递

进程间的数据交换以格式化的**消息(Message)**为单位。进程通过操作系统提供的 “发送消息/接收消息” 两个原语进行数据交换。

image-20220912160147942

管道通信

管道是指用于连接读写进程的一个共享文件,又名 pipe 文件。其实就是在内存中开辟一个大小固定的缓冲区。

image-20220912155726808
  1. 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
  2. 各进程要互斥地访问管道。
  3. 数据以字符流的形式写入管道,当管道写满时,写进程的 wite() 系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的 read() 系统调用将被阻塞。
  4. 如果没写满,就不允许读。如果没读空,就不允许写。
  5. 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

线程

线程是一个基本的 CPU 执行单元,也是程序执行流的最小单位

引入线程后,进程只作为除 CPU 之外的系统资源的分配单元。(如打印机、内存地址空间等都是分配给进程的,而不是给线程)

image-20220912162911356

引入线程机制后的变化:

image-20220912164926250

对线程的认识:

image-20220912165453727

线程的实现方式

用户级线程:

image-20220912170342150

内核级线程:

image-20220912170409873

二者组合方式:

image-20220912170642027

多线程模型

多对一模型

多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。

优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。

缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。

image-20220912171515151

一对一模型

一个用户及线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。

优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行

缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

image-20220912171636957

多对多模型

n 个用户级线程映射到 m 个内核级线程(n >= m)。每个用户进程对应 m 个内核级线程。
克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

image-20220912172029805

总结

image-20220912172112094
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值