일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- DFS & BFS
- 백준 17608번
- 동적 프로그래밍(Dynamic Programming)
- 백준 2493번
- BFS
- 위상 정렬(Topology Sort)
- 백준 2261번
- 백준 1707번
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 백준 10000번
- 알고리즘 개념
- 그래프(Graph)
- 스택(Stack)
- 다익스트라 알고리즘(Dijkstra Algorithm)
- DFS
- 백준 2504번
- 큐(Queue)
- 그리디 알고리즘(Greedy Algorithm)
- BFS(Breadth First Search)
- 백준 1948번
- 백준 18352번
- 이분 탐색(Binary Search)
- 백준 9012번
- 백준 2812번
- 위상 정렬(Topological Sort)
- 이분 그래프(Bipartite Graph)
- 트리(Tree)
- 백준 21606번
- DFS(Depth First Search)
- 분할 정복(Divide and Conquer)
- Today
- Total
목록카이스트 정글 - 프로젝트/Pintos (30)
Always Be Wise
이제 Pintos의 System Calls을 구현해보자. 현재 userprog/syscall.c에 구현되어 있는 syscall_handler( ) 함수는 골격만 있다. 해당 함수를 수정하여 각각의 시스템 콜에 알맞은 처리 작업을 수행할 수 있도록 해야 한다. /* userprog/syscall.c */ void syscall_handler (struct intr_frame *f UNUSED) { // TODO: Your implementation goes here. printf ("system call!\n"); } 우선, 구현해야 할 시스템 콜 종류를 알아보자. 프로젝트 요구사항에 따르면 시스템 콜 번호는 % rax에 저장되고, 인자들은 % rdi, % rsi, % rdx, % r10, % r8, % ..

두 번째 Pintos 프로젝트는 사용자 프로그램과 관련한 것으로 아래 사항을 구현하면 된다. 1) Argument Passing 2) User Memory 3) System Calls 4) Process Termination Messages 5) Denying Writes to Executables, 6) Extend File Descriptor(Extra) 순서대로 Argument Passing 먼저 구현해보자. 현재 Pintos의 process_exec( ) 함수는 새로운 프로세스에 인자를 전달하지 못하는 구조이다. 따라서 입력받은 명령어를 공백을 기준으로 나누어야 한다. 요구 사항에 따르면 명령어의 첫 번째 단어가프로그램명, 두 번째 단어부터가 해당 프로그램에 전달할 인자가 될 수 있도록 수정해야..

Pintos 두 번째 프로젝트는 사용자 프로그램과 관련한 것이다. 첫 번째 프로젝트에서 실행했던 모든 코드는 운영체제 커널의 일부였다. 따라서 시스템 권한이 필요한 영역까지 완전한 접근이 가능했다. 하지만 사용자 프로그램은 그렇지 않다. Pintos에서는 기본적으로 한 프로세스 이상을 동시에 실행 가능하도록 한다. 그리고 각 프로세스에는 하나의 스레드가 있다. 사용자 프로그램은 컴퓨터 전체를 사용한다는 가정 아래 실행된다. 다시 말해, 여러 프로세스를 한 번에 로드하고 실행할 때, 메모리와 스케줄링을 포함한 여러 가지들을 신경 써야 한다. 이전 프로젝트에서 테스트 진행 시, 코드를 커널에 직접 컴파일하였다. 이제는 사용자 프로그램을 실행하여 운영체제를 테스트한다. 이는 훨씬 많은 자유도를 주겠지만, 사용..
운영체제는 프로그램을 쉽게 실행하고(동시에 여러 프로그램을 실행시킬 수도 있고), 프로그램 간의 메모리 공유를 가능케하고, 여러 입출력 장치와 상호작용을 가능케하는 소프트웨어이다. 다시 말해, 프로세서, 메모리, 또는 디스크와 같은 물리적인 자원을 가상 형태의 자원으로 생성하여 다양한 프로그램들이 자원을효율적이고 공정하게 사용할 수 있도록 관리하는 역할을 담당하는 것이다. 이번 주에 집중하여 학습한 것은 운영체제의 프로세서 가상화와 관련한 것이었다. 하드웨어의 도움을 받아 운영체제는 시스템에 매우 많은 수의 프로세서가 존재하는 듯한 환상을 만들어낸다. 하나 혹은 소수의 프로세서로 동시에 많은 프로그램을 실행하는 것처럼 보이는 이러한 환상은 운영체제가 프로그램을 실행하고, 중단하고, 다시 실행하는 작업을..

