理解进程调度的基本过程,为学好多线程打好基础

2023年 9月 30日 30.4k 0

简单了解操作系统

操作系统是一组专门做计算机资源管理的软件的统称。目前常见的操作系统有:Windows,Unix,Linux,OSX,Android,ios等。

管理什么:

  • 管理下层的硬件设备---通过硬件的驱动程序来管理硬件

  • 管理上层的进程---在任务管理器中可以看到

  • image.png

    操作系统如何管理进程

    要运行一个进程,需要先分配一些系统资源(内存,网络,硬盘等)

    进程是系统分配资源的基本单位(最小的单位)

    进程启动,需要先创建一个PCB(Process Control Block,进程控制块),进程也称作任务

    操作系统管理进程就是在一个数据结构中(如双向链表),存储每个进程的pcb,通过pcb来管理进程

    创建:数据结构中,新建一个pcb
    关闭:数据结构中,删除一个pcb

    关于PCB(进程控制块)

    PCB包括以下:

    1. pid: 操作系统为每个进程分配的一个身份标识,一个系统中的pid是唯一的

    2. 内存指针: 用于标识进程占用在内存中的位置

    3. 资源清单:

    (1) 设备资源: 如打印机,键盘等等

    (2) 文件资源: 通过一个文件描述表,里面记录了可以使用的文件列表(类似数组结构)

    文件描述表:里边储存文件描述的信息,所在的索引也叫文件描述符

               每个程序运行时,打开都会默认三个文件描述符,对应Java中:System.out,in,err(分别代表标准输出,标准输入,错误输出)

    还存在一些调度信息:

    4. 优先级

    5. 其他的调度信息: 如进程已经执行/等待了多久,执行了那些代码

    6 进程上下文:

    进程在时间片轮转调度的时候,切换出去时的环境(运行的指令行需要的变量等等)为上文,恢复执行时的环境为下文

    需要在切换出去时保存上文,恢复时,读取之前保存的信息到下文,类似玩游戏的存档,读档

    进程调度算法

    我们系统中,运行的进程数量,远远超过了cpu的核心数,原因就是操作系统调度进程,在cpu上来执行指令

    操作系统调度进程时的调度算法:

  • 先来先服务:根据时间先后顺序来执行
  • 高优先级优先:优先级高的进程,优先执行,这里的优先级指的是总的优先级(优先级信息+进程等待时间)
  • 短作业优先:某个作业(一组任务)执行的剩余时间越短,就优先执行 (非抢占式)
  • 缺陷:某些耗时长的任务,就可能没有机会执行了(也叫做饥饿)
  • 抢占式:某个高优先级的进程加入,就可能暂停优先级低的任务,先执行优先级高的。更多的用于实时性高的系统(执行进程,需要及时反馈,得到运行结果)
  • Java中的多线程,就是使用抢占式的方式

    非抢占式(了解):某个进程,必须执行完毕,由进程告诉操作系统,我执行完了,可调度后续的进程。(也可能出现进程饥饿现象),这种一般用于批处理系统中,它不关注某个任务是否先执行,只关注总的执行效率

    时间片轮转调度算法

    采用这个算法,我们看起来,整个电脑中远远超出cpu核心数的进程,还是在同时在执行。
    操作系统中,使用了一个就绪队列的数据结构,其中要存放要运行的进程。

    每次使用头节点的进程,来运行一段时间,再放回到队尾,运行的时间叫做该进程这次运行的时间片,这个时间片的大小,是由操作系统计算出来的

    进程执行表现的特性

    并发:一个cpu以时间片轮转调度的方式一次执行多个进程(人肉眼感知是“同时”执行)

    并行:多个cpu在一个时间点上,同时执行多个进程

    image.png

    多个程序的代码执行:既存在并发,也存在并行

    表现特征:单个程序代码的执行顺序还是顺序的,多个程序的代码之间,就可能是无序的

    虚拟地址空间(虚拟内存)

    image.png

    🌻为什么需要虚拟内存?虚拟内存有什么用?(大厂面试常问)

    1. 进程内存独占性:隔离进程间使用的内存,进程不使用公用的物理内存,否则进程1修改了某个变量,就可能导致进程2整个程序挂掉

    2. 扩展内存容量: 某个进程如进入阻塞/时间片轮转切换出去,有一些从硬盘中读取到的内存数据,所有占用的总内存可能超过物理内存,采取的方案就是使用虚拟内存映射到硬盘
    (使用硬盘容量作为虚拟内存的一个扩展)

    某个进程在虚拟内存中,占用的空间是一个类似书籍一样的,一页一页的(分页式内存)

    当某一页映射到物理内存,但是发现没有对应的数据,就会产生一个错误,“缺页式中断”,就会从外设中查找

    进程间的通信

    如上所述,进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到存
    在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备“隔离性”。

    但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程程进
    行配合地达到应用的目的,如此,进程之间就需要有进行“信息交换“的需求。进程间通信的需求应运而生。

    由于虚拟内存隔离了进程使用的内存,需要共享数据,就需要采取通信的方式

    目前主流操作系统中提供的进程通信机制如下:

    管道  共享内存  文件   网络   信号量  信号

    其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络同一主机上的进程间进行通信。

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论