프로세스 관리

Haiseong Jeong·2022년 10월 31일
1
post-thumbnail

프로세스와 프로그램

일반적으로 프로그램은 컴퓨터 시스템에 실행을 요청하기 전의 상태를 의미한다. 프로세스는 프로그램이 주 메모리에 올라가 실행중인 상태를 의미한다. 이 프로세스는 커널에 의해서 관리된다. 작업을 요청해 커널에 등록되면 이를 프로세스라 한다.

Process Control Block (PCB)

OS가 프로세스를 관리하기 위해서는 정보들이 필요하다. 이 정보들은 프로세스가 만들어 질때 생성되고 커널내에 존재한다. 이 정보들을 PCB라고 부른다. PCB에는 다음같은 정보가 있다. (이런 정보들은 OS별로 다를 수 있다.)

PID (프로세스 고유 식별 번호)
스케줄링 정보 (프로세스 우선순위)
프로세스 상태 (자원 할당상태, 요청 정보 등)
메모리 관리 정보 (Page table, Segment Table 등)
입출력 상태 정보 (할당받은 입출력 장치 등)
컨텍스트 저장 정보 (프로세스의 레지스터 상태를 저장하는 공간)
계정 정보

Process State

running : CPU에서 수행이 되고 있는 상태를 말합니다.
ready : CPU를 얻을 때까지 기다리는 상태
wating : I/O등 이벤트를 기다리는 상태
new : 프로세스가 만들어져 실행될 준비가 된 상태
terminated : 작업을 완료해 종료된 상태

Process Creation


리눅스, 유닉스 환경에서 가장 처음 만들어지는 프로세스는 데몬 프로세스이다. 데몬 프로세스가 다른 프로세스를 만들어내고 그 만들어진 프로세스가 다시 또 프로세스를 만든다. 이때 만들어지는 프로세스를 자식 프로세스라고 하고 프로세스를 낳은 프로세스를 부모 프로세스라고 한다. 결국 프로세스들은 큰 트리 구조를 가지게 된다.

fork()

생성된 자식 프로세스는 부모 프로세스의 데이터와 프로그램이 완전 복사가 되어 똑같은 프로그램을 수행하는 프로세스가 된다. 덕분에 부모와 자식 프로세스가 서로 간편하게 의사소통을 할 수 있다. 멀티 프로세싱을 통해 부모, 자식 프로세스는 함께 동작한다. fork() 함수는 부모 프로세스에서 자식의 PID를 반환하고, 자식 프로세스에서는 0을 반환하여 구분할 수 있도록 해 줍니다.

exec()

프로세스를 새로운 프로그램을 실행하는 프로세스로 대체하는 시스템 콜 함수다. fork()와 다르게 자식 자식 프로세스를 생성하는 것이 아닌 현재 프로세스의 프로그램 코드를 새로운 프로그램 코드로 바꾼다. 이로 인하여 프로그램 코드, 메모리, 파일 등 프로세스 자원이 새로 바뀐다. exec() 함수는 현재 프로세스가 완전히 새로운 프로그램을 실행하는 프로세스로 대체되므로 반환 값이 없다.

wait()

자식 프로세스가 종료될 때까지 현재 프로세스의 동작을 멈추는 시스템 콜 함수다. 자식 프로세스가 종료되면 자식 프로세스 종료 시그널(SIGSHLD)이 발생하여 waiting queue에 있는 부모 프로세스가 ready queue로 넘어가게 되어 다시 실행이 가능해집니다.
블럭 모드로 동작하기 대문에 비용이 비싸며 자식 프로세스 관리를 하지 않으면 무한정 대기, 혹은 함수가 OS에 의해 강제 종료당할 수 있습니다.
종료된 자식 프로세스의 PID를 반환하며 인자로 받은 statloc에 프로세스의 종료 상태를 알 수 있는 번호가 입력됩니다.

exit()

status 값이 부모 프로세스 wait()의 statloc에 지정되어 반환된다. 이를 통해 부모 프로세스는 자식 프로세스가 정상 종료 혹은 문제가 있었는지 확인할 수 있다. 함수 호출 후 자식 프로세스에 할당된 모든 자원은 풀어진다.
exit 함수가 없더라도 프로그램 코드의 끝에 도달하거나 return 키워드를 만나게 되면 자동으로 exit() 함수가 호출된다.

kill()

명령어와 달리 kill() 함수는 프로세스에게 특정 시그널을 전송하며 SIGKILL 시그널을 보내게 되면 명령어 kill과 같은 동작을 한다. 시그널을 보낼 프로세스의 PID와 보낼 시그널을 인자로 한다. kill() 함수를 통해 부모 프로세스는 자식 프로세스를 관리할 수 있다.

효율적인 관리를 위해 다음과 같은 경우 자식 프로세스를 중단시키는 것이 좋고 한다.

  • 자식 프로세스가 너무 많은 자원을 사용하는 경우
  • 자식 프로세스의 동작 결과가 어떤 이유로 인하여 더 이상 필요 없을 경우
  • 부모 프로세스가 동작을 마치고 종료하는 경우
profile
나는 개발자다. 5000만큼 코딩한다.

0개의 댓글