• Linux-2-进程


    前言

    Vue框架:Vue驾校-从项目学Vue-1
    算法系列博客友链:神机百炼

    操作系统:

    组成:

    • 操作系统由两部分组成:内核 + 其他程序
      1. 内核:文件系统 + 进程管理 + 驱动管理 + 内存管理 + 硬件管理
      2. 其他程序:shell + 系统调用接口函数库

    目的:

    • 设立OS的目的:
      1. 对上:
        1. 简化用户操作
        2. 提供稳定且安全的程序运行环境
      2. 对下:
        1. 与硬件解耦,相互独立发展
        2. 管理所有软件硬件资源

    管理:

    • 管理的本质:先描述事物 ,再组织事物

    • 举例:以校长对学生的管理为例
      管理

    • 角色分配:

      1. 操作系统:校长,进行管理工作

        C语言编写的linux将一切事务都用struct描述,再用数据结构(队列)对所有struct进行组织

      2. 驱动:辅导员,进行执行工作

        根据操作系统对对应struct&struct队列的修改,针对性的修改软硬件的工作

      3. 软硬件资源:学生,被管理工作

    • 实例说明:

      现在为电脑新接入一个键盘

    驱动接入

    进程及进程管理:

    进程:

    • 含义:
      稍有错误的理解是存储在硬盘中的可执行程序及其依赖的数据被转移到内存中开始执行,程序就变成了进程
    • 图示:
      程序到内存进程

    进程管理:

    • 含义:

      继续套管理的概念,即先描述每个进程,再组织所有进程

    • PCB(process control block):

      PCB本质是一个描述进程相关信息的struct

      当程序从硬盘转移到内存后,附加上了PCB结构体信息,才正式成为进程
      Linux中PCB结构体命名为task_struct{}

    • 进程管理

      逻辑上通过双链表来组织所有PCB结构体块,进而来管理所有进程
      逻辑PCB
      物理上PCB结构体也是存储在内存中,且通过指针来连接对应程序和其他PCB块
      物理PCB

    PCB:

    • task_struct()中含有很多与对应进程相关的信息,下面来看

    pid:

    • 每一个进程有自己的编号,便于通过进程名&编号对进程进行操作
    • 查看pid的函数:
      头文件中,含有getpid()方法来获取当前进程的pid
      头文件中,含有getppid()方法来获取父进程的ppid
    • 关于父子进程我们下一篇讲

    state:

    • state用于描述对应进程的状态

    前后台运行:

    • 直接占用命令行终端进程来运行程序 称为 前台运行

      不占用命令行终端,另辟进程运行程序 称为 后台运行

    • 直接./是前台运行

      输入完毕命令之后加一个 空格& 是后台运行

    • 终止前台命令直接Ctrl + C,也可以kill -9 进程pid

      终止后台命令需要kill -9 进程pid

    常见状态:

    • S表示休眠,常见于含有sleep()和printf()的程序
    • R表示前台运行中
    • R+表示后台运行中

    优先级:

    • 优先级不等于权限

    • 出现优先级划分的根本原因是cpu计算资源/网络带宽资源……各种资源有限

    • 操作系统只看PCB双链表来决定执行顺序

      优先级高的进程PCB在发生冲突时先加入双链表

    程序计数器:

    • 含义:指出下一条要执行的指令

    时间片:

    • 前提:待执行的进程非常多,且cpu计算速度达到1010次/s

    • 并发的概念:

      微观上:同一时间CPU只执行一个进程,且持续时间非常短,切换进程非常频繁

      宏观上:同时在执行n个进程,且执行速度都很快

    • 每个进程可持续占用CPU的时间就称为时间片

    上下文:

    • 含义:存储当前进程执行中的各种数据
    • 意义:时间片到期后,拷贝CPU数据到PCB中,等待下一次被CPU执行时,可以直接从上次结束的地方继续

    内存指针:

    • 指向 程序在内存地址 + 相关数据在内存地址
    • 指向 和其他进程共享的内存的地址

    IO状态信息:

    • 以文件列表形式指出利用的IO设备及其状态

    记账信息:

    • 已占用CPU的时间和
    • 已经使用的时钟数
    • 时间限制
    • 记账号

    进程调度:

    • 进程的产生过程:

      进程程序+相关数据直接复制粘贴入内存

      进程对应PCB块生成后有两件事:

      1. 内存指针指向对应程序文件+相关数据
      2. 通过指针连接进入PCB双链表

    PCB执行方式

    • 进程调度的发生时间:
      1. 宏观看,可以发生在程序运行的任何时间
      2. 微观看,PCB规定的时间片到期
      3. 隐患:进程的数据保留在CPU中,结束后CPU并不保留这些数据
      4. 对策:PCB内设置上下文变量,专门存储CPU当前处理好的数据
    • 上下文:
      1. 意义:进程调度可以发送在任何时间,保留当前执行到的数据之后,方便下一次继续执行
      2. 细节:
        1. eip从PCB双链表中取指令地址
        2. 分析指令地址,去取指令
        3. 执行取到的指令,数据从内存转移到CPU内的寄存器
        4. 时间片结束后,数据从CPU寄存器转移到内存中PCB的上下文变量
        5. 开始取下一条指令地址
    • 进程调度的本质:PCB结构体链表的遍历 & cpu和上下文的数据交互
    • 进程调度的目的:实现并发效果,宏观上实现多任务同时处理
  • 相关阅读:
    c/c++实现网格最短路径问题
    java程序终端排查
    【Linux私房菜】第六期——Shell编程
    非线性系统的理论和方法,神经网络的非线性
    从零学算法2849
    掌握Shell:从新手到编程大师的Linux之旅
    C++的STL--->map和set容器的使用
    LeetCode每日一题——2562. Find the Array Concatenation Value
    很详细的系列Shell基础— Shell简介
    红黑树的插入(C++实现)
  • 原文地址:https://blog.csdn.net/buptsd/article/details/126025136