• 进程的认识


    什么是进程/任务

    每个应用程序运行于现代操作系统之上时,系统会提供一种抽象,好像系统上只有这个程序正在运行,所有的硬件资源都被这个程序使用.这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一.

    而现在所用的都是多任务操作系统.也就是同一时刻,可运行多个任务,这些正在运行中的程序,就可以称为任务,也叫进程.

    重要概念

    进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看作程序的依次运行过程;同时,在操作系统内部,每一个任务执行过程中,都需要分配一定的进程资源,换言之,可以认为计算机中的每个进程,在运行时,需要分配一定的系统资源,因此,进程又是操作系统进行资源分配的基本单位.

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

    计算机内部要管理任何现实的事物,都需要将其抽象成一组有关联的,互为一体的数据.在Java语言中,我们可以通过类/对象来描述这一特征.

    1. //以下是Java代码的伪码形式,重在说明,无法直接运行
    2. class PCB {
    3. //进程的唯一标识 -- pid
    4. //进程关联的程序信息,例如哪个程序,加载到内存中的区域等
    5. //分配给该资源使用的各个资源
    6. //进度调度信息(下面讲解)
    7. }

    进程管理

    1.先描述:使用类/结构体的方式, 把实体的属性都列出来

    2.再组织:使用一定的数据结构,把这些结构体/对象串在一起.(eg.在Linux系统中,是使用链表将若干task_struct串起来的--表示进程信息的结构体PCB(进程控制块),如果运行一个新的程序,于是系统上会多一个进程,多的这个进程就会构造一个新的PCB,放在链表上)

    这样,每一个PCB对象,就代表着一个实实在在运行着的程序,也就是进程.

    操作系统再通过这种数据结构,例如线性表,搜索树将PCB对象组织起来,方便管理时进行增删查改的操作.

    CPU分配-进程调度(Process Scheduling)

    操作系统对于CPU资源的分配,采用的是时间模式--不同进程在不同时间段去使用CPU资源.

    CPU少量逻辑核心要进行大量进程--需要分时复用(并发).

    如果将CPU比喻成一个舞台的话,要执行的命令(进程)就是演员.分时复用(并发)就可以看作多演员轮流登台的过程.         

    如果CPU是多核的话,就等于有多个舞台,有许多演员在同一时间段在不同舞台上进行表演,这即是并行.

    现在时代的计算机的执行过程,往往是并行并发同时存在(现在的CPU基本都是多核).往往将并行/并发统称为并发.对应的编程方式就叫做并发式编程(解决一个问题,同时搞多任务执行,共同协作解决).

    内存分配-内存管理(Memory Manage)

    操作系统对内存资源的分配,采用的是空间模式--不同进程使用内存中的不同区域,互相之间不会干扰,因为每个进程都必须使用自己申请到的内存.

    进程执行的过程中,需要消耗一定资源的,内存就是一种重要的资源

    核心结论:每个进程的内存,是彼此独立的,互不干扰的.

    进程间通信(Inter Process Communication)

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

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

    即系统提供公共的空间(多进程都可访问),让这两个进程借助这种公共空间来交互数据.

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

    1.管道

    2.共享内存

    3.文件

    4.网络

    5.信号量

    6.信号

    主要使用的进程间的通信的方式是文件和网络.网络,是可以支持同一个主机的不同进程(适用性更高).后端这里,很可能是一组服务器,这一组服务器间进行通信.

    PCB的核心属性

    pid

    进程的身份标识,通过简单不重复的整数进行区分的(同一机器,同一时刻,一定是唯一的),针对进程进行操作,就可以用pid区分

    内存指针

    进程使用的内存在哪,哪部分就放代码/指令,哪里放数据.

    文件操作符表

    由于进程需要经常访问硬盘.操作系统通过硬盘这样的硬件设备,将其封装为文件.

    一个进程想要操作文件,就必须要先打开文件(让你的进程在文件描述符表中分配一个表(构造一个结构体),文件描述符表就出现了.

    每个进程的文件描述符表是一个数组.用于存放指针,指针指向内核中表达打开文件的结构体.

    文件描述符表就包含了进程使用的硬盘的相关信息.

    状态

    用于描述某个进程是否能去cpu上执行.

    有的时候,某个进程,这会不太方便.比如:某个进程,通过Scanner等待用户输入内容(用户啥时候输入的?->这完全是不可控的事情)

    就绪状态:随时准备好去cpu上执行,操作系统一打招呼就上了.

    阻塞状态:这个进程,当前不方便去cpu上执行,不应该调度它.(直观理解就是代码不能往下走了,比如,进程在等待IO,来自控制台的输入输出/硬盘输入输出/网卡的输入输出).

    优先级

    多个进程等待系统调度,多个进程之间调度的先后关系,不是平均的.先调度谁,后调度谁,谁长谁短都是可以进行调控的(系统api可以设置).

    记账信息

    针对每个进程,占据了夺少CPU时间,进行一个统计,会根据这个统计结果来进一步调整调度的策略.因此就需要在下一轮次进行调整.确保每一个进程都不至于出现完全捞不到CPU的情况的.

    上下文

    是PCB中的数据结构,是相当于在内存上的.支撑进程调度的重要属性.就是相当于游戏中的读档和存档.每个进程在运行中,就会有很多优先结果,在CPU的寄存器中.

    (1)存档(保存上下文):在进程调度出CPU之前,把当前寄存器中的信息,单独保存在一个地方

    (2)读档(恢复上下文):在下次再去CPU上执行的时候,再把这些寄存器的信息给恢复回来.

  • 相关阅读:
    平衡树相关知识:
    【Note17】PECI(Platform Environment Control Interface)
    minio文件服务器开启https
    linux系统nginx常用命令
    ATFX:白宫再抛售1500万桶战略原油储备,油价小幅承压
    Centos7搭建SVN代码控制服务器
    CSDN流量卷领取和使用保姆级教程——流量卷,恭喜获得每日任务奖励【1500曝光】可获得新增曝光,阅读转化,点赞转化,新增关注-流量卷,流量卷,流量卷
    AB Test实验设计
    jvm学习笔记
    【LeetCode-中等】198. 打家劫舍(详解)
  • 原文地址:https://blog.csdn.net/asdssadddd/article/details/134530716