操作系统实验四 进程运行轨迹的跟踪与统计(哈工大李治军)

本文详细介绍了Linux操作系统实验中关于进程运行轨迹的跟踪与统计,包括实验目的、实验内容、关键函数解释,如fork()、struct tms结构体和clock_t数据类型。文章详细阐述了如何在内核中实现进程状态切换的记录,涉及修改内核源代码如fork.c、sched.c、exit.c等,并讨论了不同时间片对进程调度的影响。实验还涉及了进程状态的四种转换:就绪到运行、运行到就绪、运行到睡眠和睡眠到就绪,以及新建和退出。通过修改时间片,观察进程调度的变化,加深了对调度算法的理解。

实验4 进程运行轨迹的跟踪与统计

实验目的

  • 掌握 Linux 下的多进程编程技术;
  • 通过对进程运行轨迹的跟踪来形象化进程的概念;
  • 在进程运行轨迹跟踪的基础上进行相应的数据统计,从而能对进程调度算法进行实际的量化评价,更进一步加深对调度和调度算法的理解,获得能在实际操作系统上对调度算法进行实验数据对比的直接经验。

实验内容

进程从创建(Linux 下调用 fork())到结束的整个过程就是进程的生命期,进程在其生命期中的运行轨迹实际上就表现为进程状态的多次切换,如进程创建以后会成为就绪态;当该进程被调度以后会切换到运行态;在运行的过程中如果启动了一个文件读写操作,操作系统会将该进程切换到阻塞态(等待态)从而让出 CPU;当文件读写完毕以后,操作系统会在将其切换成就绪态,等待进程调度算法来调度该进程执行……

本次实验包括如下内容:

  • 基于模板 process.c 编写多进程的样本程序,实现如下功能: + 所有子进程都并行运行,每个子进程的实际运行时间一般不超过 30 秒; + 父进程向标准输出打印所有子进程的 id,并在所有子进程都退出后才退出;
  • Linux0.11 上实现进程运行轨迹的跟踪。 + 基本任务是在内核中维护一个日志文件 /var/process.log,把从操作系统启动到系统关机过程中所有进程的运行轨迹都记录在这一 log 文件中。
  • 在修改过的 0.11 上运行
### 关于哈工大操作系统实验进程轨迹的相关资料 #### 实验概述 在哈工大操作系统》课程的第实验室练习中,学生被要求深入理解并实践进程运行轨迹跟踪统计[^1]。此实验不仅涉及编写一个多进程的应用程序来模拟实际场景下的并发执行环境,还涵盖了对Linux 0.11版本内核源码级别的修改工作。 #### 多进程样本程序开发 为了满足实验需求,在`process.c`的基础上构建了一个能够创建多个子进程的应用实例。这些子进程会同时启动,并且各自独立运作一段时间(通常少于三十秒)。父进程中包含了必要的逻辑用于监控其所有后代的状态变化直至它们全部终止前不会结束自身的生命周期[^3]。 #### 日志记录机制设计 针对第二项任务,则需深入研究Linux早期版本即v0.11版的操作系统核心部分。具体来说就是利用当前上下文指针(`current`)以及调度器(`schedule()`)等相关概念和技术手段,在不影响正常业务处理的前提下实现了全局性的活动历史记载功能。每当有任何新的线程诞生或是状态发生转变时都会相应地追加一条新纪录至指定位置(`/var/process.log`)之中保存起来待后续查阅分析之用[^2]。 #### 数据收集性能评估方法论探讨 最后一步则是借助外部工具如Python脚本来解析之前生成的日志文件内容从而得出一系列量化指标比如平均等待周期长度、总耗时长短还有单位时间内所能完成的任务数量等等作为衡量改进措施效果好坏的重要依据之一。此外还可以尝试调整默认分配给各作业的时间片大小参数再重复上述过程进而观察由此引发的变化趋势以便更好地掌握其中规律特性。 ```python import re from collections import defaultdict, namedtuple ProcessLogEntry = namedtuple('ProcessLogEntry', ['pid', 'state_change_time']) def parse_process_log(log_file_path): """Parse the process log file and extract relevant information.""" with open(log_file_path) as f: lines = f.readlines() entries = [] pattern = r'(\d+)\s+(\w+)' for line in lines: match = re.match(pattern, line.strip()) if not match: continue pid, state_change_time = match.groups() entry = ProcessLogEntry(int(pid), float(state_change_time)) entries.append(entry) return entries def calculate_statistics(entries): """Calculate average waiting time, completion time (turnaround time), and throughput based on parsed log entries. """ stats_by_pid = defaultdict(list) for entry in entries: stats_by_pid[entry.pid].append(entry.state_change_time) avg_waiting_times = {} turnaround_times = {} throughputs = {} # Calculate statistics here... return { "avg_waiting_times": avg_waiting_times, "turnaround_times": turnaround_times, "throughputs": throughputs } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值