꼬꼬마 블로그

꼬꼬마의 기술 블로그

프로그램, 프로세스, 쓰레드

프로그램

특정한 작업을 실행하기 위한 명령어들의 모음

프로세스
실행되고 있는 프로그램
메모리에 올라와 실행되는 프로그램의 개체
명령어들이 올라가는 메모리 영역, Code 영역
전역변수, static 변수가 할당되는 영역, Data 영역
함수 매개변수, 지역 변수가 할당되는 영역(컴파일 타임에 크기가 결정), Stack 영역
동적으로 할당 되는 영역(런 타임에 크기가 결정), Heap 영역

스레드
프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
프로세스의 자원을 공유하며 프로세스의 실해 흐름의 일부가 됨

 

프로세스 메모리

운영체제는 프로세스마다 각각 독립된 Code, Data, Stack, Heap 영역으로 메모리를 할당해줍니다.

각각 독립적으로 할당하기 때문에 서로 공유되지 않습니다.

 

스레드 메모리

스레드는 각각 Stack 영역은 따로 할당 받고 나머지 영역은 공유합니다.

 

여기서 또 다른 프로세스와 스레드의 차이점을 알 수 있습니다.

프로세스의 경우 프로세스가 오류가 발생해 종료된다면 특별한 경우가 아니라면 다른 프로세스에는 영향을 주지 않습니다. 하지만 스레드의

 

경우 하나의 스레드에서 오류가 발생한다면 프로세스의 다른 스레드도 모두 강제 종료됩니다.

 

프로세스 VS 스레드 결론

프로세스와 스레드는 비교 대상이 아니라는 생각이 들 정도로 범위부터가 다릅니다. 

프로세스 내부에서의 여러 실행 흐름을 스레드라고 하기 때문입니다.

 

프로세스는 자원을 공유하지 않지만 스레드는 자원을 공유합니다.

 

 

그렇다면 싱글스레드와 멀티스레드는 무엇이고 장/단점은 무엇일까요?

 

싱글 스레드

프로세스가 단일 스레드로 동작하는 방식입니다. 하나의 레지스터, 스택으로 표현합니다.

 

가장 대표적으론 자바스크립트가 싱글 스레드 언어입니다.

(정확히 자바스크립트는 싱글 스레드지만 자바스크립트 런타임은 싱글 스레드가 아닙니다!)

 

장점

 

1) 자원 접근에 대한 동기화

 

멀티 스레드의 경우 아까 설명과 같이 자원을 공유합니다. 이로인해 자원의 동기화를 항상 고려해야합니다. 하지만 싱글 스레드의 경우 자원의 동기화를 신경쓸 필요가 없습니다.

 

 

2) 문맥 교환 (Context Switching) 작업을 하지 않음

 

단일 스레드로 동작하기 때문에 문맥을 교환할 필요가 없습니다.

 

문맥 교환 (Context Switching)

CPU가 한 개의 Task를 실행하고 있는 상태에서 다른 Task로 실행이 전환되는 과정에서 기존의 Task 상태 및 Register 값들에 대한 정보(문맥, Context)를 저장하고 새로운 Task의 정보(문맥, Context)으로 교체하는 작업을 말합니다.

이때 Task(프로세스/스레드)의 정보는 레지스터에 저장되며 PCB로 관리됩니다

 

 

단점

1) CPU 코어를 모두 활용하지 못함

 

싱글 스레드는 하나의 물리적 코어밖에 사용하지 못해 멀티 코어 머신에서 CPU 사용을 최적화할 수 없습니다. 최적화를 위해선 Cluster 모듈을 이용하여 여러 프로세스를 사용할 수 있습니다. 하지만 앞서 프로세스끼리의 자원 공유는 어렵기 때문에 Redis와 같은 부가 인프라가 필요합니다.

 

 

멀티 스레드

두개 이상의 스레드가 프로세스 내부에서 자원을 공유하여 작업을 수행합니다.

 

각각 스레드가 고유 레지스터와 스택으로 표현됩니다.

 

장점

1) 문맥 교환(Context Switching)이 빠름

 

프로세스에 비해 레지스터와 스택만 교환하고 공유 자원은 교환하지 않아도 돼 더 빠르게 문맥 교환을 할 수 있습니다.

 

2) CPU 활용

싱글스레드와 달리 다중 CPU 구조에서 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있습니다.

 

 

단점

1) 임계 영역

둘 이상의 스레드가 동시에 실행하며 문제를 일으키는 코드 영역입니다.

 

2) 동기화 문제

둘 이상의 스레드에서 공유 자원에 접근할때 다른 스레드에서 사용 중인 경우 값을 읽어 올때 동기화 문제가 발생할 수 있습니다.

 

자바의 synchronized와 같이 동기화를 할 수 있습니다. 이때 synchronized 키워드를 사용한 메소드 혹은 블럭은 보호 구역으로 지정되며 하나의 스레드만 자원을 사용할 수 있도록 Lock을 걸어줍니다.

 

 

 

'개발 > 운영체제 (OS)' 카테고리의 다른 글

동기와 비동기, 블로킹과 논블로킹  (0) 2021.04.17
뮤텍스(Mutex)와 세마포어(Semaphore)  (0) 2021.04.16
교착상태 (Dead Lock)  (0) 2021.04.16