반응형
프로세스의 생성
- 생성상태란 PCB와 주소공간이 마련된 상태를 의미한다.
- 프로세스는 보통 fork 시스템 콜을 통해 생성된다. 이 때 생성한 주체인 프로세스를 부모프로세스, 피 생성된 프로세스를 자식프로세스라고 한다. 부모와 자식은 1:N 관계가 될 수 있다. 그에 따라 전체적으로 프로세스 구조는 tree형태를 나타낼 것이다.
- fork()의 수행은 부모 프로세스에서 일어나지만, fork()로부터의 리턴은 부모, 자식 모두에게 일어난다. 단, 부모 프로세스의 리턴값은 자식 프로세스의 고유번호(PID)이고 자식 프로세스의 리턴값은 0이다. 이렇게 리턴값을 다르게 설정한 이유는, fork()의 리턴값을 받아 이를 조건문에 활용해 다른 작업을 수행할 수 있도록 하기 위해서이다.
- 자식프로세스가 생성되면 사용자 문맥의 text 부분만 공유하고, data와 stack 공간은 별도로 생성되고 원래 값이 복사된다. 즉, 같은 이름이라도 각각 다른 값을 뜻하는 변수들을 가진다. PCB도 당연히 따로 생성된다.
자식 프로세스의 상속
- fork에 의해 새로운 프로세스가 만들어졌다는 것은 PCB가 새로 생성되고, 부모 프로세스 PCB값의 상당수가 새로운 프로세스의 초기값으로 활용된다는 것이다.
- 지원 상속 : 자식 프로세스는 부모 프로세스로부터 속성, 자원 등을 상속받는다. 한 프로세스가 과도하게 많은 자식 프로세스를 생성하여 과부하가 발생하지 않도록 부모가 소유한 자원의 일부만 상속되도록 할 수도 있다.
- 레지스터 문맥 복제 : 부모 프로세스의 특수 레지스터 및 범용 레지스터의 값도 자식 프로세스의 초기값으로 복제되지만 각자의 작업을 수행하면서 즉시 값들이 달라질 것이다.
- 사용자 수준 문맥 복제 : text 영역은 부모프로세스와 공유하고, data,bss,heap,stack 영역은 복사되어 별도로 할당된다. text 영역이 공유하는 이유는 코드 자체는 같아 달리 보유할 이유가 없기 때문이다. 이렇게 text 영역을 제외한 모든 영역의 값을 복사하여 할당하는 프로세스를 heavy weight process라고 한다. (조금 이따 살펴볼 쓰레드가 light weight process이다.)
exec family
- exec family를 활용해 프로세스를 생성할 수도 있다. 이를 사용할시 PCB의 정보 및 부모 자식 관계 등은 유지한 채, text,data,stack 모든 영역이 새로운 프로그램을 위한 것으로 교체된다. 즉, 완전히 새로운 문맥이 탄생하는 것이다. 보통 fork() 후 자식프로세스에서 호출하여 활용한다.
- shell이 exec를 가장 잘 활용하는 예이다. shell 에서 ls라는 명령어를 입력하면 바로 ls를 수행하는 것이 아니라, fork를 하고, 그렇게 생성된 자식프로세스가 exec로 바꾸어 수행한다. 그동안 shell은 wait로 대기하고 있다가 ls과정이 종료되어 exit되면 이 신호를 받아 wake-up되고 다시 작업을 진행한다.
프로세스의 종료
- 프로세스가 종료되는 경우는 아래 3가지이다.
- main함수 끝까지 도달해 return이 일어났을 때
- exit가 호출되었을 때 : wait 상에 있는 부모 프로세스에 종료 이벤트를 알려준다. 부모가 wait상태에 있지 않다면 자식 프로세스의 주소 공간과 할당 자원은 없어지지만, PCB는 그대로 유지된다.(이러한 상태를 좀비(zombie)상태라고 한다.) 이렇게 하는 이유는 wait 구문의 수행보다 자식의 exit가 먼저 일어났을 때에도 부모에게 자식의 정보(exit code, 종료되면서 발생한 정보, PCB에 저장되어 있다)를 알려주기 위함이다.
- abort로 인해 종료요청이 일어났을 때 : shell에서 작업을 중단할 때 ctrl+c와 같은 명령을 활용한다. 이것이 부모프로세스가 abort를 하는 예이다. 이 때 자식프로세스의 PID값이 필요한데, 이는 fork의 리턴값으로 얻을 수 있었다.
반응형
'💻 CS > 운영체제' 카테고리의 다른 글
[운영체제] 스케줄링 (0) | 2020.04.11 |
---|---|
[운영체제] 쓰레드 (0) | 2020.04.07 |
[운영체제] 상태천이 / PCB / 시스템 호출, 인터럽트, 문맥교환의 연계 (0) | 2020.04.02 |
[운영체제] 프로세스 / 문맥 / 문맥교환 (0) | 2020.04.01 |
[운영체제] 보호 / 캐시 / 부트스트래핑 / 커널의 종류 (0) | 2020.03.28 |