HICSC
001 进程管理:进程的基本概念

并发编程应该算是目前最火的主题之一,而并发编程的基础则是进程和线程的相关知识,因此,掌握好进程和线程,应该算是开发者的基本功吧。

那就从进程管理开始吧。

程序的执行顺序及其特征

程序的执行顺序分两种:顺序执行并发执行。顺序执行即必须在一个程序执行完成之后,才允许另外一个程序执行;后来,为了加快程序的执行速度,人们把一个程序分成若干个互不影响的步骤,这样就可以同时执行一批程序,即并发执行。

程序的这两种执行方式有显著不同,且特征明显,这里做简单的描述。

假设现在有一程序,我们将其执行过程分为如下三个步骤:I 代表输入操作,C代表计算操作,P为打印操作,字母下标代表不同的程序,那么程序的顺序执行和并发执行的大致示意图如下:

程序顺序执行和并发执行的简单示意图

顺序执行的三大特征:

并发执行的三大特征:

何为进程?

正是由于程序在并发执行时将失去封闭性,且具有间断性和不可再现性的特征。通常情况下,程序是不能并发执行的,因为程序的执行结果是不可再现的,这就使程序的运行失去了意义。为了能让程序并发的执行,并对并发的程序加以描述和控制,引入了进程的概念。

既然说进程可以保证程序可以并发运行,那首先看看进程里到底存储了什么?

进程的结构

思考一个问题:要让一个程序运行起来的基本条件有哪些?

首先,得有程序或者说代码来定义操作流程。

其次,程序运行的有数据输入,运行过程中还要产生数据,甚至是输出数据。

最后,还要有保证程序运行的基本环境。

因此,为使程序(含数据)能够独立运行,需要为其配置进程控制块,即PCB ( Process Control Block ),而程序段、相关的数据段、PCB三部分便构成了进程实体。由于程序是指令,是静态的,而数据则是运行过程中动态产生,唯有PCB可以用于描述和控制进程。因此,在通常情况下所说的进程,实际上是指进程实体,而创建进程,实质上是创建进程实体中的PCB,同样地,撤销进程,实质上是撤销进程实体的PCB。

关于PCB的更多内容,后面单独成文介绍。

进程的特征

1)动态性

进程的实质是进程实体的一次执行过程,因此,动态性是进程最基本的特征。其表现在:进程由创建而生,由调度而执行,由撤销而消亡。简单来说,就是进程实体具有生命周期。而程序只是一组指令集合,存放在某种介质上,其本身不具有运动的含义,因而是静态的。

2)并发性

并发性是指多个进程实体同时存在于内存中,并且能在一段时间内同时运行,这也是引入进程的最原始目的。

3)独立性

在传统的OS中,独立性是指进程实体是一个能独立运行、独立分配资源和独立接受调度的基本单位。

4)异步性

异步性是指进程实体按异步的方式运行,各自独立,按自己的速度向前推进。

最后,我们得出进程的定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。关于进程,曾经有许多人从不同的角度对其下过定义,如有遇见,不用太过纠结,你自己知道怎么回事即可。

拓展阅读:OS的几个核心组件或模型

调度器 ( Scheduler )

在单核计算机里,有一个资源是无法被多个程序并行使用的:CPU。

没有操作系统的情况下,一个程序一直独占着全部CPU。

如果要有两个任务来共享同一个CPU,程序员就需要仔细地为程序安排好运行计划:某时刻CPU由程序A来独享,下一时刻由程序B来独享。而这种安排计划的工作,后面被单独拎了出来,成为OS的核心组件,被单独名命为「Scheduler」,即:调度器,它关心的只是怎样把单个CPU的运行拆分成一段一段的“运行片”,轮流分给不同的程序去使用,而在宏观上,因为分配切换的速度极快,就制造出多程序并行在一个CPU上的假象。

内存管理模块 ( Memory Management )

在单核计算机里,有一个资源可以被多个程序共用,然而会引出麻烦:内存。

在一个只有调度器,没有内存管理组件的操作系统上,程序员需要手工为每个程序安排运行的空间:程序A使用物理地址范围是0x00 - 0xff,程序B使用物理地址范围是0x100 - 0x1ff,等等。

然而这样做有个很大的问题:每个程序都要协商好怎样使用同一个内存上的不同空间。稍有差错,就会导致程序运行出现错误,甚至是崩溃。

为了解决这个麻烦,计算机系统引入了虚拟地址的概念,从三方面入手来做:

线程

现在,不同的应用程序,可以不关心底层的物理内存分配,也不关心CPU的协调共享了。

然而还有一个问题存在:有一些程序,想要共享CPU,并且还要共享同样的物理内存,这时候,一个叫线程的模型就出现了,它们被包裹在进程里面,在调度器的管理下共享CPU,拥有同样的虚拟地址空间,同时也共享同一个物理地址空间,然而,它们无法越过包裹自己的进程,去访问别一个进程的物理地址空间。

在有的操作系统里,进程不是调度单位 ( 即不能被调度器调度 ),线程是最基本的调度单位,调度器只调度线程,不调度进程,比如VxWorks ( 在VxWorks中被称为任务,任务的概念与线程大致相当 )。

Comments

Post a Message

人生在世,错别字在所难免,无需纠正。

提交评论