정글사관학교 개발일지 89

정글사관학교 PintOS Project 1-WIL (정글사관학교 60일차 TIL)

1. 1주차 요약 정리 드디어 첫 주가 끝났다..첫 주차를 마치고서 정리하는 시간을 가져보자. 이 부분은 링크로 대신한다. 1. 시작 전 개념 정리 운영체제란 무엇인가? 프로세스 스레드 2. 과제 start 1.1 Alarm Clock 1.2 Priority Scheduling 1.2 (2) Priority Scheduling - Synchronization 1.2 (3) Priority Schedulig - Donation 2. Q&A 세션 정리 Q. void thread_yield(void) 함수에서 do_schedule() 함수를 호출하기 전에 intr_disable로 인터럽트를 off하는 이유 A. Interrupt를 disable하는 이유는 CPU의 제어권을 interrput가 다시 enable..

PintOS Project 1.2(3) - Priority Inversion (정글사관학교 59일차 TIL)

1. 과제 개요: Priority Inversion Problem 해결 이번 과제에서는 Priority Inversion Problem을 해결하는 것이 목표이며, 이를 위해 3가지 도네이션 기능을 구현해야 한다. 이를 위해 먼저 priority inversion problem이 무엇인지부터 이해하고 넘어가보자. Priority Inversion Problem: 우선순위가 높은 스레드가 우선순위가 낮은 스레드를 기다리는 현상 아래 이미지만 보면 뭔 소린가 싶을 거다. 차근차근 설명에 들어간다. 아래 이미지에서 priority가 높은 순은 주황(High, H) > 파랑(Medium, M) > 연두(Low, L)이다. 여기서 연두와 주황은 Lock A를, 파랑은 Lock B에 접근하려고 한다고 하자. 즉, 여..

PintOS Project 1.2(2) - Priority Scheduling-Synchronization(정글사관학교 58일차 TIL)

1. 과제 개요: FIFO -> Priority Scheduling 기반으로 thread가 CPU 점유하도록 구현 현재 핀토스는 semaphore를 대기하고 있는 스레드 리스트인 waiters가 FIFO로 구현되어 있다고 한다. 이게 무슨 말인지부터 이해하도록 하자. 먼저 세마포어에 대해 간단히 짚고 넘어간다. 저번 과제 1.1에서 Process synchronization에 대해 간략하게 소개했다. 동시에 서로 다른 프로세스 혹은 스레드가 공유 자원에 접근하면 충돌이 발생하기 때문에 이를 막아줘야 한다. 이 공유 데이터가 존재하는 영역을 critical section(임계 구역)이라고 하며, 하나의 스레드가 여기에 들어와 작업하고 있으면 다른 애들은 바깥에서 줄 서서 기다리고 있어야 한다. 이를 해결하..

PintOS Project 1.2(1) - Priority Scheduling(정글사관학교 57일차 TIL)

이어서 바로 과제 2 진행. 과제 1 겨우 끝내고 2를 보니 만만해보였는데 양이 엄청 산더미였더라..하지만 쫄지 않고 몰입 간드아 1. 과제 목표: RR(라운드 로빈) 방식의 스케쥴링을 Priority Scheduling 방식으로 수정 위 과제를 이해하기 위해서는 간단하게 RR과 Priority Scheduling 방식에 대한 이해가 필요하다. (추후 다시 정리 예정) 여기서는 FCFS, SJF는 다루지 않겠다. CPU 스케쥴링이란, 비싼 자원인 CPU를 어떻게든 효율적으로 사용해 최대한의 퍼포먼스를 내기 위해 고안된 방식이다. 쉽게 말해 "얼마나 CPU한테 단위 시간 당 많은 일을 시킬 것인가?"인데, 단순히 많이 일하는 것만이 능사는 아니다. 1) CPU 이용률, 그리고 주어진 시간 동안 몇개의 일을..

PintOS Project 1.1 - Alarm clock (정글사관학교 56일차 TIL)

대망의 핀토스 프로젝트가 시작됐다. 오늘은 시작한지 5일차. 운영체제 이론 공부(~데드락)를 마치고 과제를 보니까 이건 뭐 또다른 신세계.. 하지만 조급해하지 않고 차근차근 공부해보자. 과제 설명부터 보겠다. (과제 링크는 여기) Reimplement timer_sleep(), defined in devices/timer.c. 현재 코드는 작동하나, 지금 코드는 busy-wait 방식이다. 이는 현재 시간(tick)을 계속 체크한 뒤, 충분한 시간이 지나기 전까지 계속해서 thread_yield() 함수를 호출하는 루프를 돈다. 이러한 busy waiting을 피하기 위해 코드를 다시 짜라. 쓰레드 호출을 최소한 x 시간이 지난 후에 진행할 수 있도록 지연해라. 만약 시스템이 idle 상태가 아니라면, ..

운영체제 (3) - 프로세스, 스레드 (정글사관학교 55일차 TIL)

