【问题标题】:Access current running processes in xv6?在 xv6 中访问当前正在运行的进程?
【发布时间】:2015-09-14 18:36:28
【问题描述】:

所以我正在尝试一种可能的方式来访问 xv6 中当前正在运行的进程的列表。我的想法是获得对 ptable 的访问权限,这样我就可以遍历它并为所有正在运行的程序增加一个计数器。但是,如果我正在对其进行系统调用(因此写入 sysproc.c),我无法访问 ptable,因为它似乎(对我来说,我仍在四处寻找)是 proc 独有的。 c

无论如何我可以访问表以循环并查找正在运行的进程,还是我应该考虑另一种方法?

编辑:在头文件中创建一个计数器变量会更容易吗,每次创建进程时都会增加它,一旦进程退出就会减少它?

【问题讨论】:

    标签: xv6


    【解决方案1】:

    但是,如果我正在为它进行系统调用(因此写入 sysproc.c),我无法访问 ptable,因为它看起来(对我来说,我仍在四处寻找)是独占的到proc.c

    你是对的。您无法在 sysproc.c 中访问它。 您大概可以访问整个 xv6 源代码,这意味着您可以在 proc.c(不是 sysproc.c)中添加一个函数来迭代这个 ptable 并做一些事情。

    无论如何我可以访问表以循环并查找正在运行的进程,还是我应该考虑另一种方法?

    直接在 proc.c 之外访问它是行不通的。幸运的是,调用访问 ptable 的 proc.c 函数将起作用。如果您查看 sysproc.c,它会调用编写在 proc.c 内部的函数,这些函数确实使用了 ptable。

    例如,您可以查看“退出”函数并查看相关代码在 xv6 中的位置,以了解使用 ptable 的系统调用如何工作:

    proc.c: //Implementation of exit function
    ...
    2353 void
    2354 exit(void)
    2355 {
    ...
    2379 for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
    ...
    2391 }
    

    proc.c 中的 exit 函数能够循环遍历在 proc.c 中实例化的进程表。

    defs.h:
    ...
    0357 // proc.c
    0358 struct proc* copyproc(struct proc*);
    0359 void exit(void);
    0360 int fork(void);
    ...
    

    defs.h 文件包含退出函数的前向声明。

    sysproc.c: //Implementation of a syscall 'exit' 
    ...
    3414 int
    3415 sys_exit(void)
    3416 {
    3417 exit();
    3418 return 0; // not reached
    3419 }
    

    sys_exit 函数 sysproc.c 包含 exit syscall 的完整实现,它从 proc.c 调用 exit(),它在某一时刻对 ptable 进行交互。

    如果您计划对 ptable 进行迭代,您可能需要考虑编写一个您的系统调用可以调用的函数来执行它需要做的任何事情,这就是我将退出系统调用作为示例的原因。

    Source code for xv6

    希望这有助于您的理解!

    【讨论】:

    • 谢谢你!绝对有助于我的理解,并且能够完成并理解这一点!既然这么说;如果我要计算当前进程,最好为 ptable 获取锁吗?
    • 很抱歉没有这么快回复您 - 不幸的是,我不确定这个问题的答案!我很确定获取锁是必要的,因为在没有锁的情况下计算进程会在你计数时打开 ptable 更改的可能性。
    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多