一、引子
文章开始之前,我们先思考几个问题:
- 到底什么是进程?
- 操作系统为什么要引入进程?
- 进程的出现解决了什么问题?
本文我们来分析一下进程诞生的背景。进程的概念起源于操作系统,是操作系统最核心的概念,所以要想真正理解进程,我们需要从操作系统的起源讲起。
二、操作系统
什么是操作系统?
操作系统位于计算机硬件与应用软件之间,本质也是一个软件。
操作系统是计算机的【管理者】,负责管理硬件资源(如 CPU、内存、存储)和软件运行,为用户和程序提供使用计算机的接口。
为什么需要操作系统?
简单说就是为用户程序提供一个更简单、更清晰的计算机模型,并管理CPU、内存等硬件资源。
2.1 操作系统的发展史
背景
:
早期计算机(如 ENIAC)主要用于科学计算,用户直接操作硬件。
特点
:
无操作系统:程序员和计算机之间的交互完全依赖于手工操作,缺乏统一的资源调度和管理。
人工操作:人工调度任务,无自动化。
问题
:
效率低,计算机只能运行单个任务。
背景
:
由于当时的计算机非常昂贵,人们自然希望减少机器的空闲时间。为此,批处理系统应运而生。
特点
:
作业队列:作业不再由用户手动操作,而是排入队列,计算机自动依次执行,提高了计算机的利用率。
操作系统的雏形:出现了管理计算资源的早期软件,即操作系统。
程序设计语言的出现:FORTRAN 等高级语言的引入,使编程更加高效、抽象。
进程管理的雏形:为支持多个作业的高效管理,出现了早期的进程概念。
问题
:
人工参与:尽管作业可以自动排队执行,但作业的提交和结果处理仍需要人为干预,流程不够完全自动化。
顺序计算:作业按照先后顺序依次执行,缺乏并行处理能力。
背景
:
随着计算机硬件的逐步提升和计算任务的增加,单一程序的顺序执行效率无法满足需求。用户希望能够同时运行多个程序,提高系统资源的利用率。
特点
:
并发的初步探索:多道程序设计允许计算机将多个程序同时加载到内存中,通过时间共享的方式交替运行不同的程序。
进程的概念:随着多个程序并发运行,进程管理逐渐成为操作系统的重要组成部分,操作系统开始提供进程调度、内存管理等机制。
背景
:
随着计算机硬件(如CPU性能和内存容量)的进步,计算机系统开始支持多个用户同时访问。分时系统(Time-Sharing) 因此诞生。
特点
:
真正的多任务操作:分时系统允许多个用户同时使用一台计算机,每个用户有自己的虚拟时间片。
进程调度和管理:系统需要实现更加复杂的调度算法,以公平合理地为多个用户分配计算资源。
共享系统资源:多个用户共享计算机资源,如何避免用户之间的干扰和资源争夺成为了新问题。
背景
:
工业控制、航空航天等领域需要对外界输入迅速做出反应。
特点
:
保证任务在规定时间内完成,具有强实时性和可靠性。
背景
:
个人计算机的兴起,计算机走向家庭和办公场景。
特点
:
面向单用户设计,操作简单。
背景
:
用户对计算机的需求从命令行操作转向更直观的界面。
特点
:
图形用户界面(GUI)使用户通过鼠标点击和窗口操作计算机。
背景
:
互联网的兴起,计算机开始联网协作。
特点
:
操作系统集成了网络功能,支持多用户远程操作。
背景
:
移动设备(智能手机、平板)和物联网(IoT)设备兴起。
特点
:
专为资源受限设备设计,具有低功耗、轻量化特点。
三、进程
3.1 进程诞生的背景
计算机刚出现的时候,是为了解决数学计算的问题,因为很多大量的计算通过人力去完成是很耗时间和人力成本的。
在最初的时候,计算机只能接受一些特定的指令,用户输入一个指令,计算机就做一个操作。当用户在思考或者输入数据时,计算机就在等待。显然,这样效率会很低下,因为很多时候,计算机处于等待用户输入的状态。
那么,能不能把一系列需要操作的指令预先写下来,形成一个清单,然后一次性交给计算机,计算机不断地去读取指令来进行相应的操作?
就这样,批处理操作系统诞生了。用户可以将需要执行的多个程序写在磁带上,然后交由计算机去读取并逐个地执行这些程序,并将输出结果写到另一个磁带上。
虽然批处理操作系统的诞生极大地提高了任务处理的便捷性,但是仍然存在一个很大的问题:假如有两个任务 A 和 B,任务 A 在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU 只能静静地等待任务 A 读取完数据才能继续执行,这样就白白浪费了 CPU 资源。
如下图所示:
人们于是想:
能否在 任务 A 读取数据的过程中,让 任务B 去执行;
当 任务A 读取完数据之后,让 任务B 暂停,然后让 任务A 继续执行?
但是这样就有一个问题,原来每次都是一个程序在计算机里面运行,也就说内存中始终只有一个程序的运行数据。而如果想要 任务A 执行 I/O操作 的时候,让 任务B 去执行,必然内存中要装入多个程序,那么如何处理呢?多个程序使用的数据如何进行辨别呢?并且,当一个程序运行暂停后,后面如何恢复到它之前执行的状态呢?
这个时候,人们就发明了进程,用进程来对应一个程序,每个进程对应一定的内存地址空间,并且只能使用它自己的内存空间,各个进程间互不干扰。并且,进程保存了程序每个时刻的运行状态,这样就为进程切换提供了可能。当进程暂停时,它会保存当前进程的状态(比如进程标识、进程的使用的资源等),在下一次重新切换回来时,便根据之前保存的状态进行恢复,然后继续执行。
正是进程的诞生,让并发成为可能。
3.2 进程的定义
进程是一个程序在计算机中执行的实例。它不仅包括程序的代码,还包括程序的当前状态、资源(如内存、CPU时间等)、程序计数器、堆栈和数据等。 进程是操作系统进行资源管理和调度的基本单位。
简单来说,进程就是程序在运行时的【容器】,它包含了程序执行所需要的一切资源和信息。当你启动一个应用程序时,操作系统会为该程序创建一个进程,以便管理和执行。
如下图所示:
3.3 进程的特点
在多道程序环境下,多个程序可以同时执行,这时它们的执行变得不再是线性的。由于多个程序交替执行,它们的运行会被中断,且每次执行的顺序和结果可能不同,这使得程序本身失去了原有的封闭性和可预测性。简单来说,程序执行的结果可能会因为并发执行而变得不可再现,这让程序在并发环境下变得不太适用。
为了让程序能够在这种并发环境下正确运行,并且能够对这些并发程序进行管理和控制,操作系统引入了进程的概念。
我们来分析一下进程的核心特点:
1、独立性:进程是系统中资源的独立单位,拥有自己的地址空间、数据、堆栈和程序计数器等。每个进程之间相互独立,彼此不直接干扰。
2、隔离性:进程之间相互隔离,一个进程的崩溃或错误不会直接影响到其他进程。操作系统通过虚拟内存、进程控制等机制确保这种隔离。
3、并发性:在多任务环境中,多个进程可以同时执行,操作系统通过时间片轮转等方式调度它们的执行。虽然计算机只能在某一时刻执行一个进程,但由于快速切换,多个进程看起来是同时运行的。
四、总结
我们回到文章开头的几个问题。
4.1 操作系统为什么引入进程?
在多道程序环境下,多个程序可以同时执行,这时它们的执行变得不再是线性的。由于多个程序交替执行,它们的运行会被中断,且每次执行的顺序和结果可能不同,这使得程序本身失去了原有的封闭性和可预测性。简单来说,程序执行的结果可能会因为并发执行而变得不可再现,这让程序在并发环境下变得不太适用。
通常的程序是不能参与并发执行的。为了让程序能够在这种并发环境下正确运行,并且能够对这些并发程序进行管理和控制,操作系统引入了进程的概念。
通过引入进程,操作系统能够更好地管理计算机资源,支持多任务并发执行,同时提高系统的稳定性和效率。
4.2 到底什么是进程?进程和程序的区别。
无论是 Java 代码还是 Python 代码,它们本质上只是静态的文件。当我们将 Java 代码编译成二进制文件后运行,这段代码就从静态的文件转变为一个正在运行的程序。我们把这个运行中的程序称为进程。
进程本质上是操作系统中正在运行的程序的一个实例。它是程序的执行过程,包含了程序代码以及执行过程中所需的资源(如内存、CPU时间、I/O设备等)。
4.3 进程如何配合操作系统实现并发?
1、进程的独立性与隔离:
每个进程都有独立的地址空间和资源,这由操作系统分配并管理,确保一个进程的操作不会干扰其他进程。
隔离性解决了多个程序并发运行时的资源冲突问题。
2、调度机制:操作系统通过调度器对多个进程进行管理,利用时间片轮转或优先级调度等算法,让多个进程在一个 CPU 上并发运行。
3、进程状态管理:进程的执行状态(如寄存器内容、程序计数器等)存储在进程控制块(PCB)中,调度时可以快速切换。
标签:今生,操作系统,并发,程序,读懂,进程,执行,OS,计算机 From: https://www.cnblogs.com/o-O-oO/p/18595992原创 摸鱼的Tom