目录
进程控制块抽象(PCB Process Control Block)
一、进程
1.概念
2.进程的管理
程序下载后在系统中是一个文件,当我们双击程序时,文件就被系统从硬盘中读取出来加载到内存中,然后系统就创建一个和该程序相对应的进程,这样程序就运行起来了。
进程控制块抽象(PCB Process Control Block)
1.PID
相当于人的身份证号,在操作系统中是全局唯一的。
2.内存指针
当程序运行时,操作系统从硬盘中读取程序文件,加载到内存里,那么就要在程序运行前给程序分配一块有效的内存空间,内存中的指令和数据最终被CPU执行和读取。
3.文件描述符表
当程序运行起来时需要访问一些文件资源,这时操作系统就负责给程序分配这些资源需要的每个文件,被称为文件描述符,多个文件描述符在一起组成文件描述符表,类似于集合。
默认每个程序会分配三个文件描述符:
- 标准输入:System.in
- 标准输出:System.out
- 标准错误:System.error
3.并行与并发
该cpu理论上可以支持八个进程同时进行 (真正意义上的同时执行---并行执行)
对于现代的CPU来讲,都是多核的,但是在多核之前的CPU都是单核。在单核CPU的机器上,可以打开多个程序,看似也是同时执行,其实操作系统里确实只运行着一个进程,是通过进程间的快速轮动,来实现看似同时运行的一个效果,这个现象就叫做并发执行。
并行执行则是同时执行,操作系统可以同时运行着多个进程。
在JAVA中并不严格区分并发和并行,统一称为并发编程。
二、进程调度属性
(进程调度的目的是为了让CPU资源得到充分的利用)
1.进程状态
1.运行
2.就绪
3.阻塞
操作系统有一个专门阻塞队列来保存这些被阻塞的队列。等到阻塞完成后,把他们从队列中取出来变为就绪状态,继续参与CPU调试。
2.进程的优先级
哪个进程可以被CPU调度的机会多,哪个优先级就高,这个优先级可以通过代码控制。
3.上下文信息
执行某个进程时,要保存当前执行的位置,也就是存档。若下一次被重新调度回来执行时,要读取之前的存档信息,也就是读档。
4.进程的记账信息
类似于一个日志,进程执行到哪里了,就在CPU调度时记录下来,以便下次调度回CPU时从这个执行的位置继续执行。
三、进程的组织方式
进程是通过一个双向链表来组织PCB:
- 创建一个进程就是把对应的PCB加入到链表中;
- 销毁一个进程就是把对应的PCB从链表中删除;
- 查看所有进程就是遍历整个链表。
四、内存分配(内存管理)
程序在运行的时候都会被操作系统分配内存(内存条、硬件设备)。
在正常情况下,进程A是不会去访问进程B的内存空间的,但是如果发生突发情况(c++中的野指针问题),进程A访问进程B的内存空间,修改了进程B的数据,导致其数据不准确,甚至程序崩溃。
操作系统为了防止野指针的问题,就使用虚拟内存来规避这种现象。采用了内存管理单元(MMU)来处理这个虚拟内存的操作。
MMU 把虚拟地址与真实地址做了一个映射,在物理地址申请,再给每个进程分配虚拟地址,一旦进程访问的地址越界,MMU直接报错,不被允许访问。这样做的目的就是将进程之间隔离开来,互相不受影响。
五、进程间通信
进程被隔离开后,多个进程之间就无法相互协作了,但是有些场景需要进程间相互合作,那么就引入了进程间通信的概念。