본문 바로가기

코드^학습/메모한 지식

리눅스 커널 심층분석 0x007

3_프로세스 관리

프로세스의 상태를 설명하는 부분

프로세스의 여러가지 상태를 설명하며 프로세스의 생성(Copy-on-Write, fork, vfork)를 설명하고 있다.

리눅스의 스레드에 대해서 설명하는데 리눅스에서는 스레드가 윈도우와 같은 개념이 아니라 그냥 하나의 프로세스이다. 다만 자원을 공유하는 방식으로만 이해한다.

그리고 프로세스의 종료에 대해서 이야기하며 자원을 반납하는 과정과 프로세스 서술자 제거하는 과정은 서로 분리된 과정임을 설명한다.

자식프로세스가 종료하는 과정에서 부모가 없을경우 부모를 전환하는 함수에 대해서도 설명이 있다.



4_프로세스 스케줄링

멀티태스킹 운영체제에는 형태가 있는데, 협력형(cooperative) 멀티태스킹과 선점형(preemptive) 멀티태스킹이다.

리눅스는 선점형 멀티태스킹을 지원한다.(선점이란 프로세스가 비자발적으로 중지되는 것을 말한다.)

선점형 멀티태스킹에서는 스케줄러가 프로세스의 실행,중지를 결정한다. 반대로 협력형 멀티태스킹에서는 프로세스가 스스로 중단하지 않는 이상 중단되지 않는다.

(스스로 중단하는 경우는 양보 yield라고 함) 이러한 방식은 어떤 프로세스가 프로세서를 독점할 경우 스스로 중단하기 전까지는 다른 프로세스들이 실행될 수 없기 때문에 매우 위험한 방식이다.


◆I/O중심 vs 프로세서 중심 프로세스

I/O중심의 프로세스는 빠른 응답이 가능하다. 왜냐하면 I/O장치에 의해 수행된 이후에 다음 작업을 위하여 대기(wait)하기 때문이다.

프로세서 중심 프로세스는 작업 처리율이 좋다. 대부분의 작업시간을 코드를 수행하는데 사용하기 때문이다.

리눅스는 I/O중심을 선택하여 프로세스의 좋은 응답성을 높이기 위해 최적화 되었다. 그러나 프로세서 중심 프로세스들을 무시하지 않게 설계되었다.


프로세서 우선순위

스케줄링 알고리즘의 가장 흔한 형태가 우선순위에 기반을 둔 알고리즘이다.

리눅스는 동적 우선순위 기반 스케줄링을 사용하며 이는 초기 우선순위를 가지고 시작하여, 시스템의 스케줄링 목표를 위하여 스케줄러가 우선순위를 동적으로 조절한다.

코드실행보다 I/O를 기다리는 프로세스는 리눅스에서는 좀더 높은 동적 우선순위를 할당받는다.

리눅스 커널은 두가지의 우선순위를 구현하고 있다.

첫 번째. nice 값을 가지는 것이다. 이 값은 -20~19까지의 범위를 가지며 큰 값(양수)일수록 다른 프로세스에게 양보할 만큼 너그러운(nice) 프로세스이다.

반대로 낮은 nice 값을 가지는 것은 높은 우선순위를 가진다.

두 번째. 실시간 우선순위. 0~99까지의 값을 가지며 모든 실시간 프로세스는 일반 프로세스보다 높은 우선순위를 부여받는다. 내용은 추후에 자세히 살펴볼 것이다.


타임슬라이스

어떤 태스크가 선점되기 전까지 실행될 수 있는 시간이 얼마나 되는가를 가리키는 값이다. 이 값은 너무 짧게도 너무 길게도 안 되기 때문에 정하기가 애메하다.

여러가지(어떤 프로세서 위주인가, 프로세스간의 스위칭 시간 등)을 고려하여 설정해야한다.

리눅스 스케줄러는 우선순위가 높은 프로세스에게는 긴 타임슬라이스 시간을 주고 반대는 짧은 시간을 준다.

또, 할당된 시간을 반드시 한번에 써야하는 것은 아니기 때문에 쪼개서 사용할 수 있다. 이렇게 하면 최대한 오랫동안 실행 가능한 상태로 머무를 수 있게 된다.

그리고 타임슬라이스 시간을 모두 사용한 프로세스는 중단된다. 타임슬라이스가 없는 프로세스는 다른 모든 프로세스가 그들의 타임슬라이스를 소비할 때까지 실행되지 않는다.

자세한 내용은 추후에 다룬다.


프로세스 선점

위에서 언급했던 선점의 개념과 우선순위를 합쳐서 이해하면 된다.

어떤 프로세스가 실행가능(TASK_RUNNING) 상태가 되면 커널은 이 프로세스의 우선순위를 검사하여 스케줄러가 실행할 프로세스를 선택한다.

또한 프로세스의 타임슬라이스가 0(중단)이 되었을 때도 선점되고, 역시 스케줄러가 실행할 프로세스를 고른다.(이 부분이 무슨말이지는 잘 모르겠다.)


실제 상황에서의 스케줄링 정책

예제로 텍스트 편집기를 쓰면서 동영상을 재생하는 상황을 들고 있다.

텍스트 편집기를 사용하는 것은 I/O 중심 프로세스이고 동영상 재상은 프로세서 중심 프로세스이다. 스케줄러는 텍스트 편집하는 프로세스에게 더 긴 타임슬라이스를 준다.

그리고 우선순위도 높으므로 동영상 인코더가 점유한 프로세스도 선점할 수 있다. 이게 가능하기에 키보드 입력시 즉각적인 반응이 가능하다.

비디오 인코더는 타임슬라이스가 상대적으로 짧고 선점도 못하기 때문에 손해인 것 같지만 I/O는 잠깐동안만 실행되므로 남는 시간은 비디오 인코더가 다 가져갈 수 있다.

이렇게 성능을 끌어올릴 수 있는 것이다.


실행큐

실행큐랑 어떤 프로세서가 실행가능한 프로세스의 목록으로, 한개의 프로세서당 하나의 실행큐가 존재한다. 또 실행가능한 프로세스 하나는 오직 하나의 실행큐에만 속한다.

실행큐는 추가적으로 각 프로세스별 스케줄링 정보도 포함한다. 즉, 실행큐는 각 프로세서를 스케줄링 하기위한 자료구조이다.

아래 사진은 자료구조의 형태이다.(주석참조)


일단 여기까지 나중에 수정해서 내용추가할 예정

하이2