본문 바로가기
한국으로/임베디드 리눅스

5.1 프로세스 관리

by 영킴. 2018. 6. 28.

5.1 프로세스 관리

5.1.1 커널 프로세스 관리



프로세스

프로그램은 코드와 실행에 필요한 자료의 묶음.
프로그램이 실행될 때 비로소 프로세스로 거듭나게 된다.
리눅스는 멀티태스킹 운영체제라서 동시에 여러개의 프로세스가 실행된다.



5.1.2 커널의 태스크 관리

task_struct 객체

커널이 태스크를 관리하기 위한 모든 정보를 포함한다.
매뉴얼과 소스코드를 확인하자 linux/sched.h
각 task_struct 객체들은 양방향 링크드 리스트로 저장되어있다.


태스크 상태

TASK_RUNNING: 실행 중이거나 대기 중인 상태
TASK_INTERRUPTIBLE: 특정 이벤트 또는 시그널을 기다리는 상태
TASK_UNINTERRUPTIBLE: 특정 이벤트를 기다리는 상태 (시그널에 반응하지 않음)
TASK_STOPPED: 실행 정지 상태 (디버그용)


프로세스 변경하기

fork() 이후 exec(): 자식 프로세스를 복제 후 새로운 프로세스를 변경한다는 개념. 결과적으로 새로운 프로세스가 실행된다.


Copy-on-Write

fork() 이후에 쓰기 작업이 일어나야만 복제가 된다. 메모리 누수를 피하기 위함.

다시 말해, 비용을 최소화하기 위해 자식이 복제된 순간에는 부모의 task_struct 객체를 가리키는 '가상' 자식 프로세스가 만들어진다.

이후에 자식 프로세스는 쓰기 작업을 함으로써 부모의 자원을 완전히 복제하거나,

exec()을 호출하여 새 자원으로 갱신하게 된다.



스레드

커널은 스레드를 하나의 태스크로 보고 관리한다.

커널 입장에서 스레드는 다른 프로세스와 자원을 공유하는 '프로세스'이다.


스레드의 생성 과정:     유저영역 --> pthread_create() --> clone() --> 커널영역 --> _do_fork() --> copy_process()

프로세스의 생성 과정:  유저영역 --> fork();               --> clone() --> 커널영역 --> _do_fork() --> copy_process()


커널 영역에서는 스레드와 프로세스의 생성 과정이 동일하다. (_do_fork() 에 의한 생성)

따라서, 커널 스레드가 생성될 때, task_strut 객체가 마찬가지로 생성된다.


스레드(태스크)의 종료는 do_eixt()으로 처리한다.

하지만, 이 함수가 호출되더라도 task_struct 객체는 남아있기 때문에 부모 프로세스의 wait()이 호출되어야 비로소 진정한 종료가 된다.

(wait() 함수가 호출된 경우 또는 커널이 해당 프로세스가 필요없다고 판단한 경우에 release_task() 함수가 호출되어 task_struct 객체가 완전히 제거된다.)




5.1.3 리눅스 스케줄러

스케줄링 정책

일반 프로세스: SCHED_NORMAL (나이스 값이 작을 수록 우선순위 높음)
실시간 프로세스: SCHED_FIFO, SCHED_RR (실시간 우선순위 값이 클 수록 우선순위 높음)

우선순위가 높아야 더 많은 CPU 사용시간을 할당받을 수 있다.
스케줄링 정책은 sched_setscheduler() 함수로 설정하자.


O(1) 스케줄러

나이스 값에 따라 절대적인 타임 슬라이스가 결정된다.
반복 시간이 나이스 값에 따라 절대적으로 변경되기 때문에, 응답 시간을 보장하지 못하고, 반복 시간이 애매모호하다.
각 태스크의 점유율이 나이스의 상대값으로 결정되지 않는다.


CFS 스케줄러

나이스 값에 따라 할당 비율을 정해 타임 슬라이스를 결정한다.

각 태스크의 반복 시간이 고정되므로 응답 시간이 보장된다.

각 태스크의 점유율을 조절하기가 쉬워진다.


SCHED_FIFO (First-in First-out): 타임 슬라이스 할당이 없음.

SCHED_RR (Round Robin): 타임슬라이스가 있다.




'한국으로 > 임베디드 리눅스' 카테고리의 다른 글

7.1 디바이스 드라이버  (0) 2018.07.01
5.4 파일시스템  (0) 2018.07.01
5.3 메모리 관리  (0) 2018.06.29
5.2 시스템 콜  (0) 2018.06.28
4.2 스레드 동기화  (0) 2018.06.28
4.1 스레드란?  (0) 2018.06.27
3.4 메시지 큐  (0) 2018.06.27
3.3 공유 메모리  (0) 2018.06.27