multi-thread

Creating the dots·2021년 9월 9일
0

CS

목록 보기
3/19
post-custom-banner

Reference
📚<쉽게 배우는 운영체제> 조성호 저, 한빛아카데미📚를 바탕으로 정리했습니다
https://luminousmen.com/post/concurrency-and-parallelism-are-different


thread

유저가 애플리케이션을 실행하면 운영체제가 실행한 메모리를 할당하고 애플리케이션의 코드를 실행하는데, 이때 애플리케이션이 바로 프로세스이다.

프로세스의 작업 과정을 살펴보면,
1. 운영체제는 코드와 데이터를 메모리에 가져온다.
2. 프로세스 제어 블록을 생성한다.
3. 작업에 필요한 메모리 영역을 확보하고 준비된 프로세스를 준비 큐에 삽입한다.

이렇게 프로세스가 생성되면 CPU 스케줄러는 프로세스가 해야할 일을 CPU에 전달하고, 실제 작업은 CPU가 수행한다. 이때, CPU 스케줄러가 CPU에 전달하는 '일' 하나가 스레드이다. 운영체제 입장에서의 작업단위는 프로세스이고 CPU 입장에서 작업단위는 프로세스로부터 전달받은 스레드이다.


multi-process

멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 의미한다. 운영체제는 멀티 태스킹을 할 수 있도록, 프로세스마다 CPU 및 메모리 자원을 적절히 할당하고 병렬로 실행한다. 예를 들어 유저는 워드로 문서작업을 하면서 Chrome 브라우저에서 유튜브를 볼 수 있다. 이처럼 애플리케이션 단위의 멀티 태스킹을 멀티프로세스라고 한다.


multi-thread

앞서 애플리케이션 단위의 멀티 태스킹이 multi-process라고 말했는데, 애플리케이션 내부에서의 멀티 태스킹이 multi-thread이다. 프로세스 내의 작업을 여러개의 스레드로 분할하여 작업의 부담을 줄일 수 있다.

multi-thread의 장점

프로세스는 운영체제에 의해 메모리를 할당받는다. 즉, 프로세스는 메모리 공간을 차지하면서 시스템 자원을 사용한다. 여러개의 프로세스를 이용해 동시에 일을 처리하면 그만큼 자원을 많이 사용하게 된다.

반면, 멀티 프로세스를 멀티 스레드로 구현할 경우, 메모리 공간과 시스템 자원의 소모를 줄일 수 있다. 스레드 간 통신을 할 때에도 별도의 자원을 이용하지 않고, 전역 변수의 공간 또는 필요에 의해 메모리를 동적으로 할당할 때 사용하는 Heap 메모리 영역을 이용한다. 따라서 시스템 처리량이 향상되고 자원 소모를 줄일 수 있다.

예를 들어, 인터넷 익스플로러 브라우저는 멀티스레드를 사용하고, 구글 크롬은 프로세스를 여러개 만든다. 인터넷 익스플로러에서 멀티탭을 켰을때, 그 중 하나에 문제가 생겼다면 문제가 있는 화면을 강제종료했을때 그 화면만 사라지는 것이 아니라 인터넷 익스플로러 전체가 종료된다. 인터넷 익스플로러는 프로세스는 하나이고, 그 안에 여러개의 스레드를 사용하므로 프로세스 전체가 종료되는 것이다.

크롬은 각 화면이 독립적인 프로세스이므로 그 중 하나에 문제가 생겨서 종료해도 다른 화면에 미치는 영향이 작다. 크롬은 멀티 스레드의 사용으로 인해 다른 스레드가 영향을 받는 것을 최소화하기 위해 낭비 요소가 있더라도 멀티 스레드 대신 멀티 태스킹을 이용한다.

또한 하나의 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속 진행해 사용자의 요구에 빨리 응답할 수 있어 응답성이 향상된다.

multi-thread의 단점

멀티 프로세스로 작업할때, 프로세스 간에는 공유하는 자원이 없다. 하지만 멀티 스레드로 작업할때는 자원을 공유하기 때문에 다른 스레드가 같은 데이터에 접근할 수 있고, 힙 영역도 공유하기 때문에 서로 다른 스레드가 사용중인 변수에 접근해 엉뚱한 값을 읽어오거나 수정하는 일이 발생할 수 있다.
따라서, 멀티스레딩 환경에서는 동기화 작업을 통해 작업 처리 순서를 제어하고, 공유자원에 대한 접근을 제어해야한다.

  • 데드락(Deadlock, 교착상태): 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태
  • 뮤텍스(Mutex): 하나의 스레드와 프로세스에 의해 소유될 수 있는 키(공유자원에 접근근하기 위해 필요한 객체)를 기반으로 한 상호배제기법
  • 세마포어(Semaphore): 현재 공유자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값(공통으로 관리한다)을 갖는 상호배제기법

Concurrency vs Parallelism

concurrency(동시성,병행성)과 parallelism(병렬성)에 대해 이해하기 앞서 시분할 시스템에 대해 먼저 알아보도록 하자.

Concurrency와 시분할 시스템

시분할 시스템은 1960년대에 등장한 개념이다. 당시 컴퓨터는 크기가 작아지고 계산능력이 향상되면서 허가받은 유저만 사용할 수 있는 고가의 기계였다. 유저들은 한번에 여러개의 작업을 수행하고 싶어했고, 이에 '다중 프로그래밍'(multiprogramming)기술이 개발되었다. 이는 하나의 CPU로 여러 작업을 동시에 실행하는 기술이다. 기존에 한번에 하나의 작업만 가능했던 '일괄 작업 시스템'보다 효율성이 뛰어났다.

하나의 CPU로 여러 작업을 할 수 있는 방법이 바로 시분할 시스템이다. 다중 프로그래밍 시스템에서는 CPU 사용시간을 잘게 쪼개어 여러 작업에 나누어준다. 여러 작업들(ex. A,B,C)은 할당받은 시간(타임 슬라이스 또는 타임 퀀텀)만큼 돌아가면서 동작하여 A,B,C가 동시에 실행되는 것처럼 보인다. 오늘날 컴퓨터는 대부분 시분할 시스템이 사용된다.

시분할 시스템으로 여러개의 스레드가 동시에 수행되는 것처럼 보이는 것이 바로 concurrency(동시성, 병행성)이다.

Parallelism과 병렬처리

뱅렬처리(parallel processing)란, 동시에 여러개의 명령을 처리해 작업 능률을 올리는 방식이다. 컴퓨터용 CPU나 스마트폰용 CPU 사양에 '듀얼코어', '쿼드코어'라고 쓰여있는 경우가 있는데, 이는 CPU의 주요 기능을 담당하는 코어가 2개, 4개라는 뜻이다. (CPU 개발사는 CPU 성능을 향상시키기 위해 CPU 핵심 기능을 가진 코어를 여러개 만들거나 동시에 실행 가능한 명령의 갯수를 늘리는 방법을 사용한다.)

이러한 멀티 코어환경에서 여러개의 스레드가 실제로 동시에 수행하는 것을 parallelism(병렬성)이라고 한다.

profile
어제보다 나은 오늘을 만드는 중
post-custom-banner

0개의 댓글