Post List

2018년 5월 27일 일요일

Dead Lock, Virtual Memory, Round Robin Scheduling

[OS] 복습

내가 OS에서 상당히 좋은 성적을 받았고 나름 이해도가 높다고 생각햇는데
남에게 어떠한 용어에 대해 명확하게 설명하는 것은 좀더 구체적이고 디테일하게 개념을
이해해야 한다는 것을 뼈저리게 느꼈다.


Dead Lock이란..


내가 주로 강의자료를 보면서 공부하기 때문에 강의자료를 펴보았는데 설명이 이렇게 되어있다.

두개 이상의 process/thread 가 서로 어떠한 이벤트를 해주기를 기다리는 것이다
예를들어

이런 상황에서 S, Q 모두 1로 세팅되어 있다고 생각하자. P_0가 전부 수행되고 P_1이 수행되고를 반복하는 것은 아무 문제가 없다. 하지만 multi process 환경에선 이러한 순서를 보장해 줄 수 없다. P_0, P_1 이 거의 동시에 들어가서 S, Q의 값이 0이 된다면 서로 semaphore의 값을 올려주길 기다린다. 따라서 진행이 되지 않는데 이런 상태를 Deadlock(교착상태) 라고 한다. 


Virtual Memory 란 실제 물리적으로 존재하는 메모리가 아닌 논리적으로 존재하는 메모리 주소공간을 뜻하는데 어렴풋이 들으면 무슨 뜬구름 잡는 소린가 싶을 수 있다. 

우리가 프로그래밍을 할때 변수에 접근하거나 특정 메모리 공간에 접근하는데 이는 실제 물리 메모리 공간이 아니다. 

역시 예를 들어 설명하는 것이 좋을 것 같다.

우리의 메모리가 고작 8MB 뿐이라고 생각해보자. 여러 프로그램을 돌리다가 메모리가 꽉차면 더 이상 메모리에 적재가 되지 않을까? 그렇지 않다. 메모리에 적재된 내용중에 일부가 디스크로 옮겨지고 해당 내용이 빠진 메모리 공간를 이용할 수 있다. 나중에 메모리 공간에 여유가 생기거나 접근하게 되면 디스크로 옮겨둔 내용을 다시 메모리에 적재해 수행시킬 수 있다. 이러한 과정을 swap out / swap in 이라 하고, 이 방법으로 실 메모리보다 더 큰 메모리를 사용할 수 있는 것이다.


마지막으로 Round Robin Scheduling...

위키피디아에서 복사해오자.
라운드 로빈 스케줄링(Round Robin Scheduling, RR)은 시분할 시스템을 위해 설계된 선점형 스케줄링의 하나로서, 프로세스들 사이에 우선순위를 두지 않고, 순서대로 시간단위(Time Quantum)로 CPU를 할당하는 방식의 CPU 스케줄링 알고리즘이다.

즉 프로세스들에게 일정 time quantum을 주어 그 시간이 지나면 다른 프로세스에게 CPU를 할당하는 것인데 이럴 경우 각 프로세스마다 응답시간이 줄어드는 장점이 있다. 또 priority에 구애받지 않고 골고루 프로세스를 수행하리 때문에 starvation도 일어나지 않는다. 하지만 계속해서 context switching이 일어나기 때문에 오버헤드가 크다.


2018년 5월 20일 일요일

Kernel Memory Allocation

kernel 에서의 memory allocation 은 user space 에서와 무엇이 다를까?

기본적으로 api로 제공하는 함수는 kmalloc, vmalloc 이 있다.

kmalloc 의 경우 큰 특징이 있는데 바로 physical memory 에 바로 매핑이 된다는 것이다.

USER SPACE MEMORY ALLOCATION

흔히 사용자 혹은 프로그래머가 user space에서 malloc과 같은 함수를 호출하게 되면 process 마다 갖고있는 process address space에서 메모리를 할당받는다. 이는 실제 physical memory에 할당 받은 것이 아닌 가상주소공간을 할당받은 것이기 때문에 첫 참조시 page table을 참조해 memory에 없다는 것을 확인 후 page fault가 일어나고 그 후 매핑이 된다. 이때 physical memory에서의 연속성은 보장할 수 없다.

KERNEL SPACE MEMORY ALLOCATION

kmalloc의 경우 바로 physical memory를 할당받는 것이기 때문에 물리적 주소공간을 초과할 수 없다는 특징이 있다. 장점으로는 실제 주소 공간이 매핑되기 때문에 연속한 주소공간을 할당 받았다면, 물리적으로 연속적이다. DMA를 수행할 경우 device는 특정 영역내의 연속한 주소공간을 사용하기 때문에 kmalloc을 사용한다.

kmalloc의 다른 특징은 flag 설정이 가능하단 것인데 간단하게 3개만 보고 가자.(아는게 3개 뿐이다)

flag는 kmalloc(size_t size, int flag)의 두번째 parameter로 GFP_KERNEL의 경우 memory allocation 이 가능하지 않을 경우 해당 request를 보낸 process를 wait시킨 후 가용할 시 memory allocation을 해준 후 process wakeup을 시킨다. 이 flag를 사용할 때 kernel 내부의 작업이 process context가 아니라면 커널이 죽어버릴 수도 있다는 점을 주의하자

GFP_ATOMIC의 경우 memory allocation이 불가능 할 경우 NULL을 return 해준다.

vmalloc 의 경우엔 user space 에서의 memory allocation 과 유사하다. kernel virtual address space 에 연속적인 공간을 할당한다. 따라서 실제 가용 memory 보다 더 많은 영역을 할당 받을 수 있지만 DMA 와 같은 용도로는 부적합하다.