一、操作系统(operating system)
操作系统是一组做计算机资源管理的软件的统称,它能够把一个计算机上的所有硬件资源和软件资源都管理好:能够管理好各种硬件资源,让他们很好的相互配合,能够管理好各种软件资源,为每个软件都提供稳定的运行环境
操作系统的内核
操作系统由 内核 和 配套的应用程序 组成:操作系统对硬件、软件的管理都是在内核中完成的
配套的应用程序也是靠内核一些功能作为支撑,举一个例子:
写了这样一个代码:System.out.println("hello world");
这就是一个"应用程序",这里println需要操作显示器,而显示器是一个硬件设备,应用程序并不能直接操作,所以应用程序会告诉操作系统它要操作显示器,接下来操作系统内核就会给应用程序提供一系列的api(有的api是操作显示器的,有的是响应鼠标键盘的,有的是操作网卡的,这里会调用操作显示器的api)
具体过程:1. 应用程序执行println,调用操作系统内核给应用程序提供的api;2. 操作系统内核里感知到要操作显示器的行为;3. 操作系统通过**驱动程序(操作系统和硬件设备之间的接口)**找到对应的硬件设备(显示器),并且执行显示字符串的操作
二、进程(Process)
一个程序运行起来,在操作系统中就会出现一个对应的进程,换言之,进程就是程序的一次运行过程
由上图可以看出,操作系统是一个进程一个进程的分配资源的,所以又可以称进程是操作系统分配资源的基本单位
进程控制块(PCB)
一旦进程多了起来,操作系统就会对这些进程进行管理 => 所谓管理就是<先描述,在组织>
描述是通过一些 结构体/类 把进程的核心信息抽象提取出来,在操作系统中是通过PCB这样的结构体来描述进程(假设这里的进程都是单线程←这句话到后面就理解了)的,结构体中包含进程的核心信息
管理是通过数据结构例如线性表、搜索树等将每一个PCB联系起来,方便在管理时进行增删查改
假如是通过链表将每一个PCB联系起来的,
1.在上图中显示了每一个进程,这就相当于遍历链表的每一个结点,并显示每一个进程
2.创建一个新的进程(双击某个程序):新的进程创建一个对应的PCB,并添加到链表中
3.销毁某个进程(退出某个程序):把链表中某个结点删除
PCB中的主要信息
- pid:进程的 id/标识符
- 内存指针 :一个进程运行时需要消耗一定的硬件资源,内存就是一个关键的硬件资源 ,一个程序在运行时,就会将运行该程序的指令和依赖的数据从硬盘加载到内存中,之后,内存指针(这是一组指针,不只有一个)就会告诉操作系统要运行的指令都在内存的哪里,进程依赖的数据都在内存的哪里
此时 test.exe 这个文件就在硬盘中
双击这个程序 => 此时操作系统就会产生一个进程,创建PCB并将PCB加入到内核的链表中
- 文件描述符表
一个文件运行的时候,会操作一些文件,通过"顺序表"这样的数据结构,记录下当前这个进程都打开了哪些文件
文件描述符表在未来会再进行详细讲解
- 进程调度的相关属性
进程调度的属性有:状态、优先级、上下文、记账信息;
什么是进程调度
上图是一个任务管理器的界面,可以看到有很多进程,每一个进程都要执行,但凡要执行就要占用CPU资源,我们的CPU是多核心CPU,每一个核心都可以各自工作、互不影响,但即使如此进程的数量还是远远多于CPU核心的数量,为了让核心更有效率的执行进程,就需要进程调度来负责了
并行与并发
一个核心同一时刻只能执行一个进程,有16个核心,同一时刻就可以同时运行16个进程,这就是并行执行
虽然一个核心同一时刻只能运行一个进程,但是CPU切换进程的速度极快,比如把总的执行时间分为好几块,每一个时间块都运行一个进程 ,在极快的切换速度下,站在人的角度就是几个进程同时运行,这就是并发执行
操作系统会按照并行 + 并发的方式执行所有的进程
具体什么时候用什么方式,操作系统的内核都已经管理好了,编写应用程序的时候无法干预,普通用户也感知不到,所以往往会把并行和并发统称为"并发"
进程调度的相关属性
- 状态
阻塞状态,处于阻塞状态的进程无法在CPU上执行,比如该进程在等待一些IO操作时就会处于阻塞状态(例如scanner.next,如果不输入一些东西,该进程就会一直处于阻塞状态),阻塞状态的相反就是就绪状态
状态这里在未来讲到线程的时候会做更详细的区分
- 优先级
进程之间也会有优先级,CPU在执行进程时会考虑进程的优先级
不止是进程的执行顺序有优先级,CPU给不同的进程分配的资源也具有优先级,有的进程吃到的CPU资源多,有的少
- 上下文
进程在CPU执行过程中,会产生很多的"中间结果",在进程切换出CPU之前,就需要把这些中间结果(CPU的各种寄存器中的值)保存到pcb的上下文里(寄存器 -> 内存),这个操作相当于存档
下次这个进程回到CPU上执行的时候,就需要把之前的存档回复回来(内存 -> 寄存器)
- 记账信息
延续刚才优先级,操作系统为了避免某个进程一直吃不到CPU资源,就会进行统计,给得到的资源比较少的进程适当的多分配一点
🙉本篇文章到此结束,接下来将会开启多线程的学习