전체 글 89

[TIL] pintOS : synchronization 우선순위 스케줄링 구현 (1)

이번 포스팅에서는 예전 포스팅에서 공부했던 Synchronization(동기화) 를 스케줄링에 맞게 코드를 수정하고 다음 포스팅에는 priority-donate라는 동기화 중 특정 상황의 솔루션을 적용해보겠다. pintos에 있는 synchronization pintos에는 synchronization을 지키기 위해 semaphore와 lock, cond(monitor)가 존재한다. 해당 로직들은 모두 구조체로 구조체의 구조를 타고 가 보면 최 하단에는 결국 semaphore 방식으로 임계영역의 동기화를 보장하도록 설계되어있다. semaphore 구조체 안에서는 해당 임계구역에 진입하려고 시도했지만 block된 쓰레드를 모아두는 리스트를 가지고 있다. synchronization을 위한 구조체들의 구조는..

Jungle 2023.11.29

[TIL] pintos 프로젝트 - 쓰레드 우선순위 문맥 전환

오늘까지 donate priority 구현을 마쳤다. 스케줄링에 대해 이해하는 것은 어렵지 않지만 실제로 운영체제에 어떤 요소들을 삽입하여 구현하는 것이 쉽지 않았다. 확실히 핀토스가 실제 운영체제보다 엄청 작은 코드량을 가지지만, 그래도 몇만줄 되는 방대한 양의 코드가 동작하는 방식을 이해하고 생각한 뒤 원하는 방식으로 동작하도록 코드를 짠다는 것이 굉장이 어려운 부분인 것 같다. 아무튼 포스팅 순서는 우리가 원하는 동작이 무엇인지 생각한 뒤 실제로 그것을 어떻게 구현했는지 확인해보겠다. 시작 전에.. 지금까지는 FIFO 로 4틱마다 context_switching이 진행되고 있었다. 하지만 지금부터 priority를 도입하면 다음과 같은 상황으로 전환된다. 1. 4ticks 후 yield interr..

Jungle 2023.11.29

[TIL] 쓰레드 sleep 시 CPU 효율성 개선하기 - sleep_list 추가

pintos 운영체계에 대해 학습하며 얻는 과제들이 어려운 점은 무엇이 잘못되고 있는지 파악하는 것부터 시작이기 때문인 것 같다. 밥 먹으며 동료들과 얘기를 나누면서 든 생각은 핀토스에서는 문제의 질문부터 찾아내는 것이 시작인 것 같다. 그래서 그 첫번째 문제점인 쓰레드가 sleep할 때, CPU를 점유하면서 쉬고 있는 상황을 개선해 보았다. 문제 인식 현재 쓰레드가 timer_sleep 될 경우 해당 쓰레드가 격리되는 방식에 대해 살펴보기 위해 초기 timer_sleep() 함수를 살펴보자. /* Suspends execution for approximately TICKS timer ticks. */ void timer_sleep (int64_t ticks) { int64_t start = timer_..

Jungle 2023.11.27

[TIL] 타이머 인터럽트 정의 및 분석

타이머 인터럽트가 무엇인가? 타이머 인터럽트가 운영체제에서 운영하는데 왜 필요한가? 에 대한 무수한 질문들을 타이머 인터럽트를 구현하기 전에 이해해야 잘 구현할 수 있을 것 같다. 따라서 이 부분에 대해서 공부해 보았다. 타이머 인터럽트란 무엇인가? 수 많은 개발자분들의 포스팅과 챗 지피티에게 질문을 하면서 이해하려고 노력했고, 어떤 느낌인지 개괄적으로 파악이 되기 시작했지만 확실히 이해하는데는 포스팅만한게 없다. 타이머 인터럽트란 시간 주기적으로 발생하는 인터럽트로 운영체제에서 정의한 일정 시간(ticks)마다 실행되는 작업을 수행하는 데 사용한다. 이 타이머 인터럽트마다 실행되는 작업은 다양한 목적이 있을 수 있다. 타이머 인터럽트를 왜 사용하는가? 1. 스케줄링 정해진 주기마다 현재 실행 중인 작업..

Jungle 2023.11.26

[TIL] threads 코드 분석

코드를 분석하다 보니 디렉토리가 너무 여기저기 흩어져 있고, 해당 함수의 정의가 어디에 있는지 한눈에 보기 힘들어서 이번 주 프로젝트의 thread.c 코드 함수의 정의된 함수의 설명과 구조체의 정의 등을 정리하고, 이후 볼 수 있게 정리해 두겠다. 메모장에 적듯이 좀 불친절하게 정리 할 예정. - Thread 구조체 위치 : include/threads/thread.h struct thread { /* Owned by thread.c. */ tid_t tid; /* Thread identifier. */ enum thread_status status; /* Thread state. */ char name[16]; /* Name (for debugging purposes). */ int priority;..

Jungle 2023.11.25

[TIL] 인터럽트 / lock, monitor

인터럽트(Interrupt) 인터럽트는 컴퓨터 시스템에서 발생하는 이벤트로, 프로세서의 정상적인 실행을 중단하고 특정한 코드(인터럽트 핸들러 또는 인터럽트 서비스 루틴)를 실행하는 메커니즘이다. 어제 포스팅한 Synchronization(동기화)를 하는 가장 간단한 방법은 인터럽트를 불가능하게 하는 것이다. 일시적으로 CPU가 인터럽트에 응답하는 것을 막으면 다른 쓰레드는 진행중인 쓰레드를 선점할 수 없게 된다. 쓰레드 선점(preempt)는 timer interrupt에 의해 이뤄지기 때문. 더보기 CPU 동작 측면에서 인터럽트는 다음과 같은 과정을 거친다. 1. 인터럽트 발생 하드웨어나 소프트웨어에서 인터럽트가 발생한다. 이는 외부 장치의 신호, 오류, 타이머, 입출력 완료 등의 다양한 이벤트에 의해..

Jungle 2023.11.24

[TIL] pintos 운영체제 환경 세팅 + Synchronization(동기화)

오늘부터는 pintOS라는 교육용 운영체제를 만들고 테스트하며 운영체제에 대해서 배우는 첫 날이다. 먼저 작업 환경을 세팅해주고 시작하자. 일단 카이스트 핀토스 레포지토리의 master가 우리가 구현해야 하는 브랜치인 것으로 확인했다. 일단 해당 파일들을 분석하기 전에 개발 환경부터 세팅해주었다. 일단 우분투 18.04 버전의 EC2 환경에 카이스트 pintos 레포지토리를 복제했다. 이후 현재 파일에서 운영체제를 테스트하기 위해 가상환경을 세팅해준다. $ source ./activate 근데 가상환경의 세팅은 일시적인 것이므로 재부팅 시에 다시 세팅해주어야 하는 번거로움이 있다. 따라서 다음과 같이 root에서 가상환경을 자동 세팅해주도록 하는 코드를 추가했다. cd ~ # home 디렉토리로 이동 c..

Jungle 2023.11.23