操作系统的进程详解

171 阅读4分钟

前言

这将是一个系列,一个关于进程、线程和 协程的系列。

主要用于:回顾和复习以往所学的知识 以及 希望这点经验能够帮助正在学习编程的你

最初的几章会讲到一些相关的计算机理论知识,可能相对枯燥。但这是基础,是理解后面程序必备的概念。如果有疑惑,可以加微信讨论,咱们一起进步。

相关概念

  • 虚拟内存:虚拟内存是一种计算机系统内存管理技术。它使得进程认为自己拥有连续的可用内存。然而实际上,这些内存在物理上被分割成多个物理内存碎片。

  • 多道程序设计技术:多道程序设计技术是指在内存同时放若干道程序实例(进程),使它们在系统中并发执行,共享系统中的各种资源。当一道进程暂停执行时,CPU立即转去执行另一道进程。

  • 进程: 一个进程就是一个正在执行程序的实例,包括程序计数器(PC),寄存器和变量的当前值。(这句话要细细品)

进程的意义

  • 进程是系统进行资源分配的基本单位,是线程的容器。

拓展:在当下流行的分时操作系统中,每个进程都认为自己拥有全部的内存资源(一个连续完整的地址空间)和CPU资源。进程间的资源是相互隔离的,互不影响。所以我们说,进程是系统进行资源分配的基本单位。这依赖于虚拟内存技术和分时系统的发展,这又是另一个比较大的话题,我们会在以后的文章中讨论这个话题。

系统对进程的描述

拓展:进程的地址空间分为内核空间用户空间,这里简单介绍一下从系统角度是如何描述一个进程的,不是重点内容。

进程空间中的内核空间(进程控制块——PCB,属于)——用于描述和控制进程运行的通用数据结构,使进程能够独立运行。PCB包含的主要信息:

名称

内容

标识符

唯一标记一个进程

状态

记录进程运行的当前状态

程序计数器(PC)

记录下一条指令的地址

内存指针

指令、数据的内存地址

上下文数据

运行状态下使用的数据

IO状态信息

文件、设备占用情况

记账信息

处理器时间、时钟统计

进程空间中的用户空间:

名称

内容

栈(stack)

保存局部变量、函数参数、返回地址等

堆(heap)

进程在运行过程中,动态分配的内存。例如,创建新的对象所产生的空间,就是堆内存分配的。

BSS段

用于保存未初始化或初值为0的的全局变量和静态局部变量。

数据段

用于保存已初始化或初值非0的全局变量和静态局部变量

代码段

可执行代码、字符串字面值、只读变量

进程的生命周期

拓展:刚开始学编程的同学往往会被各种专业术语劝退。这里为新手介绍一下生命周期的概念。如果有程序员说 某某的生命周期,那么就是说,这个程序的实例(也就是对象)从被创建到被销毁这一个过程中必须要经历的节点。

创建、就绪、阻塞、执行、终止,这被称为进程的五态模型,其中就绪、阻塞、执行这三个在整个生命周期中交替执行。这里我们重点掌握中间的三个状态。

  • 系统在创建进程时会先分配PCB,我们把拥有PCB但其他资源未就绪的状态称之为创建状态。非常短暂。

  • 当其他资源都准备好、只要在获得CPU资源就可以立即运行的状态——就绪状态。在一个系统中,处于就绪状态的所有进程被保存在就绪队列,等待系统调度执行。

  • 当就绪状态的进程获得CPU资源,进程的状态就变为了执行状态

  • 正在运行的进程由于提出系统服务请求(如I/O操作),但因为某种原因未得到操作系统的立即响应,或者需要从其他合作进程获得的数据尚未到达等原因,该进程只能请求系统把自己阻塞,阻塞的进程被保存在阻塞队列中,等待相应的事件出现后才被唤醒。这种状态我们称之为阻塞状态

  • 进程销毁时,会先清理分配的内存资源,然后归还PCB。这个过程称之为终止状态

今天的进程就先讲到这里,明天我们继续讲线程。