티스토리 뷰

OS

[OS] 쓰레드와 TCB

PeonyF 2023. 2. 28. 05:58
반응형

 

쓰레드란?

쓰레드는 Thread는 process 내에서 독립적으로 일을 수행하는 단위

 

멀티쓰레드란?

하나의 프로세스내에 여러스레드로 자원을 공유하며 작업을 나누어 수행

 

하는역할?

하나의 process에는 여러개의 Thread가 존재할 수 있고, 하나의 process에 속해있는 여러개의 Thread는 PCB의 code나 bss, data와 같은 자원을 공유하며, 공유 메모리를 통해 통신할 수 있다. OS는 각각의 thread를 TCB(Thread Control Block)이라는 자료구조로 관리를 한다.


쓰레드를 쓰는 이유? 

- 동일한 일을 하는 프로세스가 여러개 있을 경우 각각 code/data/stackheap 영역이 각각 만들어져서 메모리 낭비가 생김
 - 같은일을 하는 프로세스를 여러개 띄우고 싶다면, 메모리 공간을 하나만 띄워좋고 PC를 여러개 둬서 마다 다른 코드를 실행시키게 하는것 즉 프로세스 하나의 CPU단위를 여러개를 둘 수 있다.
- 하나가 blocked하는 상태여도 다른 쓰레드는 running상태여서 빠른 처리를 할 수 있다. ex) WebSite Request시

 

멀티쓰레드의 장점

- 성능 개선

  : 멀티쓰레드를 사용하면 하나의 프로세스 내에서 여러 개의 쓰레드가 동시에 실행될 수 있기 때문에, 병렬 처리가 가능해져서 작업을 빠르게 처리할 수 있습니다. 예를 들어, 대용량 파일을 읽고 처리하는 작업에서는 파일을 여러 개의 블록으로 나누어 각각의 쓰레드에서 병렬 처리하면, 전체 작업 시간을 단축할 수 있습니다.

 

- 자원의 효율성도 증가

 : 프로세스를 여러 개 생성해서 동시에 실행하는 것보다, 하나의 프로세스 내에서 여러 개의 쓰레드를 생성하는 것이 메모리와 CPU 자원을 더욱 효율적으로 사용할 수 있습니다.

 

 

스택을 독립적으로 할당하는 이유

스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다. 따라서 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고, 이는 독립적인 실행 흐름이 추가되는 것이다. 결과적으로 실행 흐름의 추가를 위한 최소 조건이 독립된 스택을 제공하는 것이다.

 

이 스택은 함수 호출에 따라 자동으로 할당되고 해제되며, 함수 내에서 선언된 지역변수들도 해당 함수의 스택에 저장됨
1. 스레드가 함수 호출
2. 해당 함수의 지역변수들이 그 스레드 스택에 저장
3. 다른 스레드와 별개의 메모리 공간에서 실행
-> 각각의 스레드는 자신의 스택에서 자신이 사용하는 지역변수를 수정할수있음

 

*만약 여러스레드가 하나의 지역변수를 수정하면, 그 변수가 예측할수없는 방식으로 변경되어 이 문제를 경합상태(race condition) 라고 한다.

 

전역변수의 경우 데이터 영역에 저장되어, 모든 스레드가 공유.

-> 전역변수를 변경하면 다른 스레드에서도 변경된 값을 볼 수 있어서 동기화 기법이 필요

 

 

장점?

안정성: 각 프로세스는 독립적인 메모리 공간을 가지기 때문에, 하나의 프로세스가 비정상적으로 종료되더라도 다른 프로세스에는 영향을 미치지 않습니다.
보안: 각 프로세스는 독립적인 메모리 공간을 가지기 때문에, 한 프로세스의 데이터나 자원에 다른 프로세스가 직접적으로 접근할 수 없습니다


단점?

-  여러 스레드가 동일한 자원에 접근할 때 동기화 이슈가 발생하는데, 동일한 자원을 여러 스레드가 동시에 수정하려고 할 때, 각각 스레드 결과에 영향을 주는데 이를 동기화 이슈라 합니다.

- 데이터 영역과 힙 영역을 공유

: 전역 변수와 동적 할당된 메모리 공간을 공유할 수 있고, 이를 통해 쓰레드 간 통신을 할 수 있지만  동시에 메모리에 접근하기 때문에 주의해야 한다

 

*힙(Heap) 영역은 동적 할당을 위한 메모리 영역이며, 프로그램 실행 중에 프로그래머가 필요에 따라 메모리를 동적으로 할당하고 해제할 수 있습니다.
1.객체와 배열
2.문자열
3.포인터
4,사용자정의 타입,구조체,연결리스트



TCB란?

