멀티태스킹의 진실
- CPU는
한 순간에 하나의 프로세스
만 실행 가능! - 그런데, 작업관리자 열어보면 한 순간에 여러가지의 작업을 하는것 처럼 보임
- 운영체제가 짧은 시간에 수십번~수천번 실행할 프로세스를 교체(Context Switching)하기 때문
- 따라서 우리는 동시에 여러 개의 작업이 실행되고 있다고 느끼는 것.
프로세스
- 프로그램이 컴퓨터에서 실행되고 있는 상태
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스
- 각 프로세스는 독립된 메모리 영역(Code, Data, Stack, Heap) 할당
- 프로세스 상태
- 프로세스가 실행되면 Ready 상태가 됨
- 스케줄링에 의해 작업이 할당되면 Run 상태가 됨
- Run하다가 I/O 작업이 이루어지면 Block상태로됨
- PCB(Process Control Block) : 프로세스를 제어하기 위한 정보 모음
- 어떤 프로세스를 어디까지 했는지에 대한 정보를 알 수 있어야 함. 아래와 같은 정보 포함
- 프로세스의 상태
- 다음에 진행할 프로세스 정보
- 스케줄링 정보
- 어떤 프로세스를 어디까지 했는지에 대한 정보를 알 수 있어야 함. 아래와 같은 정보 포함
-
Context Switching : 현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정
- 프로세스 구조
- Stack : 호출된 함수, 지역변수 등 임시 데이터
- Heap : 동적으로 생긴 데이터
- Data : 전역변수
- Code : 프로그램의 코드
멀티 프로세스
- 작업에 흐름이 여러 갈래 생기는 경우, 여러 개의 프로세스로 하나의 작업을 구성 할 수 있음
- 프로세스가 각 메모리 영역을 따로 가지고 있기 때문에 비효율적임
- 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(태스크)을 처리하도록 하는 것
스레드
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스의 특정한 수행 경로
- 스레드는 각각 Stack만 따로 할당 받고 Code, Data, Heap 영역은 공유
멀티 스레드
- 하나의 프로세스가 다수 개의 작업을 각각 스레드를 이용하여 동시에 작동 시킬 수 있음
멀티 쓰레드가 멀티프로세스 보다 효율적인 이유
- 컨텍스트 스위칭(Context Switching) 시에 공유 메모리 만큼의 시간(자원) 손실이 줄어든다
- 프로세스 간의 컨텍스트 스위칭시 단순히 CPU 레지스터 교체 뿐만이 아니라 RAM과 CPU사이의 캐쉬메모리에 대한 데이터 까지 초기화 되므로 상당한 부담이 발생한다.
- Stack을 제외한 모든 메모리를 공유하기 때문에 global(전역), static(정적) 변수 그리고 new, malloc에 의한 모든 자료를 공유할 수가 있다.
멀티스레드의 문제점
-
여러 개의 스레드가 동일한 데이터 공간을 공유하면서 이들을 수정한다는 점에 필연적으로 생기는 문제
- 멀티 프로세스의 방식의 프로그램에서 하나의 프로세스가 자신의 데이터 공간을 망가뜨린다면 그것은 해당 프로세스의 중단을 낳게 될 것임
- 하지만 멀티 스레드 방식의 프로그램에서는 하나의 스레드가 자신이 사용하던 데이터 공간을 망가뜨린다면 그 결과는 하나의 데이터 공간을 공유하는 모든 스레드를 작동불능 상태로 만들어 버릴 것임