운영체제(OS)/with PintOS 15

(Project2-User Programs) - User Memory

User Memory Access Implement user memory access 시스템 호출을 구현하려면 사용자 가상 주소 공간에서 데이터를 읽고 쓸 수 있는 방법을 제공해야 합니다. 인수를 받을 때는 이 기능이 필요하지 않습니다. 그러나 시스템 호출의 인수로 제공된 포인터에서 데이터를 읽을 때는 이 기능을 통해 프록시해야 합니다. 사용자가 잘못된 포인터를 제공하거나 커널 메모리에 대한 포인터를 제공하거나 해당 영역 중 하나에 부분적으로 블록을 제공하면 어떻게 될까요? 이러한 경우 사용자 프로세스를 종료하여 처리해야 합니다. void check_address(void *addr) // 유효한 주소 확인 { struct thread *cur = thread_current(); if (addr == N..

(Project2-User Programs) - Argument Passing

Argument Passing process_exec()에서 사용자 프로그램에 대한 인수를 설정하세요. Implement the argument passing. 현재 process_exec()은 새 프로세스에 대한 인수 전달을 지원하지 않습니다. 이 기능을 구현하려면 process_exec()을 확장하여 단순히 프로그램 파일 이름을 인수로 받는 대신 공백으로 단어로 나누도록 합니다. 첫 번째 단어는 프로그램 이름, 두 번째 단어는 첫 번째 인수가 되는 식으로 말이죠. 즉, process_exec("grep foo bar")는 두 개의 인자 foo와 bar를 전달하여 grep을 실행해야 합니다. 명령줄 내에서 여러 개의 공백은 하나의 공백에 해당하므로 process_exec("grep foo bar")는 ..

(Project1-Threads) - Advanced Scheduler

Advanced Scheduler 4.4BSD 스케줄러와 유사한 다단계 피드백 큐 스케줄러를 구현하여 시스템에서 실행 중인 작업들의 평균 응답 시간을 줄이세요. 우선순위 스케줄러와 마찬가지로 다단계 피드백 큐 스케줄러는 우선순위를 기반으로 실행할 스레드를 선택합니다. 그러나 다단계 피드백 큐 스케줄러는 우선순위 기부를 수행하지 않습니다. 따라서 다단계 피드백 큐 스케줄러에 대한 작업을 시작하기 전에 우선순위 스케줄러가 작동하고 있는 것이 좋습니다. (우선순위 기부에 대해서는 필요에 따라 구현하지 않았더라도) 시작 시간에 Pintos에서 스케줄링 알고리즘 정책을 선택할 수 있도록 코드를 작성해야 합니다. 기본적으로 우선순위 스케줄러가 활성화되어야 하지만 -mlfqs 커널 옵션을 사용하여 4.4BSD 스케줄..

(Project1-Threads) - Priority Scheduling

Priority Scheduling Pintos에서 우선순위 스케줄링 및 우선순위 기부를 구현하세요. 현재 실행 중인 스레드보다 우선순위가 높은 새로운 스레드가 ready 목록에 추가되면 현재 스레드는 즉시 프로세서를 새로운 스레드에 양보해야 합니다. 마찬가지로, 스레드가 lock, semaphore 또는 condition variable을 기다리고 있는 경우, 대기 중인 스레드 중 가장 높은 우선순위 스레드가 먼저 깨어나야 합니다. 스레드는 언제든지 자체의 우선순위를 높이거나 낮출 수 있지만, 우선순위를 낮춰 현재 가장 높은 우선순위를 가지지 않게 되면 CPU를 즉시 양보해야 합니다. 스레드의 우선순위는 PRI_MIN(0)에서 PRI_MAX(63)까지의 범위를 가집니다. 낮은 숫자가 낮은 우선순위를 나..

(Project1-Threads) - Alarm Clock

** Pintos 구현의 모든 순서는 pintos-kaist git book을 따른다. ** 코드 구현에 대한 설명은 주석을 참고! Alarm Clock `devices/timer.c`에 정의된 `timer_sleep()` 함수를 다시 구현하세요. 현재 제공된 구현은 시간이 충분히 경과할 때까지 현재 시간을 확인하고 `thread_yield()`를 호출하는 루프에서 busy wait(바쁜 대기)하는 방식입니다. busy wait를 피하도록 다시 구현하세요. void timer_sleep (int64_t ticks); 호출한 스레드의 실행을 일시 중단하고 적어도 x 타이머 틱이 경과할 때까지 기다립니다. 시스템이 그 외에 유휴 상태가 아닌 한 스레드는 정확히 x 틱 후에 깨어나지 않아도 됩니다. 올바른 시..