Operation on Process
。OS는프로세스를Creation하거나Termination하는 기능을 제공해야함
- 프로세스 생성 ( Process Creation ) :
fork()
。프로세스는부모&자식간트리구조를 가지며 자원을 공유하거나 독립적으로 활용
。System Call : fork()를 통해자식 프로세스생성 시 물리적인메모리 레이아웃영역은 동일하게 공유하며 단지PCB만 복사하여프로그램 카운터등으로부모 프로세스와 구분
▶부모 프로세스와Task가 완전하게 동일한 복제본을 생성
。COW를 통해프로세스를 생성하더라도 동일한 물리적메모리 레이아웃영역을 공유하도록하고,WRITE가 발생한 경우에만 별도의 물리적메모리 공간으로 구분되는 복사본을 생성하여메모리공간을 최적화
프로세스 생성 원리 예시
。System Call : wait()이 없으므로부모 프로세스와자식 프로세스가 병렬적으로 실행
▶부모 프로세스가 먼저 처리된 경우
。System Call : fork()로자식프로세스를 생성한 경우부모프로세스의Task와 이를 복제한자식프로세스의Task를 수행 후return 0을 통해Termination
。pid를 통해 생성된자식 프로세스ID를 알 수 있음
。부모 프로세스의 조건문에서System Call : wait()이 선언되어자식 프로세스를 우선Execute
。프로세스생성 시부모 프로세스가System Call : wait()를 접한 경우부모 프로세스를대기 큐로 전달 후자식 프로세스를 먼저Execute및Terminate된 경우인터럽트를 통해부모 프로세스를준비 큐로 전달하여 실행 재개
▶wait()을 선언안하면부모 프로세스와자식 프로세스를 동시에 병렬실행
。자식 프로세스가terminated된 경우부모 프로세스에 의해자식 프로세스가 사용한 자원을Kernel에 반환
▶ 이때부모 프로세스가wait()을 선언하지 않으면자식 프로세스는좀비 프로세스가 된다.
fork()#include <unistd.h>
。UNIX OS의 호출한부모 프로세스의메모리상 물리적메모리 레이아웃을 공유하는자식 프로세스를 복제하여 생성하는 System Call
▶부모 프로세스와 완전한 복제본을 생성
pid = fork()에서Kernel에 의해 생성된자식프로세스 PID를pid_ttype의 값으로 return
。pid < 0일 경우자식프로세스의 생성이 실패한 경우
。pid == 0일 경우자식프로세스가fork()를 실행한 경우
。pid > 0일 경우자식프로세스의프로세스 ID를 return.
wait():#include <sys/wait.h>
。UNIX OS에서부모프로세스의Task가자식프로세스가termination이 될때까지Block하는 System Call
▶부모 프로세스에서wait()을 접할 경우대기큐로 전달 및자식프로세스가terminate되면인터럽트를 통해부모 프로세스를준비 큐로 전달하여Execute
。자식 프로세스에서는 필요가 없으므로,pid > 0인 상황에서 선언
。자식프로세스가 종료된 경우 해당프로세스 ID를 return 및status에termination을 저장
pid_t:
。프로세스 ID를 저장하기위한 자료형
부모 프로세스( Parent Process ) :
。새로운 프로세스( =자식 프로세스)를 생성하는 기존 프로세스
。wait()을 선언할 경우부모 프로세스를대기 큐로 전달 후 생성한자식 프로세스를 우선Execute후Terminate된 경우인터럽트를 통해부모 프로세스를준비 큐로 전달한 후Execute
자식 프로세스( Child Process ) :
。다른 프로세스( =부모 프로세스)에 의해 생성된프로세스
▶부모 프로세스와 동일한 프로그램과 데이터를 가진 복사본
。부모 프로세스와는 독립적인 가상의 복사된주소공간을 갖는프로세스로서PID와 실행흐름이 구분됨
▶부모 프로세스와 동일한 물리적메모리 레이아웃 공간을 공유하며 단지PCB만 복사하여프로그램 카운터등으로부모 프로세스와 구분
。부모 프로세스에서wait()을 선언하지 않는 경우자식 프로세스는terminate되더라도 사용한 자원을 반납하지 않는좀비 프로세스가 된다.
프로세스생성 시 실행방식
。System Call : fork()선언 후System Call : wait()여부에 따라 변화
부모 프로세스와자식 프로세스가 동시에 병렬로Execute
。fork()선언 후wait()이 없는 경우부모 프로세스와자식 프로세스가 병렬적으로 실행
자식 프로세스를 먼저Execute후Terminate된 경우부모 프로세스의 실행 재개
。fork()선언 후wait()이 있는 경우부모 프로세스는wait()을 통해대기 큐에 전달되어자식 프로세스가Terminate될때까지 대기하다자식 프로세스가Terminate된 경우인터럽트를 발생시켜준비 큐로 전달 후Execute
프로세스생성 시 주소공간 방식
자식 프로세스와부모 프로세스의 물리적메모리 레이아웃공유
。자식프로세스생성 시부모프로세스의주소공간을Read Only로Mapping하여 물리적으로메모리 공간을 공유하도록 설정 및PCB만 복사하여 구분
▶PCB의프로그램 카운터에 의한프로세스의 실행하는 타이밍만 다르면 되므로.
。자식 프로세스는부모 프로세스와 동일한물리적 메모리 주소공간을 공유하지만 독립적인 가상의 복사된주소공간을 갖는것처럼 설정됨
。동일한물리적 메모리의주소공간을 공유하는자식 프로세스또는부모 프로세스중 하나가 데이터 수정 발생 시COW를 통해 서로 독립적인물리적 메모리공간을 갖도록 설정
COW( Copy On Write )
。동일한물리적 메모리공간을 공유하는자식 프로세스또는부모 프로세스중 하나가 데이터 수정 시WRITE요청 발생 시 별도의 물리적메모리 주소공간할당 및 데이터를 복사 후WRITE작업 수행하여자식 프로세스와부모 프로세스간 서로 독립적인물리적 메모리공간을 갖도록 하는 기법
자식 프로세스가 새로운프로그램을 적재한 경우
。이때는프로세스에 새로운 주소공간을 할당.
- Process Termination
。코드의 마지막statement이 끝난 경우 ( ex.return이 발생 시 ) 자동으로프로세스는terminated.
。System Call : exit()을 통해 실행 중 강제로OS에게프로세스를Terminate하도록 명령이 가능
。OS의 입장으로는 모든Task에 할당된 자원을 해지하는 행위
ex.메모리 할당,Open File,I/O Buffer에 할당된 자원들을 해지
- 좀비 프로세스 ( Zombie Process )
。프로세스가Terminated되었지만메모리상에 죽지않고 잔류된프로세스
▶부모 프로세스에서System call : wait()을 선언하지 않아서 정상적으로 자원을 반납되지않아자식 프로세스를Terminate해도 할당된 자원이 해지가 안되서 살아있는 상태
좀비 프로세스해결법
부모 프로세스에서 늦게나마wait()을 호출하여자식 프로세스에 할당된 자원을 반납
부모 프로세스를 종료시켜 모든자식 프로세스를 종료.
좀비 프로세스를 강제 종료
- 고아 프로세스 ( Orphan Process )
。부모 프로세스가 먼저 종료된자식 프로세스를 의미
▶프로세스를 생성 후wait()을 하지않고 실행되어자식 프로세스보다부모 프로세스가 먼저Terminate된 경우
。자식 프로세스는wait()을 호출할부모 프로세스가 사라져Terminate해도 할당된 자원이 해지되지않고메모리에 남아있게됨
▶좀비 프로세스와 동일한 문제 발생
고아 프로세스해결법
init 프로세스에게고아 프로세스를 입양
init 프로세스: 모든프로세스의 조상
。고아 프로세스의 새로운 부모가 되면서init 프로세스는 이미Terminated되었지만,고아 프로세스문제를 해결하기위해 주기적으로wait()을 호출
프로세스 생성 예제
- 프로세스의
Copy On Write
。부모프로세스에서wait()을 통해자식프로세스를 우선Execute하더라도부모프로세스의 전역변수value의 변화는 없다.
▶ 전역변수value는 각각의프로세스에서 독립적으로 존재
。자식프로세스와부모프로세스는Task가 동일하여 서로 물리적 메모리 주소공간을 공유하지만,자식프로세스에서 수정이 발생한 경우COW에 의해부모프로세스와자식프로세스는 서로 물리적으로 독립적인 메모리 주소공간을 가지게 됨
- 복수의 프로세스 생성
。 3번fork()시 총 8개의프로세스생성
。 4번fork()할 경우 총 16개의프로세스생성
▶프로세스 갯수= 로 증가
。 0번프로세스:i=0으로value += 53번 수행
。 2번프로세스:i=1으로value = 5의0번 프로세스복사 후value += 52번 수행
。 5번프로세스:i=2으로value = 10의
2번 프로세스복사 후value += 51번 수행
▶ 각프로세스의 전역변수value = 15를 가진다.
execlp()활용 예제
。fork()에 의해 생성된자식프로세스의 내용이execlp("/bin/ls","ls",NULL);에 의해/bin디렉토리의ls실행파일로 교체
▶자식프로세스의PCB는 유지한채로 내용만 교체됨
。execlp("/bin/ls","ls",NULL);가 수행된 경우 차후에 쓰여진명령어까지 모두 교체되므로,printf("Line J\n")은 실행되지 않음
ls( List Segment )
。UNIX에서디렉토리의 내용( = 파일 및 폴더 목록 )을 보여주는 가장 기본적인 커맨드
exec family
。UNIX OS에서 기존프로세스를 호출한프로세스로 대체하는 용도의System Call그룹
。현재프로세스의메모리 레이아웃을Exec을 호출한프로세스로 덮어씌우면서프로세스를 대체.
▶ 현재프로세스의PCB는 유지되어프로세스 ID도 유지되지만, 내부는 새로운프로세스의 내부로 교체
。 주로fork()후exec을 사용하여부모프로세스를자식프로세스로 대체하는 용도로 활용
exec계열System Call
execlp(실행파일경로, 인자1, ... , NULL)
。현재 실행중인프로세스의메모리 레이아웃을 새로운파일로 대체( =이미지 교체)하는System Call
。파일경로로 지정된 파일을 실행 및 매개변수를 전달.
▶환경변수 PATH에 정의된 경로를 기준으로 파일을 찾고 실행
。마지막 매개변수는NULL포인터로 설정
- 각
프로세스에서 자신의PID확인
。getpid()를 호출하여 현재 호출한프로세스 ID확인
getpid()
。호출한프로세스의프로세스 ID를pid_ttype으로 반환.
▶fork()는 생성한자식프로세스 ID를 반환하므로 다르다.
출처
。운영체제 공룡책 강의