본문 바로가기
연구소👨‍💻/CS연구소

[OS] 멀티프로세스, 멀티스레딩

by 신그자체김상범 2024. 6. 13.

멀티스레드는 무엇인가?

사실 멀티스레드는 컴퓨터 CPU가 한개의 프로세스에서 여러개의 작업을 동시에 하게 해주는 프로그래밍 언어의 기능이다.

우리의 현재 컴퓨터들이 여러개의 코어를 지니고 있기 때문에 효율적이고 빠른 코드를 만들려면 멀티스레딩, 멀티 프로세싱에 대한 이해는 반드시 필요해보인다.

그래서 나도 이번에 한번 공부해보자라는 생각을 하게됐다.

멀티 프로세스와 멀티 스레딩의 차이

멀티 스레드와 가장 헷갈리는 단어는 멀티 프로세슨데 CS적인 측면에서 둘은 이렇게 다르다.

프로세스는 스레드보다 큰 단위다.

프로세스는 프로그램 파일이 있을 때 실행하게 되면 메모리 위에 생성되는 프로그램의 인스턴스라고 할 수 있다.

그리고 스레드는 프로세스에서 실행되는 어떤 코드의 흐름이다 한 프로세스는 적어도 한 개 이상의 스레드로 이루어져있다.

그리고 여러 프로세스는 같은 스레드를 공유하지 않는다. 스레드는 그 프로세스의 고유의 것이라고 보면 된다.

멀티 프로세스, 멀티 스레딩의 장점

멀티 프로세스와 멀티 스레드을 쓰는 가장 큰 이유는 병렬성과 동시성이다.

병렬성 : 작업자를 여러명 둬서 나눌 수 있는 작업을 나누는 것

동시성 : 한 명이 여러개의 작업을 순서대로 순차적으로 진행하는 것

여기서 작업자는 CPU 각각을 의미한다. 요즘 컴퓨터는 사실상 거의 멀티 코어이니까 작업자를을 여럿 사용할 수 있는 프로그램이 당연히 더 유리하다.

사실 학습은 짧게 가져가려고 했지만 멀티스레딩, OS와 섞어서 공부를 하다보니 한가지 착각을 하게됐다.

병렬성 있는 멀티스레드 프로그램을 만든다면 자동으로 멀티 프로세스가 되는 것이 아닌가?

이렇게 생각했던 이유는 OS가 프로그램을 실행하면 메모리에서 각각의 CPU를 위한 프로세스를 따로 만들어주어야 CPU들이 주어진 작업을 병렬 연산 하는것이라고 생각했기 때문이다. 한마디로

CPU가 작업을 실행하는 단위를 프로세스라고 생각했다.

CPU의 작업 실행단위는 스레드다

말을 이렇게 하긴했는데 알아본결과 이말은 완전히 맞지는 않다.

프로그램이 실행될때의 흐름도

프로그램이 실행되면 OS중 커널이라는 녀석이 그 프로그램을 인스턴스화 해서 메모리 위에 올리고 그것을 프로세스라고 한다.

프로세스는 로직에따라서 스레드라고 하는 작업 단위를 만든다. 스레드는 하나일 수도 있고 여러개일 수도 있다.

커널은 여기서 발생하는 스레드를 스케쥴러에 담고 그것을 CPU에 옮겨준다.

만약 프로세스가 싱글 프로세스, 싱글 스레드인 상황이라면 한 개의 프로세스의 스레드는 한개의 CPU로 전달된다. 즉 이경우에는 한 CPU가 한 프로세스를 온전히 담당한다고 보면 되는듯 하다.

 

그런데 멀티 스레드 프로그램에서는 한개의 프로세스가 여러 스레드를 만들게 되고 이때 커널은 스레드를 공간이 남는 CPU에 분리해서 배치한다. 그러면 앞서 말한 병렬성이 얻어진다.

그러나 만약 싱글코어 CPU의 경우엔 같은 코어에 2개의 스레드를 넣게되고 이때는 병렬효과보다는 동시성만 얻어지게된다.

이렇게 멀티프로세스, 멀티스레드를 이론적으로 나마 알아봤지만 더 중요한건 실제로 어떻게 언어에서 멀티스레드가 사용되는지고 그리고 실제 프로젝트에서 이를 적용하는 것이다. 이걸 한 호흡에 적는건 좀 어려울 것 같아서 아예 몇차례로 나눠서 적고자한다.

그리고 리트코드에 동시성에 대한 문제들이 몇개 있어서 이것들을 풀면서 같이 공부하려고한다.