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. 运行结果与分析

相关推荐
优选资源分享16 小时前
开源免费 Linux 服务器管理工具 Server Box v1.0.1297
linux·服务器·开源
颢珂智库Haokir Insights16 小时前
宝塔面板安装教程(新手完整指南)
linux·运维·服务器
晨非辰16 小时前
Linux文件操作实战:压缩/传输/计算10分钟速成,掌握核心命令组合与Shell内核交互秘籍
linux·运维·服务器·c++·人工智能·python·交互
代码AC不AC16 小时前
【Linux】环境变量
linux·环境变量·命令行参数
努力努力再努力wz17 小时前
【Linux网络系列】:JSON+HTTP,用C++手搓一个web计算器服务器!
java·linux·运维·服务器·c语言·数据结构·c++
物理与数学1 天前
linux 内存分布
linux·linux内核
东城绝神1 天前
《Linux运维总结:基于ARM64+X86_64架构使用docker-compose一键离线部署MySQL8.0.43 NDB Cluster容器版集群》
linux·运维·mysql·架构·高可用·ndb cluster
creator_Li1 天前
即时通讯项目--(1)环境搭建
linux·运维·ubuntu
Mr'liu1 天前
MongoDB 7.0 副本集高可用部署
linux·mongodb
文静小土豆1 天前
Rocky Linux 二进制 安装K8S-1.35.0高可用集群
linux·运维·kubernetes