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

目录

  • 前言
  • 1. nice 命令
  • 2. 多核调度
  • 3. 实时调度与抢占
  • 4. 生产者消费者
  • 总结

前言

大山!

深大操作系统实验二:处理机调度_第1张图片

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

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

1. nice 命令

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

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


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

深大操作系统实验二:处理机调度_第2张图片
编写简单的抢占 cpu 的程序,但是不能使用阻塞,因为我们要一直霸占 cpu,所以这里使用 while1 作为代码:

深大操作系统实验二:处理机调度_第3张图片
通过 gcc 编译两份同样的可执行文件,分别叫做 block_1 和 block_2,然后再后台运行他们:

深大操作系统实验二:处理机调度_第4张图片
创建的两个进程号分别为 10458 和 10459,使用 top 命令,看到两个进程几乎占了相同比例的 cpu 资源,都是 50%,如图:

深大操作系统实验二:处理机调度_第5张图片
通过打印 /proc/pid/sched 的信息可以看到,两个进程的调度策略(policy)和优先级(prio)都分别是 0 和 120,如图:

深大操作系统实验二:处理机调度_第6张图片
深大操作系统实验二:处理机调度_第7张图片
其中调度策略 0 表示 SCHED_OTHER 调度,也就是完全公平调度,而优先级 120 则描述了其可能得到调度的 “友好值”,友好值越高越不容易急,被调度的就越少。

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

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

深大操作系统实验二:处理机调度_第8张图片
在调整优先级之后,两个进程的优先级变为105 和 111

深大操作系统实验二:处理机调度_第9张图片
因为通过 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展示并记录各进程在处理器核间的迁移次数。

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


这次设置成两核:

深大操作系统实验二:处理机调度_第10张图片

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

深大操作系统实验二:处理机调度_第11张图片

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

深大操作系统实验二:处理机调度_第12张图片

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

深大操作系统实验二:处理机调度_第13张图片

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

深大操作系统实验二:处理机调度_第14张图片

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

在这里插入图片描述

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

深大操作系统实验二:处理机调度_第15张图片

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

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

深大操作系统实验二:处理机调度_第16张图片

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

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

深大操作系统实验二:处理机调度_第17张图片

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

在这里插入图片描述

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

深大操作系统实验二:处理机调度_第18张图片

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

深大操作系统实验二:处理机调度_第19张图片

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 的密码。


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

你可能感兴趣的:(操作系统,操作系统,linux,共享内存,进程同步)