본문 바로가기
운영체제

스레드

by Minok_nok 2020. 6. 18.

프로세스만 있었을 때

CPU가 프로세스 A를 실행하다가 B를 실행한다고 생각을 합시다.

프로세스 A는 잠시동안 쓸 일 없으니 상태를 PCB에 저장하고, B의 상태를 레지스터에 저장해주어야 합니다.

 

그리고 또 캐시 메모리에 있던 데이터도 새로운 프로세스에 맞게 바꾸어주어야 합니다.

상당히 시간이 지체되는 작업들이였습니다.

 

이 두개의 프로세스의 데이터를 서로간 공유를 해주고 싶다고 생각해봅시다.

프로세스들은 독립된 주소공간을 가지고 있기 때문에 공유메모리나 소켓등을 이용하여 접근을 해야합니다.

 

이런 문제들이 있기때문에 스레드가 등장하게 되었습니다.

스레드의 정의

스레드는 한 프로세스에서 독립적인 순차흐름 또는 제어를 뜻합니다.

프로세스에는 최소 하나 이상의 스레드가 작동하며, 메인 스레드가 존재합니다.

 

스레드는 PC(Program Counter)와 SP(Stack Pointer)등을 비롯한 스레드 실행 환경 정보(Context 정보), 지역 데이터, 스택을 독립적으로 가집니다.

 

다른 스레드와 공유하는 정보들은 코드, 전역 데이터, 힙영역에 있는 데이터들을 다른 스레드와 공유합니다.

스레드의 장점

빠른 컨텍스트 스위치

스케줄링 단위가 프로세스인 시절, context switch가 일어날때마다 캐쉬 Flush 및 캐쉬 복구등을 해주어야 했습니다.

하지만, 스케줄링 단위가 스레드로 바뀌면서 같은 프로세스 내의 스레드를 context switch를 할 때 스레드의 상태 및 스택정보, 수행시간 등을 저장한 TCB(Thread Control Block)만 교체하면 되기 때문에 빠르게 스케줄링 상태를 변경 할 수 있습니다.

스레드간 통신으로 멀티스레드 구현

프로세스간의 통신을 여전히 문제로 남아 있지만, 같은 프로세스 내에서 다른 스케줄을 실행할때 그 스케줄간의 데이터 공유를 더 쉽게 할수있도록 만들었습니다.

멀티코어 환경에서 멀티 스레드를 이용하여 더 빠른 실행을 할 수 있도록합니다.

 

더 빠른 실행과 멀티 코어의 등장으로, 실행과 스케줄링의 단위가 프로세스에서 스레드로 바뀌게 되었습니다.

 

단점

스레드 하나가 잘못된 연산이나 버그 등으로 비정상 종료를 한다면, 같은 프로세스에 있는 모든 스레드가 강제로 종료됩니다.

프로세스와 스레드 관계

프로세스는 스레드를 담는 컨테이너입니다.

PCB(Process Control Block) A는 프로세스 전체 정보를 가지고 있습니다.

그 중에서 프로세스는 Thread들을 LinkedList형식으로 저장하고 있습니다.

 

위를 보면 알수 있듯이 멀티 스레드 프로세스는 스레드 간의 공유 환경을 제공해주는 역할을 합니다.



형태

스레드는 운영체제에 따라 다양하게 구현할 수 있습니다

.

아래 목록 중 사용자 수준 스레드는 스레드 라이브러리를 사용하는 방식이고, 커널 수준 스레드는 운영체제가 지원하는 스레드입니다.

 

나머지 혼합형 스레드는 이 둘을 혼합한 형태입니다.

사용자 수준 스레드: 다대일 매핑

사용자 영역에서 스레드 연산을 수행합니다.

그로 인해 커널이 스레드의 존재를 모릅니다.

 

다수의 사용자 영역 스레드가 커널 영역 스레드 한개에 매핑되므로 다대일 매핑으로 부릅니다.

장점

  • 운영체제에서 스레드를 지원할 필요가 없습니다. 운영체제 특유의 커널에 의존하지 않기때문에, 모든 운영체제에 적용할 수 있습니다.

  • 스레딩 라이브러리에서 스레드 스케줄을 제어하기 때문에, 응용프로그램 개발자들이 자신의 응용 프로그램 요구에 맞게 스레딩 라이브러리의 스케줄링 알고리즘을 수정할 수 있습니다.

  • 스케줄링 결정이나 프로시저 동기화를 위해 커널을 호출하지 않습니다.

