diff --git a/PROJECT1 : THREADS/1. Intoduction.md b/PROJECT1 : THREADS/1. Intoduction.md index e5bea5b024f51cb66a53e827e6ccbf675f44d93f..ab6dddbf33c7f9012e9d61149274a7cf2bf67710 100644 --- a/PROJECT1 : THREADS/1. Intoduction.md +++ b/PROJECT1 : THREADS/1. Intoduction.md @@ -1,10 +1,10 @@ -### 프로젝트 1: 스레드 (Threads) +# 프로젝트 1: 스레드 (Threads) 이 과제에서는 최소한의 기능을 가진 스레드 시스템을 제공합니다. 여러분의 과제는 이 시스템의 기능을 확장하여 동기화 문제를 더 깊이 이해하는 것입니다. 이 과제는 주로 `threads` 디렉토리에서 진행되며, 일부 작업은 `devices` 디렉토리에서 수행됩니다. 컴파일은 threads 디렉토리에서 이루어져야 합니다. 프로젝트 설명을 읽기 전에 `Synchronization`(동기화) 자료를 최소한 훑어보는 것이 좋습니다. -### 배경 지식 +## 배경 지식 -## 스레드 이해하기 +### 스레드 이해하기 첫 번째 단계는 초기 스레드 시스템 코드를 읽고 이해하는 것입니다. Pintos는 이미 스레드 생성과 종료, 스레드 간 전환을 위한 간단한 스케줄러, 그리고 동기화 프리미티브(세마포어, 락, 조건 변수, 최적화 방지 장치)를 구현하고 있습니다. @@ -20,11 +20,11 @@ GDB 디버거를 사용하여 컨텍스트 전환의 동작을 천천히 추적 Warning: Pintos에서는 각 스레드에 4kB 미만의 작은, 고정된 실행 스택이 할당됩니다. 커널은 스택 오버플로를 감지하려고 하지만 완벽하게 감지할 수는 없습니다. 예를 들어, `int buf[1000];`와 같은 큰 데이터 구조를 비정적 지역 변수로 선언하면 스택 오버플로로 인해 예기치 않은 커널 패닉 등과 같은 문제가 발생할 수 있습니다. 스택 할당 대신 페이지 할당자와 블록 할당자를 사용할 수 있습니다. (자세한 내용은 Memory Allocation을 참조하십시오.) -## 소스 파일 +### 소스 파일 아래는 threads 디렉토리와 include/threads 디렉토리에 있는 파일들에 대한 간략한 개요입니다. 이 코드의 대부분은 수정할 필요가 없지만, 이 개요를 통해 어떤 코드를 살펴봐야 할지 감을 잡을 수 있기를 바랍니다. -# threads 코드 +### threads 코드 •loader.S, loader.h 커널 로더. 512바이트의 코드와 데이터로 구성되어 PC BIOS가 이를 메모리에 로드하고, 이후 디스크에서 커널을 찾아 메모리에 로드한 후 start.S의 bootstrap()으로 점프합니다. 이 코드를 수정하거나 살펴볼 필요는 없습니다. start.S는 메모리 보호 설정과 64비트 긴 모드 전환을 위한 기본 설정 코드입니다. loader와 달리 이 코드는 실제로 커널의 일부입니다. @@ -65,7 +65,7 @@ I/O 포트 접근을 위한 함수들입니다. 주로 devices 디렉토리의 •flags.h x86-64 플래그 레지스터의 몇 가지 비트를 정의하는 매크로입니다. 거의 신경쓰지 않아도 됩니다. -# devices 코드 +### devices 코드 기본 스레드 기반 커널에는 devices 디렉토리에 다음 파일들도 포함됩니다: @@ -105,7 +105,7 @@ PC 스피커에서 톤을 생성할 수 있는 드라이버입니다. •pit.c, pit.h 8254 프로그래밍 가능 인터럽트 타이머(PIT)를 구성하는 코드입니다. 이 코드는 각 디바이스가 PIT의 출력 채널 중 하나를 사용하기 때문에 devices/timer.c와 devices/speaker.c 모두에서 사용됩니다. -# lib 코드 +### lib 코드 마지막으로 lib와 lib/kernel에는 유용한 라이브러리 루틴이 들어 있습니다. (lib/user는 프로젝트 2부터 사용자 프로그램에서 사용되지만 커널의 일부는 아닙니다.) 다음은 몇 가지 자세한 내용 입니다: