进程概念

冯诺依曼体系结构

  • 大多数的计算机、服务器等都遵循冯诺依曼体系结构
  • 存储器用于快慢设备之间的缓冲作用,提高系统的效率(内存可以预先装载数据)
    • 处理数据时,必须先将数据预装载到内存中(一次性装载多条数据,由操作系统完成)
  • 在硬件和数据层面上:CPU只和内存进行交流,外设也只与内存进行交流。
  • 寄存器不仅只存在于CPU中,其他的外设中也存在。
  • 各硬件之间是用总线进行链接(IO总线、系统总线)
    进程概念
    文章图片
操作系统概念
  • 操作系统实质上是一款专门搞管理的软件。
  • 操作系统包括内核(进程管理、文件管理、驱动管理)和其他程序(库函数、shell程序等)
进程控制块PCB
  • PCB:为了便于系统描述和管理进程的运行,内核为每个进程专门创建的一个结构体对象。(一个PCB对应一个进程)
  • PCB是进程实体的一部分,用于存储进程所需的所有信息。
  • CPU在执行进程时,是找的PCB,再通过PCB去调用程序代码和数据。
  • Linux中PCB的结构体是 struct task_struct{ }
  • 系统中PCB是采用双链表的形式链接起来的。
  • 【进程概念】PCB主要存储的信息:
    • 标示符:描述此进程的唯一标示符,用于区分其他进程(PID等)
    • 状态:休眠状态S、运行状态R
    • 如果进程是前台运行时,则会标识为 R+
    • 如果进程是后台运行时,则会标识为 R
    • 优先级
    • 程序计数器(PC指针):保存程序中即将被执行的下一条指令的地址。
    • 内存指针:程序代码和进程相关的数据指针,和其他进程共享的内存块指针
    • 上下文数据:进程执行时处理器的寄存器中的数据。
      • 例如:当前进程被打断,去执行另一个进程,当另一个进程执行完后要如何回到之前进程被打断的位置呢?上下文数据就是用来保存这类数据。
      • 上下文数据是保存在PCB中的。
    • IO状态信息
查看存储进程信息的文件
  • 进程信息可以通过 /proc 系统文件夹查看(文件夹的名称就是该进程的PID)
    进程概念
    文章图片
进程状态 进程的5种状态
  • 就绪态R :等待被运行。(等待CPU调度)
  • 运行态R :正在运行。(占用CPU)(运行态包含就绪态,所以运行态可以同时有多个)
  • )僵尸态Z :父进程还在运行,子进程结束还未被回收时,子进程相关信息任然被保存着。
  • 等待态(休眠态)(浅度睡眠 & 深度睡眠):等待一定条件进入就绪态,等待态下即使给它CPU也无法运行。
    • 浅度睡眠S:等待时可以被唤醒(即使没有等到某个条件,收到信号也可以被唤醒)
    • 深度睡眠D:等待时已经不能被唤醒了,只有等到某个条件才能自动唤醒(收到信号也不能被唤醒),并且该进程不能被杀死,即使是操作系统也不行。
  • 停止态T :进程只是被暂时停止了,还是可以恢复的(不是进程结束了)
  • 死亡态X :进程死亡,这个状态只是一个返回状态,任务列表中是看不到这个状态的。
僵尸进程
  • 子进程先于父进程结束。子进程已经结束了,但是父进程还未帮子进程收尸(即父进程没有读取到子进程退出时返回的代码),这一个子进程就被称为僵尸进程。
  • 回收僵尸子进程方法一:
    • 父进程可以通过使用wait或waitpid来显示回收子进程,并且获取子进程退出的状态。
  • 回收僵尸子进程方法二:
    • 父进程自己结束时,会自动回收子进程的资源。
    孤儿进程
  • 父进程先于子进程结束,此时子进程就变成了孤儿进程。
  • Linux系统规定:所有的孤儿进程都自动成为一个特殊进程(进程1,也就是init进程)的子进程。
进程优先级 优先级的计算
  • Linux中可以使用 ps -la 显示系统进程PID和优先级
  • Linux中实际优先级 = PRI + NI (在执行这个算法时,PRI一直都是最初始的优先级)
    • PRI 代表这个进程的优先级,值越小越先执行。
    • NI 代表这个进程的 nice 值(它是优先级的修正值,取值范围 -20 ~ 19,默认为0)
    • 所以调整进程优先级是调整 nice 值。
进程概念
文章图片

优先级的更改
  • 终端中使用命令 sudo top 进入更改状态
  • 进入top后按 r 进入输入状态
  • 输入进程PID 然后回车
  • 再输入新的 nice 值即可
进程相关性质
  • 竞争性:CPU资源很少,而进程较多,所以进程之间是具有竞争性的,为了高效完成任务,合理分配资源,于是有了优先级。
  • 独立性:多进程运行是相互独立的,独享各种资源,进程之间互不干扰。
  • 并行:多个进程在多个CPU下同时运行。
  • 并发:多个进程在同一个CPU下采用进程切换的方式,让多进程在宏观上实现同时运行。
环境变量
  • 环境变量实质就是一个系统级别的全局变量。
  • PATH:指定命令的默认搜索路径
  • 将路径导入PATH环境变量: echo PATH=$PATH: 路径
  • HOME:指定用户的主工作目录(即用户登录到Linux时进入的默认目录)
环境变量相关命令
  • echo $环境变量 (查询相关环境变量)(echo $? 返回最近一次程序执行后的返回值)
  • env (显示所有环境变量)
  • unset (删除环境变量)
  • set (显示本地定义的 shell 变量和环境变量)(本地变量只在本进程中有效)
  • export (导入新的全局的环境变量)
main函数带的参数(argv、argv、envp)
  • argc:命令行参数个数
  • argv:命令行参数列表
  • envp:环境变量
    进程概念
    文章图片
进程地址空间
  • 注意:进程地址空间不是实际的物理内存,而是映射出的虚拟地址(不同进程的虚拟地址是相同的,但是实际映射的物理内存是不同的地址)
  • 每个进程都有自己的进程地址空间和对应的页表(用于表示映射关系)
  • 进程地址空间实质是物理内存中的一种内核数据结构(mm_struct)
    进程概念
    文章图片
使用进程地址空间的优势
  • 避免了野指针的出现(野指针在页表中没有映射)
  • 避免系统级别的越界访问,页表只会映射当前进程的物理内存,不会映射到其他地址。
  • 统一进程的排布,即所有进程在进程地址空间中排布方式都是相同的,并且空间范围也是相同的。
  • 每个进程都相当于独立出来的,更好的实现进程独立及合理使用内存空间。

    推荐阅读