Closed MadPlayer closed 2 years ago
mvrlu_try_lock을 무한히 반복하는 것은 아래의 코드를 제대로 구현하지 않았기 때문이었습니다.
int port_addr_in_log_region(void *addr__)
{
unsigned long long addr = (unsigned long long)addr__;
return addr >= KVMALLOC && addr < KVMALLOCEND;
}
kernel에서 생성하는 process들은 따로 부모 자식 관계가 없이 생성되므로 wait을 사용할 수 없습니다. 단순히 오랜 시간을 기다리는 것으로 해결했습니다.
stop = 1;
cprintf("join %d threads...\n", nb_threads);
sleep_usec(nsectime(), 4000); // wait for threads
cprintf(" done!\n");
kbench 실행시 문제가 2가지 있습니다.
test thread 종료문제
stop이라는 공유 변수를 변경해도 종료되지 않는 문제가 있습니다.
gdb 실행시 mvrlu_try_lock을 지속적으로 실패하는 문제가 발견되었습니다.
qp_thread 종료문제
qp_thread는 mvrlu_finish 호출시에 종료하는데 test thread들이 실행중임에도 먼저 종료되는 문제가 발생했습니다. wait 함수의 비정상작동 혹은 부적절한 사용때문인 것으로 보입니다. 현재 wait에는 pid에 -1을 넘겨주고 있는데 이는 wait을 호출한 process의 자식들을 기다리게 합니다. 문제는 threadpin 함수로 생성한 process가 자식으로 등록되어 있는지의 여부입니다.
Process 문제 확인
scalefs에서는 여러 keyboard interrupt handling을 지원해 주고 있습니다.
kernel/console.cc에 이러한 정의들을 볼 수 있습니다.
제가 thread의 비정상 종료를 확인한 방법은 아래와 같습니다.
이 키입력은 현재 실행되고 있는 모든 Process들에 대한 정보를 출력합니다.
실제 실험 결과
여기서 추가적인 문제점을 확인할 수 있습니다.
test thread들 중 하나가 runnable 상태로 있는 것을 볼 수 있습니다.
위에서 실험한 코드는 https://github.com/MadPlayer/mvcc-os/tree/fix_port 에 있습니다.