Доступ к текущим запущенным процессам в xv6?
Поэтому я пытаюсь придумать возможный способ доступа к списку текущих запущенных процессов в xv6. Мой мыслительный процесс состоит в том, чтобы получить доступ к ptable, так что я могу пройти по нему и увеличить счетчик для всех работающих. Однако, если я делаю системный вызов для этого (пишу в sysproc.c), у меня нет доступа к ptable, так как кажется (я все еще копаюсь), чтобы быть эксклюзивным для proc. с
Могу ли я в любом случае получить доступ к таблице, чтобы пройтись по ней и найти запущенные процессы, или есть другой подход, который я должен рассмотреть?
Изменить: Будет ли проще просто создать переменную счетчика в заголовочном файле, и каждый раз, когда создается процесс, увеличивать его, а после выхода из процесса уменьшать его?
1 ответ
Однако, если я делаю системный вызов для этого (пишу в sysproc.c), у меня нет доступа к ptable, так как кажется (я все еще копаюсь), чтобы быть эксклюзивным для proc. с
Ты прав. У вас нет доступа к нему внутри sysproc.c. Предположительно, у вас есть доступ ко всему источнику xv6, что означает, что вы можете добавить функцию в proc.c (не sysproc.c), чтобы перебирать этот ptable и делать что-то еще.
Могу ли я в любом случае получить доступ к таблице, чтобы пройтись по ней и найти запущенные процессы, или есть другой подход, который я должен рассмотреть?
Доступ к нему прямо за пределами proc.c не будет работать. К счастью для вас, вызов функции proc.c, которая обращается к ptable, будет работать. Если вы посмотрите на sysproc.c, он вызывает функции, написанные внутри proc.c, которые используют ptable.
Например, вы можете посмотреть на функцию 'exit' и посмотреть, где находится соответствующий код в 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 может циклически проходить по таблице процессов, которая создается в 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, который вызывает метод exit() из proc.c, который в какой-то момент взаимодействует с таблицей.
Если вы планируете перебирать ptable, вы можете подумать о написании функции, которую ваш системный вызов может вызывать, чтобы делать все, что нужно, именно поэтому я включил системный вызов exit в качестве примера.
Надеюсь, это поможет вам понять!