본문 바로가기
공부/CS

기술 면접 대비 정리 - 1.2 프로세스

by son_i 2024. 2. 18.
728x90

프로세스 관련 질문이 나왔을 때 프로세스를 이용한 프로그래밍 경험을 답변으로 엮으면 개발 경험을 부각시킬 수 있다.

 

1.2.1 프로세스와 스레드

프로세스란?

컴퓨터에서 실행 중인 하나의 프로그램을 의미한다.

프로그램은 특정 작업을 수행하기 위한 명령어의 집합이다.

 

OS는 프로그램을 실행하면서 디스크에 저장된 데이터를 메모리로 로드한다.

프로세스는 OS로부터 독립된 메모리 영역(코드, 데이터, 스택, 힙)을 할당받으며, 다른 프로세스의 메모리 영역에 접근할 수 없다.

 

프로세스에 할당된 메모리 영역은 아래 그림과 같으며, PCB는 프로세스 제어 블록이다.

 

프로세스의 메모리 영역 구조

 

- 스택(stack) : 지역변수, 함수의 매개변수(파라미터), 반환되는 주소 값 등이 저장되는 영역이다.

높은 주소 값에서 낮은 주소 값으로 메모리가 할당되며, 영역 크기는 컴파일 때 결정된다.

 

- 힙(heap) : 사용자에 의해 동적 메모리 할당이 일어나는 영역이다. C언어에서 malloc()으로 할당되는 영역.

낮은 주소 값에서 높은 주소 값으로 메모리가 할당되며, 영역 크기는 런타임 때 결정된다.

 

- 데이터(data) : 전역 변수, 정적 변수, 배열, 구조체 등이 저장되는 영역이다. 데이터 영역은 세부적으로 BSS(Block Stated Symbol) 영역과 데이터 영역으로 다시 나눌 수 있다. BSS 영역은 초기화하지 않은 변수를, 데이터 영역은 초기화한 변수를 저장한다.

 

- 코드(code) : 실행할 코드가 기계어로 컴파일되어 저장되는 영역으로, 텍스트(text) 영역이라고도 한다.

 

스택 영역과 힙 영역은 동적으로 메모리 할당이 가능해 두 영역 사이에 빈 메모리 공간이 존재한다.

 

스택 영역은 LIFO 방식으로, 높은 주소 값에서 낮은 주소 값 순서로 사용

힙 영역은 FIFO 방식으로, 낮은 주소 값에서 높은 주소 값 순서로 사용.

 

메모리 영역을 공유하기 때문에 서로의 영역을 침범하는 문제가 생길 수 있다.

 

스택 -> 힙 영역 침범시 스택 오버플로

힙 -> 스택 영역 침범시 힙 오버플로

 

* 오버플로 : 메모리 공간에서 할당할 수 있는 최대 범위를 넘어가는 것을 의미

* 언더플로 : 메모리 공간에서 할당할 수 있는 최소 범위보다 작은 것을 의미.


스레드란?

프로세스는 한 개 이상의 스레드를 갖는다.

스레드는 프로세스에서 실제로 실행되는 흐름의 단위를 말한다.

 

스레드는 프로세스 안에 존재하므로 프로세스의 메모리 공간을 이용하고, 지역 변수를 저장하는 스택 영역을 할당 받는다.

전역변수를 저장하는 힙 영역은 다른 스레드와 공유한다.

<사용자 레벨 스레드와 커널 레벨 스레드>
커널과 시스템 콜에서 커널에서 관리하는 자원을 보호하기 위해 내부적으로 사용자 모드와 커널 모드로 구분한다고 함.
이와 마찬가지로 스레드도 스레드를 관리하는 주체에 따라 구분된다.

사용자 레벨 스레드는 사용자가 라이브러리를 이용해 생성 및 관리를 한다.
커널 레벨 스레드는 커널이 스레드를 생성 및 관리한다.

멀티 스레드 환경에서 사용자 레벨 스레드와 커널 레벨 스레드는 다음과 같이 3가지 관계를 맺을 수 있다.
1. 다대일
  사용자 레벨 스레드 n개에 커널 레벨 스레드 1개가 매핑되어 사용자 레벨에서 스레드를 관리한다.
  하나의 사용자 레벨 스레드에서 시스템 콜을 호출하면 나머지 사용자 레벨 스레드는 커널 레벨에 접근할 수 없으므로 멀티 코어의 병렬성을 이용할 수 없다. 

