![](https://i-blog.csdnimg.cn/blog_migrate/b6e90f212c96f638856129680c2db3f0.gif)
一、什么是进程
1.1 操作系统
学习进程之前首先要了解我们的操作系统(OS),我们的操作系统实际上也是一款软件,属于系统软件的范畴,操作系统早期采用命令提示框与用户交互,我们启动某个软件,打开某个文件夹等等,都是需要输入命令来进行操作的 典型的就是 Linux 操作系统,也是职场中常用的一款操作系统,我们现在常用的 Windows 系列的操作系统,是一款图形化操作界面的操作系统,用户使用鼠标点一点,划一划就执行对应的操作,所以对于大众来讲是一款好用的操作系统,但是对应的存储空间(内存)的占用是远远大于命令提示的操作系统。
![](https://i-blog.csdnimg.cn/blog_migrate/45eb72874f54b31648ef9466271250e3.png)
Windows 启动应用是双击应用的快捷方式图标,以qq 为例:
我们桌面的快捷方式可以理解为是 .exe 文件的“超链接”,鼠标选中快捷方式,右击,选择属性,打开文件所在位置,我们就来到了当初我们安装qq 应用时目录,链接对应了一个 .exe 文件的,我们直接双击 .exe 文件也是可以直接启动qq 的。 那么 . exe 是什么文件呢。
![](https://i-blog.csdnimg.cn/blog_migrate/38b882eb9e644f92e0f7f71a91297ceb.png)
EXE可执行文件,就是在 WINDOWS环境下,你双击直接就能打开的文件,EXE File英文全名executable file ,译作可执行文件,可移植可执行 (PE) 文件格式的文件,它可以加载到内存中,并由操作系统加载程序执行,是可在操作系统存储空间中浮动定位的可执行程序。
操作系统有什么用呢?我觉得是:控制计算机各部件协调一致的运行,
在硬件层面需要管理好各种硬件设备,比如说,键盘,鼠标,硬盘,当时适配这方面主要是靠主板支持,操作系统能够适配支持并管理硬件。
在软件层次,操作系统需要给软件提供稳定的运行环境,当然软件在这个方面是需要去适配操作系统的,如果操作系统不支持你这软件运行,那也是白给。
可以理解为:操作系统是软件和硬件之间的桥梁,是计算机的灵魂。
有了操作系统之后呢,软件就可以通过操作系统来间接的操作某个硬件设备。
1.2 进程的概念 (process)
上面提到我们 windows 中支持的一种 .exe 的运行文件,当我们双击启动这个文件时,这个程序就跑起来了,那么在系统中就会形成一个进程。
不知道有没有学习过C语言的朋友,一个 ".c" 文件到 ".exe "文件需要经过:预编译、编译、汇编、链接,中间会涉及到3个文件。
在C语言中,源程序(.c文件)经过编译程序编译之后,会生成一个后缀为“.obj”的二进制文件(称为目标文件);最后还要由称为“连接程序”(Link)的软件,把此“.obj”文件与c语言提供的各种库函数连接在一起,生成一个后缀“.exe”的可执行文件。”
![](https://i-blog.csdnimg.cn/blog_migrate/173ca940c0cd613df5483e53bad4e808.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a700d390b29acf720f7f2a5a08dfd5ae.png)
.exe 文件也可以理解为里面包含了许多二进制的指令,可以在 Windows 系统上运行,. exe 文件的启动加载在内存中运行后,其中指令的处理是交给 CUP (中央处理器)来处理的。
对于 Java 代码来说,我们会创建 “.java”文件,java 文件经过我们的JDK (javac命令)编译后,会生成 “.class”文件,也叫字节码文件,里面也是二进制指令,只是 .class 文件需要在 JVM(java虚拟机) 中才可以运行,这也是 java 只要生成了.class 文件, 就可以到处运行,只要用户安装了 JDK 即可
![](https://i-blog.csdnimg.cn/blog_migrate/c099699ecedd4bb1d41f309c503b081c.png)
无论是哪一种语言,计算机之所以可以运行的最主要的原因是,它最终会生成 二进制文件,然后被 CPU 处理。
上面说到当我们运行某个应用程序的时候,就相当于生成了一个进程,当然每生成一个进程,操作系统就会为其分配内存空间,由CPU 处理其中的数据,我们可以通过任务管理器来查看 我们电脑目前进程运行的状态。
![](https://i-blog.csdnimg.cn/blog_migrate/c44cfbd7f2ed363404ea62381dfda7a9.png)
我们通过任务管理器就可以发现,原来电脑有许多进程在运行呢。
操作系统对进程的管理有两步:
1. 使用一个构架来描述这个进程,(C 语言的结构体,Java 的类),把进程基本信息表示出来。
2. 底层使用一种数据结构来将这些进程组织起来,放在一起,想象链表 每个value 值是一个进程
CPU 就可以遍历这种数据结构,从而达到处理数据的目的。
此时我们对进程是什么东西应该是有了一个大概的理解:
总结:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,可以把进程看做程序的一次运行过程。
进程在运行的是会消耗资源的,比如:运行消耗内存,会涉及到数据的访问——硬盘,数据的处理——CPU等一系列操作
进程是操作系统分配资源的基本单位
1.3 进程的基本属性
上文我们初步认识到了进程个什么东西:进程看做程序的一次运行过程。
现在我们认识进程的几个重要的基本属性:
进程的ID(PID)
每一个进程都有一个非负整型表示的唯一进程ID(PID),好比方我们的身份证一样,每一个人的身份证号是唯一的。
内存指针
看名字大致也能理解是啥意思,就是起一个标识的作用,当前进程在内存的那一部分运行。
文件的描述表
“文件”是硬盘存储数据、整理数据的基本单位,可以看到我们的下载某个软件的安装包在安装的时候会生成一个文件夹进行管理,那么进程在运行的过程当中难免会打开一些文件来访问数据,此时,进程每打开一个文件就会产生一个“文件描述符”(标识被打开的文件,文件相关信息),然后创建对应的一个顺序结构,用于存放这些文件标识符,那么这个顺序结构就被我们称之为“文件描述符表”,我们在对文件的读写操作的时候就会使用到“文件描述符“的信息。
进程的调度
接下来这组属性是进程学习中非常重要的一个知识点。
1.4进程的调度
在软件层次,操作系统给软件提供的稳定的运行环境,进程是操作系统分配资源的基本单位,当一个进程运行时,操作系统会为其开辟内存空间,提供硬盘上的访问权限,以及CPU ……
CPU (中央处理器) 主要是负责 处理指令、执行操作、控制时间、处理数据四大作用, 咱们的程序能运行,靠的就是CPU , 每个程序就相当于一组“二进制指令”的集合,.exe 文件, . class 文件都是二进制文件。
我们先来简单的了解一下CPU :
CPU 的字长:
字长是指CPU在同一单位时间内—次能够处理的二进制位数。CPU的字长主要根据运算器和寄存器的位数确定。比如,一个CPU有32位的寄存器,并且一次处理32个二进制位,字长值越大,一次可处理的数据二进制位数越多,运算能力就越强。目前CPU大多是32位或64位。
CPU 的主频:
CPU的主频是指CPU的时钟频率,它是决定执行指令速度的计时器,通常用MHz(兆赫兹)和GHz(千兆赫兹)来度量。1MHz相当于1秒内有1百万个时钟周期,1GHz相当于1秒内有10亿个时钟周期(10亿条指令)。
CPU 的核心数:
常见的CPU核数有双核、四核、六核、八核、十二核等。在内核频率、缓存大小等条件相同的情况下,CPU内核数量越多,CPU的整体性能越强。比如3.8GHz的6核CPU就比3.8GHz的双核CPU性能要强。有些CPU的单核就非常强大(inter 系列的CPU 的每个单核心是比较强大的,即使核心线程数量不是很多,也不比普通的多核心的CPU 差),对于 AMD 系列的 CPU 来讲,多核心多进程在这方面是可以的(在同等价格上)。
我们也经常听说 CPU 是几核 多少线程, 例如 :8核 16 线程,每个核心就相当于有一个人干活,八个核心就是八个人干活, 16 线程啥意思嘞,一个CPU 核心,可以同时、并行的运行两个线程。就是说一个CPU核心一个人顶俩人干活(一个 CPU 的物理核心内部有两个逻辑的处理单元), 8 核 16线程, 8个人可以同时干16 个人的活,我启动qq,启动微信,启动 qq 音乐,腾讯视频,我一口气启动18 款应用, 8核16 线程的CPU 可以运行吧。
![](https://i-blog.csdnimg.cn/blog_migrate/73a7e464f09fd8b622dc2aabe1961dcd.png)
博主电脑的CPU是 4 核 8 线程的,基准速度就是CPU的主频率 3.11 GHz (一秒钟 31亿条指令),但是我们可以看到,现在博主电脑有220 个进程同时在运行,我的 CPU 只有区区的四核,那岂不是妥妥的狼多肉少。
1.4.1 CPU 处理进程的方式
并行:
例如:在同一时刻,两个核心,同时执行两个进程,此时我们可以认为这两个进程是并行执行的。
博主的CUP 4 核 8 线程,能同时执行 8 个进程,这些进程每个都有一个独立的核心处理数据,这就是并行处理的方式。
并发:
一个核心,先执行 进程1,执行一定的时间后,再执行进程2,执行一定的时间后,再执行进程3……最后又执行进程1,如此以往,只要核心切换的速度足够快,那么这些进程之间就相当于“同时”执行的,我们讲这种操作成称之为“并发"。
所以即使博主 CPU 只有8 个逻辑处理核心,采用并发的方式也是可以“同时”执行 200+ 的进程的,CPU 处理数据的速度是非常快的,所以进程之间来回切换人眼是无法感受到的,宏观上是同时执行的。
对于多进程之间的处理,具体那个 核心并发处理那些进程,是由操作系统分配的,也就是说如果操作系统不支持并发的处理数据,你的CPU 核心数再多也白搭。也不是说系统中不存在 并行操作,我们很多的时候把 “并行” 和 "并发" 统称为并发。
当一个核心并发的处理特别多的任务(比如说:一万个任务)的时候,我们就可以称之为”高并发“。
1.4.2 并发执行的基本属性
上文,讲述了处理 多进程多任务的两种方式,接下来给大家讲讲进程在并发的过程中,涉及到的基本的知识点。
进程的状态
运行态:进程占有处理器正在运行。
就绪态:一个进程已经准备好随时被CPU 执行。
阻塞态:指进程不具备运行条件,暂时无法执行。
通常,一个进程在创建后将处于就绪状态。每个进程在执行过程中,只能是上述三种状态之一。
同时,在一个进程执行过程中,它的状态将会发生改变。引起进程状态转换的具体原因如下:
(1)运行态一一等待态:等待使用资源或某事件发生,如等待外设传输;等待人工干预。
(2)等待态一一就绪态:资源得到满足或某事件己经发生,如外设传输结束;人工干预完成。
(3)运行态一一就绪态:运行时间片到,或出现有更高优先权进程。
(4)就绪态一一运行态:CPU空闲时被调度选中一个就绪进程执行。
进程的优先级
进程之间的调度时间上的分配不一定是公平的,有的需要优先调度,比如操作系统的进程……
进程的上下文
进程在并发处理的状态下,处理器会循环在各进程之间进行切换处理,上下文就是描述当前进程执行到哪里的(执行到了那条指令)“存档记录”,进程在“暂时" 离开CPU 的时候就会将运行时的中间结果存档,等 CPU 下次再执行该进程的时候,根据“存档记录”恢复到上次执行的状态,然后继续对该进程往后执行。
其中的处理过程会涉及到 CPU 其中的寄存器,CPU 的寄存器会动态的维护操作系统为进程分配的空间包括“存档记录”,当进程离开CPU 的时候,就需要把这些寄存器的值保存在PCB 的上下的字段中,当CPU 下次继续执行该进程的时候,CPU 的寄存器会重新维护我们的进程(把PCB 中的值给恢复到上下文的字段中),所谓的上下文具体指的就是进程运行过程中,CPU 内部的一系列存储器维护的值。
秒懂百科对 PCB 的解释:
为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
进程的记账信息
为了统计每个进程在 CPU 上执行的时间,可以作为进程调度的参考依据,当某个进程执行的时间相对较长,或者是相对较短,操作系统就可以根据进程的记账信息,对进程做出相应的处理。
进程的组织
操作系统会使用双向链表这样的结构来组织进程
创建一个进程,就是创建一个链表的节点
销毁一个进程就是把链表的节点删除了
遍历进程列表,就是在遍历链表
![](https://i-blog.csdnimg.cn/blog_migrate/f3464f06eae77076843da8bc275647e4.png)
1.5 内存的分配
每个进制在执行的时候,操作系统会给进程分配内存,用于执行,不同的进程使用的是不同的区域,进程之前互相之间不会干扰。
那么操作系统是怎么保证各进程之间不会相互干扰呢?
操作系统给进程分配的内存空间,是以“虚拟地址空间”的形式进行分配的。
![](https://i-blog.csdnimg.cn/blog_migrate/94f366f37c9a7608bedbd7171d3be917.png)
站在这两个进程的角度来讲,他们操作的是页表生成的虚拟地址,进程对内存的访问会受到页表的检查,如果该进程访问的虚拟内存的地址(越界等)不在页表的记录中,页表就无法映射出真实的内存地址,不会去执行操作,也就无法真正的修改真实的内存的值。
这样就避免了进程之间的相互影响,最大的目的就是为了方便校验当前地址是否有效,也提升了操作系统的稳定性。
一个进程无法直接干涉另一个进程的内存数据。
进程具有独立性,每个进程有自己独立的地址空间
1.6 进程的通信
进程具有独立性,但是有些时候进程之间需要进行交互,进程通信是指在进程间传输数据(交换信息)。例如:启动腾讯视频,如果你qq在线,就可以直接点击qq登录,也就不需要再输入账号密码验证了,验证操作已经在 qq 执行过了,就会很方便,检索的信息也是来自qq 提供的账号密码信息。
进程之间的通信就是在进程相互独立的情况下,找一个公共区域,然后进程之间通过这个公共区域进行数据交换。
并发进程之间的相互通信是实现多进程间协作和同步的常用工具.具有很强的实用性,进程通信是操作系统中极为重要的部分。
至此,进程的基本认识博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。
![](https://i-blog.csdnimg.cn/blog_migrate/6481274e55b0da4d1a06f3e6118d2f75.jpeg)
本期收录于博主的专栏——JavaEE,适用于编程初学者,感兴趣的朋友们可以订阅,查看其它“JavaEE基础知识”。
下期预告:线程的概念
感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