进程与线程的理解

对于进程和线程的理解一直很模糊,有看了一遍《操作系统》,感觉还是有点模糊,对于自己浅显的理解写下博客进行总结。
如有误,请留言指证错误,谢谢!

1 什么是进程?

  • 我们可以简单的理解为:
    进程是正在运行的程序的实例。

  • 进程的概念主要有两点:

  1. 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
  2. 进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

这个时候会产生一个疑问?
当系统创建了进程之后,我们怎么来记录进程的一些状态,进程ID等跟该进程相关的所有信息呢?
当操作系统创建了进程之后,怎么能让操作系统去跟踪到该进程, 所以必须要有一些与进程相关的信息,包括进程在内存中的当前状态和位置。即进程控制块。

这个时候会涉及到进程控制块(PCB)

那么什么是进程控制块?

  • 操作系统内的每个进程表示,釆用进程控制块(Process Control Block,PCB),也称为任务控制块。
    在这里插入图片描述
  • PCB通常记载进程之相关信息,包括:
  1. 程序计数器:接着要运行的指令地址。
  2. 进程状态:可以是new、ready、running、waiting或 blocked等。
  3. CPU暂存器:如累加器、索引暂存器(Index register)、堆栈指针以及一般用途暂存器、状况代码等,主要用途在于中断时暂时存储数据,以便稍后继续利用;其数量及类因电脑架构有所差异。
  4. CPU排班法:优先级、排班队列等指针以及其他参数。
  5. 存储器管理:如标签页表等。
  6. 会计信息:如CPU与实际时间之使用数量、时限、账号、工作或进程号码。
  7. 输入输出状态:配置进程使用I/O设备,如磁带机。 [1]

PCB与进程有什么关系?

  • 进程控制块(PCB)(系统为了管理进程设置的一个专门的数据结构,用它 来记录进程的外部特征,描述进程的运动变化过程。系统利用PCB来控制 和管理进程,所以PCB是系统感知进程存在的唯一标志。进程与PCB是一 一对应的)
    通俗的理解为:
    比如操作系统负责创建一个进程,它就会开辟一段数据结构用来存储进程的一些信息,这个就是进程控制块

2 进程的状态

  • 当操作系统控制进程的执行时,进程表现出来的行为无外乎有两种:
  1. 一个 进程要么正在执行(称为运行态)
  2. 一个 进程要么未执行(称为未运行态)
  • 当操作系统创建一个进程,它将该进程以未运行态加入系统,操作系统知道这个进程的存在,并正在等待执行机会,而不时地,当前正在运行的进程会被中断,此时操作系统中的分派器部分将选择一个新进程运行。前一个进程从运行态转化为未运行态,后一个进程则转换未运行态。

  • 图1
    在这里插入图片描述
    那么未运行态必须位于某种类型的队列中,并等待执行时机。
    给出如下的图解:该结构中有一个队列,队列中的每一项都指向某个特定进程的指针。或队列可以由数据块构成的链表组成,每个数据块表示一个进程。

  • 图2

在这里插入图片描述

了解完进程的基础模型之后,那么进程的生命周期都会围绕着 进程的创建和终止。

  • 为了便于管理进程,‘般来说,按进程在执行过程中的不同情况至少要定义三种不同的进程状态:

三态模型

  • 在这里插入图片描述
    (1)运行(running)态:进程占有处理器正在运行。
    (2)就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行。
    (3)等待(wait)态:又称为阻塞(blocked)态或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成。
    通常,一个进程在创建后将处于就绪状态。每个进程在执行过程中,任意时刻当且仅当处于上述三种状态之一。同时,在一个进程执行过程中,它的状态将会发生改变。引起进程状态转换的具体原因如下:
    (1)运行态一一等待态:等待使用资源或某事件发生,如等待外设传输;等待人工干预。
    (2)等待态一一就绪态:资源得到满足或某事件己经发生,如外设传输结束;人工干预完成。
    (3)运行态一一就绪态:运行时间片到,或出现有更高优先权进程。
    (4)就绪态一一运行态:CPU空闲时被调度选中一个就绪进程执行。

  • 了解完进程的基础模型之后,那么进程的生命周期都会围绕着 进程的创建和终止。

五态模型

  • 现存在一个问题,非运行态的进程是存在两种情况的:
  1. 存在一些处于非运行状态但已就绪等待执行的进程。
  2. 同时还存在着另外一些处于阻塞态等待I/O操作结束的进程。
  • 因此,如果只是运行一个单队列来执行所有未运行态的进程的话,显然是不合理的。
    为了解决上述问题,将非运行态分成两个状态: 就绪态(ready)和阻塞态(blocked,又称等待态)

  • 五态模型:
    在这里插入图片描述
    (1)NULL一一新建态:执行‘个程序,创建一个子进程。
    (2)新建态一一就绪态:当操作系统完成了进程创建的必要操作,并且当前系统的性能和内存的容量均允许。
    (3)运行态一一终止态:当‘个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结。
    (4)终止态一一NULL:完成善后操作。
    (5)就绪态一一终止态:未在状态转换图中显示,但某些操作系统允许父进程终结子进程。
    (6)等待态一一终止态:未在状态转换图中显示,但某些操作系统允许父进程终结子进程。

