-
프로세스 컨텍스트 스위칭과 스레드 컨텍스트 스위칭 정의 및 차이 with 예제 python컴퓨터과학 2024. 5. 22. 11:58728x90반응형
프로세스 컨텍스트 스위칭 (Process Context Switching)
정의
프로세스 컨텍스트 스위칭은 CPU가 현재 실행 중인 프로세스의 상태를 저장하고 다른 프로세스의 상태를 복원하여 실행하는 것을 말합니다. 여기서 프로세스는 운영 체제에서 독립된 실행 환경을 가진 프로그램을 의미합니다.
필요성
- 다중 작업을 지원하기 위해 CPU는 여러 프로세스를 빠르게 전환하며 실행합니다.
- 각 프로세스는 자신의 메모리 공간과 리소스를 가지고 있어야 하므로, 프로세스 스위칭 시 많은 정보를 저장하고 복원해야 합니다.
컨텍스트 저장 내용
- CPU 레지스터 (프로그램 카운터, 스택 포인터 등)
- 프로세스 상태 (레디, 실행 중, 대기 등)
- 메모리 관리 정보 (페이지 테이블 등)
- 기타 프로세스 관련 리소스
예제
- 프로세스 A가 실행 중입니다.
- 운영 체제는 인터럽트를 통해 프로세스 B를 실행할 필요가 있다고 결정합니다.
- 프로세스 A의 현재 상태(레지스터, 프로그램 카운터 등)를 PCB(Process Control Block)에 저장합니다.
- 프로세스 B의 PCB에서 상태를 읽어와 CPU 레지스터에 복원합니다.
- CPU는 프로세스 B의 작업을 이어서 실행합니다.
스레드 컨텍스트 스위칭 (Thread Context Switching)
정의
스레드 컨텍스트 스위칭은 같은 프로세스 내에서 CPU가 한 스레드의 실행 상태를 저장하고 다른 스레드의 상태를 복원하여 실행하는 것을 말합니다. 스레드는 프로세스 내에서 실행되는 작은 단위의 작업입니다.
필요성
- 스레드는 동일한 프로세스 내에서 실행되므로 메모리와 리소스를 공유합니다.
- 스레드 간 스위칭은 프로세스 간 스위칭보다 더 가볍고 빠릅니다.
컨텍스트 저장 내용
- CPU 레지스터 (프로그램 카운터, 스택 포인터 등)
- 스레드 상태 (레디, 실행 중, 대기 등)
- 스레드별 스택
예제
- 프로세스 A의 스레드 1이 실행 중입니다.
- 운영 체제는 프로세스 A 내의 스레드 2를 실행할 필요가 있다고 결정합니다.
- 스레드 1의 현재 상태(레지스터, 프로그램 카운터 등)를 TCB(Thread Control Block)에 저장합니다.
- 스레드 2의 TCB에서 상태를 읽어와 CPU 레지스터에 복원합니다.
- CPU는 스레드 2의 작업을 이어서 실행합니다.
비교
- 프로세스 컨텍스트 스위칭은 메모리 공간과 리소스를 분리하는 작업이 추가되므로 오버헤드가 큽니다.
- 스레드 컨텍스트 스위칭은 동일한 메모리 공간을 공유하므로 오버헤드가 적습니다.
프로세스 컨텍스트 예제
import os import time def child(): print("Child process ID:", os.getpid()) time.sleep(2) print("Child process terminating.") def parent(): print("Parent process ID:", os.getpid()) pid = os.fork() if pid == 0: child() else: print("Parent process continues to run.") os.wait() # Wait for child process to finish print("Child process has terminated. Parent continues.") if __name__ == "__main__": parent()
쓰레드 컨텍스트 스위칭 예제
import threading import time def thread_function(name): print(f"Thread {name}: starting") time.sleep(2) print(f"Thread {name}: finishing") if __name__ == "__main__": print("Main : before creating thread") thread1 = threading.Thread(target=thread_function, args=(1,)) thread2 = threading.Thread(target=thread_function, args=(2,)) print("Main : before running thread") thread1.start() thread2.start() print("Main : wait for the thread to finish") thread1.join() thread2.join() print("Main : all done")
728x90반응형'컴퓨터과학' 카테고리의 다른 글
컨슈머 스레드(Consumer Thread)와 프로듀서 스레드(Producer Thread) (0) 2024.05.23 cpu바운드 프로그램 멀티쓰레딩에 최적의 스레드 개수 결정 방법 및 멀티쓰레딩 개발에 주의할점 (0) 2024.05.22 단일프로세스,멀티프로그래밍,멀티태스킹,멀티프로세싱,컨텍스트 스위칭,스레드,멀티쓰레드란 무엇인가? (0) 2024.05.17 동기(sync)/비동기(async) , 블로킹(blocking)/논블로킹(nonblocking) 쉽게 이해하고 완전 정복 하자 with 예제코드 with java (0) 2024.05.08 DMA(Direct Memory Access)란 왜사용할까? - 수정중 (0) 2024.05.08