[운영체제] 스레드와 병행성

2024. 9. 27. 21:01CS/OS

스레드는 CPU 이용의 기본 단위이다. 스레드는 스레드 ID, 프로그램 카운터(PC), 레지스터 집합, 그리고 스택으로 구성된다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다. 전통적인 프로세스는 하나의 제어 스레드를 가지고 있다. 만일 프로세스가 다수의 제어 스레드를 가진다면, 프로세스는 동시에 하나 이상의 작업을 수행할 수 있다. 단일, 멀티 스레드 차이를 말함

 

동기

현대의 대부분의 소프트웨어 응용들은 다중 스레드를 이용한다. 하나의 응용은 몇 개의 실행 흐름을 가진 독립적인 프로세스로 구현된다. 아래에서는 다중 스레드 응용 프로그램의 몇 가지 예를 보여준다.

  • 이미지 모음에서는 사진 축소판을 만드는 응용 프로그램은 별도의 스레드를 사용하여 개별 이미지에서 축소판을 생성할 수 있다.
  • 웹 브라우저는 하나의 스레드가 이미지 또는 텍스트를 표시하고 다른 스레드는 네트워크에서 데이터를 검색하도록 할 수 있다.
  • 워드 프로세서에는 그래픽 표시 스레드, 사용자의 키 입력 응답 스레드 등등 여러 스레드가 있다.

단일 및 멀티 스레드

 

한마디로 현재 사용하는 프로세서들 대부분은 멀티 스레드를 이용한다. 왜냐면 멀티 스레드 환경은 다중 코어 시스템에서 처리 능력을 향상하도록 설계될 수 있다. 이러한 응용은 다중 계산 코어를 사용하여 다수의 CPU - 작업을 병렬 처리할 수 있다. 만일 단일 스레드 서버는 여러 클라이언트들의 요청이 동시에 들어온다면 요청 순으로 단계적으로 처리하게 된다. 때문에 후순위 클라이언트의 경우 자신의 요구 사항이 서비스될 때까지 긴 시간을 보내게 될 것이다. 

 

과거 방식의 해결책

서버가 요청을 받아들이는 하나의 프로세스로 동작하게 하는 것이다. 서버에서 서비스 요청이 들어오면 프로세스는 그 요청을 수행할 별도의 프로세스를 생성하는 것이다. 사실 이와 같은 방식으로 프로세스를 생성하는 것은 스레드가 대중화 대기 전에는 보편화된 방식이다. 

 

현재 방식의 해결책

프로세스를 일일이 생성하는 작업은 굉장히 오래 걸리는 작업이고 많은 자원을 소비하게 된다. 하지만 웹 서버가 다중 스레드화 하는 것이다.  (같은 일을 하는데 프로세스를 또 생성할 이유가 없음)  클라이언트 요청이 들어오면 listen을 위한 새 스레드를 생성하고 추가적인 요청을 listen 하기 위한 작업을 재개한다.

 

대부분의 운영체제 커널도 일반적으로 다중 스레드이다. Linux 또한 그러하다. 시스템 부트를 하는 동안 여러 커널 스레드가 생성되며 각각의 스레드는 장치 관리, 메모리 관리, 인터셉트 관리 등등의 작업을 수행한다.

 

다중 스레드 장점

  1. 응답성: 다중 스레드화를 통해 응용 프로그램의 일부분이 봉쇄되거나, 응용 프로그램이 긴 작업을 수행하더라도 프로그램의 수행이 계속되는 것을 허용함으로써, 사용자에 대한 응답성을 증가시킨다. 이 특성은 사용자 인터페이스를 설계하는 데 있어 특히 유용하다. 시간이 오래 걸리는 작업을 비동기 스레드가 처리한다면 다음 사용자는 다른 작업을 수행할 수 있다.
  2. 자원 공유: 프로세스는 공유 메모리와 메시지 전달 기법을 통해 자원 공유가 가능하다. 이러한 기법은 프로그래머에 의해 명시적으로 처리되어야 한다. 그러나 스레드는 자동으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드와 데이터 공유의 이점은 한 응용 프로그램이 같은 주소 공간에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다는 점이다.
  3. 경제성: 프로세스 생성을 위해 메모리 자원을 할당하지 않고 프로세스 내의 자원을 사용하기 때문에 프로세스 생성 작업보다 효율적이다. 문맥 교환 또한 일반적으로 프로세스 사이보다 스레드 사이가 더 빠르다. (문맥 교환: 하나의 프로세스가 다른 작업을 위해 중단하고 다른 프로세스를 실행하는 과정)
  4. 규모의 적응성: 다중 스레드의 이점은 다중 처리기 구조에서 더욱 증가할 수 있다. 다중 처리기 구조에서는 각각의 스레드가 다른 처리기에서 병렬로 수행할 수 있기 때문이다. 여러 개 작업을 동시 수행 가능

 

