一.什么是进程
进程是操作系统对一个正在进行的程序的一种抽象,换言之可以把进程看作程序的一次运行过程;同时,在操作系统内部,进程优势操作系统进行资源分配的基本单位。通过电脑的任务管理器就可以产看当前运行的进程信息。跑起来的程序就是进程。
进程是一个重要的“软件资源”,是由操作系统内核负责管理分为:描述+组织
描述:使用结构体(c语言的结构体)来描述进程属性。(操作系统基本上都是C/C++来写)用来描述进程的这个结构体,起了个特殊的名字,叫做PCB(进程控制块process control block)
组织:通过双向链表,来把多个PCB给串到一起(但并不是一个单纯的双向链表)
创建一个进程,本质上就是创建一个PCB这样的结构体对象,把它插入链表中
销毁一个进程,本质上就是把链表上的PCB结点删除掉
任务管理器查看到进程列表,本质上就是遍历这个PCB链表
PCB里面描述了那些进程的特征呢
1.pid进程的身份标识符(唯一的数字)
2.内存指针 指向说自己的内存是哪些
3.文件描述符表 硬盘上的文件等其他资源
(2,3描述了进程持有了哪些硬件资源)硬件资源,内存,硬盘都好区分,但CPU资源不好区分,操作系统里面有一个重要的模块调度器,就负责让有限的CPU来调度执行这么多的进程
4.进程调度相关的属性:
1)进程的状态
就绪状态:随叫随到,进程随时准备好了去CPU上执行
运行状态:正在和我一起的
阻塞状态:出差了,短时间内无法到CPU上执行了,比如进程在进行密集的IO操作,读写数据
注:很多操作系统不会明确区分就绪和运行
补充说明:由于狼多肉少的情况,这些进程是希望能够同时运行,分时复用
并行:微观上同一时刻,两个核心上的进程,就是同时执行的
并发:微观上,同一时刻,一个核心上只能运行一个进程,但是它能够对进程快速的进行切换,比如CPU这个核心上,先运行一个QQ音乐,再运行一下CCTalk,再运行一下画图板,只要切换速度足够快(2.5HZ,每秒运行25亿条指令),宏观上人感知不到,人看起来就好像是几个进程同时在运行。内核负责处理的应用程序感知不到,因此往往也把并行和兵法,统称为并发,未来除非显示声明,否则谈到并发,就是只并行+并发
2)优先级
先给谁排,后给谁排,给谁多排点,给谁少排点
进程也是有优先级的,操作系统进行调度并不是一碗水端平
3)上下文
操作系统在进行进程切换的时候,就需要把进程执行的“中间状态”,记录下来,保存好。
下次这个进程再上CPU上运行的时候,就可以恢复上次的状态,好继续往下执行。
“存档,读档”上下文本质上就是你存档的内容。进程的上下文,就是CPU中的各个寄存器的值——CPU内置的存储数据模块,保存的就是程序运行过程中的中间结果。
保存上下文,就是把这些CPU寄存器的值,记录保存在内部中,回复上下文,就是把内存中的这些寄存器值恢复回家
4)记账信息,统计每个进程在CPU上占用的时间和执行的指令数目,根据这个来决定下一阶段如何调度。
二、内存管理
虚拟地址空间
程序中所获取的内存地址,并非是真实的物理内存的地址,而是经过了一层抽象虚拟出来的地址。对于这点,我们感觉不那么明显,隔壁C++感知非常清楚。
C语言中都学过指针,这里的内存地址,就是虚拟的内存地址,并非真实的物理内存地址!!!
(内存是个啥东西,想象一下你的宿舍楼,有个大走廊,走廊上有很多房间,每个房间就是一个宿舍,每个房间还有一个编号,通过编号就可以定位到房间的位置,房间编号就是“地址”。内存可以存很多数据,内存就可以想象成一个大走廊,走廊非常长,有很多房间。每个房间大小1Byte,每个房间还有个编号,从0开始依次累加,这个内存编号,就是“地址”;这个地址也就认为“物理地址”)
内存有个了不起的特性,随机访问,访问内存上的任意地址的数据,速度都极快,时间上都差不多,正是这个特点,造就了数组取下标操作是O(1)
针对进程使用的内存空间,进行隔离引入了虚拟地址空间!!!代码里不再直接使用真实的物理地址了!!!而是使用虚拟的地址。由操作系统和专门的硬件设备负责进行虚拟地址到物理地址的转换。
解决进程间相互影响的问题。虽然进程隔离了,但是又引入了新问题。有时候,确实进程之间,需要进行数据的交互(相互配合),在隔离的基础上,开个口子,进程间通信,实现方式很多,但是核心思路是一致的。需要搞一个多个进程都能 访问到“公共空间”,基于这个公共空间来进行交互数据即可。这里的通讯方式/公共空间有很多具体的体现形式。例如要点个外卖,无接触配送,就在楼下放个桌子。