본문 바로가기

대학교 강의/게임 서버 프로그래밍 입문

게임 서버 프로그래밍 입문 - 프로세스와 프로세스 관리

들어가며

 시험기간이 난 너무 싫다.

 

프로세스와 상태

 저장소에 있던 프로그램이 메모리를 할당받아
실행 가능한 상태가 되면 그것이 프로세스가 된다.

 이때 프로그램이 메모리를 할당받음과 동시에
상태를 함께 지닌다.

 Run, Ready, Wait의 3가지의 상태를 지닐 수
있는데,

 Run은 실행되고 있는 상황이며, CPU를 점유하고
있는 상황을 의미한다.

 Ready는 Run 상태로 전이되기 전에 CPU 점유를
기다리고 있는 상태이다.

 이때, 프로세스들은 Run과 Ready 상태를 보통
200ms의 시간 동안 번갈아가며 전이된다.

 이를 Time-Slice라고 한다.

 각각의 프로세스들은 Time-Slice를 가지고,
이는 CPU를 할당받아 사용할 수 있는 시간이다.

 프로세스는 자신의 Time-Slice의 시간만큼
CPU를 점유하고 사용할 수 있다.

 Time-Slice가 지나면 Run 상태에서 Ready
상태로 전이되며, Ready Queue로 들어간다.

 

 한 프로세스가 파일 입출력과 같은 시간이
많이 소요되는 작업이 필요할 경우,

 OS가 스토리지에 접근하여 작업을 수행하는
동안에 CPU는 사용하지 않으므로

 해당 프로세스는 Idle 상태가 되고,

 CPU를 사용하지 않은 체로 많은 시간을
소모하는 작업을 요하므로

 Wait 상태가 된다.

 이때 Wait 상태로 전이하는 방법에는
Interrupt와 Exception이 있다.

 Wait 상태에서는 Ready로 전이된다.

Interrupt: OS가 프로세스에 할당된 CPU 점유 시간을 확인하고 강제로 CPU 점유권을 가져가는 행위
Exception: 프로세스가 스스로 CPU 점유권을 OS에게 반납하는 행위

 

프로세스 스케줄러

 운영체제의 입장에서,

 Ready 상태의 프로세스들에게
CPU 점유권을 부여해야 한다.

 이는 프로세스 우선순위에 따라서
먼저 CPU를 점유할 수 있게 된다.

 이를 관리하는 것이 스케줄러이다.

 즉, 스케줄러란 Ready 상태의
프로세스들 중 어떤 프로세스에게

 먼저 CPU를 점유할 수 있는 권한을
줄 것인지 결정하고 관리하는 것이다.

 스케줄링의 방법에는 여러 가지가 있다.

 

디스패치

 프로세스들 마다 state 혹은 context를
가지고 있고,

 Run에서 Ready로 전이될 때마다
이를 메모리에 저장한다.

 이때 다시 Ready 상태에서 Run 상태로
전이될 때 CPU에 state를 적재하는데,

 이러한 프로세스의 중요한 정보 및 데이터를
CPU에 적재하는 행동을 디스패치,

 이를 담당하는 것을 디스패처라 한다.

 즉, 디스패처란 Ready 상태의 프로세스를
Run 상태로 전이 시킬 수 있도록

 context switching을 담당하는 것이다.

 

포그라운드와 백그라운드 프로세스

 포그라운드 프로세스는 화면에서
실행되고 있는 것을

 눈으로 직접 확인할 수 있는 상태의
프로세스 구동을 의미한다.

 백그라운드 프로세스는 프로세스가
실행되었지만

 직접 눈으로 확인되지 않는 상태의
프로세스 구동을 의미한다.

 예를 들어 백신 프로그램, OS 등이 있다.

 

 만약 포그라운드 프로세스가 하드웨어
리소스를 많이 요구하는 작업을

 수행하고 있는 상황이라 가정하자.

 백그라운드 프로세스도 당연히 CPU를
점유해야 한다.

 이때 백그라운드 프로세스는 포그라운드
프로세스의 리소스를 뺏어가며 쓰는가?

 

 예를 들어, 메모리는 페이지 단위로
관리한다.

 페이지가 부족하면 지금 사용하지 않는
dirty page들을 free page로 만든다.

 free page에 대한 기준을 정해두고,
그것 보다 적어지면

 clock 알고리즘을 돌면서 free page로
만드는 작업을 수행한다.

 이것이 대표적인 백그라운드 프로세스
라고 할 수 있다.

 

 다시 돌아와서, 포그라운드 프로세스가
높은 하드웨어 자원을 사용률이 필요할 때

 백그라운드 프로세스는 굳이 포그라운드
프로세스의 자원 사용에 침범하지 않는다.

 그렇기에 백그라운드 프로세스이다.

 포그라운드 프로세스가 진행되면서 남는
시간이 있는데,

 그 시간을 잘 활용하여 백그라운드 프로세스를
수행시킨다.

 

 하지만 가끔은 백그라운드 프로세스가
강제적으로 CPU를 점유해야 할 때도 있다.

 위의 예시에서와 같이, free page가 부족할
때 불가피하게 CPU를 우선적으로 점유한다.

 그러나 보통의 상황에서는 포그라운드
프로세스가 수행하고 남는 시간을 활용하여

 백그라운드 프로세스가 수행된다고 생각하면
된다.

 

프로세스 번호

 프로그램이 스토리지에서 프로세스로
살아나 메모리에 적재되면

 OS가 관리하는 프로세스에는 process ID란
식별 가능하고 고유한 번호가 부여된다.

 

좀비 프로세스

 부모 프로세스가 어떠한 작업을 수행하기
위해 자식 프로세스를 만들고,

 자식 프로세스를 정상적으로 종료시키지 않고
부모 프로세스가 먼저 종료되었을 때

 남은 자식 프로세스들은 하드웨어 리소스를
소모하며 살아있는 채로 있는 것,

 그것이 바로 좀비 프로세스이다.

 

전면처리와 후면처리

 전면처리는 명령어를 입력하면 명령어가
전면에서 실행되며

 명령어 실행이 끝날 때까지 쉘이 기다려준다.

 후면처리는 후면에서 처리하고 전면에서는
다른 작업을 할 수 있으면서

 동시에 여러 작업을 수행 할 수 있다.

 

프로그램 종료

 exit() 함수는 뒤처리를 하고 프로그램을
종료시킨다.

 _exit() 함수는 그 즉시 프로그램을
종료시킨다.

 abort() 함수는 비정상 종료를 의미한다.

 exit() 시스템 콜에 의해 프로세스가
정상적으로 종료될 때

 열린 파일을 닫는 등의 표준적인 I/O
뒷정리가 수행된다.

 사용자는 별도의 뒷정리 작업을 하기
위하여

 exit()에 의한 프로세스 종료과정에서
자동으로 수행될

 exit handler를 등록할 수 있다.

 이때 사용되는 함수가 atexit()이다.

 exit()은 exit handler들을 등록된 역순으로
호출한다(스택 구조 상).