Process

-
Process 구성 요소
- Code : 프로그램 명령이 위치한 곳
- Data : 전역 변수나, static 변수의 할당을 위해 존재하는 공간
- Stack : 지역 변수 할당, 함수 호출 시 전달되는 인자 값들을 저장하기 위한 공간
- Heap : JAVA의 new를 통한 동적 할당을 위해 존재하는 공간
-
실행중인 프로그램의 단위로, 디스크로부터 메모리로 적재되어 CPU의 할당을 받을 수 있다.
-
프로세스 별로 각각 독립적인 메모리를 할당 받는다.
-
프로세스가 오류로 중지되어도 다른 프로세스에게 영향을 주지 않는다.
-
프로세스끼리 통신하기 위해서는 IPC, Socket, File Descripter 과 같은 방법을 사용한다.
프로세스 생명주기

- 생성 (New) : 프로세스 생성
- 준비 (Ready) : 프로세스가 프로세스를 사용하지 않고 있지만 언제든지 사용할 수 있는 상태로 CPU가 할당되기를 기다리는 중
- 실행 (Running) : 프로세스가 프로세서를 차지해 명령어들을 실행
- 대기 (Waiting) : 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태
- 종료 (Terminated) : 프로세스 종료
프로세스 제어 블록 (PCB, Process Control Block)
- 특정 프로세스에 대한 중요한 정보를 저장하고 있는 커널 내의 자료구조
- OS는 프로세스의 생성과 동시에 고유한 PCB를 생성한다.
- 프로세스는 CPU를 할당 받아서 사용하다가 프로세스 전환 시 작업 진행 상황을 PCB에 저장하고 CPU를 재할당 받으면 이를 불러와 다시 작업을 수행한다.
- PCB에 저장되는 정보
- 프로세스 식별자 (Process ID, PID) : 프로세스 식별 번호
- 프로세스 상태 : new, running, waiting, ready, terminated 등의 상태 저장
- 프로그램 카운터 (Program Counter, PC) : 프로세스가 다음에 실행할 명령어의 주소
- CPU 레지스터
- CPU 스케줄링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
- 메모리 관리 정보 : 페이지 테이블 or 세그먼트 테이블 등과 같은 정보
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
- 어카운팅 정보 : 사용된 CPU 시간, 시간 제한, 계정 번호 등
Thread

- 프로세스 내의 실행 단위로, 한 프로세스 내의 스레드는 프로세스의 주소 공간이나 자원을 공유할 수 있다.
- 프로세스 내의 Code, Data, Heap 영역은 다른 스레드와 공유하고, Stack 영역은 독립적으로 할당받는다.
- 매개변수와 지역변수의 바인딩, 함수 종료시 복귀할 주소 정보와 주소 공간 등을 저장하기 위해 사용하는데 이는 스레드가 프로세스 내에서 독립적인 실행 흐름을 가져가기 위함이다. 즉, 독립적인 함수 호출이 가능하다는 뜻을 의미한다.
- 스레드끼리의 통신에는 Heap 영역이나 Data 영역을 사용하거나 시그널을 통해 제어한다.
Multi Process
하나의 프로그램을 여러 개의 프로세스로 구성해 각 프로세스가 하나의 작업을 처리하도록 하는 것
장점
- 여러 개의 프로세스 중 하나에 문제가 발생해도 서로 영향을 미치지 않는다. (안정성)
단점
- 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 사용한다.
- 공유하는 메모리가 없고 각각 독립적인 메모리 공간을 할당 받기 때문에, Context Switching 시 캐시 메모리를 초기화 하는 등 많은 시간이 소모되는 작업이 수반되며 오버헤드가 발생할 문제가 있다.
- 프로세스 간 변수나 자료구조를 공유하기 위해서는 복잡한 통신 기법이 필요하다.
Multi Thread

하나의 프로그램을 여러 개의 스레드로 구성해 하나의 작업을 처리하도록 하는 것
장점
- 메모리 공간과 시스템 자원 소모가 줄어든다.
- Heap, Data 영역을 공유해 데이터를 주고 받기 때문에 스레드 간의 통신 방법이 간단하다.
- Context Switching 시, 캐시 메모리를 비울 필요가 없기 때문에 비용이 적고 빠르다.
- 처리량이 향상되고 자원 소모가 줄어들고 응답 시간이 단축된다.
단점
- 서로 다른 스레드가 Code,Data,Heap 영역을 공유하기 때문에 다른 스레드가 사용중인 변수나 자료구조에 접근하면 잘못된 값을 읽어오거나 수정할 수 있다. 자원 공유의 문제가 발생한다. (동기화 필요)
- 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.