[운영체제] Chapter 4. Process Management (2)
2022. 12. 20. 21:36ㆍCS/운영체제
728x90
//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎
프로세스 생성(Process Creation), 프로세스와 관련한 시스템 콜, 프로세스 간 협력, Message Passing, Interprocess communication
1. fork() 시스템 콜
A process is created by the fork() system call.
프로세스는 fork() 시스템 콜에 의해 생성된다.
- fork() 시스템 콜: 운영체제에게 새로운 프로세스를 만들라는 요청
- fork() 시스템 콜을 하게 되면 fork() 함수를 호출한 프로세스와 똑같은 프로세스가 하나 생성됨
- fork() 시스템 콜로 새로운 프로세스가 생성되면 새로운 프로세스는
- main함수의 시작 부분부터 실행하지 않고
- fork()를 실행한 그 이후 시점부터 자식 프로세스를 실행한다.
- fork()를 통한 복제 생성은 부모 프로세스의 문맥(주소 공간을 비롯해 프로그램 카운터, 레지스터 상태, PCB 및 커널 스택 등 모든 문맥)을 그대로 복사해 자식 프로세스의 문맥을 형성
- 부모 프로세스가 현재 수행한 시점(= 프로그램 카운터 시점)부터 수행
- 그렇다면 부모 프로세스와 자식 프로세스의 구분은 어떻게 하는가?? 복제된 프로세스들은 똑같은 제어 흐름을 갖는 게 아닌가??
- fork() 시스템 콜로 운영체제가 복제본을 만들게 되면 fork()의 리턴 값을 다르게 해 주어 원본과 복제본을 구분할 수 있다.
- fork()의 리턴 값이 0: 자식 프로세스
- fork()의 리턴 값이 양수: 부모 프로세스
- fork() 시스템 콜로 운영체제가 복제본을 만들게 되면 fork()의 리턴 값을 다르게 해 주어 원본과 복제본을 구분할 수 있다.
2. exec() 시스템 콜
- fork() 시스템 콜을 통한 자식 프로세스 생성은 조건문에 의한 분기일 뿐 사실상 두 프로세스 모두 동일한 코드의 내용을 가질 수밖에 없다 → 어떤 프로그램을 완전히 새로운 프로세스로 태어나게 하려면 exec() 시스템 콜
A process can execute a different program by the exec() system call.
프로세스는 exec() 시스템 콜에 의해 다른 프로그램을 실행할 수 있다.
- exec() 시스템 콜: 프로세스가 지금까지 수행했던 상태를 잊어버리고 그 주소 공간을 완전히 새로운 프로그램으로 덮어 씌운 후 새로운 프로그램의 첫 부분부터 다시 실행을 시작하도록 하는 시스템 콜이다.
int main(){
int pid();
pid = fork();
if (pid==0){ //child
printf("1");
execlp("echo", "echo", "3", (char *)0); //printf와 유사한 함수 echo
printf("2"); //출력되지 않음 - exec()를 실행하면 되돌아 올 수 없음
}
else if (pid>0) //parent
printf("\\n Hello, I am parent!\\n);
}
//출력
1
3
- execlp(”프로그램 이름”, “프로그램 이름”, “전달 인자”, null pointer);
- 일종의 함수로 결국 exec() 시스템 콜을 호출해 새로운 프로그램을 덮어 씌워 새로운 프로그램의 시작(= main 함수)부터 실행하게 한다.
- exec()를 실행하게 되면 되돌아올 수 없다.
- 꼭 자식을 만들어(= fork()를 하여) exec()를 실행할 필요는 없다.
3. wait() 시스템 콜
- wait() 시스템 콜: 자식 프로세스가 종료될 때까지 부모 프로세스를 block 상태로 잠들게 하는 것
- 주로 자식 프로세스를 만든 다음 호출한다.
- 프로세스 A가 wait() 시스템 콜을 호출하면
- 커널은 자식 프로세스가 종료될 때까지 프로세스 A를 block 상태로 sleep 시킨다.
- 자식 프로세스가 종료되면 커널은 프로세스 A를 ready 상태로 깨운다.
- 자식 프로세스가 종료되는 순간 프로세스 A는 준비 큐에 재 진입해 다시 CPU를 얻을 권한을 획득
- 유닉스 명령어 입력창에서 커맨드를 입력해 수행 → 커맨드의 수행이 종료될 때까지 프롬프트를 다시 띄우지 않음(입력을 못 하게)
: 명령어 입력창을 띄운 부모 프로세스가 커맨드를 수행하고 있는 자식 프로세스의 종료를 기다리며 봉쇄 상태에 머물러 기다리고 있기 때문
- 보통은 wait() 시스템 콜을 호출하지 않으면 부모와 자식 프로세스는 경쟁관계에 있는 독립적인 프로세스이다.
4. exit() 시스템 콜
- exit() 시스템 콜: 모든 자원을 반납하고, 부모 프로세스에게 알리는 프로세스를 종료시키는 호출
- 자발적 종료 - exit()
- 마지막 statement 수행 후 exit() 시스템 콜을 통해
- 프로그램에 명시적으로 적지 않아도 프로그램이 종료되는 위치 또는 main함수가 리턴되는 위치에 컴파일러가 자동으로 넣음
- 비자발적 종료 - abort()
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자식 프로세스가 한계치를 넘어서는 자원 요청을 한 경우
- 자식에게 할당된 태스크가 더 이상 필요하지 않은 경우
- 사람이 키보드로 kill, break 등을 친 경우
- 부모가 종료하는 경우 - 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
5. 프로세스 간 협력
5-1. 독립적 프로세스(Independent process)
- 프로세스는 각자의 주소 공간을 가지고 수행되며 프로세스가 다른 프로세스의 주소 공간을 참조하는 것은 허용되지 않는다.
→ 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못한다. - 부모 프로세스와 자식 프로세스도 자원을 서로 획득하기 위해 경쟁적인 관계에 있다.
5-2. 협력적 프로세스(Cooperating process)
- 독립적인 프로세스들이 협력할 때 부분적인 처리 결과나 정보를 공유할 수 있고, 처리 속도가 향상될 수 있는 등 업무의 효율성이 증진될 수 있다.
- 하지만 프로세스는 독립적으로 자신의 메모리 주소 공간만 볼 수 있고, 다른 프로세스에게 메세지를 전달할 방법도 원칙적으로 없다.
→ 운영체제는 프로세스 간의 협력 메커니즘을 제공해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있게 한다.
5-3. 프로세스 간 협력 메커니즘(IPC: Interprocess Communication)
- IPC: 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신, 동기화를 이루기 위한 메커니즘
- 메세지 전달 방법(message passing)
- 프로세스 간에 공유 데이터를 일절 사용하지 않고 커널을 통해 메세지를 주고받으며 통신하는 방법
- 두 프로세스의 주소 공간이 달라 메세지 전달을 직접할 수 없음 → 커널이 send와 receive 연산 제공
- 통신하기를 원하는 두 프로세스는 커뮤니케이션 링크를 생성한 후 send()와 receive()를 이용해 메세지를 주고 받게 된다.
- Direct Communication: 통신하려는 프로세스의 이름을 명시적으로 표시
- 하나의 링크는 정확히 한 쌍의 프로세스에게 할당된다.
- Indirect Communication: mailbox (또는 port)를 통해 메세지를 간접 전달
- 각 메일 박스에는 고유의 ID가 있으며 메일박스를 공유하는 프로세스들만 서로 통신을 할 수 있다.
- 간접 통신에서 사용하는 링크는 프로세스 간에 메일박스를 공유하는 경우에만 생성
- 하나의 링크가 여러 프로세스들에게 할당될 수 있으며 각 프로세스의 쌍은 여러 링크를 공유할 수 있다.
- Direct와 Indirect Communication은 연산의 인터페이스의 차이일 뿐 실제 메세지 전송이 이루어지는 내부 구현은 커널의 중재에 의해 이루어 진다.
- 주소 공간을 공유하는 방법(shared memory)
- 서로 다른 프로세스 간에도 주소 공간의 일부를 공유하는 방법
- 원칙적으로는 각 프로세스는 자신의 주소영역에만 접근할 수 있기 때문에 프로세스들끼리 직접 메모리 공간을 공유할 수 없다
→ 커널에게 시스템 콜을 하여 주소 공간이 물리적 메모리에 매핑 → 공유메모리 주소 영역에 대해 동일한 메모리 주소로 매핑 - 공유 메모리 영역은 각자의 주소 공간에 공통적으로 포함되는 영역이므로 여러 프로세스가 읽고 쓰는 것이 가능하다.
- 데이터의 일관성 문제는 커널이 책임지지 않는다. 사용자 프로세스들끼리 직접 공유메모리 접근에 대한 동기화 문제를 책임져야 한다.
- 스레드 간의 협력: 스레드는 하나의 프로세스이므로 프로세스 간 협력으로 보기 어렵지만 동일한 프로세스를 구성하는 스레드들 간에는 주소 공간을 공유하므로 협력이 가능하다.
[복습]
- fork(): create a child (copy)
- exec(): overlay new image
- wait(): sleep until child is done
- exit(): frees all the resources, notify parent
- 프로세스 간 협력
- IPC: Interprocess Communication, 프로세스 간 협력 메커니즘
- 메세지 전달 방법(message passing): 공유 데이터를 사용하지 않고 커널을 통해 메세지를 주고받으며 통신
- Direct Communication: 통신하려는 프로세스의 이름을 명시적으로 표시
- Indirect Communication: mailbox or port를 통해 메세지를 간접 전달
- 주소 공간을 공유하는 방법(shared memory): 서로 다른 프로세스들 간 주소 공간을 일부 공유하는 방법
이화여자대학교 반효경 교수님의 [2014년 1학기 운영체제], [2017년 1학기 운영체제] 강의 정리입니다.
반효경 교수님의 [운영체제와 정보기술의 원리] 교재를 참고하였습니다. 감사합니다.
https://core.ewha.ac.kr/publicview/C0101020140325134428879622?vmode=f
728x90
'CS > 운영체제' 카테고리의 다른 글
[운영체제] Chapter 6. Process Synchronization (1) (0) | 2022.12.23 |
---|---|
[운영체제] Chapter 5. CPU Scheduling (1), (2) (1) | 2022.12.22 |
[운영체제] Chapter4. Process Management (1) (0) | 2022.12.15 |
[운영체제] Chapter 3. Process(2) (0) | 2022.12.14 |
[운영체제] Chapter 3. Process(1) (2) | 2022.12.11 |