(1) 프로세스와 스레드 그리고 태스크

- 태스크 : 자원소유권의 단위
- 스레드 : 수행의 단위
- 프로세스 : 동작중인 프로그램

'프로세스는 동작중인 프로그램이며, 커널로부터 할당받은 자신만의 자원을 가지고, CPU가 기계어 명령들을 실행함에 따라 끊임없이 변화하는 동적인 존재이다.'


(2) 사용자의 입장에서 프로세스 구조
: 운영체제는 각 프로세스에게 총 4GB 크기의 가상공간을 할당한다. 리눅스는 이 중에서 0GB~3GB의 공간을 사용자 공간으로 사용하고, 나머지 3GB~4GB를 커널 공간으로 사용한다.


: 프로세스는 크게 텍스트, 데이터, 스택, 힙이라는 네 영역으로 구분할 수 있다.
 
- TEXT 영역 : CPU에서 직접 수행되는 명령어
- DATA 영역 : 전역번수
- HEAP 영역 : 동적 할당받은 내용
- STACK 영역 : 지역변수와 인자 그리고 함수의 리턴주소


(3) 프로세스와 스레드의 생성과 수행

○ 프로세스의 생성
- 독립적인 pid를 갖는다. 
- 주소공간을 포함하여 이 프로세스를 위한 모든 자원들이 새로이 할당된다.
- 자식프로세스에 발생한 결함은 부모 프로세스에게 전파되지 않는다.

○ 스레드의 생성
- 자신을 생성한 태스크와 동일한 pid를 갖는다. 
- 부모 스레드와 서로 같은 주소 공간을 공유한다.
- 자식 스레드에 결함이 발생하면 그것은 부모 스레드로 전파된다. 

'프로세스 모델은 결함 고립에 적합하며, 스레드 모델은 자원공유에 적합한 프로그래밍 모델이다.'


(4) fork() 와 vfork()

- fork() : 부모프로세스의 주소공간을 복사하여, 자식 프로세스의 주소 공간을 따로 만든다.

- vfork() : 주소공간을 일단 가리키고 있다가, execve() 함수를 통해 요청된 바이너리를 기반으로 새로운 주소 공간을 생성한다.


=> fork()이후 execve()가 수행되었다면 주소공간을 복사하는 것은 불필요한 작업이 된다. 이 단점을 위해 제공되는것이 vfork()이다.
하지만 최근 리눅스는 COW기법을 도입하여 FORK() 할 때 야기되는 주소 공간 복사 비용을 많이 줄였다.

※ COW(Copy-On-Write)

: 전통적으로 fork()는 부모의 모든 자원을 복제하여 자식 프로세스로 넘겨주는데, 많은 자원을 복제한다는 점에서 너무 단순하고 비효율적이다. Copy-On-Write란 데이터의 복제를 지연 또는 방지하는 기법이다. 즉 프로세스 주소공간을 복제하는 대신, 부모와 자식이 하나의 공간을 공유한다. 만약 데이터를 써넣을 일이 발생하면, 그제서야 주소 공간을 복제하여 자식에게 넘겨준다. 결국 자원의 복제는 쓰기가 발생할 때에만 일어나게 되고 복제 전까지는 부모와 자식이 읽기 전용 주소공간을 공유하는 셈이다. 이 기법은 대량의 데이터 복제를 방지함으로써 성능을 최적화 시킨다.

 

by 민트앤라떼 2012. 6. 19. 17:22