정글사관학교 개발일지/운영체제-PintOS 34

PintOS Project 2 - User Program (5) System Call(정글사관학교 67일차 TIL) - halt(), exit(), create(), remove()

1. 과제 목표: 시스템 콜 핸들러 및 시스템 콜 구현 Gitbook 설명을 보기 전에, 먼저 시스템 콜의 개념부터 살펴보자. (참고로, user memory access 파트는 시스템 콜의 일부로 check_address()를 구현하는 파트이다. 따라서 시스템 콜 구현에서 함께 설명한다.) 시스템 콜이란? 시스템 콜은, 위 이미지에서 얘기하는 것처럼 운영 체제가 제공하는 서비스에 대한 프로그래밍 인터페이스이다. 유저 프로그램이 함부로 OS에 접근하다가는 보안부터 시작해서 여러 문제를 야기할 수 있다. 또한 이전에 얘기했듯, 유저 프로그램이 하드웨어 단까지 내려가서 작업하는 게 여간 복잡한 게 아니다. 이를 위해서 운영체제를 제공한 것인데 운영체제 내부도 여간 복잡한 게 아니지 않겠나. 따라서 OS의 중..

PintOS Project 2 - User Program (4) User memory access 관련 개념 정리 - 주소 변환, 세그멘테이션, 페이징(정글사관학교 66일차 TIL)

1. 개념 정리: 전에 이어서 계속 주소 변환의 원리 먼저 위에서도 언급했듯, 운영체제 단독으로 주소 변환 작업을 하는 게 아니라 하드웨어의 지원을 받는다. 효율성을 높이려면 하드웨어의 지원을 받는 것이 좋다. C언어가 파이썬보다 빠른 것처럼 전기적 신호(=HW)가 C언어(=SW)보다 훨씬 빠르지 않겠나. 여기에는 TLB, 페이지 테이블 등이 필요하다. 주소 변환을 통해 하드웨어는 명령어 반입, 탑재, 저장 등의 가상 주소를 정보가 실제로 존재하는 물리 주소로 변환한다. 하지만 하드웨어는 가속화에 도움을 줄 뿐, 실질적인 메모리 가상화는 운영체제가 구현해야 한다. 따라서 운영체제는 메모리의 빈 공간과 사용 중인 공간을 항상 알고 있어야 하고, 메모리 사용을 제어하고 관리한다. 이 모든 작업의 목표는 프로..

PintOS Project 2 - User Program (3) User memory access 관련 개념 정리 - 메모리 가상화(정글사관학교 65일차 TIL)

1. 과제 설명 시스템 콜을 구현하기 위해 유저의 가상 주소 공간에 접근할 수 있는 방법을 제시해줘야 한다. 인자를 받아올 때는 이 기능이 필요하지 않았다. 하지만 시스템 콜 인자에서 제공하는 값에 접근하기 위해서는 이 기능이 필요하다. 잘못된 포인터, 커널 메모리, 블록을 가리키는 포인터의 경우 자식 프로세스를 종료해 처리해야 한다. ex) *ptr->value 형식으로 값을 넣어줄 때 큰일날 수 있기 때문에 이를 미리 확인하여 잘못된 경우 종료시킨다. 2. 개념 정리: User space memory access from the kernel 처음에는 이 파트가 그냥 넘어가도 되는 건 줄 알았는데, 보니까 이것도 하나의 과제가 맞는듯. 일단 위의 과제에서 말하는 것처럼 시스템 콜을 구현하기 위해서는 유..

OS Review 1 - 권영진 교수님 운영체제 강의 (정글사관학교 64일차 TIL)

새해 첫 주 아침이 밝았다! 기분좋게 지난 주 강의 들었던 권영진 교수님 운영체제 강의를 정리하면서 하루를 시작해보자. 왜 OS를 배울까? 왜 요즘 프로그래머가 OS 공부를 해야 할까? 사실 살면서 커널 볼 일은 거의 없다. 디바이스 드라이버 만질 일도 크게 필요하지 않다. 하지만 모든 CS 학과에서 전필로 다룬다. 교수님들은 바보가 아니다. OS 배우는 이유 1: 기본적인 퍼포먼스에 대한 지식을 이해 위와 같이 코드를 돌렸다고 해보자. mmap()으로 메모리를 1메가바이트 할당받고 addr로 해당 메모리 주소를 받아온다. 이후 memset 함수로 해당 addr에 넣을 값을 모두 1로 세팅하는 작업을 거친다. 이후 memset 함수를 돌리는데 걸린 시간을 출력하는 printf가 나온다. 이 동일한 작업(..

PintOS Project 2 - User Program (2) Argument Passing(정글사관학교 63일차 TIL)

1. 과제 목표: Command Line Parsing process_exec() 내에 사용자 프로그램을 위한 인자를 셋업해라. 유저 프로그램을 실행하기 전에, 커널은 레지스터에다가 맨 처음 function의 argument를 저장해야 한다. process_exec()은 유저가 입력한 명령어를 수행할 수 있도록 프로그램(=process)을 메모리에 적재하고 실행하는 함수이다. 해당 프로그램은 f_name에 문자열로 저장되어 있으나 현재 상태에서 process_exec() 은 새로운 프로세스에 대한 인자 passing을 제공하지 않는다. 이 기능을 구현하는 것이 이번 과제이다. process_exec() 에 코드를 추가해서 간단히 프로그램 파일 이름을 인자로 넣는것 대신에, space가 올 때마다 단어를 ..

Pintos Project 2 - User Program (1) Introduction (정글사관학교 62일차 TIL)

이번 과제 목표 사용자 프로그램을 시스템 콜을 통해서 OS와 상호작용할 수 있도록 만들어라! userprog 디렉토리에서 작업할 것 Background 프로젝트 1에서 우리가 pintos 안에서 돌린 모든 코드는 OS 커널의 일부이다. 예를 들어, 지난 과제에서의 테스트 코드는 커널의 일부로서 동작한 것이다. 즉, system의 특권 명령에 대한 모든 접근 권한을 가진 상태이다(커널에서 돌렸으니 그럴 수밖에). 만약 우리가 사용자 프로그램을 OS 시스템 가장 윗단에서 돌렸다면? 이는 이전에 우리가 테스트를 돌릴 때와는 완전 다른 상황이다. 이번 프로젝트에서는 사용자 프로그램을 OS에서 돌리는 상황에 대해 배운다. OS는 하나 이상의 프로세스를 동작하게 한다. 이때, Pintos에서는 각 프로세스가 하나의..

정글사관학교 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 이용률, 그리고 주어진 시간 동안 몇개의 일을..