> # ♻️ 资源
> **大小:** 2.74MB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010139**](https://www.yuque.com/sxbn/ks/100010139)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87293626**](https://download.csdn.net/download/s1t16/87293626)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 进程运行轨迹的跟踪与统计
## 实验内容
进程从创建(Linux 下调用 _fork()_)到结束的整个过程就是进程的生命期,进程在其生命期中的运行轨迹实际上表现为进程状态的多次切换,如进程创建以后会成为就绪态;当该进程被调度以后会切换到运行态;在运行的过程中如果启动一个文件读写操作,操作系统会将该进程切换到阻塞态(等待态)从而让出 CPU;当文件读写完毕,操作系统会将其切换成就绪态,等待进程调度算法来调度该进程执行……
本实验内容包括:
- 基于模板 _process.c_ 编写多进程的样本程序,实现如下功能:
- 所有子进程都并行执行,每个子进程的实际运行时间一般不超过 30 秒
- 父进程向标准输出打印所有子进程的 id,并在所有子进程都退出后才退出
- 在 Linux 0.11 上实现进程运行轨迹的跟踪
基本任务是在内核中维护一个日志文件_/var/process.log_,把操作系统启动到系统关机过程中所有进程的运行轨迹都记录在这一 log 文件中
_/var/process.log_ 文件的格式必须为:
```
pid X time
```
其中:
- pid 是进程的 ID
- X 可以是 N,J,R,W 和 E 中的任意一个
- N 进程新建
- J 进入就绪态
- R 进入运行态
- W 进入阻塞态
- E 退出
- time 表示 X 发生的时间。这个时间不是物理时间,而是系统的滴答时间(tick)
三个字段之间用制表符分隔
例如:
```
12 N 1056
12 J 1057
4 W 1057
12 R 1057
13 N 1058
13 J 1059
14 N 1059
14 J 1060
15 N 1060
15 J 1061
12 W 1061
15 R 1061
15 J 1076
14 R 1076
14 E 1076
......
```
- 在修改过的 0.11 上运行样本程序,通过分析 log 文件,统计该程序建立的所有进程的等待时间,完成时间(周转时间)和运行时间,然后计算平均等待时间,平均完成时间和吞吐量。可以自己编写统计程序,也可以使用 python 脚本程序——_stat_log.py_(在实验楼实验环境:操作系统原理与实践的在线 Linux 实验环境_/home/teacher_目录下)——进行统计
- 修改 0.11 进程调度的时间片,然后再运行同样的样本程序,统计同样的时间数据,和原有的情况对比,体会不同时间片带来的差异
- 实验报告
完成实验后,在实验报告中回答如下问题:
- 结合自己的体会,谈谈从程序设计者的角度,单进程编程和多进程编程最大的区别是什么?
- 你是如何修改时间片的?仅针对样本程序建立的进程,在修改时间片前后,log 文件的统计结果(不包括 Graphic)都是什么样?结合你的修改分析一下为什么会这样变化,或者为什么没变化?
- 评分标准
- process.c,50%
- 日志文件成功建立,5%
- 能向日志文件输出信息,5%
- 5 种状态都能输出,10%(每种 2%)
- 调度算法修改,10%
- 实验报告,20%
## 实验分析
### 1. main 函数
_init/main.c_ 中的 _main_ 函数是 _boot/head.s_ 执行完后接着执行的代码。
_main_ 函数首先统计物理内存的容量,并对物理内存进行功能划分。然后进行所有方面的硬件初始化工作,包括陷阱门,块设备,字符设备和 tty。人工设置任务 0(进程 0)的 PCB 以及其在 GDT 表中的任务状态段描述符 tss0 和局部描述符表描述符 ldt0,然后通过模拟从特权级变化的内核中断处理过程的返回机制,手动切换到任务 0 中。在任务 0 中通过 `fork()` 系统调用创建出子进程任务 1(进程 1:init 进程),由 init 进程进行进一步的处理工作。而任务 0 不会退出,它会在系统没有进程运行的空闲状态被调度执行,而任务 0 也只是调用 `puase()` 系统调用主动休眠,再次引发系统调度,以检查当前是否有其他进程需要调度。
#### 1.1 物理内存的功能划分
`memory_end` 变量记录了以字节为单位的物理内存的容量,并且是页大小(_4KB_)的整数倍。`buffer_memory_end` 记录了高速缓冲区的尾端地址,其中包括了用于显存和设备以及 ROM BIOS 的物理内存。`main_memory_start` 记录了主内存区的起始地址,一般来说,`main_memory_start` 等于 `buffer_memory_end`。如果系统包含虚拟盘,则 `main_memory_start` 的起始地址相对于 `buffer_memory_end` 的地址要后移,从而为虚拟盘留出内存空间。
由此可知,系统的物理内存被划分为内核模块,高速缓冲区,虚拟盘,主内存区四大部分。以拥有 _16MB_ 的物理内存的系统为例,下图展示了其物理内存的功能划分:
![](https://www.writebug.com/myres/static/uploads/2021/11/7/9fd859aab0a1d9d96f410c3b1f3c43f5.writebug#id=NuNhA&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)![9fd859aab0a1d9d96f410c3b1f3c43f5.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1704274369402-1d681844-1879-4dc0-961a-6512026b2e57.png#averageHue=%23f9f8f5&clientId=ucb960de0-4af5-4&from=paste&height=274&id=u3e1d4411&originHeight=342&originWidth=1115&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=19066&status=done&style=none&taskId=uf666a197-feb9-4db4-b64f-065bc5237d7&title=&width=892)
##### 1.1.1 mem_map 数组
`mem_map` 数组是全局的,用于对系统扩展内存(大于 _1MB_ 的物理内存)的使用情况以页为单位进行统计。在系统在进行内存初始化时就将 _1MB~4MB_ 的高速缓冲区以及虚拟盘(如果存在)设置为已用状态,所以内存管理模块是对主内存区进行分配管理的。
#### 1.2 任务 0 的内存布局
进程控制块 PCB 是一个 `task_struct` 类型的结构体,里面存放了系统用于描述进程的所有信息:进程的 pid,进程的状态,进程的已经打开的文件描述符等,其中有两个特别重要的数据结构:用于存放硬件上下文(hardware context)的任务状态段(Task State Segment, TSS)和存放进程数据段和代码段信息的局部描述符表(Local Descriptor Table, LDT)。
硬件上下文是进程开始执行(被创建后第一次执行)或恢复执行(退出 CPU 使用权后再次被调度执行)前必须装入 CPU 寄存器的一组数据。其中包含了和进程代码段有关的寄存器 cs 和 eip,和进程数据段有关的寄存器 ds,es,fs,gs,esi,edi,和进程用户态堆栈有关的寄存器 ss 和 esp 以及内核态堆栈有关的 ss0 和 esp0,和页目录表基地址有关的寄存器 cr3,以及 GDT 中的进程的局部描述符表 LDT 的描述符的段选择符 ldt,以及 eax,ebx,ecx,edx 这些通用寄存器等描述 CPU 状态的重要寄存器的值。
任务 0 的 PCB 保存在 `task_union` 联合体类型的 `init_task` 变量中,占据着 `task_struct` 类型的成员变量 `task`,其值是宏变量 `INIT_TASK` 的内容。我们着重看下 `INIT_TASK` 中上面提到的寄存器的值。下图给出了 `INIT_TASK`
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010139 进程从创建(Linux 下调用 fork())到结束的整个过程就是进程的生命期,进程在其生命期中的运行轨迹实际上表现为进程状态的多次切换,如进程创建以后会成为就绪态;当该进程被调度以后会切换到运行态;在运行的过程中如果启动一个文件读写操作,操作系统会将该进程切换到阻塞态(等待态)从而让出 CPU;当文件读写完毕,操作系统会将其切换成就绪态,等待进程调度算法来调度该进程执行…… 本实验内容包括: 基于模板 process.c 编写多进程的样本程序,实现如下功能: 所有子进程都并行执行,每个子进程的实际运行时间一般不超过 30 秒 父进程向标准输出打印所有子进程的 id,并在所有子进程都退出后才退出 在 Linux 0.11 上实现进程运行轨迹的跟踪 基本任务是在内核中维护一个日志文件*/var/process.log*,把操作系统启动到系统关机过程中所有进程的运行轨迹都记录在这一 log 文件中。
资源推荐
资源详情
资源评论
收起资源包目录
基于C语言实现的进程运行轨迹的跟踪与统计【100010139】 (149个子文件)
namei.c 16KB
sched.c 15KB
console.c 14KB
floppy.c 11KB
memory.c 11KB
exec.c 9KB
buffer.c 9KB
hd.c 8KB
tty_io.c 7KB
malloc.c 7KB
inode.c 7KB
super.c 5KB
main.c 5KB
build.c 5KB
exit.c 5KB
testlab2.c 5KB
tty_ioctl.c 5KB
traps.c 5KB
vsprintf.c 5KB
fork.c 5KB
open.c 4KB
bitmap.c 4KB
process.c 4KB
sys.c 4KB
ll_rw_blk.c 3KB
read_write.c 3KB
ramdisk.c 3KB
signal.c 3KB
pipe.c 2KB
process.c 2KB
char_dev.c 2KB
printk.c 2KB
file_dev.c 2KB
fcntl.c 1KB
mktime.c 1KB
block_dev.c 1KB
serial.c 1KB
who.c 1KB
ctype.c 1KB
who_cp.c 1KB
stat.c 1KB
truncate.c 1KB
math_emulate.c 1023B
ioctl.c 982B
panic.c 463B
iam.c 392B
open.c 389B
whoami.c 309B
wait.c 253B
_exit.c 198B
string.c 177B
execve.c 170B
write.c 160B
close.c 131B
setsid.c 128B
dup.c 127B
file_table.c 122B
errno.c 73B
sched.h.cur1 6KB
string.h 7KB
unistd.h 6KB
sched.h 6KB
a.out.h 6KB
fs.h 5KB
termios.h 5KB
blk.h 3KB
sys.h 3KB
fdreg.h 2KB
tty.h 2KB
hdreg.h 2KB
signal.h 2KB
system.h 2KB
fcntl.h 1KB
segment.h 1KB
stat.h 1KB
config.h 1KB
errno.h 1KB
ctype.h 1KB
kernel.h 865B
types.h 805B
stdarg.h 780B
time.h 734B
wait.h 560B
memory.h 492B
io.h 477B
const.h 321B
head.h 304B
stddef.h 286B
utsname.h 234B
utime.h 225B
mm.h 219B
times.h 200B
LICENSE 1KB
process.log 39KB
process_analyze.log 33KB
process.log 5KB
Makefile 5KB
Makefile 4KB
Makefile 3KB
Makefile 3KB
共 149 条
- 1
- 2
资源评论
神仙别闹
- 粉丝: 3769
- 资源: 7468
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功