반응형
목차
1. fork() 시스템 호출이란
2. fork() 시스템 호출의 동작 과정
3. fork() 함수의 장점 및 예시
4. exec() 시스템 호출이란
5. exec() 시스템 호출의 동작 과정
6. exec() 함수의 장점 및 예시
(1) fork() 시스템 호출
fork() 시스템 호출은 실행 중인 프로세스를 복사하는 함수입니다. 실행하던 프로세스는 부모프로세스가 되고, 새로 생긴 프로세스는 자식 프로세스가 되어 부모-자식 관계를 가지게 됩니다.
프로세스 제어 블록을 포함한 부모 프로세스의 영역의 대부분이 자식 프로세스에 복사됩니다.
단, 프로세스 구분자, 메모리 관련 정보, 부모 프로세스 구분자와 자식 프로세스 구분자는 복사 되지 않고 서로 다른 정보를 가지게 됩니다.
(2) fork() 동작 과정
- 프로세스 구분자(PID) 가 바뀐다. (프로세스 구분을 위해 복사를 한 경우에도 달라야 한다.)
- 부모 프로세스와 자식 프로세스가 차지하고 있는 메모리의 위치가 다르므로 메로미 관련 정보가 바뀐다.
- 부모 프로세스 구분자(PPID)와 자식 프로세스 구분자(CPID)가 바뀐다.
(3) fork() 함수의 장점
- 프로세스의 생성 속도가 빠르다. ( 하드 디스크로부터 프로그램을 가져온 것이 아닌 기존 메모리에서 복사했기 때문에 생성 속도가 빠르다.)
- 추가 작업 없이 자원을 상속할 수 있다.
- 시스템 관리를 효율적으로 할 수 있다. (부모 프로세스와 자식 프로세스가 자식 프로세스 구분자와 부모 프로세스 구분자로 연결되어 있기 때문에, 자식 프로세스를 종료하면 자식이 사용하던 자원을 부모 프로세스가 정리할 수 있다.)
(3-2) 코드 예시
실행 결과
1. 실행 순서는 스케줄러의 상황에 따라서 부모가 먼저 실행될 수도 있고 아니면 자식 프로세스가 먼저 실행될 수 있다.
2. fork() 시스템 호출을 통해 복제된 자식 프로세스는 main함수의 시작 부분부터 실행 되는 것이 아니라, 부모 프로세스에서 fork()된 바로 다음 코드부터 실행하게 됩니다. 그래서 실행 결과에 “Only parent” 출력창이 하나만 출력이 됩니다.
(4) exec() 시스템 호출이란
기존의 프로세스를 새로운 프로세스로 전환하는 함수이다.
즉, 이미 만들어진 프로세스의 구조를 재활용하는 것입니다.
새로운 프로세스를 만들려면 프로세스 제어 블록을 만들고 메모리의 자리를 확보하는 과정이 필요하다.
또한 프로세스를 종료한 후 사용한 메모리를 청소하기 위해 상위 프로세스와 부모-자식 관계를 만들어야 한다.
이때, exec() 시스템 호출을 사용하면 이미 만들어진 프로세스 제어 블록, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리하다.
(5) exec() 시스템 호출의 동작 과정
코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바뀌며 데이터 영역은 새로운 변수로 채워지고 스택 영역도 리셋이 됩니다.
프로세스 제어 블록의 내용 중 프로세스 구분자, 부모 프로세스 구분자, 자식 프로세스 구분자, 메모리 관련 사항 등은 변경 되지 않고, 프로그램 카운터 레지스터 값을 비롯한 각종 레지스터와 사용한 파일 정보가 모두 리셋됩니다.
프로세스 제어 블록의 각종 프로세스 구분자는 변경되지 않기 때문에, 프로세스가 종료된 후 부모 프로세스로 돌아올 수 있어 시스템 자원 관리에 있어 효율적입니다.
(6) exec() 함수의 장점
- 프로세스 제어 블록의 각종 프로세스 구분자는 변경되지 않기 때문에, 프로세스가 종료된 후 부모 프로세스로 돌아올 수 있어 시스템 자원 관리에 있어 효율적입니다.
- 이미 만들어진 프로세스 제어 블록, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리하다.
(5-2) 코드 예시
< 실행 결과 >
(1) 부모 프로세스는 fork() 문을 실행하여 자식 프로세스를 생성하고, wait() 문을 실행하여 자식 프로스세가 끝날 때까지 기다립니다. 그래서 child 프로세스가 먼저 실행됩니다.
* Wait() 문은 자식 프로세스와 동기화를 위한 코드로, 자식프로세스가 끝날 때까지 부모프로세스가 기다립니다.
(2) 새로 생성된 자식 프로세스는 부모 프로세스의 코드와 같다. 그러나 execlp() 이 실행되는 순간 자식 프로세스의 코드영역이 “/bin/date” 코드로 바뀌어 처음부터 다시 실행됩니다. “bin/date” 의 실행이 끝나면 부모 프로세스의 wait()가 있는 곳으로 돌아오게 됩니다.
(3) Exec() 시스템 호출을 사용하여 새로운 프로세스로 전환하더라도 프로세스 제어 블록의 각종 프로세스 구분자(PPID, CPID)가 변경되지 않기 때문에 프로세스가 종료된 후 부모 프로세스로 돌아 갈 수 있습니다.
반응형
'CS > OS' 카테고리의 다른 글
[쉽게 배우는 운영체제] 2장 연습문제 및 심화문제 - 정리 (0) | 2022.10.10 |
---|---|
[쉽게 배우는 운영체제] 1장 연습문제 및 심화문제 - 정리 (0) | 2022.10.09 |
[OS] 운영체제 - 프로세스의 상태와 관련 작업 - 생성, 준비, 대기, 보류, 실행, 완료상태 (0) | 2022.10.09 |
[OS] 운영체제 - 컴퓨터의 기본 구성 CPU와 메모리와의 관계 / 레지스터, 버스 (0) | 2022.10.07 |
[OS] 운영체제의 정의, 역할, 목표, 필요성에 대해 (0) | 2022.10.01 |