2. 일대일
  사용자 레벨 스레드 1개에 커널 레벨 스레드 1개가 매핑. 이 방식은 하나의 사용자 레벨 스레드에서 시스템 콜을 호출하면 다른 사용자 레벨 스레드가 모두 실행되지 않는 다대일의 단점을 해결한다.
  하지만 사용자 레벨 스레드 수만큼 커널 레벨 스레드가 생성되므로 성능 저하가 일어날 수 있다.

3. 다대다
  사용자 레벨 스레드 n 개에 커널 레벨 스레드 m개가 매핑. 이때 커널 레벨 스레드의 수는 사용자 레벨 스레드 수 이하이다. 이 방식은 다대일과 일대일 모델의 장점을 포함하지만, 구현이 어렵다는 단점이 있다.

 


1.2.2 PCB

OS는 프로세스를 제어하기 위해 프로세스 정보를 저장하는데, 이를 PCB라고 한다.

PCB(Process Control Block, 프로세스 제어 블록) 

 

PCB는 프로세스의 현재 상태, 프로세스를 나타내는 고유의 ID(PID), 부모 프로세스의 PID, 자식 프로세스의 PID, 다음 실행할 명령어의 주소인 PC, 프로세스의 우선 순위, 메모리 제한 등을 저장한다. 


1.2.3 프로세스의 생성

새로운 프로세스는 기존 프로세스에서 fork() 함수를 호출해 생성한다. fork() 함수에는 함수를 호출한 프로세스를 복사하는 기능이 있다. 이때 기본 프로세스르 부모 프로세스, 복사된 프로세스를 자식 프로세스라고 한다.

 

=> 부모 프로세스에서 fork() 함수를 호출하면 부모 프로세스는 자식 프로세스의 PID 값을, 자식 프로세스는 0을 반환한다.

<운영체제가 프로세스를 종료하는 경우>
- 프로세스가 운영체제의 종료서비스(exit())를 호출해 정상 종료하는 경우
- 프로세스의 실행 시간 또는 특정 이벤트 발생을 기다리는 시간이 제한된 시간을 초과한 경우
- 프로세스가 파일 검색 또는 입출력에 실패하는 경우
- 오류가 발생하거나 메모리 부족 등이 발생하는 경우

 

<부모 프로세스가 자식 프로세스를 종료시키는 경우>
- 자식 프로세스가 할당된 자원을 초과해서 사용할 때
- 자식 프로세스에 할당된 작업이 없을 때

1.2.4 프로세스 상태도

모든 프로세스는 CPU에 의해 생성되고 소멸하는 과정을 거친다.

이 과정에서 프로세스는 생성(new), 준비(ready), 대기(waiting), 실행(running), 종료(terminated) 다섯가지 상태로 존재.

 

 

- 생성(new) : 프로세스가 PCB를 가지고 있지만 OS로부터 승인받기 전

 

- 준비(ready) : OS로부터 승인받은 후 준비 큐에서 CPU 할당을 기다림.

 

- 실행(running) : 프로세스가 CPU를 할당받아 실행함

 

- 대기(waiting) : 프로세스가 입출력이나 이벤트 발생을 기다려야 해서 CPU 사용을 멈추고 기다림

 

 

프로세스의 상태 변화

 

생성 -> 준비 : 생성 상태의 프로세스가 OS로부터 승인을 받아 준비상탱릐 프로세스가 모여있는 자료구조인 준비 큐에 추가됨.

 

준비 -> 실행 : 준비 큐에 있는 프로세스 중 우선 순위가 높은 프로세스가 디스패치(dispatch)되어 실행됨

 

실행 -> 준비 : CPU 독점을 방지하기 위해 타임아웃 되어 준비 상태로 변경

 

실행 -> 대기 : 입출력/이벤트 때문에 대기 상태로 변경됨

 

대기 -> 준비 : 입출력/이벤트가 완료되어 준비 상태로 변경됨

 

