【操作系统】3.进程管理

文章目录

1. 进程和线程

1.1 进程的概念

进程是资源分配的基本单位。

概念:进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。

进程的特点

a) 动态性,可动态创建和结束进程
b) 并发性,进程可以被独立调度并占用CPU运行
c) 独立性,不同进程之间互相不影响
d) 制约性,因访问共享数据/资源或进程间同步产生制约

进程的组成

  • PCB(进程控制块)
  • 程序段
  • 数据段
  • 通用寄存器
  • 状态寄存器

总之,进程包含了正在运行的一个程序的所有状态信息。

进程与程序的联系

程序是进程的基础,进程是程序功能的体现。

进程与程序的区别

  1. 程序静态,进程动态。
  • 程序是有序代码的集合;
  • 进程是程序的执行,执行中可以是核心态/用户态
  1. 进程是暂时的,是状态变化的过程,程序是永久的;
  2. 组成不同,进程包括程序,数据,进程控制块;

1.2进程控制块(PCB)

进程控制块是操作系统管理控制进程运行所用的信息集合,它描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。

操作系统使用PCB来描述进程的基本情况以及运行变化的过程。且PCB是进程存在的唯一标志,每个进程都在操作系统中有一个对应的PCB。

PCB的创建和回收

进程创建时生成该进程的PCB,进程终止时回收它的PCB,它的生命周期和进程的生命周期一样。

进程的组织管理:通过对PCB的组织管理来实现进程控制

进程控制块的内容:

  1. 进程标识信息
  2. 处理器现场保存
  3. 进程控制信息
    1. 调度和状态信息,进程和处理机使用情况调度
    2. 进程间通信信息,进程间通信相关的各种标识
    3. 存储管理信息,指向进程映像存储空间数据结构
    4. 进程所用资源,进程使用的系统资源,如打开文件等
    5. 有关数据结构连接信息,如PCB相关的进程队列

关于进程控制块的描述正确的是(ABCD)

A.操作系统用进程控制块来描述进程的基本情况以及运行变化的过程
B.进程控制块是进程存在的唯一标志
C.每个进程都在操作系统中有一个对应的进程控制块
D.操作系统管理控制进程运行所用的信息集合是进程控制块

1.3 进程生命周期

进程的生命周期如下:进程创建,进程执行,进程等待,进程抢占,进程唤醒,进程结束.

进程创建

创建完成进程会进入就绪队列中,等待进程执行

进程执行

内核选择一个就绪的进程,让它占用处理机并执行进程,如何选择进程(处理机调度算法)

进程等待

进程进入等待(阻塞)状态的情况:

  • 请求并等待系统服务,无法马上完成;
  • 启动某种操作,无法马上完成
  • 需要的数据没有到达;
  • 内部原因导致进程等待。

进程抢占

  • 高优先级的进程就绪;
  • 进程执行当前时间用完。

进程唤醒

  • 被阻塞进程需要的资源可被满足;
  • 被阻塞进程等待的事件到达。
  • 进程只能被别的进程或者操作系统唤醒。

进程结束

需要退还系统资源。

  • 正常退出(自愿)
  • 错误退出(自愿)
  • 致命错误(强制性)
  • 被其他进程杀死(强制性)

1.4 进程状态变化模型

进程的三种基本状态:

  • 就绪状态(ready):当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行时的状态;
  • 运行状态(running):当一个进程正在处理机上运行时;
  • 等待状态(或阻塞状态blocked):一个进程正在等待某一事件而暂停运行时的状态,如等待资源,等待I/O完成,请求缓存空间。

进程还有其它的基本状态:

  • 创建状态(new),一个进程正在被创建,还没被转到就绪状态之前的状态。
  • 结束状态(exit),一个进程正在从系统中消失时的状态,这是因为进程结束或由于其它原因所导致。

image

1.5 进程挂起

在不少系统中进程只有上述三种状态,但在另一些系统中又增加了一些新状态。

处于挂起状态的进程映像在磁盘上,目的是减少进程占用内存(进程存储在外存中)。

新增加了两个挂起状态:
等待挂起状态,进程在外存并等待某事件的出现。

就绪挂起状态,进程在外存,只要进入内存即可运行。

挂起:把一个进程从内存中转到外存中。

引入挂起状态的原因:

1)终端用户的请求      当终端用户在自己的程序运行期间发现有可疑问题时,希望暂时使自己的程序静止下来。亦即,使正在执行的进程暂停执行;若用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况或对程序进行修改。这种静止状态称为挂起状态。

2)父进程请求     有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调各子进程间的活动。

3)负荷调节的需要     当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。

4)操作系统的需要     操作系统有时希望挂起某些进程,以便检查运行中德资源使用情况或进行记账。

