此篇文章和大家一起分享关于操作系统对进程的调度
目录
1.操作系统
操作系统的构成
2.进程
2.1进程的概念
2.2管理
2.3pcb
(1)pid
(2)内存指针
编辑
(3)文件描述符
(4)进程调度信息
并行执行
并发执行
pcb中支持进程调度的属性
谢谢您的访问!!期待您的关注!!
1.操作系统
我们知道,在一台计算机中,有内存、硬盘等硬件资源,而我们的操作系统就是软件层面的了
实际上软件就是许多指令的集合,就是一些数据,但是可以让计算机按照对应的规则去执行
而操作系统是一个非常复杂的软件,设计的指令代码量是千万级别的
对于我们常见的操作系统,比如win10,win11,Linus(主要是给程序员使用),macOS(苹果电脑),Android ,IOS,以及其他特定领域的操作系统
不同的操作系统,是不同的厂商给特定的领域提供的,但是实际上核心大同小异
操作系统的初心实际上是为了搞管理 ,就是为了使得一台计算机上的所有硬件资源能够配合好,并给所有软件资源提供良好稳定的运行环境
操作系统的构成
操作系统 = 内核 + 配套的应用程序
首先内核是操作系统中最核心的一部分,我们前面说到的管理,就是在操作系统内核里面完成的,而配套的应用程序往往需要靠操作系统内核提供一些功能作为支撑
假设
System.out.println("hello world");
我们运行这一段简单的代码,实际上就可以当成应用程序,这里就需要操作显示器,但是显示器是一个硬件资源,并不能直接由程序操作,就需要这个程序告诉操作系统,"我要操作显示器",那么操作系统就会完成对应的功能
而"告诉操作系统"这个方法,是因为操作系统会给程序提供了一系列的API,有的API是操作显示器,有的是操作网卡,有的是响应鼠标键盘的...而上述打印的过程就是程序调用了java内置的标准库方法,这个方法本质就是调用操作系统里面提供"操作显示器"的API.这个系统调用就称为"System call",调用对应API后,就会进入到操作系统内核,内核再通过显示器的驱动程序,在显示器上就能绘制出对应内容
而驱动程序是必不可少的,操作系统需要通过硬件资源对应的驱动程序来操作硬件.硬件是非常多的,同一种硬件,不同的厂商,生产出来的硬件细节都会有所不同,操作系统也不知道具体操作的是哪个硬件,就需要商家通过驱动程序,告诉操作系统这个硬件对应的特点和使用详情
2.进程
前提说明:为了方便理解,此处一个进程里面只包含一个线程,等后续更新线程专题,会有所不同
2.1进程的概念
所谓进程,可以理解成:当一个运行起来应用程序,在操作系统就会有一个对应的进程
进程是操作系统分配给执行程序的一块内存空间,当一个程序被执行的时候,操作系统为它创建进程中就会包括存储程序的代码.数据以及执行状态等.
我们在我们的电脑任务管理器上也可以看到当前电脑上的进程:
这上面就显示了这些进程都占用了哪些系统资源,占用了多少...想要让一个程序运行起来,需要给他分配的系统资源包括但不限于内存,cpu,硬盘,网络带宽...
因此:进程也可以认为是系统进行资源分配的基本单位
2.2管理
进程多了,就要考虑管理.对于管理这件事情,操作系统采取的方法就是"先描述再组织"
所谓先描述,就是通过一些结构体(因为操作系统大部分底层都都是c / c++实现的) / 类把一个进程的核心信息抽象出来,并进行表示;而组织是通过一定的数据结构将这样的多个结构体 / 类的对象进行串起来,方便进行增删改查
2.3pcb
我们在上述管理中谈到的结构体,在操作系统中通常使用被称为pcb这样的结构体来描述进程的,
所谓pcb就是进程控制块(Process control block),但是实际上落到具体的操作系统上名称会有所不同,就比如Linus上的pcb叫做task_struct
而组织就是操作系统会把这样多个pcb用链表结构组织起来(实际上不能简单认为是链表,而是多个链表综合在一起的,这里只是简称).因此,我们通过任务管理器查看进程列表就是在遍历链表的每个节点,并且获取显示出对应的信息,创建新的进程,新的进程会创建出新的pcb,并添加到上述的链表中销毁某个进程,就要把链表上对应的pcb节点删除
在pcb中,我们重点了解以下属性:
(1)pid
就是进程的id / 身份标识
(2)内存指针
程序运行的时候,需要消耗一定的硬件资源,而内存就是一个非常重要的资源.一个程序在运行的时候,,就会将对应的数据 / 指令加载到内存里面
而内存指针就是一组指针,用来告诉操作系统,这个程序要运行的指令以及依赖的数据都存放在内存的哪些地方
具体如下图所示:
(3)文件描述符
一个进程运行的时候,会操作一些文件,而文件操作符就是通过顺序表这样的结构,记录下当前进程都打开了哪些文件
(4)进程调度信息
我们在任务1管理器中能看到
当前运行了上百个进程
我们知道现代的cpu是多核心cpu,一个进程在一个cpu核心上运行,但是cpu的核心数量跟进程相比也是远远不足的
这时候,就要通过进程调度来负责了
并行执行
在上面提过,一个进程在一个cou核心上面运行
此时在同一时间,就能有16个进程同时运行(完全是同时),这就是并行执行
并发执行
一个核心虽然在同一时刻只能执行一个进程,但是在不同时刻是可以执行不同进程的
cpu会把总的执行时间,切换成若干个小的片段,每个片段执行一个进程,这样的每个片段称为"时间片",由于时间片比较短,cpu切换进程的速度极快,人感知不到,站在人的角度,就是这若干个进程在同时执行(其实本质上不是同时)
这样,即使是在单核cpu的年代,也可以通过并发来实现同时运行多个程序的效果
注意:并行,是指在微观上也是同时执行
但是并发是指在宏观上是同时执行,但是在微观上面是串行执行
这两者都是在操作系统内核部分管理好了,编写应用程序的时候无法干预,普通用户也无法感知到
因此,往往就把并行和并发统称为"并发",把编写解决并发问题的程序,称为并发编程
pcb中支持进程调度的属性
(1)状态
状态有:就绪状态和阻塞状态
处于就绪状态就是随叫随到,但是处于阻塞状态的进程,无法在cpu上执行,往往一个进程在等待IO操作的时候就会进入阻塞状态(scanner.next等操作)
(2)优先级
进程在竞争 CPU 时间时的相对重要性。不同的进程可以有不同的优先级,进程调度算法会参考进程的优先级来决定下一个执行的进程,在分配资源的时候就存在资源倾斜
(3)上下文
进程在cpu执行过程中,也会产生很多的"中间结果",在进程切换出cpu之前,就需要把这些中间结果(cpu的各种寄存器中的值)保存到pcb的上下文里面(从寄存器到内存)
下次这个进程回到cpu上执行的时候,就需要先把之前的存档恢复回来(内存->寄存器),在其中就有一个pc程序计数器,记录执行到哪一条指令了,下次执行就是沿着上次执行到的地方继续执行
(4)记账信息
操作系统也是要避免某个进程一直吃不到cpu资源,就会进行类似的统计,给吃的cpu少的进程,适当地多分配点