hyeonga_code

JVM_18_Thread 스레드 본문

JVM

JVM_18_Thread 스레드

hyeonga 2024. 5. 11. 05:59
반응형

 

 


프로세스
컴퓨터에서 실행 중인 프로그램입니다.
각각의 프로세스는 독립된 메모리 공간을 할당 받아 명령어들과 데이터를 가집니다.

 


CPU 
Central Processing Unit 명령어를 실행하는 연산 장치입니다.

 


메인메모리   
프로세스가 CPU에서 실행되기 위해 대기하는 곳입니다.

 


IO 
파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 것입니다. 혹은 입출력 장치와 데이터를 주고 받는 것입니다.

 


단일 프로세스 시스템 :
한 번에 하나의 프로그램만 실행되는데 CPU 사용률이 좋지 않습니다.

> CPU에서 P1 프로세스를 실행하다가 IO 작업을 만나면 P1 작업을 일시중지 하고 IO 작업이 종료될때까지 CPU가 멈추어 있습니다.

 

 

단일 프로세스 시스템의 단점을 개선하기 위해


멀티프로그래밍
 여러 개의 프로그램을 메모리에 올려두고 동시에 실행시키기 위함입니다.
IO 작업이 발생하면 다른 프로세스가 CPU에서 실행됩니다.
멀티프로그래밍은 CPU 사용률을 극대화 시키지만 하나의 프로세스에서 사용하는 CPU 시간이 길어지는 경우 다른 프로세스는 계속 대기해야 합니다.

> CPU에서 P1 프로세스를 실행하다가 IO 작업을 만나면 P1 작업을 일시중지 하고 IO 작업을 실행합니다.
CPU가 멈춰있으므로 P2 작업을 진행하고, P2에서 IO를 만나면 P2 작업을 일시중지 하고 IO 작업을 실행합니다.
P1의 IO 작업이 종료된 경우 P1의 작업을 다시 실행합니다.

 


멀티태스킹
 프로세스는 한 번 CPU를 사용할 때 아주 짧은 시간(quantum)만 CPU에서 실행되도록 합니다.
멀티태스킹은 프로세스의 응답 시간을 최소화시킬 수 있으나 하나의 프로세스가 동시에 여러 작업을 수행할 수는 없습니다.

여러 프로세스를 실행하면 해결되지만
1) 프로세스 간의 컨텍스트 스위칭은 무거운 작업이고,
2) 프로세스는 각각의 독립적인 메모리 공간을 할당받으므로 데이터 공유가 까다롭습니다. 
3) 발열 등의 문제로 두 개의 코어를 두고 사용하는데 잘 사용하고 싶습니다.

> CPU에서 P1과 P2를 밀리세컨 단위로 아주 잘게 쪼개어 번갈아 가면서 실행합니다.

 


스레드 
CPU에서 실행되는 단위로 이전에는 프로세스가 CPU에서 실행되는 단위였습니다. (Unit of Execution)
프로세스는 한 개 이상의 스레드를 가질 수 있습니다.
한 프로세스 안에서 여러 개의 작업을 동시에 실행하기 위해 스레드를 사용합니다.
같은 프로세스의 스레드끼리는 컨텍스트 스위칭이 가볍고, 속한 프로세스의 메모리 영역을 공유하므로 데이터의 공유가 쉽습니다.

 


싱글스레드 / 프로세스 구조
[ Reserved for OS ][ Stack ] [ Heap ][ Code : Program Counter ]

멀티스레드 구조
[ Reserved for OS ][ Stack for thread 0 ] [ Stack for thread 1 ][ Stack for thread 2 ] [ Heap ][ Code ]

`PC` : 다음 번에 실행되어야 할 메모리의 주소를 가리킵니다.
같은 프로세스 내에 속한 스레드들은 같은 메모리 공간을 공유하지만, 고유 메모리 영역도 가지고 있습니다.

1. CPU 하나에 두 개의 스레드를 가지는 프로세스가 있을 때
두 개의 스레드를 잘게 쪼개 CPU 에서 번갈아 가며 실행 합니다.

2. 듀얼 코어를 가지는 CPU 하나에 두 개의 스레드를 가지는 프로세스가 있을 때
듀얼 코어 각각에서 하나의 스레드를 실행합니다.

 


