• 操作系统与进程调度


    一、计算机操作系统

    1.操作系统(Operating System)

    操作系统是一组做计算机资源管理的软件的统称,我们在日常生活常接触到的操作系统有:windows、IOS、Android、鸿蒙,以及Linux系统等等,那么操作系统是什么?计算机是如何运行的?

    计算机是由软件、硬件相互配合工作;事实上,操作系统可以看做是介于软硬件之间的一组软件,主要起到两点作用:

    • 提供稳定的运行环境给软件
    • 管理好各种硬件设备

    2.计算机系统示意图

    下图为计算机系统示意简图,其中操作系统属于系统软件,大家可以了解一下:
    计算机组成简图
    当然,我们学JavaWeb最关心的不是他的硬件如何,就目前来说也不应该是操作系统是如何实现的,我们最密切关心的内容是进程管理模块

    二、进程

    1.进程/任务(Process/Task)

    简单来说,一个运行起来的程序(.exe)就是一个进程,从操作系统的调度上来看,进程在运行时,需要向操作系统申请资源,因此进程是操作系统进行资源分配的基本单位。
    在这里插入图片描述
    以上的每一项任务都是一个进程,我们可以看到有一百多个进程,这么多进程同时跑起来,为了保证在计算机上的有序执行,于是需要引入进程管理~

    管理:

    • 先描述:明确把这个东西有啥特征,都表示出来 ,操作系统主要是通过C/C++实现的,这里的描述其实就是用结构体/类;进程这个结构体称为“PCB”(process control block)进程块。
    • 再组织:使用一个数据结构(双向链表),把很多个这样的结构体 / 对象给整理到一起
    • //创建进程:先创建出PCB,然后把PCB加载到双向链表中
    • //销毁进程:找到链表的PCB,并且从链表上删除
    • //查看任务管理器:就是遍历链表

    2.进程控制块抽象(PCB Process Control Block)

    一个进程的属性是非常多的,因此在PCB中存储的是一些较为关键的属性,主要属性有以下:

    class PCB {
        // 进程的唯一标识 —— pid;
        // 进程关联的程序信息,例如哪个程序,加载到内存中的区域等    
        // 分配给该资源使用的各个资源
        // 进度调度信息(下面讲解)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    说明:

    • 身份标识PID: 一个进程有一个唯一的身份标识
    • 内存指针:*指明了当前进程要使用的是哪一部分内存(进程是消耗一定的硬件资源的)。
    • 文件描述表:程序运行过程中,进程每次打开一个文件,就会增加一个文件描述符,文件描述符会以顺序表的方式存储构成文件描述表。
    • 辅助属性:该类属性主要是为了辅助进程调度,主要是描述与cpu资源相关的属性

    3.进程调度(Process Scheduling)

    计算机在执行程序时离不开CPU,CPU的核心数相当于干活的人数,线程数相当于干活效率
    在这里插入图片描述
    如上图,现在常见的CPU多为六核十二线程、八核十六线程等等,反观我们的进程数却经常以百为单位,注意,我们要的是同时干!!! 那么他们是如何执行这么多任务的呢?

    • 并行:同一时间,各干各的,互不打扰,进程之间就是并行的
    • 并发:先干一会儿A,再干一会儿B,再干一会C,再去干A~,只要切换够快,我们就认为ABC是并发的

    通过并行+并发,我们就可以实现CPU‘同时’执行几百个进程,注意:并行和并发只有在微观上有区分,宏观上我们是区分不了的,因此我们将并发+并行统称为并发。

    进程调度的辅助属性通常有以下几点:

    • 进程状态
    • 进程的优先级
    • 进程的记账信息
    • 进程的上下文

    说明:

    • 进程状态:描述这个进程接下来的调度方式;阻塞状态:改进程暂时无法在CPU上执行;2.就绪状态:随时可以在CPU上执行
    • 优先级:进程在调度时要有先后顺序以及时间分配
    • 记账信息:统计进程在CPU上的执行时间,作为一定的参考依据进行调整
    • 上下文:通俗来讲就是游戏的存档、读档;具体来讲就是CPU在执行过程中,执行中间的值以及执行的计算机指令等内容

    4.内存管理(Memory Manage)

    这里讲到的内存管理主要是指虚拟地址空间,事实上,每个进程访问的内存地址都不是真实的,而是利用一个页表将虚拟地址空间映射到真实地址空间上
    在这里插入图片描述
    如图,进程直接访问内存,如果出现数组越界等等的代码bug,极有可能由一个不相干的进程引起另一个进程的bug,显然这种实现代价是极为糟糕的,使用代价也是非常大的,为了让各个进程之间互不干扰, 就出现了“虚拟地址空间”,每个进程都只能访问到自己的地址空间,成功的完成进程间的隔离。

    虚拟地址主要指的是进程在访问地址时,会被操作系统通过一个中间站“页表”来映射到真实的内存地址,如果出现野指针、数组越界等等bug,会被页表报错,就无法修改真实内存地址上的内容,从而不会产生对别的进程的干扰

    进程之间无法互相干扰,大大提高了操作系统的稳定运行!

    5.进程间通信(Inter Process Communication)

    现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进行配合地达到应用的目的,如此,进程之间就需要有进行“信息交换“的需求。进程间通信的需求就应运而生。
    目前,主流操作系统提供的进程通信机制有如下:

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

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

  • 相关阅读:
    博客添加评论功能及定制化样式
    【区块链 | OpenZeppelin】OpenZeppelin 7个最常使用的合约
    svelte初探-上
    【面试复习】Python基础复习
    【Linux】进程概念与进程状态
    【23-24 秋学期】NNDL 作业7 基于CNN的XO识别
    【WebSocket 第一篇】从一个WebSocket连接说起
    haproxy集成国密ssl功能[下]
    MSPM0G3507——GPIO例程讲解1——input_capture
    Spring Boot与Shiro实现权限管理04
  • 原文地址:https://blog.csdn.net/m0_65038072/article/details/130631611