실행 -> 종료 : 실행 중인 프로세스가 정상적으로 끝나서 종료 상태로 변경됨.

 

* 승인(admit) : CPU를 제외한 다른 자원이 준비되어 해당 프로세스가 준비 상태가 될 수 있도록  OS가 허락하는 것

* 디스패치(dispatch) : 프로세스에 CPU 자원을 할당해 해당 프로세스가 준비 상태에서 실행 상태가 되는 것을 의미.

 


1.2.5 멀티 프로세스와 멀티 스레드

동시성과 병렬성의 개념을 먼저 알아야한다.

 

동시성(concurrency) : 하나의 코어(싱글 코어)에서 여러 작업을 번갈아 가면서 처리하는 방식.
CPU는 한 번에 하나의 작업만 처리할 수 있어서 여러 작업을 조금씩 돌아가면서 처리한다.
이렇게 하나의 CPU에서 여러 작업을 번갈아가면서 처리하기 위해 처리 중인 작업을 교체하는 것을 컨텍스트 스위칭이라고 한다.

 

병렬성(parallelism) : CPU가 여러 개(멀티 코어) 있어서 각 CPU에서 각 작업을 동시에 처리하는 방식이다.
즉, 물리적인 시간 관점에서 동시에 여러 작업이 처리된다. 

 

멀티 프로세스란?

응용 프로그램 하나를 여러 프로세스로 구성하는 것을 의미한다.

멀티 프로세스 환경에서는 한 프로세스가 죽어도 다른 프로세스에 영향을 주지 않는다.

 

=> 응용 프로그램을 프로세스 하나로 구성하는 것보다 여러 개로 구성하는 것이 안정적.

=> 하지만 시간과 메모리 공간을 많이 사용한다는 단점이 존재.

 

CPU는 한 번에 하나의 작업만 처리할 수 있어서 여러 프로세스를 처리하려면 CPU에서 처리 중인 프로세스를 교체하는 컨텍스트 스위칭 작업이 이루어져야한다.

 

이때 CPU에서 기존에 처리하던 프로세스가 할당받은 메모리 영역을 다른 프로세스에서 사용할 수 있게 교체하면서 시간과 메모리가 필요한데 이를 오버헤드라고 한다.

 

또한 프로세스는 독립적인 공간을 할당 받는다. 따라서 프로세스 간에 공유할 자원은 IPC를 통해 공유해야한다.

그래서 공유할 메모리를 직접 참조하는것보다 비효율적이다.


멀티 스레드란?

스레드를 여러 개 생성해 스레드들이 각자 다른 작업을 처리하는 것을 의미한다.

멀티 스레드는 스레드 간 힙, 데이터, 코드 영역을 공유한다.

 

=> 컨텍스트 스위칭을 할 때 오버헤드가 적게 발생하고 IPC를 사용하지 않아도 돼서 멀티 프로세스의 단점 보완 가능.

 

  따라서 독립적인 메모리 공간을 갖는 프로세스를 여러 개 생성하는 것보다 스레드를 여러 개 생성하는 것이 자원을 효율적으로 사용할 수 있게 된다.

 

그리고 스레드 간 자원 공유가 프로세스 간 자원 공유보다 시스템 처리 비용이 적고 프로그램 응답 시간도 단축된다.

 

하지만 스택 영역을 다른 스레드와 함께 사용하므로 공유 자원에 대한 동기화가 필수적이다.

또한, 스레드에 문제가 생기면 프로세스 내 다른 스레드에 영향을 미칠 수 있다.

 


1.2.6 콘텍스트 스위칭

* 인터럽트 : CPU에서 프로세스를 처리하다가 입출력 관련 이베트가 발생하거나 예외 상황이 발생할 때 이에 대응할 수 있게 CPU에 처리를 요청하는 것을 의미.

 

  - 인터럽트가 발생하는 경우

 : 입출력이 발생할 때, CPU 사용시간이 만료되었을 때, 자식 프로세스를 생성할 때

 

CPU는 하나의 프로세스만 처리할수 있으므로 멀티 프로세스를 처리하려면 CPU 스켸줄러에 의해 인터럽트가 발생하면서 컨텍스트 스위칭이 이뤄진다.

 

