SW 사관학교 정글(Jungle)/운영체제-PintOS 17

[PintOS Project 1 - Threads] 2번 Priority Scheduling

높은 우선순위 쓰레드가 양보락 세마포어 또는 조건변수 대기할 때 우선순위가 가장 높은 대기 스레드를 꺠움우선순위 063 (PRI_MIN PRI_MAX)초기 쓰레드 우선순위는 thread_create()에 인수에 우선순위 저장우선순위 선택 이유 없으면 PRI_DEFAULT(31) 사용우선순위 역전(Priority inversion)높은 우선순위의 스레드가 낮은 우선순위의 스레드가 소유한 락(lock)을 기다릴 때, 그 낮은 우선순위의 스레드가 일시적으로 높은 우선순위를 "기부받아" 실행 우선순위를 높이는 개념구현 계획기존 코드 분석:thread.c 파일을 열어 현재 스레드 우선순위 관리 방식과 실행 순서에 대한 구조를 이해합니다. 특히 스레드가 준비 리스트에 추가되는 부분과 우선순위 비교를 중점적으로 확인..

cpu와 스레드

스레드가 CPU를 점유하고 있다는 것은 해당 스레드가 현재 CPU에서 실행되고 있다는 의미입니다. 이 개념을 이해하려면, 스레드와 CPU의 관계를 먼저 살펴볼 필요가 있습니다.1. 스레드와 CPU의 관계CPU는 컴퓨터의 연산 장치로, 모든 프로그램이나 작업을 처리합니다. 하지만 CPU는 한 번에 하나의 작업(즉, 하나의 스레드)만 실행할 수 있습니다.스레드는 프로그램 실행의 단위입니다. 프로그램 내의 스레드가 CPU에서 실행됨으로써 프로그램의 로직을 처리하게 됩니다.여러 스레드가 동시에 존재할 수 있지만, CPU는 한 순간에 하나의 스레드만 실행할 수 있기 때문에, 운영체제의 스케줄러는 여러 스레드를 번갈아가며 실행하도록 조정합니다.2. CPU를 점유하고 있다는 의미스레드가 CPU를 점유하고 있다는 것은..

[PintOS Project 1 - Threads] 1번 Alarm Clock

Alarm Clock첫번째 과제 목적은 스레드를 일정한 시간만큼 재우는 기능을 하는 Alarm Clock을 busy-wait 방식에서 sleep-awake 방식으로 변경한다.   busy-wait  voidtimer_sleep (int64_t ticks) { int64_t start = timer_ticks (); ASSERT (intr_get_level () == INTR_ON); while (timer_elapsed (start)   현재 위에 코드의 방식은 busy_wait 방식으로 timer_sleep()이 구현되어 있다.timer_ticks() 함수를 이용해 start 변수에 현재 시각(static ticks)를 저장한다.얼마만큼 재울지 지정한 ticks만큼 while문을 통해 thread_yi..

[Pintos : 동기화] 모니터(Monitors)

모니터(Monitors)모니터는 세마포어나 락보다 더 높은 수준의 동기화 방법입니다. 모니터는 동기화되는 데이터와 락(모니터 락이라고 불림), 그리고 하나 이상의 조건 변수로 구성됩니다. 스레드는 보호된 데이터에 접근하기 전에 먼저 모니터 락을 획득합니다. 이때 스레드는 "모니터에 있다"고 합니다. 모니터 안에서는 스레드가 모든 보호된 데이터를 자유롭게 검사하거나 수정할 수 있습니다. 데이터 접근이 완료되면 모니터 락을 해제합니다.모니터의 기본 개념모니터 락: 모니터에서 보호되는 데이터에 접근하려면 먼저 이 락을 획득해야 합니다. 즉, 스레드가 데이터를 사용하려면 이 락을 잠가 다른 스레드가 동시에 접근하지 못하게 막습니다.조건 변수: 조건 변수를 사용하면 특정 조건이 만족될 때까지 스레드가 기다릴 수 ..

[Pintos : 동기화] 락(Lock)

락(Lock)세마포어와 유사하지만 주로 리소스에 대한 상호 배제를 보장하기 위해 사용된다.세마포어처럼 동작하지만 초기값이 1인 세마포어와 동일한 개념이다. 락의 목적한 번에 하나의 스레드만 특정 리소스에 접근할 수 있도록 보장락의 연산 락 획득(Acquire): 세마포어의 down 연산에 해당하며, 락을 잠그고 현재 스레드가 리소스를 사용하게 만듭니다.락 해제(Release): 세마포어의 up 연산에 해당하며, 락을 풀고 다른 대기 중인 스레드가 리소스를 사용할 수 있도록 합니다.락의 추가적인 제약세마포어와 비교했을 때, 락에는 하나의 중요한 제약이 있습니다. 락을 획득한 스레드, 즉 `락의 소유자(owner)`만 `그 락을 해제`할 수 있습니다. 만약 다른 스레드가 락을 해제하려고 시도하면, 이는 잘못..

[Pintos : 동기화] 세마포어(Semaphore)

세마포어(Semaphore)비동기적으로 실행되는 여러 스레드나 프로세스 간의 **동기화(synchronization)**를 위해 사용하는 중요한 도구이다. 세마포어의 두 가지 연산 Down 또는 P 연산: 세마포어 값이 양수일 때까지 대기하고, 양수가 되면 그 값을 1 감소시킵니다.Up 또는 V 연산: 세마포어 값을 1 증가시키고, 대기 중인 스레드가 있으면 하나를 깨워서 실행시킵니다.이제 세마포어가 "0,1, 그 이상의 수" 초기화 되는 경우 3가지를 설명합니다.세마포어의 활용 예시세마포어는 `0`으로 초기화되면 한 번만 발생하는 `이벤트를 기다리기 위한 목적`으로 사용할 수 있다.스레드 A가 스레드 B를 생성하고, 스레드 B가 어떤 작업을 완료할 때까지 A가 기다려야 한다고 가정해봅시다. 스레드 A는..

[Pintos] 동기화(Synchronization)

동기화(Synchronization)여러 스레드가 자원을 공유할 때 발생할 수 있는 문제들을 방지하는 데 중요한 역할을 한다. 동기화가 제대로 이루어지지 않을 때..- 경쟁상태나 데이터 손상, 예측할 수 없는 동작과 같은 문제가 발생할 수 있다. - 운영체제 커널에서 이러한 문제 발생시 시스템 전체를 다운 시켜버릴 수 있다. 그래서 Pintos에서는 여러 동기화 프리미티브(primitives)를 제공하여 이러한 상황을 제어한다. 1. 인터럽트 비활성화(disabling interrupts)동기화의 가장 원시적인 방법은 인터럽트를 비활성화하는 것이다. cpu가 인터럽트에 응답하는 것을 일시적으로 차단인터럽트가 꺼져 있으면, 현재 실행 중인 스레드는 타이머 인터럽트(timer interrupt)에 의해 선점..