进程是计算机操作系统中非常重要的概念。是一种非常重要的抽象。
一、为什么要引入进程这个概念?
先从计算机的体系结构——冯诺依曼体系结构。它是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同。这个体系结构有三大原则:采用二进制逻辑、程序存储执行和计算机由五大部分组成。这五大部分是:运算器、存储器、控制器、输入设备、输出设备。
这种结构特点是“程序存储,共享数据,顺序执行”,需要 CPU 从存储器取出指令和数据进行相应的计算。
这种操作系统有以下几个特点:
(1)单处理机结构,机器以运算器为中心;
(2)采用程序存储思想;
(3)指令和数据一样可以参与运算;
(4) 数据以二进制表示;
(5)将软件和硬件完全分离;
(6) 指令由操作码和操作数组成;
(7)指令顺序执行。
这里的存储器包括了:内部存储器(也就是内存)和寄存器。其中寄存器、控制器和运算器共同构成了CPU。这是一个以存储器为核心的计算机体系结构。所以存储交换数据的快慢很大程度上决定了计算机的速度。此外可以发现指令是顺序执行,也就是说处理器是串行执行指令的。
这种串行特点在应对多个作业(也叫做程序吧)的时候,就必须把作业一个个做完,一旦其中一个作业是I/O密集型的话,限制作业执行效率的因素就是I/O的读写速度,且大多数时候CPU是空闲的。使得在处理多个作业时,整体效率偏低。为了提高CPU的利用率,那么最好的方式就是让CPU并行地处理这些作业。但是实际上CPU是串行工作的。这该怎么办呢?
这里要谈到两个概念“并行”、“并发”:并行是指同时处理多个任务,并发是指由处理多个任务的能力,但是实际上不一定要同时进行。
所以只能串行执行任务单核CPU为了看起来像是能够同时执行多个任务,采用了并发的方式同时处理多个任务,看起来像是并行那样。并发技术的实现相当复杂,最容易理解的就是“时间片轮转进程调度”算法。我们这里先理解成有多个任务,所有的任务轮流使用CPU,每个任务占用CPU的时间非常短。使得用户根本感觉不到CPU是在轮流为多个任务提供服务,就好像多个任务在不间断地运行那样。但是实际上在任何一个时间内,只有一个任务占用着CPU。所以这里就是理解并发的关键,它不是并行,因为CPU本质是串行的,只是通过并发技术使得其看起来像并行。
但是并发运行产生了一些问题,
1、间断性:任务A和任务B根本没啥关系,它们俩是并发执行的,一会儿执行任务A,一会儿执行任务B。
2、失去封闭性:并发执行的程序,系统中的资源都是共享的,那么任务A执行了的时候改变了资源的状态,在任务B来执行时发现状态改变了,不知它之前想要的状态。这就使得任务A和任务B相互影响。
3、不可再现性:就是由于程序的运行速度不同,程序的运行环境也有影响,则程序多次执行,虽然它们的初始条件一样,但是运行的结果不一样。因为这个可程序在运行时由于并发,每次运行的环境都不一样,每次运行都是独一无二的。
以上都是并发的问题,这可怎么办。但是进程的概念的引入很好地解决了上述问题。
======================================================================
二、什么是进程
引入进程的概念是为了使得计算机在多程序环境下并发执行,并且能够对并发执行的程序加以控制,规避上述的问题。
从不同的角度去看进程,可以得出不同的概念和定义。有时候这些描述把进程这个概念刻画地越来越玄乎,越来越琢磨不透。
所以一开始我讨论的不是进程是什么,而是为什么要引入进程这个抽象的概念。梳理一下逻辑线条:
冯诺依曼计算机体系结构--->CPU在执行多任务时效率不高---->采用并发设计克服,提升CPU效率---->并发设计引入新的问题---->引入进程概念解决这些问题
我先解读一下程序的概念,上述表述的任务,在这里也可以解读为程序。
程序就是一堆指令和数据的集合,程序的目的是让CPU按照顺序读入指令串行地执行下去,去完成特定的任务。
程序在进入内存之前是存放在磁盘上的,也叫做外存储器。内存是运行存放运行中的程序。程序本身是一个静态的概念。
那么如何描述运行中程序呢?如何在并发时很好地克服上述问题,很好地控制和描述程序的运行?
需要一个新的概念,这就是——进程。进程可以理解为运行中的程序。或者理解成程序动态运行中的实例。
进程这个抽象概念被创造出来,当然也被计算机赋予了一些重要的意义。
进程是计算机操作系统资源分配的基本单位。进程的概念甚至成为操作系统的基础。
从物理上来看进程是有程序代码、代码相关的数据集以及进程控制块组成的。
进程是动态的概念,就是运行中的程序。是一个很好地方式去描述运行中的程序。其实引入进程就是体现了封装和分治的思想来解决上述并发的问题。让程序之间在轮流使用一个CPU的时候不会相互影响。
进程控制块(PCB)是一个重要的数据结构,操作系统就是通过进程控制块感知进程的存在。
PCB保存了很多关于进程相关的信息。如下:
标识符 (就是进程的ID,身份证)
状态
优先级
程序计数器
内存指针
上下文数据
I/O状态信息
记账信息
进程很好地解决了CPU的利用率问题,使得CPU高效利用:
所有的应用程序以进程的方式运行在比操作系统权限更低的级别。
每个进程都有自己独立的地址空间;使得进程之间的地址空间相互隔离。
CPU由操作系统进行统一分配,每个进程根据优先级都有机会得到CPU。具体来讲就是进程的调度方面的知识;
总体目标是使得每个进程从逻辑上看来都可以独占计算机的资源。
另外也使得CPU能在多个进程之间很好地共享。
原文地址:https://www.cnblogs.com/grooovvve/p/11605178.html