* 컨텍스트 :  CPU가 처리하는 프로세스의 정보.

 

=> 멀티 프로세스 환경에서 CPU가 처리 중인 프로세스의 정보를 바꾸는 것이 콘텍스트 스위칭

 

처리 중 프로세스 p1, 다음에 처리해야하는 프로세스 p2

 

CPU가 p1을 처리하던 중 OS에 의해 인터럽트 발생.

p1은 유휴 상태(idle)로 변경, 스켸줄러는 레지스터에 있는 처리 중인 작업 정보를 p1의 PCB에 저장.

 

p2의 PCB에 있는 정보를 가져와 레지스터에 로드하고 CPU는 p2를 처리.

 

p1의 정보를 p1의 PCB에 저장하고, p2의 PCB에 저장된 정보를 레지스터에 로드하는 동안  CPU는 아무 일도 못 함.

이렇게 어떤 처리를 하던 중에 간접적인 처리 시간과 메모리가 소요될 경우오버헤드가 발생했다고 한다.

 

멀티 스레드를 처리할 때도 콘텍스트 스위칭이 이뤄진다.

하지만 멀티 프로세스의 콘텍스트 스위칭보다 시간과 메모리 자원을 적게 사용한다.

 

멀티 스레드는 스택 영역을 제외한 힙, 데이터, 코드 영역을 공유하므로 레지스터에 저장하고 로드해야 하는 데이터가 상대적으로 적기 때문이다.

 

CPU에서 처리 중인 프로세스가 중간에 변경되어도이전에 실행하던 코드를 이어서 실행할 수 있는 이유는 PCB에 프로그램카운터(PC)와 스택 포인터 값이 저장되어 있기 때문이다. 

 

프로그램 카운터(PC, Program Counter)는 프로세스가 이어서 처리해야 하는 명령어의 주소 값이고

스택 포인터(stack pointer)는 스택 영역에서 데이터가 채워진 가장 높은 주소 값을 가리킨다. 

 

-> 이어서 실행할 명령어의 주소값과 데이터가 슻택에 어디까지 채워져 있는지를 알고 있으므로 콘텍스트 스위칭이 원활히 이뤄진다.

 


1.2.7 프로세스 동기화

경쟁 상태

여러 프로세스 또는 스레드에서하나의 공유 자원에 접근하는 경우에 자원에 접근하는 순서에 따라 결과 값이 달라질 수 있다.

 

이런 현상을 공유자원에 동시에 접근해 경쟁하는 상태라고 해서 경쟁 상태(race condition)라고 한다. 

 

이러한 문제를 해결하려면 프로세스 동기화가 이루어져야한다.

 

임계 영역

공유 자원에 접근할 수 있고 접근 순서에 따라 결과가 달라지는 코드 영역임계영역이라고 한다.

 

임계영역에서 경쟁 상태가 발생하는 것을 방지하려면 여러 프로세스가 공유 자원에 접근해도 데이터의 일관성이 유지되도록 프로세스 동기화를 해야한다.

 

임계 영역에 여러 접근이 동시에 발생하는 것을 방지하려면 다음 3가지 조건을 충족해야 한다.

 

1. 상호배제기법(mutual exclusive) : 어떤 프로세스가 임계 영역을 실행 중일 때 다른 프로세스가 임계 영역에 접근할 수 없다. 상호배제 기법으로는 뮤텍스세마포어가 있다.

 

2. 진행(progress) : 임계 영역을 실행 중인 프로세스가 없을 때 다른 프로세스가 임계 영역을 실행한다.

 

3. 한정된 대기(bounded waiting) : 임계 영역에 접근을 요청했을 때 무한한 시간을 기다리지 않는다.

 

뮤텍스 

락을 가진 프로세스만이 공유 자원에 접근할 수 있게 하는 방법이다.

임계 영역에 접근한 프로세스가 임계 영역에 락을 건다고 해서 락킹 매커니즘(locking mechanism)이라고도 한다.

 

임계 영역에 접근하지 못한 프로세스는 락을 얻기 위해 기다리는 동안 락이 풀렸는지 반복문을 돌면서 확인한다.

