【操作系统】实验七 显示进程列表

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【操作系统】实验七 显示进程列表

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢支持!!!

实验七 显示进程列表

一、实验目的

掌握进程结构及进程管理原理

二、实验内容

  1. 实验名称:显示进程列表
  2. 实验任务:

编写一个模块,将它作为Linux内核空间的扩展来执行,并报告模块加载时内核的当前进程信息,进一步了解用户空间和内核空间的概念。

三、实验过程记录

部分A

实验任务:查看系统已加载模块。写一个小的模块打印“hello world”。

查看已加载模块,如图所示。

编写小模块打印“hello world”

代码如下:

20191909.c文件

#include<linux/module.h>
int hello_init(void)
{
    printk("\nhello world\n");
    return 0;
}
void hello_exit(void){
    printk("\n bye bye world\n");
}
MODULE_AUTHOR("20191909");//id
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);

Makefile文件

obj-m:=20191909.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

操作如下:

编译 make 如图1所示

图1

加载模块insmod 20191909.ko 如图2所示

图2

查看日志dmesg如图3所示

图3

4) 删除模块rmmod 20191909.ko 如图4所示

图4

查看日志dmesg如图5所示

图5

部分B

实验任务:设计模块遍历进程描述符链表,打印出系统的进程数目、当前进程,并尽量多地打印每个进程的信息。例如:进程PID,进程状态等。

编写代码如下:

20191909.c文件

#include <linux/init.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <linux/sched.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int num = -1;
module_param(num, int, S_IRUGO);
static __init int exp_init(void){
  struct task_struct *p = NULL;
  // for_each_process宏遍历系统中的每个进程,将其赋值给p
  printk("数量:%d",num);
  for_each_process(p)
  {
    if (num==0 )
      break;
    // 使用printk函数打印当前进程的PID和进程名称,real_parent->pid : 父进程id   __state : 状态
    printk("pid=%d,name=%s,parent_id=%d,state=%d\n", p->pid, p->comm,p->real_parent->pid,p->__state);
    num--;
  }
  return 0;
}
static __exit void exp_exit(void){
  printk("Good bye.\n");
}
module_init(exp_init);
module_exit(exp_exit);

Makefile 文件

obj-m:=20191909.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

操作如下:

编译make 如图6所示

图6

加载模块insmod 20191909.ko 如图7所示

图7

查看日志 dmesg 可以看到进程的PID、进程名称、父进程id、当前状态 如图8所示

图8

删除模块 rmmod 20191909.ko如图9所示

图9

四、实验小结

本次实验旨在通过编写Linux内核模块来了解用户空间和内核空间的概念,并掌握如何显示进程列表。实验分为两部分进行。

在实验的第一部分中,我们成功编写了一个简单的内核模块,用以打印“hello world”信息。通过编译、加载模块、查看日志和删除模块的步骤,我们确认了模块的正确加载和工作。这个过程加深了我们对内核模块生命周期管理的理解。

在实验的第二部分中,我们设计了一个更复杂的内核模块,用于遍历进程描述符链表,打印出系统的进程数目、当前进程以及尽可能多的进程信息(例如:进程PID,进程状态等)。通过这个过程,我们不仅学习了如何访问和操作内核中的进程信息,还加深了对Linux内核进程管理机制的了解。

存在的问题和注意事项:

  1. 在编写内核模块时,需要确保代码的稳定性和安全性,因为任何错误都可能导致系统崩溃或安全漏洞。
  2. 在使用printk进行调试时,应该注意其输出级别,以免产生大量的日志信息影响系统性能。
  3. 在遍历进程时,我们使用了for_each_process宏,需要了解其工作原理及如何正确使用它。
  4. 模块参数的使用提供了灵活性,但也需要注意确保传入的参数是合法的,防止模块运行时出现异常。
    有待提高的能力:
  5. 对内核编程的熟练度,包括更深入地理解内核API和内核编程的最佳实践。
  6. 对Linux内核的整体架构和机制的理解,特别是进程管理、内存管理和模块管理等方面。
  7. 调试技能的提高,包括使用更高级的内核调试工具和技术。
  8. 编写更加健壮和高效的内核代码的能力。
  9. 总体而言,本次实验不仅帮助我们实践了内核模块的编写和操作,还增进了我们对Linux内核的理解,为今后深入学习Linux内核打下了良好的基础。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
16天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
43 1
|
20天前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
18天前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
18天前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
19天前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
18天前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
19天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
22天前
|
算法 Linux 调度
深入浅出操作系统的进程管理
本文通过浅显易懂的语言,向读者介绍了操作系统中一个核心概念——进程管理。我们将从进程的定义出发,逐步深入到进程的创建、调度、同步以及终止等关键环节,并穿插代码示例来直观展示进程管理的实现。文章旨在帮助初学者构建起对操作系统进程管理机制的初步认识,同时为有一定基础的读者提供温故知新的契机。
|
22天前
|
消息中间件 算法 调度
深入理解操作系统之进程管理
本文旨在通过深入浅出的方式,带领读者探索操作系统中的核心概念——进程管理。我们将从进程的定义和重要性出发,逐步解析进程状态、进程调度、以及进程同步与通信等关键知识点。文章将结合具体代码示例,帮助读者构建起对进程管理机制的全面认识,并在实践中加深理解。
|
24天前
|
负载均衡 算法 调度
深入理解操作系统:进程管理与调度
在数字世界的心脏,操作系统扮演着至关重要的角色。它如同一位精明的指挥家,协调着硬件资源和软件需求之间的和谐乐章。本文将带你走进操作系统的核心,探索进程管理的艺术和调度策略的智慧。你将了解到进程是如何创建、执行和消亡的,以及操作系统如何巧妙地决定哪个进程应该在何时获得CPU的青睐。让我们一起揭开操作系统神秘的面纱,发现那些隐藏在日常计算背后的精妙机制。