'Thread'에 해당되는 글 1건

  1. 2009.07.03 스터디 07/18-1 (Thread) by 대절님

//프로세스
정의 : CPU가 실행중인 프로그램(Code와 Data 로 구성)
-멀티프로세싱 : 하나 이상의 CPU에 의해 여러개의 프로그램이 실행
-멀티프로그래밍 : 하나의 CPU에서 여러개의 프로그램이 실행
-멀티태스킹 : 여러개의Job을 동시에 병렬처리

//Thread
정의 : 프로세스 내에서 실행되는 세부 작업단위
-멀티쓰레드 : 하나의 프로세스에서 여러개의 쓰레드가 병행처리
장점 : 재사용과 자원공유
단점 : 공유자원에 대한 처리(Mutex관리 : 상호배제)

프로세스 Code:Data / Code:Data / Code:Data
쓰레드 : Code:Data/Data/Data    <--자원공유 가벼움
//CPU스케쥴링
정의 : 작업을 처리하기위해 프로세스에게 CPU나 다른기기를 할당하는 정책
종류 :
  - 선점스케쥴링 : 하나의 프로세스가 CPU를 차지하고 있을때 우선순위가 높은 다른프로세스가 현재 프로세스를 중지시키고 자신이CPU를 차지할수있는 정책
  - 비선점스케쥴링 : 하나의 프로세스가 CPU를 할당받으면 다른 프로세스는 CPU를 점유하지 못하고 수행중인 프로세스가 끝날때까지 기다리는 정책

//쓰레드 스케쥴링
정의 : 멀티쓰레드가 동작할때 어떤쓰레드를 먼저 수행할지를 결정 (자바는 선점스케쥴러사용)
생성방법 : java.lang.Thread 상속, java.lang.Runnable 구현

//Thread API
sleep() : 지정된 시간만큼 대기
getName() : 쓰레드 이름 반환
setName(String name) : 쓰레드 이름 설정
start() : 쓰레드 시작
getPriority() : 쓰레드우선순위 반환
setPriority(int new) : 쓰레드 우선순위 설정
currentThread() : 현재 수행되는 쓰레드 객체 반환
join() : Join()메서드를 호출한 쓰레드가 종료될때까지 현재 수행중인 쓰레드가 대기
yield() : 우선순위가 같은 다른 쓰레드에게 제어권을 넘김.

예제 :
public class Go extends Thread{
  public void run(){
    while(true) { sout("GO") }
  }
}

public class Come extends Thread{
  public void run(){
    while(true) { sout("COME") }
  }
}

public class GoComeTest{
   psvm{
    Go go = new Go();
    Come come = new Come();
    go.start();
    come.start();
   }
}
//Runnable이용
public class Go implements Runnable{
  public void run(){
    while(true) { sout("GO") }
  }
}

public class Come implements Runnable{
  public void run(){
    while(true) { sout("COME") }
  }
}

public class GoComeTest{
   psvm{
    Go go = new Go();
    Come come = new Come();
    Thread t1 = new Thread(go);
    Thread t2 = new Thread(come);
    t1.start();
    t2.start();
   }
}
//main쓰레드
psvm{
  sout("현재수행되는 쓰레드이름" + Thread.currentThread().getName());   -> main
  sout("쓰레드의 최소우선순위값" + Thread.MIN_PRIORITY);  -> 1
  sout("쓰레드의 중간우선순위값" + Thread.NORM_PRIORITY);  -> 5
  sout("쓰레드의 최대우선순위값" + Thread.MAX_PRIORITY);  -> 10
  sout("현재 수행되고 있는 쓰레드의 우선순위" + Thread.currentThread.getPriority()); ->5
}

//start()와 run()의 관계 : 쓰레드의 상태와 관련
-New 상태 : 쓰레드를 객체생성하는 시점               - start()호출

-Runnable상태 : 쓰레드가 실행하기위한 준비단계        -쓰레드가 준비한다.      
                       우선권정책에 의해 -run()호출
-Running상태  : 스케쥴러에 의해 선택된 쓰레드가 실행되는 단계        -쓰레드가 실행
-Blocked상태 : 쓰레드가 작업을 완수하지 못하고 잠시작업을 멈추는 상태
                      (sleep(), yield(), join() 메서드를 만나면 Blocked상태로 대기상태의 쓰레드는 다시
                      Runnable상태로 돌아감.)

-Dead 상태 : -쓰레드가 종료

