认识进程
一个程序运行时,操作系统就会出现一个对应的进程,运行起来的可执行文件/程序就可以成为进程。例如,我们打开文件资源管理器
在进程这一栏中这里展示的自己的应用和后台进程都是进程,除了这些以外,还有系统自带/安装的某些程序,这些对于系统能够稳定运行有很重要的意义。
所谓进程调度,就是从进程的就绪队列(阻塞)中按照一定的算法选择一个进程并将 CPU 分配给它运行 ,以实现进程的并发执行(后面有介绍)。
操作系统对进程的管理
操作系统上面包含了很多的进程,这么多的进程需要进行管理,通用的做法是先描述,在组织。
1.描述
通过一些结构体/类把一个进程的核心信息抽象提取出来,并进行表示。(目前主流的操作系统都是C语言实现的,Windows操作系统以C语言为主要,但也包含了部分C++实现)。在操作系统中,用来描述的结构体我们称之为PCB(进程控制块),不同操作系统中进程控制块的名字是不一样的,如在Linux中PCB的实际名字是task_struct。
2.组织
通过数据结构,把多个结构体/类的对象串起来,方便进行进一步的增删查改。在操作系统中通常会用链表把多个PCB串起来。
3.基本进程操作介绍
1.任务管理器查看进程列表
遍历链表的每个节点,并且获取显示出对应信息
2.创建新进程(双击运行程序)
新的进程创建出一个新的PCB,并且添加到上述链表中。
3.销毁某个进程(某个程序退出)
删除链表上对应的PCB节点。
PCB包含的重要属性
1.pid
进程的id,用来标识进程。(同一个机器,同一时刻,进程id不一定相同。)
这些进程都是运行cloudmusic.exe产生的。
2.内存指针
程序在运行时就会被从硬盘中加载到内存中,加载这个程序的指令/依赖的数据。内存指针是一组指针,指向内存中对应的指令,也就告诉系统,该进程依赖的数据在内存中的哪里。
3.文件描述符表(简单介绍)
一个进程运行的时候,会操作一些文件。就通过一个“顺序表”这样的数据结构,记录下当前这个进程,都打开了哪些文件。
4.并发控制
进程的执行需要占用cpu资源,到cpu上面去 执行。但进程的数量远远大于cpu的数量。对于现在的cpu,都是多核的cpu。我们常说的8核,16核都是cpu核心数量。
a.并行执行
一个核心,同一时刻,只能执行一个进程。有8个核心,同一时刻可同时执行8个进程。(完全同时执行),这就是并行控制。
b.并发执行
一个核心,不同时刻,可以执行不同的进程。也就是说,某时刻执行进程1,下一时刻执行进程2,在下一时刻执行进程3.cpu 就把总的执行时间,切换成若干个小的片段,每个片段执行一个进程,每个片段称为"时间片由于时间片比较短,cpu 切换进程的速度极快, 所以我们感知不到。这就是并发执行。
c.并行+并发
并行和并发通常称称为“并发”,操作系统会按照并行 + 并发相互搭配, 运行所有的进程,即使是单核cpu的年代,也可以通过并发 来实现同时运行多个程序的效果。只要是支持多任务的操作系统都能支持并行+并发。
PCB支持进程调度的属性
1.状态
a.就绪状态
在操作系统中,进程随时待命,随时可以启动的状态。
b.阻塞状态
处于阻塞状态的进程 无法在cpu中执行,往往这个程序在等待IO的时候就会进入阻塞状态。(如在java中写scanner.nextInt();等待键盘输入,此时就为阻塞状态)。
2.优先级
cpu会对核心进行适当分配,合理运用每个核心,避免部分核心不进行工作或工作量少。
3.上下文
进程在 cpu 执行过程中, 也会产生很多自“中间结果”,在进程切出cpu之前需要把这些中间结果(cpu各种寄存器的值)保存在pcb的上下文中,下次这个进程回到cpu上执行时,就需要把之前的存档恢复过来。
4.记账信息
通过表格统计cpu核心分配的资源,操作系统为了避免某个进程吃不到cpu资源,就会进行类似统计,给这些进程分配资源。