이를 바쁜 대기(busy waiting)의 한 종류인 스핀락이라고 한다.

 

스핀락은 락을 얻기 위해 프로세스가 반복문을 돌면서 기다리는 것을 의미한다. 프로세스가 대기상태가 되지 않고 반복문을 돌면서 자원의 사용 가능 여부를 확인하므로 프로세스가 빠르게 교체될 수 있다. 

 

* 바쁜 대기(busy waiting) : 프로세스가 공유 자원에 접근할 수 있는 권한을 얻을 때까지 확인하는 과정을 일컫는다.

 


세마포어

공유 자원에 접근할 수 있는 프로세스의 수를 정해 접근을 제어하는 방법 

 

임계 영역에 접근할 수 있는 키 n개를 지정하고 이 중 하나를 가진 프로세스만이 임계 영역에 접근하게 하는 방식이다.

이 방식은 공유자원에 접근한 프로세스가 접근을 해제하면 다른 프로세스가 접근할 수 있도록 신호를 보낸대고 해서 시그널링 매커니즘(signaling mechanism) 이라고도 한다. 

 

동기와 비동기, 블로킹과 논블로킹은 작업 처리와 관련해 자주 사용하는 용어

동기, 비동기는 작업 순서에 대한 개념
  - 동기(synchronization) : 여러 작업을 처리할 때 작업 순서를 보장함
  - 비동기(asynchronization) : 여러 작업을 처리할 때 작업 순서를 보장하지 않음.

블로킹과 논블로킹은 작업을 위한 대기를 구분하는 개념
  - 블로킹 : 작업을 수행할 때 대기할 수 있다는 것을 의미하며 작업 순서를 보장하지 않음,.
  - 논블로킹 : 작업을 시작하면 대기 없이 수행한다는 것을 의미.

1.2.8 교착 상태(Dead lock)

상호배제 기법 때문에 2개 이상의 프로세스가 각각 자원을 가지고 있으면서 서로의 자원을 요구구하며 기다리는 상태를 교착상태(dead lock)라고 한다.

 

교착 상태가 발생하는 4가지 필요 충분 조건이 있다.

 

1. 상호배제(mutual exclusion) : 하나의 공유 자원에 하나의 프로세스만 접근할 수 있다.

 

2. 점유와 대기(hold and wait) : 프로세스가 최소 하나의 자원을 점유하고 있는 상태에서 추가로 다른 프로세스에서 사용 중인 자원을 점유하기 위해 대기한다.

 

3. 비선점(non-preemption) : 다른 프로세스에 할당된 자원을 뺐을 수 없다.

 

4. 환형 대기(circular wait) : 프로세스가 자신의 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원을 요구한다.

 

 교착상태를 막으려면 위의 4가지 필요 충분 조건 중에서 한 가지를 제거하면 된다 !

 

- 상호배제 부정 : 여러 프로세스가 동시에 하나의 공유 자원을 사용할 수 있게 한다. 

 

- 점유와 대기 부정 : 프로세스가 실행되기 전에 필요한 모든 자원을 할당함으로써 프로세스 대기를 없앤다. 또는 프로세스가 자원을 점유하지 않은 상태에서만 자원을 요구하게 한다.

 

- 비선점 부정 : 자원을 점유한 프로세스가 다른 자원을 요구할 때 점유한 자원을 반납하게 한다.

 

- 환형 대기 부정 : 자원을 선형 순서로 정렬해 고유 번호를 할당한다. 그리고 각 프로세스에서 요구할 수 있는 번호의 방향을 정해서 한쪽 방향으로만 자원을 요구하게 한다.

 

 교착 상태의 필요 충분 조건은 외우지 않고 이해하는 것이 좋음.

 


1.2.9  스레드 안전

스레드 안전은 멀티 스레드 환경에서 하나의 변수, 함수, 객체에 스레드 여러 개가 동시에 접근해도 문제가 없음을 의미한다. 스레드 안전하지 않은 경우는 아래와 같은 간단한 코드에서도 나타난다.

var++;

 

이 코드는 var 변수의 값을 메모리 -> cpu 레지스터로 로드 -> 연산 처리 -> 연산 결과를 메모리에 작성하는 과정을 거치게 된다. 만약 이 코드에 스레드 2개가 접근하면 잘못된 결과를 초래할 수 있다.

