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

相关推荐
浪客灿心11 分钟前
Linux网络传输层协议
linux·运维·网络
舟遥遥娓飘飘38 分钟前
Nexus4CC 手机电脑同步claude code对话部署教程(基于linux系统)
linux·智能手机·电脑
何妨呀~1 小时前
Firewalld防火墙端口配置
linux
切糕师学AI1 小时前
Vim 深度解析:从经典 vi 到现代编辑器之巅
linux·vim·文本编辑器
计算机安禾1 小时前
【Linux从入门到精通】第49篇:服务器故障排查终极指南——思路决定出路
linux·运维·服务器
古月-一个C++方向的小白1 小时前
Linux——初识文件
linux·运维·服务器
北山有鸟2 小时前
编译香橙派内核
linux·运维·服务器
小此方2 小时前
Re:Linux系统篇(八)权限篇 ·三:深度解析从 umask 位运算到粘滞位的“权力锁”
linux·运维·服务器
晨曦夜月2 小时前
进程的五大状态及特殊进程解析
linux·服务器·算法
生而为虫2 小时前
Claude Code 最新版安装教程(Windows/Mac/Linux 全平台) 面向普通用户的 Claude Code 安装与模型接入指南
linux·windows·macos