유닉스 시스템에서 새로운 child process를 생성하는 일은 fork
라는 시스템콜을 통해 이루어진다. 트리형태를 하고 있다.
- 프로세스가 커널에게 뭔가를 요청할 때는 항상 시스템콜을 통해 이루어짐
- A라는 프로세스가 실행되고 있고, fork라는 시스템콜 호출이 이루어졌다고 가정하자. 이를 통해 B라는 프로세스가 생성되는데, B는 원래 있던 A와 똑같은 모양새를 가진다.
Inter-process Communication (IPC)
: 서로 다른 프로세스 간에 정보를 주고 받는 일
- 방법 1: Shared memory 사용
- 방법 2: message passing 사용
- Shared memory
- 커널에 shared memory 사용을 요청하는 시스템콜을 보낸다
- 커널은 원래 메모리의 보호를 위해 각 프로세스가 다른 메모리 주소를 갖게끔 하는데, share memory 방식의 경우에는 양쪽 프로세스의 메모리 주소가 같게 한다
- message passing
- 발신자는 정해진 방법에 의해 커널에게 메세지 전달 요청을 보내고, 커널은 수신자에게 해당 메세지를 전달한다
- send-receive의 메커니즘이 필요함
효율성에서 보자면 shared memory가 편하지만, 메모리를 공유해야하므로 같은 컴퓨터 위에 있는 프로세스끼리만 정보를 주고받을 수 있다. 하지만 message passing 방식에서는 멀리 떨어진 컴퓨터와도 정보를 주고받을 수 있다.
shared memory에서 발생할 수 있는 동기화 문제는 어떻게 해결할까? > 다른 수업에서 알아볼 예정
쓰레드와 프로세스
쓰레드와 프로세스는 무엇이고, 차이점은 무엇인가?
쓰레드
- 프로세스 내에서 연속적인 명령을 실행하고 있는 흐름
- 동일 프로세스 내에 여러 개의 쓰레드 생성 가능
- 쓰레드를 여러 개 만드는 것이 프로세스를 여러 개 만드는 것보다 오버헤드가 작음
- = light weight process
- 같은 프로그램 내의 서로 다른 부분을 실행하고 있다면, 각 쓰레드는
프로그램 카운터(PC), 현재 가지고 있는 레지스터의 값, 스택
을 가지고 있어야 한다
- 한 프로그램 내의 서로 다른 쓰레드는
메모리의 address spaces는 공유
하지만, 스택은 각각
가지고 있다
- 스택에는
로컬 변수, function의 리턴 주소, 함수의 파라미터
등이 담겨있기 때문에 서로 다른 쓰레드 간에 이것들을 공유하지 않게 된다
- 하지만 address space는 공유하기 때문에 전역 변수는 공유한다. 쓰레드 A가 전역변수 V를 변화시키면, 쓰레드 B가 바라보는 V도 값이 변경된 상태
프로세스
- 하나의 프로그램이 실행되면 하나의 프로세스가 생긴다
- 여러 개의 프로세스가 병렬적으로 실행되는 것처럼 보이는 이유는 CPU가 time share 되기 때문이다