[CS] 프로세스와 스레드

유환익·2022년 6월 21일
0

프로세스와 스레드

기술 면접 대비 자료를 보던 중, 프로세스와 스레드에 관한 내용을 공부하던 중, 프로세스와 스레드에 대해서는 그간 공부하면서 많이 접하고 들었었지만 막상 기억속에서 잘 인출해내지 못하는 느낌을 받아 글로 정리하려고 한다.

이번 포스팅을 기회로 프로세스와 스레드 두 개념의 내용에 대해 좀 더 명확히 짚고 넘어가는 것을 이번 글의 목표로 하고 있다.

프로세스란?

프로세스와 스레드에 대한 내용을 정리하기 앞서, 흔히 말하는 컴퓨터의 프로그램에 대해 정리할 필요가 있다.

프로그램은, 컴퓨터 내에 파일이 저장 장치에 저장되어 있으나, 메모리에 올라가지 않은 정적인 상태를 말한다.

여기서 메모리에 올라가지 않았다는 것은, 아직 운영체제가 프로그램에 독립적인 메모리 공간을 할당해주지 않았다는 것을 의미한다. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간이 할당되어야 실행될 수 있다.

정적인 상태라는 것은, 실행되지 않은 상태를 의미한다.

따라서, 간단히 말해 프로그램은 아직 실행되지 않고 있는 파일 혹은 코드를 의미한다.

프로그램을 실행하게 되면, 파일 혹은 코드는 컴퓨터의 메모리에 올라가게 되고, 동적인 상태가 된다. 이렇게 실행되고 있는 상태의 프로그램을 프로세스라고 한다.

프로세스의 정의는 실행되고 있는 컴퓨터 프로그램이자, 스케줄링 단계의 작업이다.

스레드란?

스레드의 등장 이전에는 프로그램을 실행할 때, 시작부터 끝까지 프로세스 하나만을 사용하여 진행했다. 그러나 점차 프로그램이 복잡해지고 프로세스 하나만을 사용해서 프로그램을 실행하기 힘들게 되자, 프로그램이 한 가지 이상의 작업을 할 수 있어야 하는 필요가 생기게 되었다.

이로 인해 프로세스 보다 더 작은 실행 단위의 개념이 필요하게 되었고, 이것이 바로 스레드이다.

스레드는 프로세스와 달리 스레드 간 메모리를 공유하며 작동한다. 다시 말해, 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것이다.

프로그램이 코드 덩어리라면, 스레드는 코드 내에 선언된 함수라고 볼 수 있다.

프로세스와 스레드의 작동 방식

프로세스의 작동 방식

운영체제는 프로세스가 메모리에 올라갈 때 프로세스마다 각각 독립된 메모리 영역을 Code, Data, Stack, Heap 의 형식으로 할당한다.

각각의 독립된 메모리 영역을 할당하기 때문에, 프로세는 다른 프로세스의 변수나 자료에 접근할 수 없다.

스레드의 작동 방식

이와 달리 스레드는 같은 프로세스 내의 메모리를 서로 공유할 수 있다.

프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역을 따로 할당받고, 나머지 Code, Data, Heap 형식으로 할당된 메모리 영역은 공유한다.

따라서 각각의 스레드는 별도의 스택을 가지고 있으나, 힙 메모리의 경우 서로 공유하여 읽고 쓸 수 있는 것이 가능한 것이다.

프로세스와 스레드의 차이

먼저 스레드는 프로세스 안에 포함되는 개념이다.

프로세스는 컴퓨터의 메로리에 올라가 동적으로 실행되는 상태의 프로그램을 말하고
스레드는 프로세스를 구성하는 더 작은 실행 단위를 말한다.

프로세스는 메모리에 올라갈 때, 운영체제로부터 독자적인 시스템 자원을 할당받지만,
스레드는 프로세스 내부에서 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.

싱글 스레드와 멀티 스레드

프로그래밍을 배우면서 종종 싱글 스레드와 멀티 스레드 같은 용어를 접할 기회가 많다. 나와 같은 경우엔, 주로 자바스크립트를 사용하고 공부하면서 '자바스크립트는 싱글스레드 언어' 라는 이야기를 많이 들었다.

싱글스레드 언어가 '하나의 스레드 만을 사용한다. 따라서, 한번에 하나의 작업만을 수행할 수 있다'라는 것은 자바스크립트와 익숙해지며 어렴풋이 알고 있다. 하지만 싱글 스레드에 대한 더 깊은 정보, 혹은 이와 반대되는 개념인 멀티스레드에 대해 알 필요를 느껴서 이에 대해 자료를 찾아보며 정리를 하게 되었다.

싱글 스레드

이름이 의미하는 바와 같이 하나의 프로세스에서 하나의 스레드만을 실행하는 것이다.
싱글 스레드는 하나의 레지스터와 스택으로 표현한다.

장점

싱글 스레드의 장점은 자원 접근에 대한 동기화를 신경쓰지 않아도 된다는 점이 있다.

자원 접근에 대한 동기화란, 한 프로세스 내 여러 개의 스레드가 공유된 자원에 대해 각 스레드의 접근을 통제하는 작업을 말한다.

이 작업은 프로그래머에게 많은 노력을 요구하는 등 많은 비용을 발생시킨다.

싱글 스레드 모델에서는 이러한 자원 접근 통제 및 동기화에 대한 작업이 필요하지 않다.

또한, 싱글스레드 모델에서는 작업전환 작업을 요구하지 않는다.

작업전환 작업은, 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.

단점

싱글 스레드 모델은 여러 개의 CPU를 활용하지 못한다는 단점이 있다.

싱글 스레드에서 프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나, 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다.

두 개의 작업을 하나의 스레드로 처리하는 경우와 비교할 때,
두 개의 스레드로 두 개의 작업을 처리하는 경우, 짧은 시간 동안 2개의 스레드가 번갈아가면서 작업을 수행한다. 이는 신속하게 이루어지기 때문에 동시에 두 작업이 처리되는 것 처럼 보인다.

이러한 멀티 스레드 작업은 스레드 간의 작업전환에 시간이 걸리기 때문에, 싱글 스레드 모델로 작업하는 것 보다 시간 비용이 더 걸릴 수도 있다.

이 때문에 단순히 CPU만을 사용하는 계산의 경우, 오히려 싱글스레드로 프로그래밍하는 것이 효율적일 수 있다.

멀티 스레드

프로그램을 다수의 실행 단위로 나누어 실행하는 모델이다.

멀티 스레드 모델에서는 프로세스 내에서 자원을 공유하여 자원의 생성과 관리의 중복을 최소화 할 수 있다.

서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공한다.

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

장점

새로운 프로세스를생성하는 것 보다 기존 프로세스에서 스레드를 생성하는 것이 빠르기 때문에 효율적이다.

또 프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능하다.

프로세스의 작업전환보다 스레드의 작업전환이 빠르다.

단점

하나의 스레드만을 실행할 경우, 싱글 스레드 모델보다 실행 시간이 지연될 수 있다.

멀티 스레드 작업을 위해 운영체제의 지원이 필요하며, 스레드 스케줄링을 신경써야 하는 단점이 있다.


프로세스와 스레드부터 시작해서 싱글스레드와 멀티스레드 모델까지 정리를 해보았다.

profile
사용자의 편의를 더 생각하고 편안한 UI/UX 개발을 꿈꾸는 프론트엔드 개발자 지망생입니다.

0개의 댓글