1.2.7 프로세스 동기화에서 너무 많은 우유 문제도 스레드 안전하다고 할 수 없다.

 

스레드 안전을 위한 조건

- 상호배제(mutual exclusive) : 공유 자원에 접근해야할 때 뮤텍스 또는 세마포어와 같은 상호 배제 기법을 사용해 접근을 통제해야 한다.

- 원자 연산(atomic operation) : 공유 자원에 접근할 때 원자 연산을 이용하거나 원자적으로 정의된 연산을 이용해 연산 도중에 다른 스레드가 접근할 수 없게 한다. 여기서 원자 연산이란 '연산 했다' 와 '연산 안 했다' 두 가지만 존재하는 연산이다.

- 재진입성(reentrancy) : 특정 함수를 하나의 스레드에서 실행 중일 때 다른 스레드가 해당 함수를 실행해도각 스레드에 올바른 결과가 나올 수 있게 해야한다. 

- 스레드 지역 저장소(thread local storage) : 각 스레드에서만 접근할 수 있는 저장소를 사용해서 공유되는 자원을 줄여야한다. 

1.2.10 IPC

프로세스는고유한 메모리영역을 갖기 때문에 프로세스 간 자원을 공유해야 할 때 IPC를 해야한다.

IPC는 Inter Process Communication의 약자로, 프로세스 간에 자원을 공유하는 방식을 나타낸다.

대표적인 종류는 다음과 같다.

 

1. 공유 메모리(shared memory)

프로세스 간에 공유 가능한 메모리를 구성해 자원을 공유하는 방식이다.

여러 프로세스에서 접근할 수 있으므로 동기화 문제가 발생할 수 있다. 

 

2. 소켓(socket)

네트워크 소켓을 이용하는 프로세스 간 통신으로, 외부 시스템과도 이용할 수 있다.

클라이언트와 서버 구조로 자원을 주고받는다.

 

3. 세마포어(semaphore)

접근하는 프로세스를 제어해 공유 자원을 관리한다.

 

4. 파이프(pipe)

FIFO 형태의 메모리인 파이프를 이용해 프로세스 간 자원을 공유하는 방식이다.

파이프는 단방향 통신만 지원하므로 읽기 또는 쓰기 중 하나만 할 수 있다.

따라서 양방향통신을 하려면 읽기 파이프(read pipe)와 쓰기 파이프(write pipe)를 각각 생성해야 한다. 

 

5. 메세지 큐(message queue)

FIFO 형태의 큐 자료구조를 사용해 프로세스 간 메세지를 주고 받는 방식이다. 


1.2.11 좀비 프로세스와 고아 프로세스

자식 프로세스가 종료되었지만 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않았을 경우에 남겨진 자식 프로세스를 좀비 프로세스라고 한다.

 

자식 프로세스가 종료될 때 부모 프로세스에 SIGCHLD라는 시그널을 보내면 부모 프로세스에서 wait() 함수(시스템 콜)를 호출해 자식 프로세스의 상태 정보를 받고 자원을 회수한다. 이때 자원 회수에 실패하면 좀비 프로세스가 생기게된다. 좀비 프로세스가 쌓이면 자원이 낭비될 수있다.

 

부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우에 자식 프로세스고아 프로세스(orphan process)라고 한다. 이럴 때는 자식 프로세스의 부모 PID를 init 프로세스 (부팅 시 가장 먼저 실행되는 프로세스)의 PID인 1로 바꿔준다.  

이렇게 하면 고아 프로세스의 부모 프로세스는 init 프로세스가 된다. 이후에 고아 프로세스가 작업을 종료하면 init 프로세스가 고아 프로세스의 자원을 회수해 좀비 프로세스가 되는 것을 방지할수 있다. 

 


예상 질문

1. 프로세스와 스레드의 차이점 설명

프로세스는 실행 중인 하나의 프로그램을 의미하며 실행의 단위이다.
반면 스레드는 프로세스 내에서 실행되는 흐름의 단위를 의미한다.
그래서 프로세스는 독립적인 메모리 영역을 갖지만, 스레드는 스택 영역만 독립적이고, 그 외 영역은 다른 스레드와 공유한다. 

 

 

