目录
一、进程控制块抽象(PCB Process Control Block)
1.pid:进程的身份标识
2.内存指针:
3.文件描述符表
进程的调度(额外知识,不是进程属性):
4.进程的状态:
5.进程的优先级
6.上下文
7.记账信息
二、虚拟地址空间
每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
一、进程控制块抽象(PCB Process Control Block)
计算机内部要管理任何实事物,都需要将其抽象成一组有关联得、互为一体的数据。在Java语言中,我们可以通过类/对象来描述这一特征。
通过PCB来描述、抽象进程的属性。
// 以下代码是Java伪代码的形式,重在说明,无法运行
class PCB{//进程的唯一标识--pid;//内存指针//文件描述符表//状态//优先级//记账信息//上下文
}
使用这个PCB描述进程的属性,一个进程就可以使用一个或多个PCB来表示
系统中会使用类似于双向链表这样的数据结构来组织多个PCB:
创建新的进程,就是创建PCB并且把PCB插入到链表中。
需要销毁进程时,就是把PCB从链表上删除并释放。
展示进程链表时,就是相当于遍历链表的每个节点。
1.pid:进程的身份标识
每个进程都会有pid,同一时刻,不同进程之间的pid是不同的,每个进程的pid是唯一的。
2.内存指针:
用来区分进程中内存空间的属性
每个进程在运行时,都会分配一定的内存空间,而这个进程的内存空间、具体是在哪里,以及分配的内存空间中有哪些部分,每个部分是干啥的...所以就有这么一组指针来进行区分。
最典型的,比如进程的内存空间,需要有专门的区域存储要执行的指令,以及指令依赖的数据,同时还要存储一些运行时产生的临时数据,所以就是需要一组指针来区分。
3.文件描述符表
每个进程都有自己的文件描述表,文件描述表时操作系统中的数据结构,它用于跟踪当前进程打开的所有文件,当进程打开一个文件时,内核会为这个文件分配一个文件描述符,并且会创建一个条目在文件描述表符中,这个表包含了打开的文件相关联的所有信息。
文件描述符表包含了进程所关联的文件的所有信息。
进程的调度(额外知识,不是进程属性):
进程调度是操作系统中的一个核心功能,它负责决定哪个进程应该何时使用CPU。进程调度的主要目标是合理地分配CPU时间,以实现多种不同的目标,比如提高系统吞吐量、保证进程响应时间、确保公平性和优先级等。
给进程分配合理的CPU时间。
PCB引入了还引入了一些属性,用来支持操作系统实现进程调度的效果。
- 进程的状态
- 进程的额优先级
- 进程的上下文
- 进程的记账信息
4.进程的状态:
表示进程当时的运行状态。
- 就绪状态:
- 进程正在CPU上执行;
- 虽然进程没在CPU上执行,但是时刻准备着去CPU执行。
- 阻塞状态:
某个进程,某种执行条件不具备,就导致这个进程暂时无法参与CPU的调度。
还有其他状态,不做一一讨论。
5.进程的优先级
操作系统在调度多个进程的时候并非是一视同仁,有些会给更高的优先级,优先调度。优先级可以通过系统api进行设置。
6.上下文
上下文是支持进程调度的重要属性。
进程从CPU离开之前,需要把当前CPU中各种寄存器的状态,都记录到内存中。等到下次进程回到CPU上执行的时候,此时就可以把保存的这些寄存器的值恢复回去,然后进程就会沿着上次执行到的位置继续往后执行。
进程结束前,保存进程的状态到内存中,以方便进程再次执行时沿着上次的继续执行。
7.记账信息
通过优先级机制,对不同的进程分配了不同的资源,但是为了让某些资源也能分配到资源,就是要记录当前进程持有CPU的情况(进程的创建时间、开始时间、结束时间和运行时间),以这个为依据作为操作系统调度进程的参考依据,更加合理的分配资源。
记录进程的情况合理调度。
二、虚拟地址空间
早期的操作系统,程序运行时分配的内存就是“物理内存”。
如果B进程越界访问了A进程的内存,把A内存写成错误的值,A进程可能崩溃。
所以操作系统要给进程提供稳定的运行环境。
引入“虚拟地址空间”,不是直接分配物理内存了,而是分配虚拟的内存空间,操作系统对内存进行了一层抽象。
A操作某个内存中的数据,就需要把操作的虚拟地址告诉给系统,系统再把虚拟地址翻译成物理地址然后在对物理地址进行操作,如果给定的虚拟地址是非法的,操作系统就能及时发现对当前进程进行处理。通过这样的操作,就能保证进程之间存储数据的独立性,不会涉及到其它进程。
保证进程独立后,进程之间就相互隔开了,但如果需要进程之间的配合,就是需要实现进程之间的通信,后面博客主要介绍两种:通过文件,网络(socket)。