728x90

1 프로세스의 구조

프로세스는 코드 영역, 데이터 영역, 스택 영역으로 구성된다.

 

코드 영역 : 프로그램의 본문이 기술된 곳으로 텍스트 영역이라고도 한다. 프로그램의 코드가 읽기 전용으로 처리된다.

 

데이터 영역 : 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 저장하는 곳이다. 읽기, 쓰기가 모두 가능하다.

 

스택 영역 : 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓는 곳이다. 운영체제가 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게는 보이지 않는다.

 

2 프로세스의 생성과 복사

fork() 시스템 콜의 개념

fork() 시스템 콜은 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. fork()를 실행하면 현재 실행중인 프로세스와 똑같은 프로세스가 하나 더 만들어진다.

프로세스를 복사할 때 기존의 프로세스는 부모 프로세스, 새로 생긴 프로세스는 자식 프로세스가 되어 부모-자식 관계로 연결된다.

 

fork()를 호출한 후 자식 프로세스는 pid가 변경된다. 또한 메모리의 위치가 다르므로 메모리 관련 정보가 바뀐다. 

부모 프로세스는 ppid와 cpid가 바뀐다. 각각 부모,자식 pid를 뜻한다. 

자식 프로세스는 자식이 없으므로 cpid가 -1이 된다.

 

fork() 시스템 콜의 장점

프로세스 생성 속도가 빠르다. 새로 프로그램을 가져오지 않고 기존 메모리에서 복사하기 때문이다.

추가 작업 없이 자원을 상속할 수 있다. 

시스템 관리를 효율적으로 할 수 있다. 자식 프로세스가 종료하면 자식이 사용하던 자원을 부모 프로세스가 정리할 수 있다. 서로 연결되어 있기 때문인데, 정리를 부모 프로세스에 맡김으로써 시스템이 효율적으로 관리된다.

 

3 프로세스의 전환

exec() 시스템 콜은 기존의 프로세스를 새로운 프로세스로 전환하는 함수이다.

프로세스는 그대로 둔 채 내용만 바꾼다. exec() 시스템 콜을 하면 현재 프로세스가 완전히 다른 프로세스로 변경된다.

exec()의 목적은 프로세스의 구조체를 재활용하기 위함이다. 이미 만들어진 PCB, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리하다.

 

exec()을 사용하면 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바뀐다. 데이터 영역은 새로운 변수로 채워지고 스택 영역은 리셋된다. PID, PPID, CPID 등은 변경하지 않고 나머지 레지스터와 각종 파일 정보가 리셋된다.

 

 

 

4 프로세스 계층 구조

유닉스의 경우 커널 관련 프로세스 중 init 프로세스가 전체 프로세스의 출발점이 된다. 프로세스를 효율적으로 관리하기 위해 init 프로세스의 자식으로 나머지 프로세스를 생성한다. 그럼을 보면 이해가 된다.

 

이런 계층 구조는 동시에 여러 작업을 처리하고, 종료된 프로세스의 자원을 회수하는 데 유용하다.

아래 각 사용자가 로그인을 할 때 login 프로세스를 fork()를 이용해 여러 개 만들어 사용자에게 나눠준다. 이렇게 동시에 여러 사용자를 처리할 수 있다.

login을 한 후엔 shell 프로세스가 필요한데 login 프로세스를 exec()를 이용해 shell프로세스로 다시 활용한다.

 

좀비 프로세스

부모 프로세스는 자원을 회수하기 위해 자식 프로세스가 종료될 때까지 기다려야 한다. 

그런데 부모 프로세스가 먼저 종료되거나, 자식 프로세스가 비정상적으로 종료되어 부모 프로세스에 연락이 안 되는 경우가 있는데, 이런 경우 자식 프로세스가 종료되지 않거나 종료가 되어도 자원이 그대로 남는 경우가 있다.

이렇게 비정상적으로 남아 있는 프로세스를 좀비 프로세스 또는 미아 프로세스라고 한다.

이런 좀비 프로세스가 많아지면 자원이 낭비되어서 효율적인 운영에 방해가 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts