深大操作系统实验二:处理机调度

本文详述了在Linux操作系统中通过nice命令调整进程优先级以实现CPU资源分配,以及在多核环境下利用调度策略分配CPU资源。通过实例展示了在单核和双核系统上,如何调整进程的nice值、调度策略和优先级,以及实时调度与抢占的实验过程。此外,还探讨了生产者消费者模型的实现,利用信号量和互斥量解决同步问题。
摘要由CSDN通过智能技术生成

前言

大山!

在这里插入图片描述

我们老师似乎没有给实验指导 pdf,但是听说别的班都有 o(TヘTo)

于是以下内容纯属嗯编,不保证对蛤。。。

1. nice 命令

在一个空闲的单核 Linux 系统上用 nice 命令调整两个进程的优先级(20%)
要求:
使得它们各自使用约 1/5 和 4/5 的CPU资源。
用top和/proc/PID/sched展示各进程使用的调度策略以及调整前后的优先级变化
用top命令展示CPU资源分配的效果。

这题不难,用 nice 命令调调调就完事了。。。


使用单核虚拟机进行实验:

在这里插入图片描述
编写简单的抢占 cpu 的程序,但是不能使用阻塞,因为我们要一直霸占 cpu,所以这里使用 while1 作为代码:

在这里插入图片描述
通过 gcc 编译两份同样的可执行文件,分别叫做 block_1 和 block_2,然后再后台运行他们:

在这里插入图片描述
创建的两个进程号分别为 10458 和 10459,使用 top 命令,看到两个进程几乎占了相同比例的 cpu 资源,都是 50%,如图:

在这里插入图片描述
通过打印 /proc/pid/sched 的信息可以看到,两个进程的调度策略(policy)和优先级(prio)都分别是 0 和 120,如图:

在这里插入图片描述
在这里插入图片描述
其中调度策略 0 表示 SCHED_OTHER 调度,也就是完全公平调度,而优先级 120 则描述了其可能得到调度的 “友好值”,友好值越高越不容易急,被调度的就越少。

通过 nice 命令改写两个进程的调度优先级,从 0 改为 -10 和 -15,如图:

在这里插入图片描述
再次使用 top 命令,可以看到两个进程各自占了 80% 和 20% 的 cpu 资源:

在这里插入图片描述
在调整优先级之后,两个进程的优先级变为105 和 111

在这里插入图片描述
因为通过 CFS 调度的是非实时任务,Linux 将其优先级范围从 [-20,+19] 映射到 [100,139],于是刚刚的 -15 和 -9 优先级对应的值为 105 和 111 。

2. 多核调度

在一个空闲的双核Linux系统上启动P1/P2/P3/P4四个一直就绪不阻塞进程。(20%)

要求:
使得P1/P3在第一个处理器上运行各占50%的CPU资源,P2/P4在另一个处理器上运行,各自30%和70%的CPU资源。
展示并记录/proc/cpuinfo给出的系统核数,展示并记录进程在各处理器上的绑定情况
展示并记录top命令给出的CPU资源分配情况。
运行第5个不阻塞进程,用top查看并记录负载均衡现象
用/proc/PID/sched展示并记录各进程在处理器核间的迁移次数。

这题也不难,不用写代码,也是命令行就搞定。。。


这次设置成两核:

在这里插入图片描述

然后查看 proc/cpuinfo 读取 cpu 信息,可以看到这次显示了两个 cpu 的信息,其中两个核的编号分别为 core 0 和 core 1,如图:

在这里插入图片描述

仍然使用刚刚的 while 1 卡死并且霸占 cpu,然后开始运行 4 个阻塞程序,他们的进程号分别为 2267,2268,2269,2270,如图:

在这里插入图片描述

通过 taskset 命令查看每个进程运行在那些 cpu 上,其中 mask 掩码为 3,转换为二进制就是 11,也就是每个 cpu 上面都有运行:

在这里插入图片描述

然后再手动调整每个进程,将他们绑定到对应的 cpu 上面运行,其中 2267和 2268号进程绑定到 cpu0,而 2269和 2270号进程绑定到 cpu1,如图:

在这里插入图片描述

然后手动调整 2268号,也就是 block_2 进程的调度优先级,调整为 4 即可:

在这里插入图片描述

然后通过 top 命令查看运行的 4 个进程的 cpu 占用情况:

在这里插入图片描述

其中 block_1 和 block_2 在 0 号 cpu 上运行,并且分别占用 70%,30% 的 cpu 资源,而 block_3 和 block_4 在 1 号 cpu 上运行,分别占用 50% 的 cup 资源。

再通过 /proc/pid/sched 信息查看进程的调度信息。其中 nr_migrations 是在 cpu 之间迁移的次数,可以看到 4 个进程的迁移次数如下:

在这里插入图片描述

其中 block_1,2,3,4 的迁移次数分别是 7,10,13,5,这是一开始运行时,还未绑定 cpu 导致的,因为大家一起抢 2 个 cpu,难免发生迁移。

然后再运行第五个进程,和他们争抢 cpu :

在这里插入图片描述

通过 taskset 命令查看,发现新任务 block_5 的掩码是 3,也就是 11,默认在两个 cpu 上都可运行:

在这里插入图片描述

运行 top 命令查看他们负载均衡的结果,大家的 cpu 占用都被均摊了!通过观察发现 block_1 和 block_2 仍然保持几乎 7:3 的占用比例,但是数值上被 block_5 均摊。而原来的 block_3,4 则保持比例不变。如下图:

在这里插入图片描述

通过间隔数十秒,两次检查 proc/pid/sched 信息,可以看到 block_5 任务不断的在两个 cpu 之切换,并且 migrations 计数不断增加:

在这里插入图片描述

3. 实时调度与抢占

在一个空闲的单核Linux系统运行两个进程,以相同优先级的RR实时调度的进程,在上述两个进程结束前运行另一个优先级更高的FIFO进程。(20%)

要求:
用top和/proc/PID/sched展示并记录各进程的调度策略和优先级
展示并记录FIFO进程抢占CPU的现象
展示并记录两个RR进程轮流执行的过程。

这题挺变态的,我当时跑的时候,两个实时任务嗯把我命令行卡成 ppt,毕竟他们要和 bin bash 进行抢占。

观察交替抢占 cpu,就每个线程 print 就好,那么怎么让两个线程同时 print 到一个 console 呢? fork !

然后会看到交替的 print,注意因为是实时任务跑的巨快,可能会 print 几千次,太多了,于是搞个 cnt,加到满就 print 这样 print 不会太眼花缭乱

此外 FIFO 也是通过一个巨大的 cnt 控制时长的,这个 因机器而异,我用的是 20000000 和 7770000000

然后就是要用 管理猿权限 去跑,否则不能正常调整调度策略。通过 su 命令进入管理员模式,通过 sudo passwd root 可以设置 su 的密码。


再次将虚拟机调整成一核:

在这里插入图片描述
然后编写 RR.c 程序,该程序通过 fork 创建两个优先级相同的实时调度进程,这里将 RR 进程的优先级设置为 1,并且采用时间片轮回,也就是 SCHED_RR 策略进行调度。

此外,两个 RR 调度的进程需要不停打印当前系统时间,这样待会他们被优先级更高的 FIFO 进程打断的时候,时间将会出现明显的 “断片“ 现象,便于观察。下面代码:

#include <sched.h>
  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值