CS + 인프라/운영체제

[운영체제] : 쓰레드는 많으면 좋나요? : 2탄 - 스레드 탐구

공대키메라 2025. 5. 14. 00:27

 

지난 시간에는 프로세스에 대해 알아보았다.

 

현재 쓰레드는 많으면 좋냐는 것을 찾기 위해 처음부터 밟아가고 있다.

 

이제 스레드에 대해 알아보고 이를 프로세스와 비교해볼 것이다.

 

아, 참고로 프로세스의 내용은 정말로 어그로가 아니다! (ㅠㅠ...)


 

들어가기 전에

중앙 처리 장치(CPU)?

서버의 핵심 계산 장치인 하드웨어 구성 요소입니다. 서버 및 기타 스마트 장치는 데이터를 디지털 신호로 변환하고 이에 대한 수학적 연산을 수행합니다.

코어?

CPU 내부에 있는 독립적인 연산 유닛으로, 사람의 두뇌와 같은 역할을 한다.

코어가 4개라면 동시에 4개의 일을 생각하고 처리 가능!

보통 코어 하나에 하나의 스레드가 배정이 된다.(하이퍼 스레드 기술을 통해 코어 하나에도 여러개의 스레드를 배정 가능)

 

예시 : Rygen CPU

 

병행성과 병렬성?

병행은 여러 작업을 논리적으로 동시에 진행하는 것을 말하며,

병렬은 여러 작업을 물리적으로 동시에 실행하는 것을 말한다.

 

이게 무슨 말이냐?

 

병행은 일과 쉼의 병행을 생각하면 쉽다. 일과 쉼은... 한 번에 둘 다 할 수 없다. 일하면서 쉴 수 있는 사람 알려주세요. ㅎ

 

하지만 병렬은 한 번에 동시에 실행하는 것이다. 말 그대로 물리적으로 동시에! 

 

여기서 병렬성이 없이 병행성은 가질 수 있음에 유의하자.

 

1. 스레드란?

스레드는 CPU 이용의 기본 단위이다.

 

컴퓨터 시스템은 보통 많은 프로세스와 스레드를 가진다. 

 

만약 프로세스가 다수의 제어 스레드를 가진다면, 프로세스는 동시에 하나 이상의 작업을 수행할 수 있다.

 

 

 

기존의 프로세스를 더 만들어서 더 많은 일을 할 수 있지만,

 

새 프로세스의 생성 작업은 매우 많은 시간을 소비하고 많을 자원을 소비한다.

 

하지만 이렇게 새롭게 만들어진 프로세스가 기존 프로세스와 하는일이 동일하다면 이러한 오버헤드를 감수할 이유가 없기 때문에,

 

여러 스레드을 만들어 나가는 것이 효율적이라는 결론이 난다.

 

 

대부분의 운영체제 커널도 일반적으로 다중 스레드이며 많은 응용 프로그램도 이를 활용한다.

 

프로세스 공부한 거 보다 너무 허접하죠잉?

 

2. 스레드의 장점

 

2.1 응답성(responsiveness)

사용자 인터페이스를 더 반응적으로 유지할 수 있다.

이게 무슨 말이냐면, 한 스레드가 긴 작업을 수행하는 동안에도 다른 스레드는 사용자 입력에 응답할 수 있음을 말한다.

 

2.2 자원공유(resource sharing)

같은 프로세스 내의 스레드들은 메모리와 자원을 공유합니다. 

 

프로세스는 기본적으로 독립된 자원 공간을 가진다. 다른 프로세스와 자원을 직접 공유하지는 않는다.

 

물론 IPC를 통해서 정보공유, 계산 가속화, 모듈성을 달성할 수 있지만 위에서 설명했듯이 이는 비효율적일 수 있다.

 

하지만 스레드를 사용하면 별도의 프로세스 간 통신보다 훨씬 효율적으로 데이터를 공유할 수 있습니다.

 

2.3 경제성(economy)

스레드 생성과 컨텍스트 스위칭은 프로세스보다 훨씬 비용이 적게 든다.

 

프로세스를 생성하는 것보다 스레드를 생성하는 것이 시스템 자원을 덜 소모한다.

 

자원공유와 비슷한 내용이 나온다.

 

2.4 규모 적응성(scalabilty)

 

멀티프로세서 또는 멀티코어 시스템에서 각 스레드가 다른 처리 코어에서 병렬로 실행될 수 있다.

 

또 더 많은 처리 능력을 활용하여 전체 애플리케이션 성능을 향상시킨다.

 

3. 다중 코어 프로그래밍

다중 코어 프로그래밍은 여러 개의 CPU 코어를 동시에 활용하여 프로그램의 성능을 향상시키는 소프트웨어 개발 방식이다.

 

