Computer Science

운영체제(Operating System) - 스레드

취업하고싶다! 2025. 1. 4. 20:14

 

 

스레드란?

프로세스를 구성하는 실행 흐름의 단위

하나의 프로세스는 하나 이상의 스레드를 가질 수 있다

스레드는 단일 스레드, 멀티 스레드(실행 흐름이 여러 개)로 구분된다

 

 

스레드의 구성 요소

스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택 등 실행에 필요한 최소한의 정보

스레드들은 자원을 공유하면서 실행

cf) 요즘 운영체제들은 스레드 단위로 CPU를 할당받는 경우가 많음

 

 

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

동일한 작업을 수행하는 단일 프로세스 여러개 실행 vs 하나의 프로세스를 여러 스레드로 실행

어떤 차이가 있을까?

 

프로세스를 fork하면 코드/데이터/힙 영역 등 모든 자원이 복제되어 저장됨

저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재

 

cf) fork 직후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하지 않는 방법도 있다.

이를 쓰기 시 복사(copy on write)기법이라고 함

 

반면, 스레드는 각기 다른 스레드 ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지는 자원을 공유

 

 

멀티 프로세스

멀티 프로세스 내부를 보면 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성함으로서 다중 프로세스를 구성하는 구조

한 프로세스는 실행되는 도중 프로세스 생성 시스템 콜을 통해 새로운 프로세스들을 생성할 수 있는데, 다른 프로세스를 생성하는 프로세스를 부모 프로세스(Parent Process)라 하고, 다른 프로세스에 의해 생성된 프로세스를 자식 프로세스(Child Process)라 한다

 

부모 프로세스와 자식 프로세스는 각각 고유한 PID(Process ID)를 가지고 있다.

부모 프로세스는 자식 프로세스의 PID를 알고 있으며 이를 통해 자식 프로세스를 제어할 수 있다. 또한, 자식 프로세스는 부모 프로세스의 PID와 PPID(Parent Process ID)를 알고 있어, 이를 통해 부모 프로세스와의 통신이 가능하다.

다만 통신이 가능할 뿐이지, 부모 프로세스자식 프로세스는 엄연히 서로 다른 프로세스로 독립적으로 실행되며, 독립적인 메모리 공간을 가지고 있어 서로 다른 작업을 수행한다. 대표적인 예로 웹 브라우저의 상단 탭(Tab) 이나 새 창을 들 수 있다. 각 브라우저 탭은 같은 브라우저 프로그램 실행이지만, 각기 다른 사이트 실행을 행하기 때문이다.

 

멀티 프로세스의 장점

[ 프로그램 안전성 ]

한 프로세스가 비정상적으로 종료되어도 다른 프로세스에 영향 X

 

[ 프로그램 병렬성 ]

다중 CPU 환경에서 각 프로세스를 병렬적으로 실행시켜 성능 향상

 

[ 시스템 확장성 ]

새 기능, 모듈 추가 시 타 프로세스에 영향 X -> 시스템 규모 쉽게 확장 가능

 

멀티 프로세스의 단점

[ Context Switching Overhead ]

성능 저하 발생: 프로세스를 컨텍스트 스위칭하면 CPU는 다음 프로세스 정보를 불러오기 위해 메모리를 검색하고, CPU 캐시 메모리를 초기화하며, 프로세스 상태를 저장하고, 불러올 데이터를 저장해야 하기 때문에

 

[ 자원 공유의 비효율성 ]

자원 공유를 위해선 프로세스 간 통신(IPC)가 필요한데, 파이프, 소켓, 메시지 큐 등이 사용되나 오버헤드 발생

 

 

멀티 스레드

스레드는 하나의 프로세스 내에 있는 실행 흐름이다.

멀티 스레드는 하나의 프로세스 안에 여러개의 스레드가 있는 것을 말한다.

따라서 하나의 프로그램에서 두가지 이상의 동작을 동시에 처리하도록 하는 행위가 가능해진다.

웹 서버는 대표적인 멀티 스레드 응용 프로그램이다. 사용자가 서버 데이터베이스에 자료를 요청하는 동안 브라우저의 다른 기능을 이용할 수 있는 이유도 바로 멀티 스레드 기능 덕분인 것이다. 즉, 하나의 스레드가 지연되더라도, 다른 스레드는 작업을 지속할 수 있게 된다.

 

멀티 스레드의 장점

[ 가벼움 ]

스레드 생성, 제거 시 프로세스보다 빠름

 

[ 자원의 효율성 ]

하나의 프로세스 내에서 여러 개의 스레드가 생성되므로 heap 영역과 같은 공유 메모리에 대해 스레드 간 자원 공유

 

[ Context Switching 비용 감소 ]