멀티스레딩 
스레드를 이용하여 하나의 프로세스가 동시에 여러 작업을 실행하기 위함입니다.
여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 CPU Time을 나누어 갖는 것을 의미합니다.

 


멀티프로세싱 
두 개 이상의 프로세서나 코어를 활용하는 시스템을 의미합니다.

 


예시
1. 싱글 코어 CPU : 싱글 스레드 프로세스 x 2
두 개의 프로세스가 CPU 하나를 나누어 사용해야 하므로 멀티태스킹입니다.
싱글 스레드 프로세스가 하나 이므로 멀티스레딩이 아닙니다.
코어가 듀얼이 아니고 프로세서가 한 개 이므로 멀티프로세싱이 아닙니다.

2. 싱글 코어 CPU : 듀얼 스레드 프로세스 x 1
CPU 하나를 두 개의 스레드가 나누어 사용해야 하므로 멀티태스킹입니다.
듀얼 스레드이므로 멀티스레딩입니다.
CPU가 하나이기 때문에 멀티프로세싱이 아닙니다.

3. 듀얼 코어 CPU : 싱글 스레드 프로세스 x 2
코어 하나당 스레드 하나를 각각 실행하므로 멀티태스킹이 아닙니다.
코어 하나당 하나의 스레드를 실행하므로 멀티스레딩이 아닙니다.
코어가 두 개이므로 멀티프로세싱입니다.

4. 듀얼 코어 CPU : 듀얼 스레드 프로세스 x 1
코어 하나당 스레드 하나를 각각 실행하므로 멀티태스킹이 아닙니다.
하나의 프로세스에 두 개의 스레드가 포함되므로 **멀티스레딩입니다.
코어가 두 개이므로 멀티프로세싱입니다.

5. 듀얼 코어 CPU : 듀얼 스레드 프로세스 x 2
1) 하나의 코어에 동일 프로세스의 듀얼 스레드를 실행
2) 하나의 코어에 각 프로세스의 스레드 한 개 씩을 실행

코어마다 두 개의 스레드를 실행하므로 멀티태스킹입니다.
하나의 프로세스에 두 개의 스레드가 포함되므로 멀티스레딩입니다.
코어가 두 개이므로 멀티프로세싱입니다.

 

 

 

 

Context Switching

CPU/코어에서 실행 중이던 프로세스나 스레드가 다른 프로세스나 스레드로 교체되는 것을 의미합니다.
하나의 프로세스는 기본적으로 하나의 스레드를 가집니다.

 

컨텍스트

프로세스나 스레드의 상태를 의미합니다.

 

컨텍스트스위칭이 필요한 이유

여러 프로세스나 스레드를 동시에 실행시키기 위함입니다.

 

컨텍스트스위칭이 언제 발생하는가?

주어진 time slic(quantum)을 다 사용했거나 IO 작업을 해야 하거나 다른 리소스를 사용해야 할 때 발생합니다.


멀티태스킹 시스템에서의 컨텍스트스위칭
P1 과 P2 가 하나의 CPU에서 실행해야 할 때 P1 과 P2 를 잘게 쪼개어 CPU에서 번갈아가며 실행합니다.
변경되는 시점은 쪼갠 시간이 다 되었거나 IO 작업을 만나는 경우에 발생합니다.

 

 

컨텍스트스위칭은 누구에 의해 실행되는가?

집행하는 존재를 의미하며 누가 발생시키는 지를 의미하는 것이 아닙니다.
OS 커널에 의해 실행됩니다.


OS Kernel
각종 리소스를 관리, 감독하는 역할입니다.

 

 

컨텍스트스위칭의 구체적인 과정

 1. Process Context Switching

 

다른 프로세스끼리의 스위칭을 의미합니다.

 

2. Thread Context Switcing

같은 프로세스 내의 스레드들끼리의 스위칭을 의미합니다.

 

공통점

커널 모드에서 실행


P1이 실행되다가 컴퓨터의 여러 리소스를 사용해야 하는 경우 프로세스가 아닌 운영체제를 통해 접근합니다.
프로세스에서 커널로 통제권이 넘어가 커널 모드에서 실행됩니다.

 