Thread Control Block(TCB)

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jhc9639&logNo=221707378026


Thread Context Switching

 Thread Context Switching은 어떻게 진행되고, process Context Switching과 어떤점에서 차이는?

Thread context-Switching의 주체는 OS가 될 수도 있지만, 특정 library가 담당하기도 한다.
process context-switching이 발생하면, 진행하던 cache의 내용은 새로 진행해야되는 process에서는 무용지물이 되어버린다.  
(Process context-switching이 발생하면, 새로운 프로세스가 실행되기 때문에 기존의 상태를 기억하기 위해 캐시 내용이 다시 로드되어야 합니다. 이는 프로세스가 작업을 수행하기 위해 필요한 모든 데이터를 읽어들이기 위해 필요합니다. 또한, 프로세스가 작업을 수행하고 나면 반드시 새로운 상태로 캐시 내용을 업데이트해야 합니다.)

하지만, thread context-switching 에서는 꼭 그렇지만은 않다. 2가지 이유가 있다.
1. 같은 process에 속해있는 thread 이기에, 많은 자원들을 공유한다. 그렇기에, 가상메모리 공간을 바꿀 필요가 없다.
2. Cache에 이미 두 thread가 공유하는 data가 올라가있다. 또한, Cache memory에 data를 가져올 때는, 필요한 data 만을 가져오는게 아니라, 주변에 있는 data도 같이 가져오게 된다. Cache는 locality 라는 특성을 갖고있기 때문에, 이 과정에서 새로 실행하게 되는 thread에서 사용하는 data 또한, cache memory에 이미 적재되어 있을 가능성이 높다.
이러한 이유로, thread context-switching의 overhead는 process context-switching의 overhead 보다 적다.

3.스레드는 프로세스와 달리 컨텍스트 전환이 더 자주 발생합니다. 하지만 스레드의 컨텍스트 전환은 프로세스보다 빠릅니다. 이는 스레드가 스택 영역만 변경하면 되기 때문입니다.

 

*참고 Context Switching이란?

- 현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정을 말합니다.

 

사용이유?

Computer multitasking을 통해 빠른 반응속도로 응답할 수 있습니다.
빠른 속도로 Task를 바꿔 가며 실행하기 때문에 사람의 눈으론 실시간처럼 보이게 되는 장점이 있습니다.
CPU가 Task를 바꿔 가며 실행하기 위해 Context Switching이 필요하게 되었습니다.

 

어떻게 Context Switching은 진행될까요?
Task의 대부분 정보는 Register에 저장되고 PCB(Process Control Block)로 관리되고 있습니다.
현재 실행하고 있는 Task의 PCB 정보를 저장하게 됩니다. (Process Stack, Ready Queue)
다음 실행할 Task의 PCB 정보를 읽어 Register에 적재하고 CPU가 이전에 진행했던 과정을 연속적으로 수행을 할 수 있습니다.

 

*참고 Cache Memory

캐시 메모리는 CPU에서 한번 이상 읽어 들인 메인 메모리의 데이터를 저장하고 있다가 CPU가 다시 그 메모리에 저장된 데이터를 요구할 때 메인 메모리를 통하지 않고 바로 값을 전달하는 용도로 사용된다.

프로세스 사이에서 공유하는 메모리가 하나도 없기 때문에 컨텍스트 스위칭이 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 한다.

쓰레드는 캐쉬 정보를 비울 필요가 없기 때문에 프로세스와 쓰레드의 컨텍스트 스위칭 속도의 차이는 이때 발생한다.

 

스레드의 주소공간?

쓰레드에 대한 정보를 보관 (프로세스의 PCB와 유사)
- thread ID
-  thread 실행상태
-  program counter, register set  thread context
- stack
- thread specific 메모리 공간 (static 메모리)


CPU수행 즉 instruction의 수행을 위해서는 현재 이 코드의 어느 부분을 실행하고 있는지를 가르키는 PC가 있어야하고
 그 CPU에서 실행되면서 메모리에 현재 어떤 regiter에 값을 넣을지 알기위해 registers를 가지고 있다.
CPU가 여러단위로 실행되어서 여러개의 스택을 Process 주소공간에 넣는다. (쓰레드 하나가 코드 어느 부분을 실행하다가 함수호출을 하면 스택에 쌓아야 하기때문에 쓰레드의 스택이 있다.)

 

*참고

https://nesoy.github.io/articles/2018-11/Context-Switching

https://3dmpengines.tistory.com/m/2003

https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jhc9639&logNo=221707378026

https://velog.io/@xogh20321/OS-PCB-Context-Switching

https://gold-dragon.tistory.com/262

https://www.oninit.com/manual/informix/100/admin/admin237.htm

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함