sw사관학교정글/PintOS(KAIST's CS330 class) 15

[week09] PintOS - Project 2(User Programs) : System Calls 나머지

Project 2 : System call 나머지 나머지 system call들을 구현해보도록 하자! syscall.c 헤더파일 추가 및 함수의 원형 선언 // userprog/syscall.c #include "threads/init.h" #include "threads/synch.h" #include "threads/palloc.h" #include "filesys/filesys.h" #include "filesys/file.h" #include "userprog/process.h" static struct file *find_file_by_fd(int fd); void check_address(uaddr); void halt(void); void exit(int status); bool create..

[week09] PintOS - Project 2(User Programs) : System Calls 개요 및 File Descriptor 구현

Implement system call infrastructure userprog/syscall.c에 있는 system call handler를 구현하라. system call 번호를 검색한 다음 시스템 호출 인수를 검색하고 적절한 작업을 수행해야 한다. System Call Details 첫 번째 프로젝트는 운영 체제가 사용자 프로그램으로부터 제어권을 되찾을 수 있는 한 가지 방법을 이미 다루었다: 타이머와 입출력 장치로부터의 인터럽트. 이것들은 CPU 외부의 엔티티에 의해 발생하므로 "외부(external)" 인터럽트이다. 운영 체제는 프로그램 코드에서 발생하는 이벤트인 소프트웨어 예외도 처리한다. 그것들은 page fault 또는 division by zero와 같은 error일 수 있다. 예외(E..

[week09] PintOS - Project 2(User Programs) : Argument Passing

x86-64 calling convention calling convention의 규칙 중 하나는 함수 인수와 반환값이 전달되는 방법을 제어한다. x86-64 Linux에서 처음 6개의 함수 인수(function arguments)들은 각각 %rdi, %rsi, %rdx, %rcx, %r8, %r9 레지스터에 전달된다. 일곱 번째 인자와 그 이후의 인수는 stack에 전달된다. 그리고 반환값은 %rax 레지스터에 전달된다. 전체 규칙은 이것보다 더 복잡하다. 몇 가지 주요 사항들을 살펴보자. single machine word(64 bits/8 bytes)에 맞는 structure argument는 single register에 전달됨 Example: struct small { char a1, a2; }..

[week09] PintOS - Project 2(User Programs) : Introduction

Project 2 : User Programs The base code already supports loading and running user programs, but no I/O or interactivity is possible. 기본 코드는 이미 사용자 프로그램 로드 및 실행을 지원하지만 I/O 또는 상호 작용은 불가능하다. In this project, you will enable programs to interact with the OS via system calls. 이 프로젝트에서는 프로그램이 시스템 호출을 통해 OS와 상호 작용할 수 있도록 한다. Background 지금까지 핀토스에서 실행했던 모든 코드는 운영 체제 커널의 일부였다. 운영 체제 위에서 사용자 프로그램을 실행하기 시작하..

[week08] PintOS - Project 1(thread) : Priority scheduling(3) donation

Project1: priority schedule(3) Priority Inversion Problem 문제 : priority 높은 thread가 priority가 낮은 thread를 기다리는 현상 L, M, H는 thread의 이름이라고 하자. 그리고 우선순위는 H가 가장 높고, L이 가장 낮다. 지금 M보다 H가 우선순위가 높은데, L이 lock을 가지고 있기 때문에 H는 실행되지 못하고, L보다 우선순위가 큰 M이 먼저 실행된다. H는 M이 다 끝날때까지 기다려야 한다. 해결책 : priority donation H이 lock을 획득하려고 요청할 때, L에게 자신의 priority를 donate(기부)한다. 이렇게 되면 M보다 H가 먼저 실행되어서 문제를 해결할 수 있다. 그러나 이렇게 간단하게 ..

[week08] PintOS - Project 1(thread) : Priority Scheduling(2)

Project1: priority schedule(2) 이번엔 무엇을 바꿔볼까? 이번에는 Synchronization과 관련된 도구들의 scheduling 방식을 살펴보자. 그 도구들은 semaphore, lock, condition variables가 존재한다. 그런데 현재 PintOS는 여러 thread들이 semaphore, lock, condition variables를 얻기 위해 기다릴 경우 먼저 온 놈이 먼저 사용하는 FIFO 방식을 사용하고 있다. Synchronization 도구들을 기다릴 때, 우선순위가 가장 높은 therad가 CPU를 점유하도록 구현해보자. Semaphore 하나의 공유자원을 사용하기 위해 여러 thread가 sema_down 되어 대기하고 있다고 할 때, 이 공유자원..

[week08] PintOS - Project 1(thread) : Priority Scheduling(1)

Project1: priority schedule(1) 문제 현재 PintOS는 scheduling을 어떻게 하고 있을까? 앞선 포스트에서 살펴보았듯이, 현재 PintOS는 Round-Robin방식을 채택하고 있다. 할당된 시간 4 tick이 지나면 running thread는 다른 thread에게 선점당한다. PintOS는 새로운 thread를 ready_list에 넣을 때 항상 맨 뒤에 넣는다. 그리고 ready_list에서 다음 CPU 할당할 thread를 찾을 때에는 항상 맨 앞에서 꺼낸다. 이 방식은 thread들 간의 우선순위 없이 ready_list에 들어온 순서대로 실행된다. 제대로 된 우선순위 scheduling이 이루어지지 않고 있다! 해결책 우선순위에 따라 scheduling을 하도록..