由操作系统来维护一组队列,表示系统中所有进程的当前状态,不同队列表示不同状态,根据进程状态不同,进程PCB加入相应队列。进程状态变化时,它所在的PCB会从一个队列换到另一个队列。

1.6 线程的概念

线程是独立调度的基本单位。

引入线程可以提高进程内部的并发性。多进程并发比较复杂,在进程内部引入多线程机制会提高进程内部的并发性。

多进程的实现系统之间的通信和数据共享复杂(要经过内核共享数据)且系统的开销较大,因此在进程内部增加一类实体,实体之间可以并发执行,且实体之间共享相同的地址空间,因此引入线程的概念。

线程的概念:线程是进程的一部分,描述指令流执行状态,他是进程中的指令执行流的最小单元,是CPU调度的基本单位。

进程的作用变成了资源分配,进程由一组相关资源构成,包括地址空间(代码段、数据段)打开文件等各种资源。线程作为处理机调度角色,线程描述在进程资源环境中的指令流执行状态。(线程是程序执行的最小单元)。

线程的特点:

  1. 一个进程可以同时存在多个线程
  2. 各个线程之间可以并发的执行
  3. 各个线程之间可以共享地址空间和文件等资源
  4. 缺点:一个线程崩溃,会导致其他所属进程的所有线程崩溃。

1.7 用户线程与内核线程

用户线程:

  • 由一种用户级别的线程库函数来完成线程的管理包括线程的创建、终止、同步和调度。
  • 不依赖于操作系统的内核,内核不了解用户线程的存在,可用于不支持线程的多进程操作系统;在用户空间实现的线程机制,每个进程有私有的线程控制块列表。
  • 同一进程内的用户线程切换速度快,无需用户态/核心态切换。允许每个进程拥有自己的线程调度算法。
  • 不足之处:线程发起系统调用而阻塞时,则整个进程进入等待;不支持基于线程的处理机抢占,只能按照进程分配CPU时间,多个线程进程中,每个线程的时间片较少。

内核线程

  • 由内核通过系统调用实现的线程机制,由内核完成线程的创建、终止和管理。
  • 特征如下:由内核维护PCB和TCB;线程执行系统调用而被阻塞不影响其他线程。
  • 线程的创建、终止和切换相对较大

线程和进程的区别

  • 资源:进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
  • 调度:线程是CPU调度单位,在同一进程中,线程的切换并不会引起进程切换。
  • 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,线程切换时只需保存和设置少量寄存器内容,开销很小。(线程要保存少量的寄存器内容)
  • 通信方面:线程间可以直接通过读写同一进程中的数据进行通信,但进程通信需要借助IPC。

2. 进程控制

2.1 进程切换

进程切换主要涉及资源保存与恢复。

使用进程控制块PCD保存内核的进程状态记录。内核将相同状态的进程的PCB放置在同一个队列当中。

进程切换暂停当前运行进程,从运行状态变成其他状态。
要调度另一个进程从就绪状态变成运行状态。
要保存进程生命周期的信息(寄存器(PC,SP...)CPU状态,内存地址空间。

2.2 进程创建

操作系统系统调用供用户创建进程。

a) Windows进程创建API: CreateProcess(filename)

b) Unix或者Linux进程创建系统调用: fork/exec 重点掌握fork

  1. fork()把一个进程复制成两个进程fork后子进程和父进程除PID不同外其他相同。
  2. exec()用新程序来重写当前进程,重写进程写入新进程的执行函数

c) fork()创建一个继承的子进程的步骤

  1. 复制父进程的所有变量和内存
  2. 复制父进程的所有CPU寄存器(有一个寄存器例外)(fork进程父进程和子进程的PID不同)
  3. Fork()返回值可方便后续使用,子进程可使用getpid()获取PID。对于父进程fork()返回的是child PID,对于子进程返回值为0,由此可以区分父进程和子进程。
  4. 程序加载与执行:系统调用exec()加载新程序取代当前运行程序exec_status = exec(“calc”, argc, argv0, argv1, …)修改复制进程的参数

image

Copy on Write(COW)技术:在Linux程序中,fork()会产生一个和父进程完全相同的子进程,把父进程的内容复制一份 但子进程在此后多会exec系统调用再把父进程内容覆盖,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
https://www.cnblogs.com/wuchanming/p/4495479.html

2.3 进程加载

用户应用程序通过系统调用exec()加载执行可执行文件。

a) 程序加载和执行系统调用exec(),允许进程“加载”一个完全不同的程序,并从main开始执行
b) 允许进程加载时指定启动参数(argc, argv).
c) exec调用成功时,它是相同的进程,和加载之前原进程的PID参数相同但运行了不同的程序。
d) 代码、堆、栈的数据被完全重写。

2.4 进程等待与退出

进程等待与退出是父子进程之间的交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程芝士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值