안녕하세요.
오늘은 스레드
에 대해 포스팅 합니다.
프로세스 포스팅을 읽고 오시면 좀 더 쉽게 읽으실 수 있습니다.
CPU 스레드
CPU 하드웨어를 평가할 때 참고하는 많은 정보들이 있습니다.
대표적으로는 아래의 두정보가 있습니다.
- 코어 수
- 스레드 수
코어 수는 컴퓨터 데이터인 이진수를 계산 할 수 있는 계산기의 갯수 입니다. 이는 하드웨어적인 개념 입니다.
스레드 수는 이진수를 계산 할 수 있는 능력입니다. 이는 소프트웨어적인 개념 입니다.
보통은 코어 수가 곧 스레드 수 입니다. 하지만 인텔이 개발한 하이퍼스레딩 같은 기술을 접목하면 각 코어당 2개의 스레드를 사용 할 수 있습니다.
정리하자면 코어 수의 두배인 스레드 를 사용할 수 가 있습니다.
하지만 이해가 잘 안갑니다. 계산기는 하나 인데 어떻게 2배의 처리 능력을 가질 수 있는것일까요?
아래의 프로세스 2개가 존재한다고 가정해봅시다.
1코어 1스레드는 두 프로세스를 마치는 시간은 14초 입니다.
A 프로세스가 선 처리되던 (11111111110000)
B 프로세스가 선 처리되던 (00001111111111) 간에 총 처리 시간은 같습니다.
하지만 B 프로세스의 처리 결과를 기다리는 사용자가 느끼는 경험은 많이 다릅니다.
첫번째 경우는 B 프로세스가 처리 될 때까지 걸린시간은 14초 입니다.
반면에 두번째 경우는 4초가 걸렸습니다.
이렇게, 처리시간이 긴 프로세스가 존재하면 상대적으로 다른 프로세스들이 늦게 끝나게 되는 경우가 발생하게 되고 이는 사용자가 여러가지 프로그램을 동시적으로 처리하는데 어려움을 느낄 수 있다는 것입니다.
반면에 1코어 2스레드는 어떻게 처리할까요? 아래와 같이 처리합니다.
10101010111111
CPU 입장에서 총 처리시간은 1스레드와 같은 14초입니다.
하지만 B프로세스는 8초가 걸리게 됩니다. 최악의 경우인 14초 보다 거의 2배 가량 감소하게 되었습니다.
더군다나 이렇게 나누어 처리하게 된다면 여러가지 프로그램이 동시적으로 조금씩 처리되고 사용자 입장에서는 여러 프로그램이 버벅임 없이 처리되는것을 경험하게 됩니다.
정리하자면, 스레드는 데이터를 병렬로 처리하는 능력을 의미합니다.
이 때, 착각하면 안되는 것은 CPU 입장에서는 총 처리 시간은 변함없다는 점 입니다.
CPU 하드웨어 입장에서 총 처리 시간을 줄이는 방법은 코어 갯수를 늘리는 방법 뿐입니다.
프로세스 스레드
CPU 스레드
는 일을 처리할 수 있는 능력이라 소개했습니다. 운영체제는 프로세스
를 CPU 스레드
에게 할당하는 작업을 합니다.
CPU가 2개의 스레드
를 제공한다고 가정 할 때, 프로세스
를 2개만 처리하는 것으로 착각 할 수 있습니다. 이는 잘못된 개념이며 쉽게 설명하자면, 2개의 계산기가 있고 여러 사람(=프로세스)이 돌려 사용하는것을 의미합니다.
위에서 소개한 예시처럼 컴퓨터는CPU 스케줄링
을 통해 여러 프로세스
들을 N개의 CPU 스레드
에 일을 돌아가면서 할당 합니다.
이때, 운영체제가 정의하는 스레드 의 개념은 프로세스
내부의 작업 단위로 사용됩니다.
특정 프로세스
가 CPU에게 선택받는다고 해서, CPU는 무조건적으로 일을 진행하지 않습니다. 예를 들어, 해당 프로세스
가 IO 인터럽트가 걸려있으면 CPU는 해당 프로세스
를 처리하지 않고 대기 큐에 보내 버리지요.
프로세스 입장에서는 억울 할 수 있습니다. IO 인터럽트 처리 다음에도 해야할 일이 많을 수도 있을테니깐요. 이 때, 다중 스레드
를 이용하면 해당 이슈를 개선할 수 있습니다.
A 스레드
는 IO 인터럽트를 처리하게 하고, B 스레드
는 CPU가 진행 할 수 있는 일을 처리하게 했다고 가정해봅시다.
CPU는 해당 프로세스
를 선택했을 때, 스레드
단위로 살펴보게 되고 처리할 수 있는 스레드
가 있다면 해당 작업을 진행하게 됩니다.
정리하자면, 다중 스레드
로 프로그래밍을 진행하게 된다면 CPU에게 일을 처리 받을 확률이 높아짐을 의미합니다.
프로세스 스레드 특징
프로세스
는 CODE, DATA, STACK, HEAP 영역을 가지게 됩니다.
STACK은 명령어가 수행되기 위한 작업 공간입니다.
스레드의 개별 STACK
프로세스 내부에 스레드를 만들게 되면 각 스레드는 개별 STACK 영역을 가지게 됩니다.
즉, 스레드가 3개인 프로세스
는 3개의 STACK 공간을 가지게 되는것이지요.
이러한 개별 스택 공간을 통해 CPU는 독립적인 단위로 처리하는것이 가능해집니다.
스레드간 통신
프로세스
의 CODE, DATA, HEAP 영역은 스레드
끼리 공유하게 됩니다.
그로인해, 스레드간 데이터 통신은 프로세스간 데이터 통신보다 쉽게 처리할 수 있는 특징이 있습니다.
자바와 같은 프로그래밍 언어를 이용해 코딩해보면 서로 다른 스레드를 처리 할 때, 특정 변수등을 같이 사용할 수 있습니다.
프로세스간 데이터 통신은 파일 통신(소켓 통신)이 베이스가 되어야 합니다.
하지만, 데이터를 공유한다는 것은 그만큼 동기화 문제가 발생할 확률로 높습니다.
멀티 프로세스 방식과 멀티 스레드 방식
프로그램을 만들 때, CPU에게 최대한 많은 일 처리를 받기 위해 사용하는 방식은 크게 두가지 입니다.
- 멀티 프로세스 프로그래밍
- 멀티 스레드 프로그래밍
멀티 프로세스
방식은 루트 프로세스
가 존재하고, 일처리를 다수의 자식 프로세스
에게 나누어 처리하여 취합하는 방식입니다.
장점은 독립성을 보장받을 수 있다는 점 입니다.
하나의 프로세스가 문제가 생기더라도 다른 프로세스에게 영향을 주지 않습니다.
단점은 데이터 통신에 많은 자원을 소비한다는 점입니다. 컨텍스트 스위칭에 따른 성능 저하가 대표적입니다.
멀티 스레드
방식은 하나의 프로세스
에 다수의 스레드(스택)에게 나누어 처리한 후 취합하는 방식입니다.
장점은 데이터 통신이 상대적으로 쉽고, 빠르고, 비용이 적습니다.
단점은 데이터를 공유하기 쉬우므로, 동기화 문제가 빈번하게 발생 할 수 있고 특정 스레드
가 문제가 생기면 전체 프로세스
에 영향을 줄 수 있습니다.
오늘 포스팅은 여기까지 입니다.
읽어주셔서 감사합니다.
'운영체제' 카테고리의 다른 글
[운영체제] 뮤텍스와 세마포어 (0) | 2021.07.25 |
---|---|
[운영체제] 프로세스 (0) | 2021.07.21 |
포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.