CPU 스케줄링 1
OS가 CPU를 스케줄링하는 과정에 대해 배운 내용을 정리해보았다.
CPU를 스케줄링 하는 것은 OS가 하는 가장 중요한 일 중 하나이다. 이를 통해 여러 프로세스가 동시에 실행되는 것 처럼 보여줄 수 있고, 프로세스 실행 우선순위에 따라서 먼저 실행되어야 하는 프로세스를 먼저 실행할 수 있다. 이 스케줄링은 자주 해야 하는 작업이므로 빨라야 한다.
우선, 스케줄링은 크게 Non-preemptive 스케줄링과 Preemptive 스케줄링으로 나눌 수 있다.
- Non-preemptive 스케줄링
- Non-preemptive 스케줄링은 CPU에서 돌아가고 있는 프로세스를 쫓아낼 수 없는 스케줄링 방식이다. 따라서 각 프로세스가 CPU를 점유하다가
yield()를 통해 CPU를 양보해야 한다. 하지만 CPU를 독점하는 악성 프로세스를 만들게 되면 CPU가 그 일만 하게 된다. 따라서 서로 믿을 수 있는 환경에서만 사용할 수 있다. - 이 때는 스케줄러가 간단해진다는 장점이 있다. Timer interrupt도 필요 없기 때문에 관련 하드웨어도 있을 필요가 없다.
- Non-preemptive 스케줄링은 CPU에서 돌아가고 있는 프로세스를 쫓아낼 수 없는 스케줄링 방식이다. 따라서 각 프로세스가 CPU를 점유하다가
- Preemptive 스케줄링
- Preemptive 스케줄링은 돌아가는 프로세스를 쫓아낼 수 있는 방식이다. 스케줄러가 프로세스를 바꾸는 context switch를 강제할 수 있다. 따라서 한 프로세스에 의해 CPU를 독점당할 걱정은 없다.
- 하지만 중요한 일을 하는 프로세스도 쫓겨날 수 있다는 단점이 있다.
용어 정리
각각의 스케줄러에 대해 알아보기 전에 사용하게될 용어를 정리하고 넘어가자.
CPU 스케줄링 2
Dockerfile과 docker-compose
42 Seoul의 Inception 과제는 Dockerfile과 docker-compose를 이용해서 wordpress 서버를 구축하는 과제이다. 이 과제를 하면서 배운 Docker 관련 내용을 정리해보았다.
Docker Container
도커 컨테이너는 소프트웨어들의 표준화된 묶음이다. 이 안에는 모든 dependencies와 code가 포함되어 있어 Docker Engine만 있으면 어떤 환경에서든 Container를 쉽게 실행할 수 있다. Docker가 독립된 환경을 보장하기 때문에 Docker를 사용하여 애플리케이션을 개발하면 환경에 구애받지 않고 실행될 수 있다. 그렇다면 Docker Container는 어떻게 만들까? 바로 Docker Image를 통해서 만들게 된다.
Docker Image
도커 이미지는 실행할 애플리케이션의 코드와 환경을 모두 포함한 파일이다. 이 이미지를 도커 엔진에서 실행시키면 도커 컨테이너가 된다. 따라서 어떤 애플리케이션을 배포하거나 전달할 때, Docker Image를 전달하면 받은 사람도 동일한 환경에서 실행해볼 수 있게 된다. 쉽게 말해 도커 컨테이너는 도커 이미지의 인스턴스인 셈이다. 이미지는 Dockerhub에서 다운받아서 사용할 수도 있고, 직접 만들어서 사용할 수도 있다. 물론 다운받은 이미지를 기반으로 수정을 가해서 쓸 수도 있다. 이미지는 만드는 방법이 두 가지가 있는데, 하나는 도커 컨테이너로부터 커밋하는 방법이고, 하나는 Dockerfile로부터 빌드하는 방법이다.
EDF 스케줄러 구현하기
Git Hooks로 linter 자동화하기
Unity 프로젝트에서 Git Hooks를 활용하여 linter를 자동화하는 방법을 소개합니다.
0. 배경
이번 학기 수업에서 진행되는 Unity 프로젝트에서 PM을 맡게 되어, 프로젝트의 전반적 진행을 관리하고 있습니다. 코드를 자동으로 Linting하는 작업은 프로젝트를 진행하기 전 가장 먼저 해야 했습니다. 그러나 Git Hooks를 처음 써보기 때문에 어려움을 겪었고, 따라서 이 과정을 공유하고자 합니다.
1. Git Hooks?
우선, Git Hooks를 통해 코드 Linter가 커밋 전에 코드를 자동으로 린팅할 수 있도록 설정하였습니다. Unity 프로젝트를 위한 Git Hooks는 Unity 프로젝트를 위한 Git Hooks 활용을 참고하여 설정하였습니다.
Page Table과 TLB
Virtual Memory에서 OS가 Virtual Memory를 제공하는 방법에 대해서 알아보았다. 현대의 OS는 대부분 Paging 기법을 이용한다. 이번에는 Paging을 위해서 꼭 필요한 Page Table의 단점을 보완하는 방법에 대해서 알아보자.
Paging의 단점
Paging을 위해서는 OS가
- Page Table을 가지고 있을 공간이 필요하고(Space overhead)
- Address translation을 위해 메모리에 한 번 더 접근해야 한다(Time overhead)
는 단점이 있다. 이 두 가지 단점을 해결하는 방법을 알아보자.
Space overhead
64bit 시스템의 virtual address space를 생각해보자. 한 페이지의 크기가 8KB라면 offset으로 13비트, Virtual Page Number(VPN)으로 51비트를 사용할 수 있다. 이 시스템에서 한 Page Table Entry(PTE)의 크기는 8바이트 일 것이므로, Page Table 전체를 저장하기 위해 필요한 메모리는
Sleep AI Challenge ver.3 참가 후기
서울대학교병원에서 진행하는 Sleep AI Challenge ver.3 에 참여했다.
0. 사전 지식
폐쇄성 수면 무호흡증(OSA, Obstructive Sleep Apnea)은 수면다원검사(PSG, polysomnography)를 통해 진단할 수 있다. OSA는 1시간에 무호흡 또는 저호흡이 발생된 횟수인 AHI(Apnea-Hypopnea Index)로 진단하는데, 수면다원검사의 데이터를 통해 OSA를 진단하는 것은 장소의 제약이 있을 뿐만 아니라, 많은 시간과 비용이 필요하다.
따라서 웨어러블 기기에서 측정할 수 있는 심전도(ECG), 움직임, 소리 데이터를 기반으로 수면무호흡증을 진단할 수 있다면 많은 비용을 아낄 수 있다.
이 대회에서는 웨어러블 기기에서 측정한 데이터를 바탕으로 폐쇄성 수면무호흡증, 즉 OSA(Obstructive Sleep Apnea)를 진단하는 것이 목표였다.
System call 구현하기
xv6: a simple, Unix-like teaching operating system의 Ch 4.는 Trap과 System call에 대해서 다룬다. 이를 읽고 정리한 문서는 Ch4. Traps and system calls에 있다.
PA2 Specification
kbdints()구현하기- device가 boot한 시점부터 들어온 모든 keyboard interrupts의 개수를 세서 리턴하는 system call
kbdints()를 구현해야 한다. - System call number는 22로 주어진다.
- device가 boot한 시점부터 들어온 모든 keyboard interrupts의 개수를 세서 리턴하는 system call
time()구현하기mtime레지스터를 읽어서 리턴하는 system calltime()을 구현해야 한다.mtime레지스터를 읽어오는rdtimeinstruction은 machine mode에서만 실행 가능하다.- System call number는 23으로 주어진다.
1. **kbdints()** 구현하기
kbdints()를 구현하기 위해서는 먼저 system call number를 추가해주어야 했다. 이는 주어진 스켈레톤 코드에서 이미 설정되어 있었다.
Virtual Memory
OS가 제공하는 기능 중 하나인 Virtual Memory에 대해서 정리해보았다.
Virtual Memory
컴퓨터에는 메모리가 있다. 이 메모리에 실행되는 프로세스들을 올리고, 프로세스가 필요로 하는 정보를 저장해두었다가 프로세스에 제공하는 역할을 한다. OS는 Virtual Memory라는 기능을 제공하는데, OS가 Virtual Memory를 제공함으로써 이루고자 하는 목표는 다음과 같다.
- Transparency
- 한 프로세스는 메모리가 공유되고 있는지 모른다. 자신이 메모리를 독점하고 있다고 생각한다.
- 연속된 메모리공간을 사용하고 있다고 생각한다.
- Efficiency
- Fragmentation 최소화 (space)
- 빠른 속도를 위해 하드웨어 지원을 받음 (time)
- Protection
- 어느 프로세스가 다른 프로세스 또는 OS의 메모리에 접근하지 못하도록 보호
- 어느 프로세스가 다른 프로세스에 영향을 끼치지 못하도록 보호
- 메모리를 공유하는 것을 지원
각 프로세스는 위의 세가지를 보장받기 위해 virtual address space를 가진다. 이 덕분에 연속된 주소의 메모리를 제공받은 것처럼 사용할 수 있고, private한 메모리 공간을 보장받을 수 있다.