/sleep(long millis) : 다른쓰레드에게 running할 기회를 주기위해서 사용. 기아상태에 빠지는것 방지
                             Thread.sleep(1/1000초); 주어진시간동안 대기상태에 존재
/yield() : 우선순위가 같은 쓰레드에게 running할 기회를 줄때 사용. Thread.yield();
/join() : join()메소드를 호출한 쓰레드가 종료될때까지 현재 running된 쓰레드가 대기상태에 존재
            thread변수.join();
      running이 t , t2가 join()을 호출하면 running되던 t는 join()을 호출한 t2가 dead할때까지 blocked
예제
Thread t1 = new Thread();
Thread t2 = new Thread();
Thread t3 = new Thread();
Thread t4 = new Thread();
t1.setPriorty(1);
t2.setPriorty(1);
t3.setPriorty(3);
t4.setPriorty(2);
---------------------
public void run(){
  if(Thread.currentThread() == t1){
      Thread.yield();
  }
}
-->t3/t4/t1/t2
//-----------------------
Thread t1 = new Thread();
Thread t2 = new Thread();
Thread t3 = new Thread();
Thread t4 = new Thread();
t1.setPriorty(4);
t2.setPriorty(4);
t3.setPriorty(4);
t4.setPriorty(4);
t~~~~~~.start();
t4.join();
--> main쓰레드가 먼저 시작되어서 t1,t2,t3,t4를 생성해주는것 main의 우선순위는 5, 하지만
t4.join()이라는 메서드때문에 t4가 끝나기 전까지 main쓰레드는 블럭

//자원공유와 동기화
/임계영역 : 두개이상의 쓰레드에서 동시에 수행되면 안되는 영역
/동기화 : 공유영역에 둘 이상의 쓰레드가 접근할때 발생되는 문제점해결
 - Mutex(상호배제) : Busy wait - 자원을 사용할수 있는지 계속적으로 확인
                     Lock/sleep - 사용할수 있을때까지 재워둠.(효율적)              
 - 세마포어 :
/자바의 동기화 : Lock이용. 공유객체에 여러쓰레드가 동시에 접근하지 못하도록 객체가 heap
                 메모리에 생성될때 자동으로 만들어짐. 쓰레드는 Lock을 가져가야 running될수있음.
 -synchronized 키워드 이용
  1. 메서드 moidifier로 지정(메서드 전체가 동기화)
     public synchronized void go(){ .... }              <-t1이 go()를 실행하고있을때는 끝나기 전까지 t2접근X
  2. 코드블록 이용(일부분만 동기화)-퍼포먼스 좋음
     public void go(){    
        synchronized(공유객체){
           ........
        }
     }

/동기화 쓰레드 상태 : New(start()호출)  --> Runnable(준비)  -스케쥴러에의해 쓰레드선택run()호출-> Running(실행)
              -->다른것이 쓰레드가 접근하면 Lock유무를 체크하기 때문에 Lock이 없는 쓰레드는 Lock'Pool로 이동 후 Runnable상태로
/동기화 성능 향상 방법
 -busy wait방법은 성능이 떨어진다.
 -Lock/sleep방법으로 성능을 향상시킨다.
 -wait()메서드와 notify() 메서드를 이용한다.(t1이 Running상태일때 t2가 접근하면 Lock을 가진 t1쓰레드가
    wait()를 호출하여 t2를 WaitPool로 보낸다. t1의 작업이 끝나면 notify()를 호출하여 WaitPool에 있는 t2를 깨운후
    t2는 Runnable로 갔다가 Running상태가 된다.
예제 :
public class ShareData{
   List list = new ArrayList(50);
   public synchronized char down(){
      char data;
      while(list.size()==0{
          this.wait();
      }
      data = ((Chracter)list.remove(list.size()-1)).charValue();
      return data;
   }
   public synchronized void up(char data){
      Chracter c = new Chracter(data);
      list.add(c);
      this.notify();
   

}
 

신고

'study' 카테고리의 다른 글

스터디 07/18-2(io)  (0) 2009.07.18
무료강의  (0) 2009.07.17
스터디 07/18-1 (Thread)  (0) 2009.07.03
스터디 07/11-4 (Generics, varargs, enum)  (0) 2009.07.03
스터디 07/11-3(Collection)  (0) 2009.07.03
스터디 07/11-2(Exception)  (0) 2009.07.03
Posted by 대절님
TAG

댓글을 달아 주세요



티스토리 툴바