컨텍스트 스위칭으로 인한 부하를 줄이기 위해서는 프로세스를 줄여야한다.
프로세스의 구성원 중 스레드가 있는데 이는 프로세스가 실행하는 작업의 실행단위를 나타낸다.
스레드는 프로세스 내에 1-10개 사이 존재 할 수 있다, 스레드들 끼리는 자신들이 속해있는
프로세스의 컨트롤블록인 코드영역, 데이터 영역, 힙영역을 공유하는데 구조적인 문제때문에 스택 영역은 한 스레드당 하나씩 가진다.
지역변수나 매개변수를 저장하는 영역이므로 작업마다 지역변수 영역을 따로 가져야 하기 때문에 스레드당 개별적을 할당된다.
따라서 작업이 늘어나도 프로세스는 늘지 않고 스레드만 늘어나므로 부담이 적어 효율적이다.
프로세스내에 여러개의 스레드가 있을 경우 프로세스 처럼 스레드 마다 개별적인 아이디가 존재하 고 프로세스 컨트롤 블록같은 스레드 컨트롤 블록도 존재한다.
스레드와 프로세스의 차이 이해
스택영역만큼은 스레드마다 개별적으로 할당되는 이유
스택은 함수 호출시 전달되는 인자, 되돌아갈 주소값 과 지역변수등을 저장하기 위해 사용하는 메모리 공간이다. 스택은 먼저들어간 것이 가장 나중에 쓰인다. 따라서 이 메모리 공간이 독립적으로 할당되지 않으면 추가적인 실행흐름을 만들 수 없다.
공유되는 영역들
스레드는 프로세스가 처리해야 할 작업을 수행하기 위해 존재하는 것이므로, 코드영역을 공유해 명령어에 접근할 수 있어야 하고,
명령어 실행 시 전역변수, 정적변수, 지역변수 등의 데이터에 접근해야 하므로 데이터 영역과 힙 영역도 공유해야한다.
<스레드 할당>
# 스레드를 만들어 할당하는 방법
import threading
import os
def func():
print('안녕, 나는 실험용으로 만든 대충함수야!')
print('나의 프로세스 아이디 :', os.getpid())
print('스레드 아이디 :', threading.get_native_id())
if __name__ == '__main__':
print('기존 프로세스 아이디', os.getpid())
thread1 = threading.Thread(target=func)
thread1.start()
<실행결과>

스레드에 독립적인 아이디 할당됨 확인
<메인스레드, 하위스레드 동시 작동>
import threading
import os
import time
def something(word):
while True:
print(word)
time.sleep(3)
if __name__ == '__main__' :
print('기존 프로세스 아이디 :', os.getpid())
t = threading.Thread(target=something, args=('happy',)) #word에 전달할때 args써서 튜플형태로 전달
t.daemon = True # daemon 스레드는 자기에게 일을시킨 스레드에 메인기능이 끝나면 같이 끝난다는 속성
t.start()
print('메인 스레드에서 반복문 시작')
while True:
try:
print('daily...')
time.sleep(1)
except KeyboardInterrupt:
print('good bye~')
break
# 현재 메인스레드와 하위스레드 두개를 가지고 있는 것임/ daily는 메인스레드, happy는 하위스레드
<실행결과>

현재 메인스레드와 하위스레드 두개를 가지고 있고 1초에1번 daily는 메인스레드, 3초에 한번happy는 하위스레드 에 할당되 있음.