CPU의 레지스터 상태를 교체합니다.


CPU 안의 여러 레지스터(명령어를 수행하기 위해 필요한 여러 데이터를 저장하는 것)가 P1이 실행되면서 정보가 변경됩니다.
P2 가 실행될 때, P1 에서 변경된 레지스터의 정보가 어딘가 저장되어 있어야 다음 실행 시 연결하여 실행할 수 있습니다.

 

차이점

프로세스 컨텍스트스위칭은 가상 메모리 주소 관련 처리를 추가로 수행해야 합니다.

스레드 컨텍스트스위칭은 같은 프로세스 내에 존재하여 메모리 공간을 공유합니다.

 `MMU_Memory Manage Uni` 새로운 프로세스 주소를 바라볼 수 있도록 설정합니다.

 `TLB`는 가상 메모리 주소와 실제 메모리 주소의 매핑 정보를 가지는 캐시를 비워주어야 합니다.

 


Thread Context Switching
 P1 [ T1, T2 ] 가 CPU에서 실행될 때 T1이 실행 중 컨텍스트스위칭이 발생하면 커널 모드가 실행됩니다.
T1 로 인해 변경된 CPU 상태를 저장하고, T2의 이전 CPU 상태가 저장되어 있는 경우 로딩합니다.
커널 모드가 종료되고 T2가 실행됩니다. T2 가 실행 중에 컨텍스트스위칭이 발생하면 커널 모드가 실행됩니다.
T2 로 인해 변경된 CPU 상태를 저장합니다.
앞서 저장한 T1의 CPU 상태를 로딩합니다.
커널 모드가 종료되고 T1이 실행됩니다.

 


Process Context Switching
 P1 [ T1 ], P2 [ T2 ] 가 CPU 에서 실행될 때 스레드 컨텍스트스위칭의 과정 중에 커널 모드가 종료되기 전에 메모리 처리 과정이 발생합니다.

>>
CPU에서 T1 이 실행 중 컨텍스트스위칭이 발생하면 커널모드가 실행됩니다.
T1 으로 인해 변경된 CPU 상태를 저장합니다.
T2 의 이전 CPU 상태를 로딩합니다. 
[ 메모리와 관련된 처리가 발생합니다. ]
커널 모드가 종료되고 T2 가 실행됩니다.
T2가 실행 중에 컨텍스트스위칭이 발생하면 커널 모드가 실행됩니다.
T2 로 인해 변경된 CPU 상태를 저장합니다.
앞서 저장한 T1의 CPU 상태를 로딩합니다.
[ 메모리와 관련된 처리가 발생합니다. ]
커널 모드가 종료되고 T1이 실행됩니다.

 

 

 

메모리와 관련된 처리

1. 레지스터 상태의 저장 및 복원
2. 페이지 테이블의 교체 : MMU가 물리적 메모리 주소와 가상 메모리 주소를 매핑하는 페이지 테이블을 사용합니다.
3. 캐시의 관리 : CPU 캐시에는 실행 중인 프로세스의 데이터와 명령어가 있습니다. 캐시의 일부/전체를 초기화해야 할 필요가 있을 수 있습니다.
4. TLB 플러시 : 페이지 테이블의 일부를 빠르게 참조할 수 있도록 하는 캐시입니다.
연관 페이지 테이블 엔트리가 변경되므로 역시 초기화되어야 합니다.
5. 스택 메모리의 관리

 


메모리 관리 단위(MMU) 가 P2의 메모리 공간을 바라보도록 합니다.
TLB를 비워 초기화합니다.

? 이 작업이 수행되지 않는 경우 T2 실행 중에 T1의 메모리 영역으로 접근하여 문제가 발생할 수 있습니다.

 

 

가상 메모리

프로그램이 실제 물리 메모리의 제약을 뛰어넘어 마치 더 많은 메모리를 가진 것처럼 작동할 수 있게 해주는 시스템입니다.
가상 주소 공간을 프로그램에게 제공하며 실제 물리 메모리 주소와는 독립적으로 동작합니다.

 

가상 메모리의 주요 구성 요소 및 동작 원리

1. 가상 주소와 물리 주소

