본문 바로가기
💻 컴퓨터 시스템

[운영체제, 개발자면접] '프로세스와 스레드 완벽 정리'

by 비타민찌 2022. 11. 25.
728x90
프로그램을 실행하면 OS로부터 실행에 필요한 메모리를 할당받아 프로세스가 되는데,
그 안에서 실제로 작업을 수행하는 것이 바로 쓰레드입니다.
하나의 프로세스 안에 하나 이상의 스레드가 있고, 스레드는 동시에 작업 할 수 있습니다. 

 

1. 프로세스와 스레드

#프로세스

운영체제에서 실행중인 하나의 프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 된다. 프로세스는 프로그램을 수행하는데 필요한 데이터와 메모리 등의 자원 그리고 하나 이상의 쓰레드로 구성되어 있으며, 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드이다.

[ 프로세스 용어 ]
PCB: 프로세스 제어 블록, 프로세스에 대한 중요한 정보를 저장
PC: 프로그램 카운터, 프로세스 실행을 위한 다음 명령의 주소를 표시
캐시 메모리: 자주 사용되는 데이터가 저장되는 공간으로 CPU의 레지스터와 메모리 사이에서 병목 형상을 완화하는 장치

 

#스레드

스레드는 프로세스내에서 동시에 실행되는 독립적인 실행 단위. 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다. 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들 (힙 공간 등)과 같은 프로세스 내에 스레드끼리 공유하면서 실행된다. 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다.

[ 자바기초 스레드 join, Synchronized ]

2. 멀티 프로세스와 멀티 쓰레드의 특징

공유하는 공간이 없는 멀티 프로세스는 하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않고 계속 실행된다는 장점이 있지만, 멀티 쓰레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 있다.

 

멀티 쓰레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, 공유하는 공간 때문에 하나의 쓰레드에 문제가 생기면 전체 쓰레드가 영향을 받으며 동기화 문제도 있다는 단점이 있다.

 

+ 멀티스레드의 동시성과 병렬성

동시성은 멀티 작업을 위해 싱글 코어에서 여러 개의 쓰레드가 번갈아 실행하는 것을 말한다. (동시에 실행하는 것처럼 보이지만 사실은 번갈아가며 실행하고 있는 것!) 병렬성은 멀티 작업을 위해 멀티 코어에서 한 개 이상의 쓰레드를 포함하는 각 코어들을 동시에 실행하는 것이다.

 

+ 멀티 쓰레드 환경에서의 주의사항

다수의 쓰레드가 공유 데이터에 동시에 접근하는 경우에 상호배제 또는 동기화 기법을 통해 동시성 문제 또는 교착 상태가 발생하지 않도록 주의해야 한다.

 

+ Thread safe 란?

두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산 결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태를 의미한다. 인스턴스 변수를 두지 않고, 싱글톤 패턴을 사용한다. (싱글턴에도 종류가 여러개 있는데, 일반적으로 구현하는 싱글톤 패턴은 Thread-safe 하지 않다. 스프링을 사용한다면 싱글턴 패턴에 대해 조금 더 알아두어야 할 필요가 있다.) 동기화(syncronized) 블럭에서 연산을 수행한다.

 

+ 선점형 스케줄링과 비선점형 스케줄링의 차이

선점형은 하나의 프로세스가 다른 프로세스 대신 CPU를 차지할 수 있고, 비선점형은 하나의 프로세스가 끝나지 않으면 다른 프로세스는 CPU를 사용할 수 없음을 말한다.

 

+ 동기와 비동기의 차이

동기는 순차적, 직렬적으로 테스크를 수행하고, 비동기는 병렬적으로 테스크를 수행한다. 예를 들어, 서버에서 데이터를 가져와서 화면에 표시하는 작업을 수행할 때, 동기는 서버에 데이터를 요청하고 데이터가 응답될 때까지 이후 테스크들은 블로킹(Blocking, 작업 중단)된다. 비동기는 서버에 데이터를 요청한 이후 서버로부터 데이터가 응답될 때까지 대기하지 않고(Non-Blocking) 즉시 다음 테스크를 계속해 수행한다.

 

+ Critical Section(임계영역)

임계 영역이란 프로세스간에 공유자원을 접근하는데 있어 문제가 발생하지 않도록 한번에 하나의 프로세스만 이용하게끔 보장해줘야 하는 영역을 말한다. 임계 영역 문제를 해결하기 위해서는 아래의 3가지 조건을 충족해야 한다.

- 상호 배제(Mutual exclution): 하나의 프로세스가 임계 영역에 들어가 있다면 다른 프로세스는 들어갈 수 없어야 한다.

- 진행(Progress): 임계 영역에 들어간 프로세스가 없는 상태에서 들어가려 하는 프로세스가 여러 개라면 어느 것이 들어갈지 결정 해주어야 한다.

- 한정 대기(Bounded waiting): 다른 프로세스의 기아를 방지하기 위해, 한 번 임계 구역에 들어간 프로세스는 다음 번 임계 영역에 들어갈 때 제한을 두어야 한다.

 

+ 컨텍스트 스위칭(Context Switching)

콘텍스트 스위칭은 한 Task가 끝날 때까지 기다리는 것이 아니라 여러 작업을 번갈아가며 실행해서 동시에 처리될 수 있도록 하는 방법이다. 인터럽트가 발생하면 현재 프로세스의 상태를 PCB에 저장하고 새로운 프로세스의 상태를 레지스터에 저장하는 방식으로 동작한다. 이때, CPU는 아무런 일을 하지 않으므로 잦은 콘텍스트 스위칭은 성능 저하를 일으킬 수 있다. 스레드와 프로세스의 동작 방식이 약간 상이한데, 스레드는 캐시 메모리나 PCB에 저장해야 하는 내용이 적고, 비워야 하는 내용도 적기 때문에 상대적으로 더 빠른 콘텍스트 스위칭이 일어날 수 있다.

 

 

3. 아파치는 멀티 프로세스, 톰캣은 멀티 쓰레드

Web Server vs WAS

 

아파치, 톰캣은 각각 멀티 프로세스인가 멀티 쓰레드인가? 아파치는 멀티 프로세스로 구현되어 있다. 하지만 설정에 따라 멀티 쓰레드를 같이 운용할 수 있다. 톰캣은 요청을 처리하기 위한 쓰레드 풀을 관리하고 있다. 그리고 요청이 오면 해당 쓰레드 풀에서 쓰레드를 꺼내 요청을 처리하도록 한다. 라고들 구글에 나오는데.. 왜일까?

 

멀티스레딩은 하나 이상의 순차적 명령어 세트를 동시/병렬적으로 실행하는 특성 때문에 톰캣과 같은 WAS에서 사용한다. 멀티 스레드는 요청에 대한 응답을 기다리지 않고, 자기의 할 일을 수행한다. 응답이 오면 원할 때 작업을 처리할 수 있고.. 그래서 Blocking에 대한 걱정을 할 필요가 없으니 멀티 프로세스인 것 같다.

 

4. 스레드풀이란?

작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고, 작업 큐에 들어오는 작업들을 하나씩 스레드가 맡아 처리하는 기법이다.

스레드풀의 사용 이유는.. 병렬 처리가 많아지면 스레드 수가 많아지고, 그에 따른 스레드 생성과 스케줄링으로 인해 CPU가 바빠져서 메모리 사용량이 늘어난다. 이는 애플리케이션 성능 저하로 이어진다.

 

 

 

 


728x90

댓글