20252820_进程管理实验
一、实验基本信息
- 课程名称:操作系统实验
- 实验名称:第三章 进程管理实验
- 实验环境:
- 操作系统:openEuler
- 内核版本:
5.10.0+ - 开发工具:
gcc、make - 其他:cgroup(cpuset、devices 子系统)
二、实验目的
- 理解 Linux 内核中进程与内核线程的基本概念和实现方式。
- 掌握内核模块编写、编译、加载和卸载的方法。
- 能够遍历进程控制块,获取进程状态、PID 和进程名。
- 学会使用 cgroup cpuset 子系统限制进程可用 CPU 核数。
- 学会使用 cgroup devices 子系统限制进程对 U 盘等设备的访问。
三、实验内容与步骤
任务一:创建并运行内核线程
1. 任务目标
- 编写内核模块,在模块加载时创建并启动一个内核线程;
- 内核线程周期性打印信息;
- 模块卸载时正确终止该线程。
2. 核心代码(kthread.c)

3. Makefile

4. 实验步骤
- 在
~/os_exp/ch3_task1目录下编写kthread.c。 - 编写对应的
Makefile,配置好KERNELDIR。 - 执行
make编译生成kthread.ko。 - 使用
insmod kthread.ko加载模块。 - 使用
lsmod | grep kthread检查模块是否加载成功。 - 使用
dmesg | tail查看内核线程运行输出。 - 使用
rmmod kthread卸载模块。 - 再次
dmesg | tail确认线程已结束。

5. 运行结果与分析
- 主要现象描述:
- 模块加载时内核日志输出:创建内核线程的提示信息;
- 线程运行时周期性打印日志;
- 卸载模块后日志中打印线程结束的信息。

任务二:打印当前系统 CPU 负载情况
1. 任务目标
- 编写内核模块,在模块加载时读取
/proc/loadavg; - 提取 1 分钟内 CPU 负载值,并通过
printk输出到内核日志。
2. 核心代码(cpu_loadavg.c)

3. Makefile

4. 实验步骤
- 在
~/os_exp/ch3_task2目录中编写cpu_loadavg.c。 - 编写
Makefile并完成编译,生成cpu_loadavg.ko。 - 使用
insmod cpu_loadavg.ko加载模块。 - 使用
dmesg | tail查看 CPU 负载的打印结果。 - 使用
rmmod cpu_loadavg卸载模块,再次查看日志。

5. 运行结果与分析

任务三:打印当前处于运行状态进程的 PID 和名称
1. 任务目标
- 使用
for_each_process宏遍历系统中所有进程; - 找出处于运行状态(
state == 0)的进程; - 打印其 PID 和进程名。
2. 核心代码(process_info.c)

3. Makefile

4. 实验步骤
- 在
~/os_exp/ch3_task3目录中编写process_info.c。 - 使用
make编译生成process_info.ko。 - 使用
insmod process_info.ko加载模块。 - 使用
dmesg | tail -n 50查看打印出的运行中进程列表。 - 使用
rmmod process_info卸载模块,并查看退出日志。

5. 运行结果与分析


任务四:使用 cgroup 限制进程可用 CPU 核数(cpuset)
1. 任务目标
- 使用 cgroup 的 cpuset 子系统限制进程可用的 CPU 核数;
- 编写死循环程序
while_long,观察其 CPU 使用情况; - 使用
taskset验证进程被绑定在指定 CPU 核上。
2. 用户态测试程序(while_long.c)

3. 实验步骤
- 在
~/os_exp/ch3_task4目录编写并编译while_long.c:gcc while_long.c -o while_long
- 创建并挂载 cgroup cpuset 子系统:
mkdir -p /cgroupmount -t tmpfs tmpfs /cgroupmkdir /cgroup/cpusetmount -t cgroup -o cpuset cpuset /cgroup/cpuset
- 创建 cpuset 控制组
mycpuset并配置:mkdir /cgroup/cpuset/mycpusetecho 0 > cpuset.memsecho 0-2 > cpuset.cpus(根据实际 CPU 调整)
- 运行
./while_long,在另一终端通过pgrep while_long获取 PID。 - 通过写入
/cgroup/cpuset/mycpuset/tasks将该进程加入 cgroup:echo <PID> > /cgroup/cpuset/mycpuset/tasks
- 使用
top、taskset -p <PID>、taskset -cp <PID>查看 CPU 亲和性。


4. 运行结果与分析

任务五:使用 cgroup 限制进程访问 U 盘(devices)
1. 任务目标
- 使用 cgroup 的 devices 子系统禁止进程访问指定 U 盘设备;
- 使用
dd测试访问 U 盘是否被禁止; - 理解 devices 子系统的 allow/deny 规则。
2. 实验前准备
- 插入 U 盘,使用
fdisk -l找到对应设备(如/dev/sda1)。 - 使用
ls -l /dev/sda1查看主设备号和次设备号(如8,1)。 - 将 U 盘挂载到
/usb:mkdir -p /usbmount /dev/sda1 /usb
3. 挂载 devices 子系统并创建 mydevices
mkdir -p /cgroupmount -t tmpfs tmpfs /cgroupmkdir /cgroup/devicesmount -t cgroup -o devices devices /cgroup/devicesmkdir /cgroup/devices/mydevicescd /cgroup/devices/mydevices
4. 配置拒绝访问 U 盘的规则
bash
echo 'a 8:1 rwm' > devices.deny # 根据实际主/次设备号填写

5. 将当前 shell 加入 devices cgroup 并执行 dd
-
在
/cgroup/devices/mydevices中执行:bashecho $$ > tasks cat tasks -
在同一终端中执行
dd测试访问 U 盘:bashdd if=/dev/sda1 of=/home/temfile bs=1 count=12800 -
记录出现的错误信息(期望为
Operation not permitted)。

6. 运行结果与分析
