高级OS(五) - 进程的创建和调度

一.题目

1.进程从诞生到结束,是一个生命周期,在这个生命周期中,进程的创建至关重要,请分析进程的生命周期,并深入到内核源代码对fork进行分析

2.进程的生命周期中,有一个重要的环节是被调度到CPU上执行,请分析进程的调度算法的源代码进行分析(从最简单的0.11版着手),并比较一个高版本的算法,说明为什么要进行这样的改进

3.动手实践,运行P59页的内核模块,查看task_struct结构,并增加打印进程状态或者其他信息至少共5个字段的信息。给出调试截图,并对运行结果给予解释。

二.解答

1.进程从诞生到结束,是一个生命周期,在这个生命周期中,进程的创建至关重要,请分析进程的生命周期,并深入到内核源代码对fork进行分析**

(1)什么是进程?

进程是处于执行期的程序以及相关的资源的总称。进程主要包含资源有代码段、数据段、打开的文件、挂起的信号,内核内部数据、一个/多个具有内存映射的内存地址空间,一个或多个执行线程等。进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。举个例子:一个应用程序的打开关闭就是一次进程的生命周期,又提出一个生命周期的问题。

(2)进程的生命周期?

进程的生命周期分为创建、运行、撤销。
进程的创建:进程是通过fork(),vfork(),clone()系统调用创建新进程。在内核中,都是调用do_fork实现的。传统的fork函数直接把父进程的所有资源复制给子进程。而Linux的fork()使用写时拷贝页实现,也就是说,父进程和子进程共享同一个资源拷贝,只有当数据发生改变时,数据才会发生复制。一般来说,子进程创建后会立即调用exec(),这样的好处是:避免复制父进程的全部资源。
在这里插入图片描述
进程运行时的 3 个基本状态:
操作系统包括实时系统对应进程一般都有 3 个状态,进程在有 CPU 时对应运行态,无 CPU 时对应就绪态睡眠态就绪态指所有资源都准备好,只要有 CPU 就可以运行了。睡眠态指有资源还未准备好,比如读串口数据时,数据还未发送。此时有 CPU 也无法运行,需要等资源准备好后变成就绪态,然后得到 CPU 后才能变成运行态

linux 进程扩展的 6 个状态
僵尸态:子进程退出后,所有资源都消失了,只剩下 task_struct,父进程在 wait 函数中可以得到子进程的死亡原因。在 wait 之前子进程的状态就是僵尸态。
深度睡眠:等待资源到位后才醒过来
浅度睡眠:等待资源到位或收到信号后都会醒过来
暂停:stop 状态是被外部命令作业控制等强制进程进入的状态。
就绪:未占用 CPU,等待调度算法调度到运行态的进程
运行:占有 CPU,正在运行的线程。

(3)fork.c进行分析

在这里插入图片描述
clone_flags : 宏定义 clone 标志,例如 CLONE_VM 表示与父进程共享内存描述符(线程的创建)
stack_start : 将用户态栈指针值给子进程的 esp 寄存器(给子进程分配新堆栈)
regs : 通用寄存器的地址(用户态->内核态,寄存器的值保存至内核栈中)
stack_size : 置 0
parent_tidptr : 父进程用户态变量地址
child_tidptr : 新进程用户态变量地址
在这里插入图片描述
dup_task_struct函数为新的进程创建一个内核栈,thread_info结构和task_struct结构等,值都是和父进程完全一样的
在这里插入图片描述
copy_files函数是去拷贝父进程的一些东西
在这里插入图片描述
copy_process做一些收尾工作,并返回新进程的task_struct指针,此时再次回到了do_fork,新创建的子进程被唤醒,并让其先投入运行。

2.进程的生命周期中,有一个重要的环节是被调度到CPU上执行,请分析进程的调度算法的源代码进行分析(从最简单的0.11版着手),并比较一个高版本的算法,说明为什么要进行这样的改进

2.1 进程调度的策略讨论

在进⾏调度时,我们都希望操作系统能满⾜以下⽬标:

  • 公平:保证每个进程得到合理的 CPU 时间。
  • ⾼效:使 CPU 保持忙碌状态,即总是有进程在 CPU 上运⾏。
  • 响应时间:使交互⽤户的响应时间尽可能短。
  • 周转时间:使批处理⽤户等待输出的时间尽可能短。
  • 吞吐量:使单位时间内处理的进程数量尽可能多。

但在实际系统中,以上⽬标往往是存在冲突的。⽐如前台任务和后台任务,前台任务关注响应时间,⽐如按下⼀次⿏标多久才能有响应,⽽后台任务关注周转时间,⽐如执⾏编译任务多久能完成,后台任务不希望被频繁打断,但这样势必会导致前台任务的响应时间变⻓。这就要求在设计进程调度算法时,需要充分的进⾏综合和折中。
在进⾏调度时,有两个⽐较直观的思路。⼀个是较为公平的先来先服务,另⼀个是带有特权级的。单纯的先来先服务可能会导致平均周转时间变⻓,因为先来的任务可能执⾏时间⾮常⻓,导致后⾯执⾏时间短的任务迟迟不能执⾏,所以衍⽣出了⼀种短作业优先(SJF)算法,先执⾏时间短的任务,以提⾼系统的平均周转时间。
若单纯采取以上的调度算法,假如处理⽤户操作的任务被排到了最后,会导致系统的响应时间⾮常⻓,这显示是不⾏的,于是有了按时间⽚轮转调度(RR)。这种调度算法把⼀个任务分为多个时间⽚来执⾏,执⾏完第⼀个任务的时间⽚后转去执⾏第⼆个任务的时间⽚,之后再去执⾏第三个任务的时间⽚,直到这些任务都执⾏完。这样做的好处是,假设处理⽤户操作的任务排到第三个,第⼀个和第⼆个任务需要的执⾏时间很⻓,在时间⽚轮转的情况下&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值