2. 스택 오버플로와 힙 오버플로에 관한 설명

스택 오버플로는 메모리에서 스택 영역이 힙 영역을 침범할 때 발생한다.
예로 과도한 재귀 호출이 있다.

힙 오버플로는 힙 영역이 스택 영역을 침범하는 경우이다.
예로 과도한 메모리 동적 할당이 있다.

TIP) 스택 오버플로와 힙 오버플로가 발생하는 예를 함께 답변하면 좋다.
스택 영역은 지역 변수와 함수의 매개변수가 저장되는 영역으로, 과도한 재귀호출이 발생하면 힙 영역을 침범하게 되어 스택 오버플로가 발생한다. 

힙은 동적 메모리 영역이므로 과도하게 동적할당하면 힙 오버플로가 발생한다. 

 

 

3. PCB가 무엇인지 설멍

 PCB는 Process Control Block으로 프로세스에 대한 정보를 저장하는 구조체이다.
저장되는 정보로는 프로세스 고유 아이디인 PID, 프로세스가 다음 실행되어야 할 명령어의 주소를 가리키는 PC, CPU 의 레지스터에 저장되는 정보 등이 있다.

TIP) PCB는 프로세스에서 빠질 수 없는 내용이다. 따라서 저장되는 정보를모두외울 필요는 없지만, 몇 가지는 설명할 수 있어야 한다.  

 

 

4. 멀티 프로세스와 멀티 스레드의 차이점 설명

멀티 프로세스는 응용 프로그램 하나를 프로세스 여러 개로 구성하는 것이다.
반면 멀티 스레드는 하나의 프로세스 안에서 여러 스레드로 작업을 처리하는 것이다.

프로세스는 독립적인 메모리 영역을갖기 때문에 자원 공유와 프로세스간 통신을 하려면 IPC를 활용해야 한다.
스레드는 자원 공간을 공유하므로 스레드 간 통신과 자원 공유가 간단하고 프로세스 대비 컨텍스트 스위칭 비용이 적게 들지만, 동기화가 필요하다.

TIP) 멀티 프로세스와 멀티 스레드의 중요한 차이점 중 하나는 자원 공간의 공유 여부다. 자원 공간을 공유할 수 없는 프로세스 간 자원 공유 방법인 IPC에 대한 연결질문이 나올 수 있다. 추가로 답변에 스레드 구현경험과 데이터 동기화 문제 해결 경험을 녹여내면 면접 흐름을 이끌고 개발 경험을 강조할 수 있다.   

 

5. 동시성과 병렬성을 비교해 설명

동시성은 하나의 코어에서 작업을 번갈아 가면서 실행해 여러 작업을 처리하는 것을 의미한다.
이 방식은  CPU에서 처리 중인 작업을 변경하기 위해 컨텍스트 스위칭이 일어나 오버헤드가 발생한다.

반면에 병렬성은 여러 코어에서 여러 작업을 처리하는 것을 의미한다. 즉, 물리적인 시간 관점에서 여러 작업이 동시에 처리되는 방식이다.

TIP) 동시성의 핵심은 하나의 코어에서 여러 작업을 번갈아 처리하지만, 사용자 입장에서는 동시에 처리되는 것처럼 보인다는 점이다. 그리고 병렬성은멀티 코어를 이용해 물리적인 시간 관점에서 동시에 여러 작업을 실행한다는 것이 핵심 

 

6. 컨텍스트 스위칭이 무엇인지 설명

컨텍스트 스위칭은 CPU가 처리 중인 프로세스를 변경하는 것을 의미한다. CPU는 하나의 프로세스만 처리할 수있어서 멀티 프로세스 환경에서는 컨텍스트 스위칭이 발생한다. CPU 스켸줄러에 의해 인터럽트가 발생하면 실행 상태의 프로세스가 준비 또는 대기 상태로 전환되고, 다음에 실행할 프로세스가 실행 상태로 전환된다. 
이때 레지스터에 저장된 프로세스 정보가 바뀌면서 오버헤드가 발생하게 된다.