七态模型

  • 在了解七态模型之前,我们先看一看两个图片 如下:
    在这里插入图片描述
    I/O活动远慢于计算速度使得单道程序系统中的处理器大多数时间处于空闲状态。 图(b)还是没有解决这个问题。
    在图(b)中内存中保存有多个进程,当一个进程被阻塞时,处理器可移向另一个进程,但由于处理器远快于I/O,会出现内存中的所有进程都在等待I/O的现象。因此,多道设计,处理器还是多数时间仍处于空闲状态。

  • 所以在进程行为模型中,加入另外一个状态:挂起态
    当内存中的所有进程都处于阻塞态时,操作系统可以把其中的一个进程置为挂起态,并将它转移到磁盘,此时内存释放的空间就可被调入的另一个进程使用。

  • 但是又存在一个问题,即所有的已被挂起的进程都处于阻塞态,显然,这时把被阻塞态进程取回内存没有任何意义,因为它仍然未做好执行的准备。

  • 而且如果活动的进程很多的话,且所有的进程都有一部分在内存中时,则可能会导致虚存系统崩溃。
    因此,即可是在虚存系统中,操作系统也需要不时地根据执行情况完全显示的换出进程。

  • 所以:进程在等待一个事件(阻塞与否)还是已被换出内存(挂起与否)。为了容纳这2x2的组合,需要4个状体:

  1. 就绪态:进程已在内存中并可以执行。
  2. 阻塞态:进程已在内存中并等待一个事件。
  3. 阻塞/挂起态:进程已在外存中并等候一个事件。
  4. 就绪/挂起态:进程已在外存中,但只要载入内存就可执行。

在这里插入图片描述

引起进程状态转换的具体原因如下:

1.等待态—→挂起等待态:如果当前不存在就绪进程,那么至少有一个等待态进程将被对换出去成为挂起等待态;
操作系统根据当前资源状况和性能要求,可以决定把等待态进程对换出去成为挂起等待态。
2.挂起等待态—→挂起就绪态:引起进程等待的事件发生之后,相应的挂起等待态进程将转换为挂起就绪态。
3.挂起就绪态—→就绪态:当内存中没有就绪态进程,或者挂起就绪态进程具有比就绪态进程更高的优先级,
系统将把挂起就绪态进程转换成就绪态。
4.就绪态—→挂起就绪态:操作系统根据当前资源状况和性能要求,也可以决定把就绪态进程对换出去成为挂起就绪态。
5.挂起等待态—→等待态:当一个进程等待一个事件时,原则上不需要把它调入内存。但是在下面一种情况下,
这一状态变化是可能的。当一个进程退出后,主存已经有了一大块自由空间,
而某个挂起等待态进程具有较高的优先级并且操作系统已经得知导致它阻塞的事件即将结束,此时便发生了这一状态变化。
6.运行态—→挂起就绪态:当一个具有较高优先级的挂起等待态进程的等待事件结束后,它需要抢占 CPU,
而此时主存空间不够,从而可能导致正在运行的进程转化为挂起就绪态。另外处于运行态的进程也可以自己挂起自己。
7.新建态—→挂起就绪态:考虑到系统当前资源状况和性能要求,
可以决定新建的进程将被对换出去成为挂起就绪态。

程序、数据、栈、进程控制块(PCB)的集合称之为进程映像。
在这里插入图片描述

线程

进程和线程算是操作系统内两个很基本、很重要的概念了,进程是操作系统中进行保护和资源分配的基本单位,操作系统分配资源以进程为基本单位。而线程是进程的组成部分,它代表了一条顺序的执行流。
在这里插入图片描述
进程从操作系统获得基本的内存空间,所有的线程共享着进程的内存地址空间。当然,每个线程也会拥有自己私有的内存地址范围,其他线程不能访问。

由于所有的线程共享进程的内存地址空间,所以线程间的通信就容易的多,通过共享进程级全局变量即可实现。

同时,在没有引入多线程概念之前,所谓的『并发』是发生在进程之间的,每一次的进程上下文切换都将导致系统调度算法的运行,以及各种 CPU 上下文的信息保存,非常耗时。而线程级并发没有系统调度这一步骤,进程分配到 CPU 使用时间,并给其内部的各个线程使用。

在分时系统中,进程中的每个线程都拥有一个时间片,时间片结束时保存 CPU 及寄存器中的线程上下文并交出 CPU,完成一次线程间切换。当然,当进程的 CPU 时间使用结束时,所有的线程必然被阻塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值