프로세스와 스레드의 차이점 정리

프로세스는 컴퓨터에서 실행되고 있는 프로그램을 말한다. 통상적으로 CPU에서 수행하는 작업을 말한다. 스레드는 프로세스 내에 있는 작업의 흐름을 말한다. 

 

다중 코어 프로그래밍

컴퓨터 설계의 역사 초기에 더  좋은 컴퓨팅 성능에 대한 요구에 부응하여 단일 CPU 시스템은 다중 CPU 시스템으로 발전하였다. 나중의 비슷한 시스템 설계 추세는 단일 컴퓨팅 칩에 여러 컴퓨팅 코어를 배치하는 것이다. 각 코어는 운영체제에 별도의 CPU로 보인다. 이러한 시스템을 다중 코어라고 하며 다중 스레드 프로그래밍은 이러한 여러 컴퓨팅 코어를 보다 효율적으로 사용하고 병행성을 향상하는 기법을 제공한다.

병행 시스템은 모든 작업이 진행되게 하여 둘 이상의 작업을 지원한다. 반면 병렬 시스템은 둘 이상의 작업을 동시에 수행할 수 있다. 따라서 병렬성 없이 병행성을 가질 수 있다. 다중 처리기 및 다중 코어 아키텍처가 출현하기 전에 대부분의 컴퓨터 시스템에는 단일 프로세서만 있으며 CPU 스케줄러는 프로세스 간에 빠르게 전환해 각 프로세스가 진행되도록 병렬성의 환상을 제공하였다. 이러한 프로세스는 병행하게 실행되었지만 병렬로 실행되지는 않았다.

 

다중 코어 시스템을 위한 5가지의 도전 과제

  1. 태스크 인식: 독립된 병행 가능 태스크(작업)로 나눌 수 있는 영역을 찾는 작업. 한마디로 서로 독립적인 개별 코어에서 병렬 실행이 가능하도록 만들어야 한다.
  2. 균형: 병렬 작업을 실행할 때 전체 작업에 균등한 기여도를 줄 수 있게 만들어야 한다. 서로 다른 코어의 작업 가중치가 다르면 병렬 작업의 의미가 퇴색된다.
  3. 데이터 분리: 태스크가 접근하고 조작하는 데이터 또한 독립되어 있어야 한다.
  4. 데이터 종속성: 태스크가 접근하는 둘 이상의 태스크 사이에 종속성이 없는지 확인해야 한다. 데이터 오염 위혐이 있다. 이 때문에 동기화 수행을 올바르게 해야 한다.
  5. 시험 및 디버깅: 프로그램이 다중 코어에서 병렬로 실행될 때 다양한 실행 경로가 존재할 수 있다. 그런 병행 프로그램을 시험하고 디버깅하는 것은 단일 스레드 응용을 시험하고 디버깅하는 것보다 근본적으로 더 어렵다.

병렬 실행의 유형

데이터 병렬 실행은 동일한 데이터의 부분집합을 다수의 계산 코어에 분배한 뒤 각 코어에서 동일한 연산을 실행하는데 초점을 맞춘다. 예를 들어 크기가 N인 배열의 내용을 더하는 경우 단일 코어 시스템에서는 하나의 스레드가 원소 0 ~ N - 1을 더한다. 그러나 듀얼 코어 시스템에서는 코어 0에서 실행되는 스레드 A는 0부터 N / 2 -1까지 더하고 코어 1에서 실행되는 스레드 B는 원소 N / 2부터 N -1까지 더할 수 있다. 두 스레드는 각자 계산 코어에서 병렬로 실행된다.

 

태스크 병렬 실행은 데이터가 아니라 태스크를 다수의 코어에 분배한다. 각 스레드는 고유의 연산을 실행한다. 다른 스레드들이 동일한 데이터에 대해 연산을 실행할 수 있고 혹은 서로 다른 데이터에 연산을 실행할 수도 있다. 위의 예를 다시 고려해 보자.

 

기본적으로 데이터 병렬 처리에는 여러 코어에 데이터를 분배하는 것이 포함되고 태스크 병렬 처리에는 여러 코어에 태스크를 분배하는 것이 포함된다. 그러나 테이터와 태스크 병렬 처리는 상호 배타적이지 않으며 실제 응용 프로그램에서는 두 가지 전략을 동시에 혼합해 사용할 수 있다.

1. 데이터를 여러 세트로 나눠 서로 다른 코어에 나눠줌

2. 데이터가 아닌 작업 단위로 코어에 나눠줌

'CS > OS' 카테고리의 다른 글

[운영체제] 프로세스 간 통신  (0) 2024.09.11
[운영체제] 프로세스에 대한 연산  (0) 2024.09.04
[운영체제] 프로세스란  (0) 2024.08.22