20252820_进程管理实验

20252820_进程管理实验


一、实验基本信息

  • 课程名称:操作系统实验
  • 实验名称:第三章 进程管理实验
  • 实验环境:
    • 操作系统:openEuler
    • 内核版本:5.10.0+
    • 开发工具:gccmake
    • 其他:cgroup(cpuset、devices 子系统)

二、实验目的

  1. 理解 Linux 内核中进程与内核线程的基本概念和实现方式。
  2. 掌握内核模块编写、编译、加载和卸载的方法。
  3. 能够遍历进程控制块,获取进程状态、PID 和进程名。
  4. 学会使用 cgroup cpuset 子系统限制进程可用 CPU 核数。
  5. 学会使用 cgroup devices 子系统限制进程对 U 盘等设备的访问。

三、实验内容与步骤

任务一:创建并运行内核线程

1. 任务目标
  • 编写内核模块,在模块加载时创建并启动一个内核线程;
  • 内核线程周期性打印信息;
  • 模块卸载时正确终止该线程。
2. 核心代码(kthread.c)
3. Makefile
4. 实验步骤
  1. ~/os_exp/ch3_task1 目录下编写 kthread.c
  2. 编写对应的 Makefile,配置好 KERNELDIR
  3. 执行 make 编译生成 kthread.ko
  4. 使用 insmod kthread.ko 加载模块。
  5. 使用 lsmod | grep kthread 检查模块是否加载成功。
  6. 使用 dmesg | tail 查看内核线程运行输出。
  7. 使用 rmmod kthread 卸载模块。
  8. 再次 dmesg | tail 确认线程已结束。
5. 运行结果与分析
  • 主要现象描述:
    • 模块加载时内核日志输出:创建内核线程的提示信息;
    • 线程运行时周期性打印日志;
    • 卸载模块后日志中打印线程结束的信息。

任务二:打印当前系统 CPU 负载情况

1. 任务目标
  • 编写内核模块,在模块加载时读取 /proc/loadavg
  • 提取 1 分钟内 CPU 负载值,并通过 printk 输出到内核日志。
2. 核心代码(cpu_loadavg.c)
3. Makefile
4. 实验步骤
  1. ~/os_exp/ch3_task2 目录中编写 cpu_loadavg.c
  2. 编写 Makefile 并完成编译,生成 cpu_loadavg.ko
  3. 使用 insmod cpu_loadavg.ko 加载模块。
  4. 使用 dmesg | tail 查看 CPU 负载的打印结果。
  5. 使用 rmmod cpu_loadavg 卸载模块,再次查看日志。
5. 运行结果与分析

任务三:打印当前处于运行状态进程的 PID 和名称

1. 任务目标
  • 使用 for_each_process 宏遍历系统中所有进程;
  • 找出处于运行状态(state == 0)的进程;
  • 打印其 PID 和进程名。
2. 核心代码(process_info.c)
3. Makefile
4. 实验步骤
  1. ~/os_exp/ch3_task3 目录中编写 process_info.c
  2. 使用 make 编译生成 process_info.ko
  3. 使用 insmod process_info.ko 加载模块。
  4. 使用 dmesg | tail -n 50 查看打印出的运行中进程列表。
  5. 使用 rmmod process_info 卸载模块,并查看退出日志。
5. 运行结果与分析



任务四:使用 cgroup 限制进程可用 CPU 核数(cpuset)

1. 任务目标
  • 使用 cgroup 的 cpuset 子系统限制进程可用的 CPU 核数;
  • 编写死循环程序 while_long,观察其 CPU 使用情况;
  • 使用 taskset 验证进程被绑定在指定 CPU 核上。
2. 用户态测试程序(while_long.c)
3. 实验步骤
  1. ~/os_exp/ch3_task4 目录编写并编译 while_long.c
    • gcc while_long.c -o while_long
  2. 创建并挂载 cgroup cpuset 子系统:
    • mkdir -p /cgroup
    • mount -t tmpfs tmpfs /cgroup
    • mkdir /cgroup/cpuset
    • mount -t cgroup -o cpuset cpuset /cgroup/cpuset
  3. 创建 cpuset 控制组 mycpuset 并配置:
    • mkdir /cgroup/cpuset/mycpuset
    • echo 0 > cpuset.mems
    • echo 0-2 > cpuset.cpus(根据实际 CPU 调整)
  4. 运行 ./while_long,在另一终端通过 pgrep while_long 获取 PID。
  5. 通过写入 /cgroup/cpuset/mycpuset/tasks 将该进程加入 cgroup:
    • echo <PID> > /cgroup/cpuset/mycpuset/tasks
  6. 使用 toptaskset -p <PID>taskset -cp <PID> 查看 CPU 亲和性。

4. 运行结果与分析

任务五:使用 cgroup 限制进程访问 U 盘(devices)

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

    bash 复制代码
    echo $$ > tasks
    cat tasks
  2. 在同一终端中执行 dd 测试访问 U 盘:

    bash 复制代码
    dd if=/dev/sda1 of=/home/temfile bs=1 count=12800
  3. 记录出现的错误信息(期望为 Operation not permitted)。

6. 运行结果与分析

相关推荐
model20052 小时前
Alibaba linux 3安装LAMP(5)
linux·运维·服务器
哇哈哈&3 小时前
安装wxWidgets3.2.0(编译高版本erlang的时候用,不如用rpm包),而且还需要高版本的gcc++19以上,已基本舍弃
linux·数据库·python
minihuabei5 小时前
跨域拉镜像
linux
王 富贵5 小时前
【Linux】防火墙常用命令(iptables/firewalld/ufw)
linux·运维·服务器
写代码的【黑咖啡】5 小时前
Linux系统简介及常用命令分类详解
linux·运维·服务器
YFLICKERH6 小时前
【Linux系统】ubuntu 25.04 虚拟机联网与DNS域名问题排查案例
linux·ubuntu25.04
松涛和鸣6 小时前
DAY27 Linux File IO and Standard IO Explained: From Concepts to Practice
linux·运维·服务器·c语言·嵌入式硬件·ubuntu
GeniuswongAir6 小时前
飞牛NAS死机排查
linux·运维·服务器
hhcgchpspk6 小时前
linux查找并杀死进程部分方法
linux·运维·服务器·网络·经验分享