동기식 입출력 / 비동기식 입출력 프로세스가 입출력 요청 → 입출력 처리를 운영체제가 하니 사용자가 운체한테 요청. 동기식 입출력: I/O 요청 후 입출력 작업 완료된 후에 제어가 사용자 프로그램에게 넘어감. 구현 1 I/O가 끝날 때까지 CPU 낭비 매시점 하나의 I/O만 일어날 수 있음. 구현 2 I/O가 완료될 떄까지 해당 프로그램에게서 CPU 뺏음. I/O 처리 기다리는 줄에 그 프로그램을 줄세움 ready 상태인 다른 프로그램(프로세스)에게 CPU를 준다 (이것도 동기식이라는 거 주의!) 현재 수업에서 얘기하고 있는 입출력 방식은 동기식 - 구현 2! (비동기식이 아님!) 비동기식 입출력: I/O 가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에게 즉시 넘어감. ⇒ 두..

운영체제 (2) - 프로세스 (정글사관학교 54일차 TIL)

프로세스 프로세스 개념 프로세스란 "실행 상태의 프로그램"을 의미한다. 여기서 프로그램이 실행 중이라는 의미는 디스크에 있던 프로그램을 메모리에 적재하여 운영체제가 다룰 수 있는 상태가 되었다는 것을 뜻한다. 즉, 메모리 내에 자신을 위한 주소 공간이 있음을 의미한다. 운영체제는 이를 가상 메모리로 관리해 각 프로세스마다 독립적으로 메모리를 할당해준다. 프로세스의 문맥(context) 프로세스에서 문맥이란 굉장히 중요한 개념이다. 앞으로 나올 운영체제의 작동 방식을 이해하는데 있어 필수적으로 이해해야 한다. 일반적으로 문맥이라는 단어의 뜻을 우리는 "글의 맥락, 글의 흐름"이라고 해석한다. 이를 컴퓨터에서는 "프로세스가 현재 시점을 기준으로 수행 완료한 상태"를 말한다. 즉, 이 프로세스가 1에서 10까..

운영체제(1) - 시스템 구조/프로그램 실행 (정글사관학교 53일차 TIL)

1. 운영체제 운영체제란 무엇인가? 운영체제란, 사용자 및 다른 모든 소프트웨어, 하드웨어를 연결하는 소프트웨어 계층으로, 컴퓨터 계층구조 상에서 하드웨어 바로 위에 올라와있다. 좁은 의미로는 커널(운영체제 중 메모리에 상주하고 있는 핵심 부분)만을 말하고(이는 보통 전공자 입장에서 해당), 넓은 범위로는 커널 뿐만 아니라 각종 주변 시스템 유틸까지 포함한다. 운영체제를 쓰는 목적 1. 하드웨어, 즉 시스템 자원 (CPU, 메모리, 기억장치, 입출력 장치 등)을 효율적으로 관리 여기서 효율성이란, 하드웨어라는 유한한 자원은 이미 주어져있고 세팅된 상황에서는 변경되지 않는데 이 자원을 가지고서 최대한 성능을 낼 수 있도록 하는 관점을 말한다.한 가지 예로 CPU의 경우, 실행 중인 프로그램들에게 짧은 시간..

정글사관학교 52일차 TIL: tiny 서버 구현, string 관련 함수 정리

1. tiny 서버 구현 Tiny main() 루틴 타이니는 포트로부터 오는 반복적으로 연결 요청을 듣기 수행하는 서버. Open_listenfd() 함수를 호출해 듣기 소켓을 오픈한 다음, 무한한 서버 루프를 실행 ⇒ 반복적으로 accept() 을 실행해 연결을 받고, 트랜잭션을 수행한 뒤, 연결을 닫아. doit 함수 doit 함수는 HTTP 트랜잭션을 다룬다. 요청라인을 읽고 parsing. 이때, rio_readlineb 함수를 이용해 request line을 읽는다. *rio_readinitb, rio_readlineb 텍스트 라인 전체를 내부 읽기 버퍼에서 복사하는 rio_readlineb와 텍스트 라인과 바이너리 데이터 모두를 읽을 수 있는 rio_readnb 파일 → 읽기 버퍼 → (읽기 ..

정글사관학교 51일차 TIL: 프록시, mmap()과 malloc() 차이 정리

1. 프록시 1. 프록시(proxy)란 무엇인가 클라이언트와 서버 사이에 위치해 중계기로서 통신을 수행하는 역할. 클라이언트가 직접적으로 end server와 연결하여 리소스를 얻는 게 아니라 프록시라는 중간 경로를 통해 통신 수행 프록시는 클아이언트로부터 받은 요청을 엔드 서버에게 보내 응답을 받은 뒤, 해당 응답을 클라이언트에게 보낸다. 프록시 종류 Forward proxy Reverse proxy 1. Forward proxy 보통 우리가 부르는 proxy: forward proxy. 클라이언트가 서버로 요청할 때 직접 요청하지 않고 먼저 프록시 서버를 통해 요청하는 방식. Forward 프록시 특징: 클라이언트가 요청한 내용을 캐싱(caching)해준다. 캐싱: 이전에 요청해서 얻은 리소스를 저장..