首页 > 系统相关 >【OS系列】一文读懂进程的前世今生

【OS系列】一文读懂进程的前世今生

时间:2024-12-09 20:31:53浏览次数:14  
标签:今生 操作系统 并发 程序 读懂 进程 执行 OS 计算机

一、引子

文章开始之前,我们先思考几个问题:

  • 到底什么是进程?
  • 操作系统为什么要引入进程?
  • 进程的出现解决了什么问题?

本文我们来分析一下进程诞生的背景。进程的概念起源于操作系统,是操作系统最核心的概念,所以要想真正理解进程,我们需要从操作系统的起源讲起。

二、操作系统

什么是操作系统?

操作系统位于计算机硬件与应用软件之间,本质也是一个软件。
操作系统是计算机的【管理者】,负责管理硬件资源(如 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)中,调度时可以快速切换。

原创 摸鱼的Tom

标签:今生,操作系统,并发,程序,读懂,进程,执行,OS,计算机
From: https://www.cnblogs.com/o-O-oO/p/18595992

相关文章

  • 【docker】容器编排工具docker-compose常用命令
    一、官网https://docs.docker.com/compose/install/  二、命令介绍$docker-compose--helpDefineandrunmulti-containerapplicationswithDocker.Usage:docker-compose[-f<arg>...][--profile<name>...][options][--][COMMAND][ARGS...]docker......
  • 【Fiddler】iOS抓取全部显示“Tunnel to......443”
     前面的流程正常配置 IOS下载证书:IP+端口--192.168.XX.XX:8888正常情况能抓取,如果出现无法抓取到https请求,显示http灰锁,报443。 fiddler中log报错:由于远程方已关闭传输流,身份验证失败。解决方法(原因-默认的证书不符合Android和iOS的证书要求): (1)将电脑端中的证书,使......
  • 【保姆级教程】教你从零开始在飞牛云fnOS搭建WordPress网站并实现公网访问
    文章目录前言1.Docker下载源设置2.Docker下载WordPress3.Docker部署Mysql数据库4.WordPress参数设置5.飞牛云安装Cpolar工具6.固定Cpolar公网地址7.修改WordPress配置文件8.公网域名访问WordPress前言在数字化浪潮中,网站搭建已成为个人和企业在推广自身品......
  • Centos7.9实现远程挂载 nfs
    需求:现有2台华为云服务器(配置了同一个安全组,内网可以互ping),需要将192.168.0.141的/data/logs目录下的所有文件远程挂载到192.168.0.204的/data/logs目录下,采用了nfs的方式一、192.168.0.204配置如下1yuminstallnfs-utils23mkdir/data/logs4chmod755/data/logs......
  • ROS2话题模型代码解读
            本人在学习鱼香ROS2的过程中对代码还是有些不了解,于是把所写的代码进行解构分析其流程和逻辑,适合像我一样的初学者进行辅助学习。我们这里以c++代码为例。一、发布者1.cpp发布者全部代码为:#include"rclcpp/rclcpp.hpp"#include"std_msgs/msg/string.hpp......
  • Centos7安装Nginx教程,一步安装http和https
    nginx是一款轻量级web服务器,主要有负载均衡和反向代理的特性。安装准备nginx一些模块需要依赖lib库,所以先安装lib库,执行以下命令:[root@localhostlocal]#yum-yinstallgcc-c++pcrepcre-develzlibzlib-developensslopenssl-devel下载在官网下载安装包安装......
  • 百期PostgreSQL技术公开课进行时,已讲到第73期了
    PostgreSQL数据库是一个国际范围内开源免费的数据库技术,这些年一直呈上升趋势,基于PostgreSQL强大的性能和可扩展性,国内也有越来越多的企业开始了PostgreSQL数据库的研发,比如腾讯云TDSQL的PG版,华为的openGauss,阿里云PolarDB的PG版等等,可见PostgreSQL数据库在国内会“火”起来。为......
  • Sealos AI Proxy 发布!一个平台调用所有大模型,再也不用到处找 API 了
    你是一位开发者,你需要调用各类AI模型,每次调用模型,都要在不同的平台间反复横跳,你大概会遇到以下问题:获取APIKey流程繁琐:需访问多个厂商的官网,查阅各自的使用文档,并按照规定的步骤进行注册和申请。多平台支付:在调用来自不同厂商的模型时,需要在这些厂商的计费平台上进行支付......
  • 【人工智能】Moss-AI编程利器:CodeMoss & ChatGPT中文版超详细入门教程!(VScode/IDER/WE
    文章目录摘要一、环境介绍VSvode安装步骤IDER(Pycharm)安装步骤Web使用步骤二、Moss9大功能讲解1、AI问答对话2、文件上传功能3、自定义AI助手4、AI联网助手5、AI图片识别6、思维链思维链的简单介绍使用CodeMoss思维链7、AI图片生成图片生成效果8、图片生成代码9、......
  • 新建虚拟机 VMware17 + Centos7
    新建虚拟机选择自定义,以便于安装CentOS7。直接下一步选择稍后安装操作系统。选择Linux系统,版本选择centos7;如果自己的电脑是32位就选centos732位;如果自己的电脑是64位就选centos764位。设置虚拟机名称,以及安装位置某个处理器内核数量建议选2虚拟机内......