• 操作系统 进程 - 进程调动



    🚜一、进程是什么?

    进程就是运行起来的程序~

    同一时刻,系统中的进程有很多,操作系统就会对这些进程进行管理

    管理需要包含两个方面:

    1. 描述:详细的标识清楚一个进程有哪些属性/信息
    2. 组织:通过一定的数据结构,把若干个用来描述的实体,给放到一起,并且进行增删改查

    1️⃣描述:

    描述进程的属性/信息是通过结构体来描述的(因为是用C++ 实现的),结构体里面包含一个进程的各种信息,这个结构体叫做PCB(进程控制块)

    2️⃣组织:

    系统中通常会使用双向链表这样的结构来把PCB来组织在一起

    🎐创建一个进程,本质上就是创建PCB,并且加入到链表上~
    🎐销毁一个进程,本质上就是从链表上删除对应的PCB结点~
    🎐查看任务管理器的进程列表,本质上就是在遍历这个链表~

    一个进程可能是一个PCB,也可能对应多个
    系统管理PCB的链表也不一定是一个

    在这里插入图片描述

    🚜二、进程里面有哪些关键的要素?

    🛴1.pid 进程的身份标识

    例如网易云音乐里面现在有4个进程,它们的PID都不同.

    在这里插入图片描述PID就是进程的身份标识
    一个主机,同一时刻,这些进程的pid是唯一的,通过pid来区分一个进程

    在这里插入图片描述

    🛴2.内存指针

    一个可执行文件,双击后开始运行,系统把文件中的核心数据(要执行的指令依赖的数据)加载到内存中!

    那么就势必要给进程分配内存空间,然后这个内存空间上就有很多区域,有的用来放指令,有的用来放数据,有的用来维护运行状态…

    内存指针的作用就是来分配哪块指针是干什么用的~

    描述进程持有的 内存资源
    在这里插入图片描述

    🛴3.文件描述符表

    每个进程都可以打开一些文件(文件其实是存储在硬盘上的数据)
    文件描述符表里面就记录了当前进程都打开了哪些文件
    (打开了之后就可以后续针对这些文件进行读写操作了)

    描述进程持有的 文件资源

    进程是操作系统分配资源的基本单位!

    在这里插入图片描述

    进程调度

    下面的一组属性都和"进程调度"有关,这一组属性存在的意义就是为了支撑"进程调度"

    1. 进程状态
    2. 进程优先级
    3. 进程上下文
    4. 进程记账信息

    CPU资源有限,需要合理安排,电脑在运行时进程有很多,而6核CPU只同时可以跑6个任务,那电脑是怎么运行的呢?

    CPU运算能力,和集成程度密切相关(单位面积下元件越多,单个元件足够小)
    单核提升能力有限就可以搞多个核心~

    并行执行

    每个CPU核心上都可以独立的运行一个进程(运行进程的相关指令)
    多个CPU核心,就可以同时独立的运行多个进程

    并发执行

    一个CPU核心,先运行进一下程1,再运行进程2,再运行进程3…
    只要微观上切换的足够快,宏观上看起来就好像是3个进程同时运行一样~
    现在计算机上都是并行和并发相结合

    所谓的进程调度就是通过"并行"和"并发"的方式让计算机可以"同时"执行多个进程(任务)

    这是多任务的操作系统(比如手机打游戏的时候也可以收到微信消息)
    在这里插入图片描述

    🚀4.进程状态

    1. 就绪状态(随叫随到)
    2. 阻塞状态(不能随叫随到)

    阻塞状态的进程,无法被调度到CPU上执行
    就绪状态的进程,才能上CPU来执行

    在这里插入图片描述

    🚀5.进程优先级

    谁先谁后,主次之分~
    喜欢的就多排一点时间,优先排!
    不喜欢的就少排时间~

    系统调度的时候,就会根据优先级,来给进程安排时间!

    创建进程的时候,可以通过一些系统调用来干预优先级(相对的,也要看其他的进程的优先级情况)

    在这里插入图片描述

    🚀6.进程上下文

    进程再CPU上执行了一会之后,要切换给别的进程,就需要保存当前运行的中间结果(存档),下次再轮到他执行的时候,就恢复之前的中间结果(读档),继续往下执行.

    对于进程来说,上下文就是CPU中寄存器的值
    (寄存器的值就包含了运行的中间结果,需要把这些结果保存到PCB的上下文信息中(内存))

    🎭比如我做题做一半去开门了,回来之后要继续做题(不能去刷视频)!

    在这里插入图片描述

    🚀7.进程记账信息

    每个进程在CPU上执行了多久,统计信息
    是辅助调动的效果~

    执行进程的时候虽然有优先级,但是还是不希望让有的进程完全捞不到CPU

    通过进程记账信息,看一下给某一个进程安排了多少时间,如果太少就再安排一些(优先级提高一下)

    💟作用是让运行更加均衡,避免有进程完全捞不到CPU执行~


    在上述基础之上就可以完成进程调度了

    🚜三、虚拟地址空间

    运行时会给每个进程安排一些内存资源

    假如是简单的按照下图这样分配就不太科学…
    在这里插入图片描述
    💦假设出现极端情况,进程1中出现了内存访问越界这样的危险操作!(解引用 野指针:保存了一个无效的内存地址,解引用这个内存)

    ❗就有可能越界访问到进程2的内存中,那么就会导致进程1的bug会影响到进程2!

    上述操作就会产生进程间的相互影响~

    为了解决这个问题,就需要让每个进程都有各自的内存空间(活动范围)
    不要让这些进程的活动范围重叠~

    💌虚拟地址空间:

    给每个进程划分的内存空间,都叫做"虚拟地址空间"(不是真实的物理内存地址)
    通过专门的设备MMU来完成 虚拟地址 到 物理地址 之间的映射!

    在这里插入图片描述
    针对进程1和进程2来说,能够访问的内存空间就只是0x0 - 0xFFFF这么大的一段~
    如果不小心访问了更大的内存空间,在MMU映射的时候就能及时发现,从而避免对物理内存产生影响

    MMU就可以针对地址进行校验,如果地址非法,就直接通知进程(比如把进程给杀死),从而及时止损,避免影响到其他进程的运行~

    使用虚拟地址空间,就认为进程之间存在了"隔离性"
    一个进程是不能直接访问另一个进程的内存数据的!
    防止干扰的操作,提高了系统的稳定性!!

    在这里插入图片描述

    🚜四、进程间通信(不详细讨论具体实现)

    有了隔离性之后,虽然进程是稳定了,但也有新的问题!
    有些需求场景,就需要多个进程相互配合,进程隔离了,此时进程之间就很难交互了

    所以系统又引入了一个机制:进程间通信

    无论是哪种进程间通信,核心原则相同:

    找一个多个进程都能访问到的公共资源,然后基于公共资源来交换数据~

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

    1. 管道
    2. 共享内存
    3. 文件
    4. 网络
    5. 信号量
    6. 信号

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

    总结

    在这里插入图片描述

    你可以叫我哒哒呀
    非常欢迎以及感谢友友们的指出问题和支持!
    本篇到此结束
    “莫愁千里路,自有到来风。”
    我们顶峰相见!
  • 相关阅读:
    空间金字塔池化改进 SPP / SPPF / ASPP / RFB / SPPCSPC
    机器学习库Scikit-Learn(线性模型、岭回归、插入一列数据(insert)、提取所需列、向量机(SVM)、聚类)
    文件上传下载
    嵌入式Linux入门-彻底理解UART串口,手把手教你写程序
    《Go 简易速速上手小册》第9章:数据库交互(2024 最新版)
    clion 安装 boost 库
    C语言——数据在内存中的存储_学习笔记
    LeetCode练习4——删除有序数组中的重复项
    内存利用:迟来的blindless与逃不掉的exit漏洞
    操作系统的接口
  • 原文地址:https://blog.csdn.net/m0_58437435/article/details/126317333