프로그램은 메모리를 사용할 때 가상 주소를 사용합니다.
이 가상 주소는 실행 시에 실제 메모리 주소로 변환되어야 합니다.

코드상에서 10000번째 줄에 해당하는 메모리 주소가 실제 서버에서는 103000번째 주소에 위치할 수도 있습니다.
이처럼 변환을 통해 물리 메모리의 실제 구조와 무관하게 독립적으로 실행할 수 있습니다.

 

 

2. 메모리 관리 유닛(MMU)

CPU와 메모리 사이에 위치하여 가상 주소를 물리 주소로 변환하는 하드웨어 장치입니다. 페이지 테이블을 사용하여 이 매핑 정보를 관리하고 CPU가 요청하는 가상 주소에 대응하는 물리 주소를 빠르게 찾아줍니다.

 

3. 페이지 테이블

가상 주소를 물리 주소로 매핑하는 데 사용되는 데이터 구조입니다. 각 프로세스마다 고유한 페이지 테이블이 있으며, 테이블은 프로세스의 가상 주소 공간을 물리 메모리의 페이지로 매핑합니다.

 

4. 캐싱

가상 주소를 물리 주소로 매핑하는 데 사용되는 데이터 구조입니다. 각 프로세스마다 고유한 페이지 테이블이 있으며, 테이블은 프로세스의 가상 주소 공간을 물리 메모리의 페이지로 매핑합니다.

 

 

5. 커널의 역할

운영 체제의 커널은 프로세스의 페이지 테이블 관리, 스왑 영역 관리, 메모리 할당 및 회수 등의 작업을 담당합니다.
커널은 프로세스가 필요로 하는 메모리 자원을 효율적으로 관리하여 여러 프로세스가 안정적으로 실행될 수 있도록 지원합니다.

 

 

MMU_Memory Management Unit

메모리 관리 유닛은 CPU에서 생성된 가상 주소를 물리적 주소로 변환하는 역할을 합니다.
이 변환 과정은 운영 체제에 의해 설정된 페이지 테이블을 기반으로 수행됩니다.

 


`운영 체제` 는 페이지 테이블을 관리하고 MMU에 의해 참조될 수 있도록 가상 주소와 물리 주소의 매핑 정보를 제공합니다.

 

CPU 캐시의 작동 원리

캐시 작동 : CPU 개시는 자주 접근하는 데이터를 빠르게 접근할 수 있도록 임시로 저장하는 메모리 영역입니다.
캐시는 프로그램 실행 중 미리 다음에 필요할 것으로 예상되는 데이터를 로드하여 성능을 향상시킵니다.


`캐시 히트` : 요청된 데이터가 캐시에 이미 존재하는 경우 빠르게 데이터를 제공받을 수 있습니다.
`캐시 미스` : 요청된 데이터가 캐시에 없는 경우 더 느린 주 메모리에서 데이터를 가져와야 하므로 처리 속도가 느려집니다.

 

컴파일러 최적화

`분기문 최적화` : 컴파일러는 실행 흐름을 분석하여 특정 조건문이 자주 사용되는 경로를 최적화합니다.


else 문이 더 자주 실행될 경우, 컴파일러는 이를 코드에서 더 우선적인 위치로 옮겨 성능을 향상시킬 수 있습니다.

 

스레드 컨텍스트 스위칭이 더 빠른 이유

같은 프로세스 내의 스레드간에 메모리 공간을 공유하므로 메모리 주소 관련 처리는 하지 않고 CPU의 상태 정보만 변경하면 되기 때문입니다.

 

컨텍스트스위칭이 미치는 간접적인 영향은?


캐시 오염 cache pollution
CPU 안에는 기본적으로 캐시라는 것이 있습니다.

`cache` : 자주 사용되는 데이터를 메모리가 아닌 캐시에 저장하고 사용합니다.
컨텍스트스위칭이 된 직후 캐시를 확인하면 이전에 사용하던 프로세스의 정보를 가지고 있으므로 필요한 데이터가 없는 경우가 발생합니다.

 

 

유저 관점에서 컨텍스트 스위칭이란?

프로그램 작업과 관련이 없으므로 순수한 오버헤드로 인식됩니다.

반응형