다중 스레드 프로그래밍은 이러한 여러 컴퓨팅 코어를 보다 효율적으로 사용하고 병행성을 향상시키는 기법을 제공한다.

 

코어가 여러개면 코어별로 별도의 스레드를 할당할 수 있기 때문에 일부 스레드가 병렬로 실행될 수 있다.

 

4. 병렬 실행의 유형

데이터 병렬 실행과 태스크 병렬 실행의 두 가지 유형이 존재한다. 

 

데이터 병렬 시행

동일한 데이터의 부분집합을 다수의 계산 코어에 분배한 뒤 각 코어에서 동일한 연산을 실행하는데 초점을 둔다.

 

태스크 병렬 시행

데이터가 아니라 태스크(스레드)를 다수의 코어에 분배한다.

 

 

5. 다중 스레드 모델

스레드는 사용자 스레드와 커널 스레드로 나눌 수 있다.

 

이 사용자 스레드와 커널 스레드간의 관계에 대해 알아보자.

 

5.1 다대일 모델

다대일(many to one) 모델은 사용자 수준 스레드를 하나의 커널 스레드로 관리하는 것이다.

 

다시말하면, 여러 사용자 수준 스레드가 하나의 커널 스레드에 매핑한다.

 

이 모델은 단점이 심각한데, 한 스레드가 블록되면 모든 스레드가 블록된다. 

 

이를 책에서는 "한 스레드가 봉쇄형 시스템 콜을 할 경우, 전체 프로세스가 봉쇄된다." 로 표현한다.

 

한 번에 하나의 스레드만 커널에 접근이 가능하기에 다중 스레드가 다중 코어 시스템에서 병렬 실행이 불가능하다.

 

5.2 일대일 모델

일대일(one to one) 모델은 각 사용자 스레드가 각각의 커널 스레드에 매핑한다.

 

하나의 스레드가 봉쇄적 시스템 콜을 호출하더라도 다른 스레드는 별개로 나뉘어 있어서 실행이 가능하니 당연 병렬로 작업이 가능하다. 

 

단점은 너무 많은 커널 스레드를 만들면 오버헤드가 발생할 수 있다.

 

5.3 다대다 모델

다대다 (Many to many) 모델은 여러 사용자 스레드를 더 적은 수의 커널 스레드에 매핑한다.

 

책에서는 매핑하는것을 "멀티플렉스" 한다 라고 표현중이다.

 

이를 곰곰히 생각해보면, 다대일 모델의 경우와 마찬가지로 진정한 병렬 실행을 획득할 수는 없다. 

 

커널은 한 번에 하나의 커널 스레드만 스케줄할 수 있기 때문이다.

 

6. 스레드풀

사실 프로세스만 사용하는것 보다 스레드를 활용하면 더 효율적이지만, 

 

이것도 마냥 그런것만은 아니다.

 

새로운 스레드를 매 요청마다 만들어 주는 것은 서비스 할 때 마다 생성하면 시간이 좀 걸린다. 

 

그리고 모든 요청마다 스레드를 만들어 주면 한계가 있기 때문에 이를 방지하기 위해

 

스레드 풀(pool)을 사용한다.

 

 

스레드 풀은 일정산 수의 스레드들을 미리 풀로 만들어 두는 것이다. 

 

이로 인해 얻을 수 있는 장점은 다음과 같다.

 

  1. 새 스레드를 만들어 주기보다 기존 스레드로 서비스해 주는 것이 빠르다.
  2. 스레드 풀은 임의 시작에 존재할 스레드 개수에 제한을 둔다. 
  3. 태스크를 생성하는 방법을 태스크로부터 분리하면 태스크를 실행을 다르게 할 수 있다.

 

이렇게 우리는 스레드가 뭔지, 스레드에는 어떤 장점이 있으며 그와 관련된 여러 정보를 알게 되었다.

 

사실 해당 내용은 필자가 단순하게 정리한 내용이고 책을 사서 읽어보길 권장한다.

 

사실 필자는 이것만 읽어보고 정리하면 위의 해답을 찾을 수 있을 거라 생각햇는데 내가 틀렸다.

 

다음에는 이에 대한 해답을 찾아보고 정리할 예정이다. 

 

아무래도 프로세스와 스레드에 대해 이해했으니 수월하게 알 수 있을거다. (아마도...)

 

출처:

https://www.youtube.com/watch?v=rQcE_GMUCaU

운영체제 10판 (원서명 : Operating System Concepts, 10th Edition, International Edition) 퍼스트북 / Abraham Silberschatz, Peter Baer Galvin, Greg Gagne  4장 스레드

https://docs.oracle.com/javase/tutorial/essential/concurrency/procthread.html