第八篇章 进程管理

本文详细阐述了操作系统中创建子进程的过程,包括压入寄存器值、准备子进程环境、加载用户代码、用户进程退出及进程切换等步骤。在子进程生成时,涉及了内存页面的分配、资源继承与重置,以及如何从shell进程复制执行环境。在用户代码执行阶段,描述了如何解析参数、加载环境变量,以及处理缺页中断将用户代码加载到内存。最后,讨论了进程退出时的资源释放和进程切换机制。
摘要由CSDN通过智能技术生成

日期:2022-10-13

版本号:V1.0

作者:snow

一、基础概念

二、创建子进程

在硬盘上存在一个可执行文件app,在通过shell输入需要执行该文件./app,经过shell解析后,这条指令为执行该程序。故shell需要创建一个新的子进程用以执行app。其创建过程与进程0创建进程1,进程1创建进程2,进程1创建shell进程,进程2创建update进程一致。

2.1、压入相关寄存器值

将当前寄存器值入栈作为子进程的参数,并将父进程的各种段信息传入,使子进程能有能力为可执行文件创建执行环境。

2.2、准备子进程基本环境

(1)在进程槽中申请一个空闲项,用以存放子进程

(2)在进程号管理模块申请一个空闲进程ID号

(3)在主内存中为子进程申请一个空闲页面

(4)将shell进程的进程管理项复制给子进程的单独页面

(5)将子进程的进程管理结构初始化(最主要的是将栈指针指向栈顶,意味着子进程将会从shell代码的最开始执行)

(6)将进程槽中子进程的代码段、数据段的基址长度信息复备份到子进程的进程惯例项中

(7)参照shell进程的页目录项和页表结构,为子进程的创建相应的页表管理结构,并将页表、页目录位置写入到进程管理项中

(8)将shell进程的页表拷贝子线程,并更新子线程的页目录项(此时子进程具备了shell进程的代码和数据,可以认为是shell的复制体)

2.3、重置子线程的资源

2.3.1 释放无用资源

在父进程(shell)中,其使用了文件、协处理器、inode节点等资源,子线程在拷贝过程也继承了相关资源的(并导致相关资源的引用次数+1),但子进程将会执行自己的用户程序,而用户程序并不需要这些资源,也不应使用这些资源(要使用的化,子进程或用户进程自己申请,但不会释放tty0等通用资源)

2.3.2 重置所需资源

在子进程的LDT、TSS信息加入到当前进程槽所对应的GDT表中

三、子进程加载用户代码

3.1 准备用户线程输入数据

3.1.1 子进程启动

(1)将子线程设置为就绪态,然后进程调度器将运行子进程(也是shell进程)

3.1.2 启动用户进程的环境准备

(1)读取可执行文件的i节点

(2)解析执行可执行程序传入的参数,并统计统计参数以及环境变量的个数

(3)读取可执行文件的第一个数据块(文件头),判断文件是否shell脚本以及是否满足执行条件

(4)将环境变量以及参数拷贝子进程所管理的页面中

(5)将子进程的可执行程序标记目标执行文件的i节点

3.2、清理子进程现场

(1)将子进程所用的文件、信号等信息清除

(2)子进程释放当前所使用的物理页面(与shell进程共同使用的页面)

3.3、设置用户进程环境

(1)将可执行文件的长度设置为代码段最大长度

(2)将新的数据段和代码段的基址、限长写入到GDT项中(逻辑地址)

(3)将参数以及环境变量所在的页面映射到进程线性地址中(就是保存线性地址到物理地址的 映射关系)

(4)获取环境变量、参数变量的数量以及逻辑块地址(基于页表和线性地址,逆向推导逻辑地址)

(5)初始化用户进程基本属性。栈底指针、用户id、组id,代码段和数据段长度等信息

(6)将可执行文件的入口地址(逻辑地址)作为用户进程的栈底指针(即要求用户进程在此开始执行)

3.4、缺页加载用户代码

代码栈底指针设置完成后,配置函数将会返回,但返回后会将栈底指针返回至esp,esp即代表为下一行代码的逻辑地址

(1)系统将逻辑地址映射为线性地址(目的是得到其所在页面)

(2)由于未加载过代码,当前内存中没有页面存储用户代码,无法获取到线性地址的页面号

(3)产生缺页中断。缺页中断根据逻辑地址以及当前使用文件的逻辑块管理项获取到这些代码数据块位置

(4)将这些数据块通过缓冲块读取到一个空闲页面中

(5)将装有代码的页面地址与线性地址进行连接

至此,用户代码被真正加载到内存中,用户进程开始从执行可执行文件的入口地址处执行相应的代码。

四、用户进程退出

4.1、用户进程退出

4.1.1 主动退出

4.1.2 被动退出

4.2、用户进程文件资源释放

在用户进程业务代码执行完毕或收到中止信号后,需要在进程结束时将相关资源释放

4.2.1 释放内存页面

同4.4节

4.2.2 释放子进程

(1)将非僵死的子进程的父进程设为1号进程(移交)

(2)向已僵死的子进程发送SIGCHLD信号

4.2.3 释放文件相关资源

(1)关闭当前操作的文件

(2)释放当前进程的目录i节点

(3)释放当前当前进程的根目录i节点

(4)释放当前执行文件的i节点

4.2.4 释放设备资源

(1)若当前进程是所在进程组会话进程(前台进程),则释放该进程组的会话设备

(2)若当前进程是所在进程组会话进程(前台进程),关闭所有会话

(3)释放协处理器

4.2.5 释放进程退出信号

(1)将进程状态设置为僵死状态

(2)保存退出码

(3)向shell发送子进程退出信号

4.2.6 释放进程管理资源

(1)shell进程收到子进程退出信号,被唤醒

(2)释放用户进程的进程管理结构所在页面

(3)解除用户进程与进程槽的关联

五、进程切换

5.1 主动让出执行权

5.1.1 等待报警信号

(1)sleep函数设置当前报警信号值

(2)同时将自身设置为挂起(可中断等待状态)

(3)发生时间中断,由调度器判断报警信号值,若需要报警则向该进程发送信号并唤醒该进程

5.1.2 等待其他信号

5.1.3 时间片执行完毕

(1)发生进程软件定时器中断,减少当前进程的时间片

(2)当前处于用户态且时间片使用完毕

(3)调度器选择进程执行

5.2、时间片抢夺

(1)发生时钟中断后,调度器从就绪态中选取合适的执行(剩余时间片最多)

(2)当前就绪态进程时间均为0,从新给所有就绪进程分配时间片

6.2.1 释放报警信号

(1)当前时间是否大于进程报警信号值,若大于则向该进程的释放SIGALRM信号,并将进程状态设为就绪态

5.3、进程切换过程

switch_to实现

5.3.1 切换至当前进程

直接返回,继续执行当前进程

5.3.2 切换至其他进程

(1)将新进程tss选择符存入临时变量

(2)将当前进程指针备份至ecx

(3)将系统当前进程指针指向新进程

(4)将cpu当前寄存器状态填写到当前进程的tss中

(5)将新进程tts中所有寄存器的值载入到CPU寄存器中(硬件实现)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值