认识进程

一个程序运行时,操作系统就会出现一个对应的进程,运行起来的可执行文件/程序就可以成为进程。例如,我们打开文件资源管理器

java如何通过进程pid_linux

在进程这一栏中这里展示的自己的应用和后台进程都是进程,除了这些以外,还有系统自带/安装的某些程序,这些对于系统能够稳定运行有很重要的意义。

所谓进程调度,就是从进程的就绪队列(阻塞)中按照一定的算法选择一个进程并将 CPU 分配给它运行 ,以实现进程的并发执行(后面有介绍)。

操作系统对进程的管理

操作系统上面包含了很多的进程,这么多的进程需要进行管理,通用的做法是先描述,在组织。

1.描述

通过一些结构体/类把一个进程的核心信息抽象提取出来,并进行表示。(目前主流的操作系统都是C语言实现的,Windows操作系统以C语言为主要,但也包含了部分C++实现)。在操作系统中,用来描述的结构体我们称之为PCB(进程控制块),不同操作系统中进程控制块的名字是不一样的,如在Linux中PCB的实际名字是task_struct。

2.组织

通过数据结构,把多个结构体/类的对象串起来,方便进行进一步的增删查改。在操作系统中通常会用链表把多个PCB串起来。

3.基本进程操作介绍

1.任务管理器查看进程列表

遍历链表的每个节点,并且获取显示出对应信息

2.创建新进程(双击运行程序)

新的进程创建出一个新的PCB,并且添加到上述链表中。

3.销毁某个进程(某个程序退出)

删除链表上对应的PCB节点。

PCB包含的重要属性

1.pid

进程的id,用来标识进程。(同一个机器,同一时刻,进程id不一定相同。)

java如何通过进程pid_服务器_02

这些进程都是运行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资源,就会进行类似统计,给这些进程分配资源。