스레드 간 공유하는 자원을 제외한 스레드 정보(stack, register)만 교체하면 됨 -> 응답 시간 단축

 

멀티 스레드의 단점

[ 안전성 문제 ]

하나의 스레드에서 문제가 발생하면 다른 스레드들도 영향을 받음

 

[ 동기화로 인한 성능 저하 ]

여러 개의 스레드가 동시에 공유 자원에 접근할 수 있어, 동기화 문제가 발생할 수 있음. 예로, 여러 스레드가 동시에 한 자원을 변경해 버린다면 의도되지 않은 엉뚱한 값을 읽어 서비스에 치명적인 버그가 생길수도 있다. 따라서 스레드 간 동기화(syncronized)는 데이터 접근을 제어하기 위한 필수적인 기술이다. 동기화 작업은 여러 스레드들이 자원에 대한 접근을 순차적으로 통제하는 것이다. 그러면 동시 접근으로 인한 동시 수정과 같은 현상은 일어나지 않게 된다. 그러나 동기화 작업은 여러 스레드 접근을 제한하는 것이기 때문에 병목 현상이 일어나 성능이 저하될 가능성이 높다는 단점이 있다. 이를 해결하고자 임계 영역(Critical Section)에 대해 뮤텍스, 세마포어 방식을 사용한다.

 

[ 데드락(교착 상태) ]

 

데드락이란 다수의 프로세스, 스레드가 서로 자원을 점유하고 다른 프로세스, 스레드가 점유한 자원을 기다리는 상황에서 발생하는 교착 상태를 말한다. 여러 개의 스레드가 서로 대기하면서 무한정 기다리게되는 무한 루프와 같은 증상이라고 보면된다.

 

예를들어, 스레드 1 은 자원 A을 점유하고 있는 상태에서 자원 B가 필요한 상황이다. 그리고 스레드 2 는 자원 B를 점유하고 있는 상태에서 자원 A이 필요한 상황이다. 하지만 스레드 1은 자원 B가 필요한 상황에서 자원 A을 빌려줄 수 있는 상황이 아니고, 스레드 2또한 자원 A이 필요한 상태에서 자원 B를 빌려줄 수 없는 상황인 것이다.

이처럼 다수의 쓰레드가 같은 lock을 동시에, 다른 명령에 의해 획득하려 할 때 서로 절대 불가능한 일을 계속적으로 기다리는 상황을 이야기 한다. 

 

이러한 현상은 스레드의 특징인 공유 자원에 대한 동시 엑세스로 인한 문제로, 이를 방지하기 위한 상호배제(Mutual Exclusion), 점유와 대기(Hold and Wait), 비선점(No Preemption), 순환 대기(Circular Wait) 등의 알고리즘을 통해 극복해야 한다.

다만, 데드락은 멀티 스레드만의 단점이라기 보다는 멀티 프로세스와 스레드 모델의 공통된 문제점이라고 말하는 것이 옳다. 왜냐하면 프로세스 끼리는 기본적으로 독립적인 메모리 공간이지만 IPC를 통해 공유 자원을 사용할 수 있기 때문에 멀티 스레드와 똑같이 교착 상태에 빠질 수 있기 때문이다.

 

 

임계 영역(Critical Section)
멀티 스레드 프로그래밍에서 임계 영역은 공유 자원을 접근하는 코드 영역을 말한다.
대표적으로 전역 변수나 heap 메모리 영역을 들 수 있겠다.

뮤텍스(Mutex)
공유 자원에 대한 접근을 제어하기 위한 상호 배제 기법 중 하나로, 임계 영역에 진입하기 전에 락(lock)을 획득하고 임계 영역을 빠져나올 때 락을 해제하여 다른 스레드들이 접근할 수 있도록 한다. 한마디로 오직 1개의 스레드만이 공유 자원에 접근할 수 있도록 제어하는 기법이다.

세마포어(Semaphore)
세마포어는 동시에 접근 가능한 스레드의 개수를 지정할 수 있다. 세마포어 값이 1이면 뮤텍스와 동일한 역할을 하며, 값이 2 이상이면 동시에 접근 가능한 스레드의 수를 제어할 수 있다. 스레드가 임계 영역에 진입하기 전에 세마포어 값을 확인하고 값이 허용된 범위 내에 있을 때만 락을 획득할 수 있는 형식이다. 한마디로 뮤텍스 상위 호환 이라고 보면 된다.

 

 

정리

프로세스
- 자원 공유 x -> 독립적으로 실행
- 하지만 프로세스 간 자원 주고받을 수 있음: 프로세스 간 통신(IPC)
- 파일을 통한 프로세스 간 통신, 공유 메모리를 통한 프로세스 간 통신

스레드
- 프로세스 자원(코드, 데이터, 힙, 파일) 공유 o -> 협력, 통신에 유리