Process( 프로세스 )
: 프로세스는 프로그램이 메인 메모리에 적재된 상태로 실행되는 작업의 단위이다.
생성(create) : 프로세스가 생성되는 중이다.
준비(ready) : 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있다. 일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다.
실행(running) : 프로세스가 CPU를 차지하여 명령어들이 실행되고 있다.
대기(waiting) : 보류(block)라고 부르기도 한다. 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태를 말한다.
종료(terminated) : 프로세스의 실행이 종료되었다.
Thread( 스레드 ) - 실타래
: 스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 일컫는 용어.
- 생성(New) : Thread 가 만들어진 상태
- 실행가능상태(Runnable) : Thread Object 가 생성된 후에 star() 메소드를 호출 하면 Runnable 상태로 이동
- 실행중인상태(Running) : Runnable 상태에서 Thread Scheduler에 의해 Running 상태로 이동
- 대기(Blocked) : Thread가 다른 특정한 이유로 Running 상태에서 Blocked 상태로 이동
- 종료(Dead) : Thread 가 종료되면 그 Thread 는 다시 시작할 수 없음
스레드의 장점
- 시스템의 throughput이 향상된다.
- 시스템의 자원 소모가 줄어든다
- 프로그램의 응답 시간이 단축된다.
- 프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단하다.(Context Switch)
스레드의 단점
- 디버깅이 어렵다.
- 스레드간 통신시, 공유하는 메모리 공간을 유념하며 설계한다. (미묘한 시간차 , 공유하는 변수)
( 데이터를 공유하여 사용해서 , 변경하면 바로 모든 쓰레드에 적용됨. 안전성에 심각한 문제가 있다. )
프로세스 : Code,Data,Heap,Stack으로 구성 고유
쓰레드 : Code,Data,Heap을 공유하고 Stack만 갖는다
Context Switch 속도 : 스레드 > 프로세스
최적화 쓰레드의 갯수 : 프로세스*2 + 1
멀티 프로세서 & 멀티 스레드
공통점 :
- 여러 흐름이 동시에 진행된다
차이점:
멀티프로세서 : 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지한다.
멀티스레드 : 프로세스 내의 메모리를 공유해 사용할 수 있다.
프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.
멀티스레드 장점 :
CPU가 여러 개일 경우에 각각의 CPU가 스레드 하나씩을 담당하는 방법으로 속도를 높일 수 있다
ㄴ여러 스레드가 실제 시간상으로 동시에 수행될 수 있기 때문이다.
멀티스레드 단점 :
멀티스레드의 단점에는 각각의 스레드 중 어떤 것이 먼저 실행될지 그 순서를 알 수 없다
<Race Condition 문제 발생>
- 공유되는 변수 i의 값을 레지스터에 저장한다.
- 레지스터의 값을 1 증가시킨다.
- 변수 i에 그 값을 저장한다.
이때 두 스레드가 실행될 때 어떤 스레드가 먼저 실행될지는 보장되지 않으며, 만약 다음과 같은 순서로 실행된다면:
스레드 | 동작 | i의 값 | 스레드 1의 레지스터 | 스레드 2의 레지스터 |
---|---|---|---|---|
스레드 1 | i의 값을 레지스터에 저장 | 0 | 0 | |
스레드 1 | 레지스터 값을 1 증가 | 0 | 1 | |
스레드 1 | i에 값 저장 | 1 | 1 | |
스레드 2 | i의 값을 레지스터에 저장 | 1 | 1 | 1 |
스레드 2 | 레지스터 값을 1 증가 | 1 | 1 | 2 |
스레드 2 | i에 값 저장 | 2 | 1 | 2 |
최종 결과로 i는 2가 증가된다. 하지만 다음과 같이 실행된다면:
스레드 | 동작 | i의 값 | 스레드 1의 레지스터 | 스레드 2의 레지스터 |
---|---|---|---|---|
스레드 1 | i의 값을 레지스터에 저장 | 0 | 0 | |
스레드 2 | i의 값을 레지스터에 저장 | 0 | 0 | 0 |
스레드 1 | 레지스터 값을 1 증가 | 0 | 1 | 0 |
스레드 2 | 레지스터 값을 1 증가 | 0 | 1 | 1 |
스레드 1 | i에 값 저장 | 1 | 1 | 1 |
스레드 2 | i에 값 저장 | 1 | 1 | 1 |
최종 결과로 i는 1이 증가되고, 이것은 원래 프로그램의 의도(각각의 스레드가 i를 1씩 증가하는 동작)와 다를 수 있다. 또한 이러한 문제는 스레드의 실행 조건에 따라 결과가 다르게 나오므로, 오류가 발생했을 때 원인을 찾기가 힘들다. 이러한 문제를 경쟁 조건(Race Condition)이라고 하며, 문제를 막기 위해 세마포어(Semaphore)와 같은 방법을 통해 공유 데이터에 접근하는 스레드의 개수를 한개 이하로 유지하는 방법을 사용할 수 있다. 어렵게 생각하지 말자.
'JAVA > Theory' 카테고리의 다른 글
CPU Scheduling [Priority & Round Robin] (0) | 2015.02.25 |
---|---|
Context Switch (0) | 2015.02.25 |
CPU Scheduling [Dispatcher & Time Slice] (0) | 2015.02.25 |
JDK (JRE [API + JVM] + 개발 유틸리티 ) (0) | 2015.02.06 |
컴파일 & 인터프리트 (0) | 2015.02.06 |