단점

  • 커널이 멀티스레드 프로세르를 한 스레드로 간주합니다. 그렇기 때문에 규모를 확장하기 어려우며, 커널이 한 프로세스에 속한 스레드를 여러 프로세서에 동시에 할당할 수 없습니다.

  • 프로세스에 속한 스레드 중 어느 하나만 입출력 작업을 위해 블록되어도, 프로세스 전체가 블록됩니다. 전체적으로 블록이 빈번히 일어나면 전체적인 진행이 느려집니다.

  • 사용자 수준 스레드는 시스템 전반에 걸친 스케줄링 우선 순위를 지원하지 않습니다.

 

커널 수준 스레드: 일대일 매핑

각 스레드마다 고유한 스케줄을 맵핑하는 방법입니다.

그렇기 때문에 일대일 매핑이라 부릅니다.

 

스레드를 일대일 맵핑하려면 운영체제에서 디스패치할 수 있는 커널 스레드를 각 사용자 스레드에게 제공해야합니다.

 

장점

  • 커널은 프로세스의 스레드들을 몇몇 프로세서에 한꺼번에 디스패치할 수 있기때문에 병렬실행하도록 설계된 프로그램의 성능을 높여줍니다.

  • 응용프로그램은 한 스레드의 입출력 작업이 끝날 때까지 다른 스레드를 사용하여 다른 작업을 실행할 수 있습니다.

  • 스케줄링 결정이나 프로시저 동기화를 위해 커널을 호출하지 않습니다.

단점

  • 스케줄링과 동기화를 위해서 커널을 호출해야하는데, 이는 오버헤드를 증가시킵니다.

  • 사용자 수준 스레드보다 다른 운영체제로의 이식성이 떨어집니다.

  • 전체적으로 자원을 더 많이 소비하는 경향이 있습니다.

 

혼합형 스레드: 다대다 매핑

많은 사용자 수준스레드를 한 그룹의 커널 스레드에 맵핑합니다.

m대n 스레드 맵핑이라고도 합니다.

 

혼합형 스레드의 구조는

  1. 작업: 일반적인 프로세스

  2. 사용자 수준 스레드: 응용프로그램의 병렬 처리를 위한 인터페이스

  3. 경량 프로세스 스레드: 하나 이상의 사용자 수준 스레드를 지원하고, 커널 스레드 하나에 매핑되며 커널에 의해 독립적으로 스케줄링 되며, 다중 프로세서에서는 병렬로 실행됩니다.

  4. 프로세서에 실행하기 위해 디스패치하고 스케줄링합니다.

 

일대일 스레드 맵핑을 하려면 운영체제가 커널 스레드를 나타내는 자료구조를 할당해야합니다.일대일 스레드 매핑 시스템의 스레드가 증가함에 따라 커널 스레드에서 소비하는 자료구조의 용량이 크게 늘어납니다.

 

다대다 스레드 매핑은 미리 만들어놓은 스레드를 재사용하게 만들어 스레드의 생성시간을 단축해주는 스레드 풀링을 실행합니다.



CPU와의 상관 관계

CPU내의 물리적 연산부인 코어가 있습니다.

이 코어의 효율을 향상 시키기 위해 각 코어당 분산처리할 수 있는 기술인 하이퍼스레딩이 탄생합니다.

 

현재는 한 코어에 스레드가 2개씩 붙습니다.

 

프로세스의 스레드와 CPU의 스레드는 약간 다릅니다.

 

CPU의 스레드는 말 그대로 ‘물리적’연산 처리 장치입니다.

명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛입니다.

 

프로세스의 스레드는 ‘논리적’ 코어 개수입니다.

 

(CPU의 스레드 개수=프로세스의 스레드 개수)의 형태가 필수 적인것이 아니며, 스레드의 스왑으로 프로세스의 스레드 개수가 더 많아질 수 있습니다.

 

유니티의 스레드

유니티는 단일 스레드를 지원하며, 멀티 스레드로 리소스를 접근하려고 하면 에러가 발생합니다.

 

만약에 유니티에서 병렬처리 연산을 실행하고 싶을 때는 코루틴을 권장합니다.

 

유니티의 프레임 워크에서 중간중간 yield부분에서 예약된 코루틴의 동작을 확인하고, 실행시킵니다.

이는 스레드를 사용하는것과 비슷한 연출로 보여집니다.



자세한 방법은 관련 PPT자료가 있어서 링크를 붙입니다.

https://www.slideshare.net/jungsoopark104/ienumerator

 

'운영체제' 카테고리의 다른 글

세마포어 / 뮤텍스  (0) 2020.06.18
캐시 메모리: 리스트와 벡터의 속도차이  (0) 2020.06.17

댓글