프로세스(Process):
스레드(Thread):
힙(Heap):
malloc
또는 new
연산자)을 통해 생성된 객체들은 힙에 저장됩니다.스택(Stack):
힙의 공유:
스택의 독립성:
힙 구조 및 사용 사례:
스택 구조 및 사용 사례:
각 스레드는 프로세스 내의 4가지 메모리 공간 중 코드(code)와 데이터(data) 영역, heap 영역을 공유
하고, 각 스레드는 별도의 레지스터를 갖는다는 점
을 구체적으로 설명드리겠습니다. 동적 메모리 할당을 위한 영역
입니다. 모든 스레드가 공유합니다.레지스터:
명령어 실행에 필요한 데이터를 임시로 저장하는 공간
threading
모듈을 사용하여 멀티스레드 프로그램을 작성한 예제import threading
import time
# 전역 변수 (Data Segment에 저장됨)
shared_data = 0
# 스레드가 실행할 함수 (Code Segment에 저장됨)
def thread_function(name):
global shared_data
for i in range(5):
time.sleep(1)
# 전역 변수에 접근하고 수정 (Data Segment 공유)
shared_data += 1
print(f"Thread {name}: shared_data = {shared_data}")
# 스레드 생성
thread1 = threading.Thread(target=thread_function, args=("A",))
thread2 = threading.Thread(target=thread_function, args=("B",))
# 스레드 시작
thread1.start()
thread2.start()
# 메인 스레드가 다른 스레드들이 끝날 때까지 기다림
thread1.join()
thread2.join()
print("Final shared_data:", shared_data)
코드 영역 (Code Segment):
프로그램의 실행 코드를 포함합니다. 모든 스레드가 공유합니다.
thread_function
함수는 코드 영역에 저장됩니다. thread1
과 thread2
)에서 동시에 실행데이터 영역 (Data Segment):
초기화된 전역 변수와 정적 변수가 저장되는 영역
입니다. 모든 스레드가 공유shared_data
는 전역 변수로, 데이터 영역에 저장됩니다. shared_data
를 공유하므로, 하나의 스레드에서 이 값을 수정하면 다른 스레드도 수정된 값을 볼 수 있습니다.힙 영역 (Heap Segment):
스택 영역 (Stack Segment):
thread_function
함수 내에서 선언된 지역 변수와 매개변수(name
등)는 각 스레드의 스택에 저장name
매개변수는 thread1
스레드에서는 "A"로, thread2
스레드에서는 "B"로 독립적으로 저장됩니다.각 스레드는 독립적인 레지스터 집합을 가집니다. 이는 다음과 같은 이유로 중요합니다:
프로그램 카운터 (PC):
thread1
과 thread2
가 thread_function
내에서 다른 명령어를 실행하고 있을 수 있습니다.스택 포인터 (SP) 및 베이스 포인터 (BP):
이 예제에서는 두 스레드가 shared_data
를 공유하여 값을 수정하는 것을 볼 수 있습니다.
이는 데이터 영역을 공유
하는 스레드의 특성을 보여줍니다.
각 스레드가 name
매개변수를 독립적으로 가지는 것은 스택을 독립적으로 사용하는 것을 보여줍니다.