Priority Scheduling의 마지막 문제는 우선순위 반전(Priority Inversion)이다. 이는 우선순위가 낮은 스레드가 우선순위가 높은 스레드보다 우선하여 실행되는 문제이다. 아래의 그림을 살펴보자. Thread H, Thread M, Thread L 세 개의 스레드가 있고, 우선순위는 Thread H > Thread M > Thread L 순이다. 즉, 우선순위 기준으로 스레드가 실행되어야 한다면 H -> M -> L 순이어야 한다. 하지만 현재 Lock을 점유하고 있는 스레드는 Thread L이다. 실행을 위해 Lock이 필요한 Thread H는 CPU 점유를 반환하고 Thread L이 Lock을 반환할 때까지 대기 상태에 들어간다. 문제는 Thread H가 CPU 점유를 반환할 경..

다음으로 동기화 기본 연산들의 스케줄링 방식을 수정하고자 한다. Pintos에서 제공하고 있는 동기화 기본 연산은 Semaphore, Lock, Condition Variable 세 가지이다. Semaphore 우선, semaphore 구조체를 살펴보면 value와 waiters라는 변수로 구성되어 있다. value는 공유 자원의 수, waiters는 공유 자원을 사용하기 위해 대기하고 있는 스레드들의 리스트를 의미한다. Priority Scheduling을 적용하기 위해서는 공유 자원을 사용하기 위해 대기하고 있는 스레드 가운데 우선순위가 가장 높은 스레드가 공유 자원을 차지할 수 있도록 만들어야 한다. /* include/threads/synch.h */ /* PROJECT1: THREADS - Pr..

이제부터 본격적으로 Priority Scheduling을 구현해보도록 하겠다. 가장 먼저 우선순위가 가장 높은 스레드가 CPU를 점유할 수 있도록 만들어야 한다. 이를 위해 ready_list 관련 함수들을 수정하고자 한다. ready_list는 CPU를 사용하고자 대기하고 있는 스레드들을 관리하는 리스트이다. 해당 리스트에서 스레드를 꺼낼 때 우선순위가 가장 높은 스레드를 꺼낼 수 있다면 상기의 목적을 달성할 수 있다. 이를 손쉽게 가능하게 하는 방법은 ready_list를 우선순위 기준으로 내림차순 정렬하는 것이다. 따라서 ready_list에 새로운 스레드를 넣을 때, 우선순위를 고려하고자 한다. 우선순위를 고려하여 ready_list에 스레드를 넣는다면, 리스트는 항상 정렬된 상태를 유지할 수 있..
첫 번째 Pintos 프로젝트는 스레드와 관련한 것으로 Alarm Clock, Priority Scheduling, Advanced Scheduler 세 가지로 구분된다. 그중 Priority Scheduling의 목표는 "Implement priority scheduling and priority donation in Pintos."이다. Priority Scheduling 구현의 기본 아이디어는 다음과 같다. 만약 현재 프로세서를 사용 중인 스레드보다 높은 우선순위를 가진 스레드가 ready_list에 추가된다면, 현재 스레드는 프로세서를 즉시 새로운 스레드에게 넘겨야 한다. 또한, 스레드들이 Semaphore, Lock, 또는 Condition Variable들을 기다리고 있을 때, 높은 우선순위를..

첫 번째 Pintos 프로젝트는 스레드와 관련한 것으로 Alarm Clock, Priority Scheduling, Advanced Scheduler 세 가지로 구분된다. 그중 Alarm Clock의 목표는 아래와 같다. Pintos 기본 스레드 시스템의 Alarm Clock은 busy waiting으로 구현되어 있다. busy waiting이란 CPU를 계속해서 사용하며 특정 조건을 만족할 때까지 대기하는 방식을 의미한다. 이는 CPU 자원 낭비를 유발한다. 따라서 busy waiting을 피하기 위해 이미 구현되어 있는 아래의 timer_sleep( ) 함수를 수정하는 것이 Alarm Clock의 목표이다. (사실 timer_sleep( ) 함수 이외에도 코드를 수정하거나 추가해야 할 함수들이 있다...

Pintos 첫 번째 프로젝트는 스레드와 관련한 것이다. Pintos에서 제공하는 스레드 시스템은 최소한의 기능만 갖고 있다. 해당 시스템의 기능을 확장하여 '동기화'의 문제를 조금 더 이해하는 것이 프로젝트의 목적이다. 프로젝트를 수행을 위해서는 Pintos 스레드 시스템에 대한 이해가 필요하다. 초기 스레드 시스템의 코드를 살펴보면 스레드 생성과 완료, 간단한 스케줄러, 동기화 기본 연산들을 구현하고 있다. 구현되어 있는 코드를 일부 수정 및 추가하여 프로젝트의 목적을 달성하면 된다. 사실 대부분의 수행 작업이 소스파일 내 thread 디렉토리와 devices 디렉토리에서 이루어진다. 다만, 컴파일 작업은 thread 디렉토리에서 수행해야 한다. Pintos에서 스레드를 생성하는 것은, 새로운 문맥을..