一、进程的概念
进程(Process)是指计算机中已运行的程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。进程是程序真正运行的实例,若干进程可能与同一个程序相关,且每个进程皆可以同步或异步的方式独立运行。
例如:
这些.exe文件被称为 可执行文件 ,在你双击它们之前都是静静的待在硬盘上面的,不会对你的系统产生任何影响。但是一旦你双击执行,操作系统就会把这个.exe文件加载到内存,并且让CPU开始执行exe文件内部的一些二进制指令,这个时候这个exe文件已经运行起来了,并不在躺平。我们把这个运行起来的exe文件称为 进程。
二、操作系统如何管理进程
从概念中我们可以知道,一个进程想要运行起来是需要依赖于操作系统的,那操作系统具体是如何来管理进程的呢?
2.1 描述进程-PCB
第一,操作系统先描述一个进程,明确一个进程上面的相关属性。而操作系统用来描述这个进程属性的结构体我们称为 PCB(process control block):进程控制块 。上述情况是指一个进程中只存在一个线程,而实际中一个进程包含若干线程,而每一个线程才称为一个 PCB。至于什么是线程,我们后面马上会接触到。
PCB中又具体包括哪些属性呢?如下:
1、pid(进程id): 进程的身份标识,相当于人的身份证号码。
2、内存指针: 指明了这个进程要执行的代码/指令具体在内存的哪里,以及这个进程执行依赖的数据都在哪里?
3、文件描述符表:
上面的属性都是一些基础的属性,而为了实现 进程调度 还需要依赖以下属性:
4、状态: 这个状态描述了当前这个进程接下来该如何调度。就绪状态:随时可以去cpu执行 。阻塞状态/睡眠状态:暂时不可以去cpu上执行
5、优先级: 先给哪个进程分配时间,后给谁分配时间。以及给谁分的多,谁分的少
6、记账信息: 统计了每个进程都分别被执行了多久,分别执行了哪些指令等,给进程调度提供指导依据
7、上下文:
上文中我们提到了 进程调度 这个重要的内容,大家可以参考大佬笔记!!!
2.2 组织进程
操作系统有很多,内部的实现也各有不同,下面我就以开源的Linux来举例
所谓组织进程,就是 通过特定的数据结构来把描述进程的信息放到一起,方便进行增删查改。而Linux中就是使用双向链表把每个进程的PCB给串起来!在Linux中,所谓的创建进程就是把PCB加到链表中,而销毁进程就是从链表中删除,查看进程就是遍历链表。
三、虚拟地址空间
在上文中我们提到了 进程调度,所谓进程调度其实就是操作系统在考虑如何给各个进程分配CPU资源,而具体如何分配资源,我们需要通过虚拟地址空间来实现。
举个例子:
在疫情期间,如果某个居民阳了就需要立刻封锁小区,否则会导致其他人也被传染。这种情况就类似于早起的操作系统,里面的进程都是访问同一个内存的地址空间,如果某个进程出现了BUG就可能引起其他进程的崩溃。那我们该如何解决呢?
解决办法就是在这个小区中划分出很多条道路,这些道路之间彼此隔离开,互不干扰,这样每个居民走各自的道路就不会存在传染的问题了,如下:
进程也一样,通过类似的虚拟地址空间,来保证进程间的独立性,确保每个进程互不干扰!!
但是在实际工作中,我们有的时候还是需要进程间的交互的,这个时候我们该如何来实现进程间的通信呢?
在以前,操作系统提供了公共空间机制来实现进程通信,就是进程A把数据放到公共空间上,进程B再来取走。但是这种通信机制有很大的缺点,不适合现代程序开发了,目前我们最主要的两种通信方式就是文件操作 和 网络操作。在后面我们也会学习到
在此我们只是稍微了解进程相关的知识点,方便后续学习多线程知识以及并发编程!如果还想了解更过进程知识,请参考大佬笔记!!!!