TIP) 멀티 프로세스의 단점인 오버헤드를 소개하고 이를 멀티 스레드로 보완할 수 있다고 설명하면 멀티 스레드에 관해 알고 있다는 것을 어필 가능

 

7. 멀티 프로세스에서 컨텍스트 스위칭과 멀티 스레드에서 컨텍스트 스위칭의 차이점 설명

가장 큰 차이점은 멀티 스레드에서 컨텍스트 스위칭을 할 때 멀티 프로세스보다 오버헤드가 적게 발생한다는 점이다. 멀티 프로세스는 프로세스별로 고유한 메모리 영역을 갖는 반면, 멀티 스레드는 스택 영역을 제외한 메모리 영역을 공유한다. 그래서 레지스터에 로드해야 하는 데이터 양이 적어서 오버헤드가 적게 발생한다.

TIP) 이 질문으로 컨텍스트 스위칭에 대한 이해도 뿐만 아니라 멀티 프로세스와 멀티 스레드의 이해도까지 확인할 수 있다. 따라서 컨텍스트 스위칭에서 발생하는 오버헤드와 프로세스 + 스레드가 갖는 메모리 영역의 차이를 설명하는 내용이 답변에 들어가면 좋다.   

 

8. 프로세스 동기화에 대해 설명

프로세스 동기화는 여러 프로세스 또는 스레드가 하나의 공유 자원에 접근해도 일관성을 유지하는 것을 의미한다.
공유 자원에 접근하는 코드를 임계 영역이라고 하며, 임계 영역에 대한 상호배제 기법이 잘 이뤄져야 프로세스 동기화를 할 수 있다.
상호 배제 기법으로는 뮤텍스와 세마포어가 있다.

TIP) 프로세스 동기화에 대해 답변할 때 중요한 개념인 임계 영역, 뮤텍스, 세마포어를 짚고 넘어가는 것이 좋다. 추가로 임계 영역 문제를 해결하기 위한 조건으로 상호배제 기법 뿐만 아니라 진행과 한정된 대기에 대해서도 알고 있으면 좋다. 

 

 

9. 뮤텍스와 세마포어의 차이점 설명

뮤텍스와 세마포어는 프로세스 동기화를 위한 상호 배제 기법이다.
뮤텍스는 락을 획득한 하나의 프로세스만이 임계 영역에 접근할 수 있도록 하는 동기화방식이다.
이 방식을 사용하면 임계 영역에 접근하려는 프로세스는 반복문을 돌며 임계 영역에 접근 가능한지 확인하게 되는데, 이러한 현상을 스핀락이라고 한다.
 
세마포어는 임계 영역에 접근 가능한 프로세스 수를 지정해서 제어하는 방식이다. 임계 영역에 접근이 불가능하면 해당 프로세스는 대기 상태로 들어가고, 이후 임계 영역을 처리 중이던 프로세스가 임게 영역을 나가면서 대기 상태인 프로세스를 깨우게 된다.

TIP) 뮤텍스와 세마포어의 목적이 동기화라는 것을 이해해야 한다. 또한 뮤텍스와 세마포어의 특징도 알아두기 ! 

 

 

10. 스레드 안전의 의미가 무엇이고 이를 구현하는 방법은 무엇인가?  

스레드 안전은 하나의 자원 또는 객체에 여러 스레드가 접근해도 프로그램을 실행하는데 문제가 없는 것을 의미한다. 자바에서 스레드 안전을 구현할 때 Synchronized 키워드를 사용하는 방법이 있다. Synchronized 키워드는 임계 영역에 하나의 스레드만 접근할수 있게 해서 이 키워드를 사용한 블록 단위로 락의 획득 및 해제가 발생한다. Synchronized 키워드를 사용할 때 블록을 크게 잡으면 성능 저하 문제가 생길 수 있으므로 임계 영역을 최소화 해야 한다. 

TIP) 여기서는 자바로 스레드 안전을 구현하는 방법이고 각 자신의 주 언어로 어떻게 스레드 안전을구현할 수 있는지숙지해야한다. 또한, 본인이 프로젝트를 진행하면서 스레드 안전을 고려해 코드를 작성한 경험이 있다면 답변에 포함하는 것이 좋음.