본문 바로가기

JAVA/Theory

Process 와 Thread

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 문제 발생>


  1. 공유되는 변수 i의 값을 레지스터에 저장한다.
  2. 레지스터의 값을 1 증가시킨다.
  3. 변수 i에 그 값을 저장한다.

이때 두 스레드가 실행될 때 어떤 스레드가 먼저 실행될지는 보장되지 않으며, 만약 다음과 같은 순서로 실행된다면:

스레드동작i의 값스레드 1의 레지스터스레드 2의 레지스터
스레드 1i의 값을 레지스터에 저장00
스레드 1레지스터 값을 1 증가01
스레드 1i에 값 저장11
스레드 2i의 값을 레지스터에 저장111
스레드 2레지스터 값을 1 증가112
스레드 2i에 값 저장212

최종 결과로 i는 2가 증가된다. 하지만 다음과 같이 실행된다면:

스레드동작i의 값스레드 1의 레지스터스레드 2의 레지스터
스레드 1i의 값을 레지스터에 저장00
스레드 2i의 값을 레지스터에 저장000
스레드 1레지스터 값을 1 증가010
스레드 2레지스터 값을 1 증가011
스레드 1i에 값 저장111
스레드 2i에 값 저장111

최종 결과로 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