提交 ecdfdab1 编写于 作者: H hypox64

3-homework finish

上级 a14ab7b3
#include <stdio.h>
int main()
{
long i,j,temp;
printf("HelloWorld!\n");
while(1)
{
for (i=0;i<1024*1024*1024;i++)
{
temp+=1;
}
printf("one iteration!\n");
}
return 0;
}
\ No newline at end of file
taskset -c 0 ./HelloWorld-loop &
taskset -c 0 nice -6 ./HelloWorld-loop &
\ No newline at end of file
#include <stdio.h>
int main()
{
long i,j,temp;
printf("HelloWorld!\n");
while(1)
{
for (i=0;i<1024*1024*1024;i++)
{
temp+=1;
}
printf("one iteration!\n");
}
return 0;
}
\ No newline at end of file
taskset -c 0 ./HelloWorld-loop &
taskset -c 0 nice -4 ./HelloWorld-loop &
taskset -c 1 ./HelloWorld-loop &
taskset -c 1 ./HelloWorld-loop &
\ No newline at end of file
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc,char ** argv)
{
long i,j,temp;
char cmd_str[100];
int rc,current_scheduler_policy;
struct sched_param my_params;
//将要设置的调度参数
if(argc!=3)
{
printf("usage:RR-FIFO-sched sched_class priority \nsched_class: 0 for CFS; 1 forFIFO; 2 for RR\n");
exit(1);
}
my_params.sched_priority=atoi(argv[2]);
rc=sched_setscheduler(0,atoi(argv[1]),&my_params);
if(rc<0)
{
perror("sched_setscheduler error\n");
exit(0);
}
current_scheduler_policy=sched_getscheduler(0);
printf("the PID:%d current scheduler = %d \n", getpid(),current_scheduler_policy);
for(i=0;i<1024*1024*1024;i++)
for(j=0;j<10;j++)
temp++;
sprintf(cmd_str,"cat /proc/%d/sched > ./sched-%d ; date >> ./sched-%d", getpid(),
getpid(), getpid());
system(cmd_str);
//记录各个进程的/proc/PID/sched 以及时间信息
return 0;
}
\ No newline at end of file
taskset -c 0 ./RR-FIFO-sched 1 95&
taskset -c 0 ./RR-FIFO-sched 1 95
\ No newline at end of file
./RR-FIFO-sched 1 5&
./RR-FIFO-sched 1 10&
./RR-FIFO-sched 1 15&
./RR-FIFO-sched 1 20&
./RR-FIFO-sched 1 25&
./RR-FIFO-sched 1 30&
./RR-FIFO-sched 1 35&
./RR-FIFO-sched 2 80&
./RR-FIFO-sched 2 80
\ No newline at end of file
# 实验记录
#### 3-1 /proc/cpuinfo 信息
```bash
cat /proc/cpuinfo
......@@ -55,6 +56,7 @@ cat /proc/15363/stat
* nice 命令可以用-xx 给出调整的数值(降低优先级 xx),也可以用“-n xx”方式直接设定 NICE 值(-
20~19)
* taskset -c 0 在命令前加上这条语句可以绑定进程运行在制定CPU<br>
3-11 执行 Run-NICE.sh 脚本并用 ps –a 查看
![image](./record/pic/3-11.png)<br>
......@@ -70,6 +72,7 @@ cat /proc/15363/stat
#### 3-15&3-16创建实时进程
* 以 root 身份运行 RT-process-demo 进程,如果以普通用户运行 RT-process-demo 则会报告不允许创建实时进程。<br>
* 实时任务的均衡原则很简单,对于 N 个处理器的系统,保证优先级最高的 N 个实时任务各自在一个处理器上运行。如果实时任务少于 N 个,则多出来的处理器可以运行普通 CFS 任务。
3-15 用 ps –al 观察 RT-process-demo 的四个观测点
![image](./record/pic/3-15a.png)
......@@ -102,7 +105,9 @@ RR-FIFO-sched (10044, #threads: 1)
-------------------------------------------------------------------
nr_involuntary_switches : 198
se.load.weight : 1024
policy : 2
policy : 2实时任务的均衡原则很简单,对于 N 个处理器的系统,保证优先级最高的 N 个实时任务
各自在一个处理器上运行。如果实时任务少于 N 个,则多出来的处理器可以运行普通 CFS 任
务。
prio : 9
-------------------------------------------------------------------
nr_involuntary_switches : 199
......@@ -131,7 +136,9 @@ top命令后按 f 进入管理界面根据提示操作打开Last Used Cpu
![image](./record/pic/3-22.png)
可以发现4个进程被分配在4个不同的CPU核心上运行
3-23 察看运行-5/0/+5/+10 四个进程后各处理器负载
FIFO 任务执
行时不被打断一直到运行结束(除非更高优先级的实时任务来抢占),而后者的 RR 任务在执
行一个时间片之后将让出 CPU 给其他相同优先级的 RR 任务实现轮转执行。3-23 察看运行-5/0/+5/+10 四个进程后各处理器负载
![image](./record/pic/3-23.png)
3-24 从/proc/PID/sched 中查看进程的迁移次数
......@@ -147,3 +154,71 @@ top命令后按 f 进入管理界面根据提示操作打开Last Used Cpu
3-26 用/proc/PID/sched 查看进程迁移次数
![image](./record/pic/3-26.png)
#### 3-27&3-28实时进程负载均衡
进程在八个处理器上运行
![image](./record/pic/3-28.png)
高优先级实时进程抢占低优先级实时进程的示例,开启一个优先级更高的进程
![image](./record/pic/3-28.png)
# 课后作业
#### 1.在一个空闲的单核 Linux 系统上用 nice 命令调整两个进程的优先级,使得它们各自使用 1/5 和 4/5 的 CPU 资源。
```bash
cat Run-NICE.sh
taskset -c 0 ./HelloWorld-loop &
taskset -c 0 nice -6 ./HelloWorld-loop &
```
运行结果如下:
![image](./homework/1/1.png)
#### 2.P1/P3 在第一个处理器上运行各占 50%的 CPU 资源,P2/P4 在另一个处理器上运行,各自 30%和 70%的 CPU 资源。
```bash
cat Run-NICE.sh
taskset -c 0 ./HelloWorld-loop &
taskset -c 0 nice -4 ./HelloWorld-loop &
taskset -c 1 ./HelloWorld-loop &
taskset -c 1 ./HelloWorld-loop &
```
运行结果如下:
![image](./homework/2/2.png)
#### 3.请预测 Linux 对于相同优先级的 FIFO 实时进程的调度情况,并通过实验给出实测数据以证明。
教材中提到:
* FIFO 任务执行时不被打断一直到运行结束(除非更高优先级的实时任务来抢占),而后者的 RR 任务在执行一个时间片之后将让出 CPU 给其他相同优先级的 RR 任务实现轮转执行。
* FIFO 由于避免了调度切换的时间开销,因此更有利于本任务的快速完成。但是同时由于FIFO 也会造成同级 FIFO 任务的明显延迟.
故可以猜测 Linux 对于相同优先级的 FIFO 实时进程会安装先进先出的原则执行完一个进程后再执行另外一个。
实验结果如下:
1.启动两个相同优先级的FIFO 实时进程
![image](./homework/3/3_homework_3_1.png)
2.观察top结合1的打印结果,发现只有一个成功执行
![image](./homework/3/3_homework_3_2.png)
3.一段时间后第一个进程执行完毕,第二进程PID号才打印了出来,说明两者运行互斥
![image](./homework/3/3_homework_3_3.png)
![image](./homework/3/3_homework_3_4.png)
#### 4.在一个空载的系统上,如果将代码 3-8 的最后一行替换成两个“RR-FIFO-sched 2 80”,请预测其负载均衡后进程的运行情况,并说明是否只有一种处理器分配方案?
```bash
cat RT-Balance.sh
./RR-FIFO-sched 1 5&
./RR-FIFO-sched 1 10&
./RR-FIFO-sched 1 15&
./RR-FIFO-sched 1 20&
./RR-FIFO-sched 1 25&
./RR-FIFO-sched 1 30&
./RR-FIFO-sched 1 35&
./RR-FIFO-sched 2 80&
./RR-FIFO-sched 2 80
```
知识点:
* 以 O(1)调度器方式调度——本处理器上的实时进程按照优先级不同挂入不同的子队列中,高优先级的队列先执行完再执行低优先级的队列上的进程。
* 实时进程可以进一步分为两种调度模式:SCHED_FIFO 和 SCHED_RR。前者的 FIFO 任务执行时不被打断一直到运行结束(除非更高优先级的实时任务来抢占),而后者的 RR 任务在执行一个时间片之后将让出 CPU 给其他相同优先级的 RR 任务实现轮转执行。
预测:后面运行的RR-FIFO-sched 2 80拥有高的优先级故会挂载进队列并开始运行,最低优先级的./RR-FIFO-sched 1 5 被挤出队列,待其他进程完成后再运行
实际结果(一开始运行就卡炸了):
首先,8个优先级较高的开始运行,最高占用不超过95%
![image](./homework/4/4-1.png)
待8个优先级较高的进程执行完成后,优先级较低的进程开始执行
![image](./homework/4/4-2.png)
\ No newline at end of file
./RR-FIFO-sched 1 5&
./RR-FIFO-sched 1 5&
./RR-FIFO-sched 1 10&
./RR-FIFO-sched 1 15&
./RR-FIFO-sched 1 20&
./RR-FIFO-sched 1 25&
./RR-FIFO-sched 1 30&
./RR-FIFO-sched 1 35&
./RR-FIFO-sched 1 85&
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册