JAVA(객체지향프로그래밍) - Ⅻ

corone_hi·2021년 5월 12일
0

Java

목록 보기
15/16

Program Execution Unit


  • Program

    • 일련의 SW의 관리 단위

    • 실행할 명령 시퀀스

    • 여러 프로세스로 구성된다.** (Single Processing)**

    • 하나의 프로그램이 실행 데이터(Excution Unit = Instance)가 될 수 있다.

  • Process (or Task)

    • 프로그램 실행 단위

    • Heavy weight Process (Multi-Processing)

      • 코드 세그먼트와 데이터 세그먼트를 독립적으로 가지고 있음
  • Thread

    • Light weight Process

      • 코드 세그먼트와 데이터 세그먼트를 공유한다.



Excution Unit in Java Application



Concurrent Processing Concept


  • 병행(Concurrent)

    • 같이 존재하고 있다는 뜻이며, 메모리에 다수의 프로세스가 같이 존재한다는 것을 의미한다.

    • 한 개의 CPU가 있는 단일처리 시스템에서는 병행 프로세스 중 한 개만이 실제로 실행되지만 CPU의 처리 시간을 효과적으로 나눔으로써 겉으로는 병행 프로세스들이 동시에 처리되는 것이다.

    • 병형과 병렬(Parallel)은 다르다.

      병렬은 다중처리 시스템의 경우 여러 개의 프로세스가 동시에 실행하는 것을 말한다.


  • 동시에 여러 개를 돌리기 위해 등장한 개념 (운영체제 시간에 배운 것)

  • 동기화(Synchronization)

    • 프로세스 간 지연 대기열 기능 (Delayed Queue function between processes)

    • 여러 프로세스의 실행 순서 기능 지원

    • 예: 이진 세마포어의 잠금 / 잠금 해제


  • 상호 배타적 (Mutual Exclusive)

    • 프로세스 간의 상호 배타성 제어

    • 예: Read/Write, Input/Output


  • 통신 (Communication)

    • 프로세스 간 커뮤니케이션 지원

    • 예: Mailbox, Socket



Why need Thread?


  • Process Unit의 문제

    • 프로세스 인스턴스 작성을 위한 오버 헤드

    • 프로세스 간 컨텍스트 전환 시 오버 헤드

    • 여러 프로세스 제어의 오버 헤드


Context Switching

현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정을 말합니다.

<Context Switching 진행 과정>

Task의 대부분 정보는 Register에 저장되고 PCB(Process Control Block)로 관리되고 있습니다.

현재 실행하고 있는 Task의 PCB 정보를 저장하게 됩니다. (Process Stack, Ready Queue)

다음 실행할 Task의 PCB 정보를 읽어 Register에 적재하고 CPU가 이전에 진행했던 과정을 연속적으로 수행을 할 수 있습니다.

<PCB(Process Control block) 구조>



  • Thread unit

    • process unit의 오버 헤드 감소

    • Light weight Process


  • Thread의 이점

    • 제작(creation) 오버 헤드 감소

    • 스레드 간 컨텍스트 전환에 대한 오버 헤드 감소

    • 주소 공간이 공유되기 때문에 리소스 공유가 쉽고 스레드 간의 통신이 쉽다.



Structure of Thread

  • Memory Segment for Thread



Processing Structure of Thread


  • 스레드의 처리 구조

    • 하나의 클래스 인스턴스에 여러 스레드 인스턴스가 있습니다.

    • Scheduling Unit: 클래스 인스턴스의 스레드 클래스 인스턴스


  • Thread 기반의 동시 / 다중 처리 지원



1. Java Thread


  • Java Thread class types

    • Thread class

      • run() 함수가 고정된다.

        • 고정적인 동시에 반복적으로 돌리려면 이 방식
    • Runnable interface

      • 구현을 통해 사용

      • run() 함수를 재구현한다.

        • 다양한 run() 함수를 사용하려면 이 방식을 사용

  • Import Package for java Thread

    • java.lang.Thread

      • Package for support Java Thread


  • 생성자

    • Thread()

    • Thread(String)

    • Thread(Runnable)

    • Thread(Runnable, String)


  • 메소드

    • static void sleep (long millis) : 현재 실행중의 thread를, 지정된 밀리 세컨드 수의 사이, sleeve (일시적으로 실행을 정지) 시킵니다.

      • static void sleep(long msec) throws InterruptedException
    • String getName (): 이 thread의 이름을 리턴합니다.

    • void setName (String name): 이 thread의 이름을 인수 name에 동일해지도록 변경합니다.

    • void start (): 이 thread의 실행을 개시합니다.

    • boolean isAlive (): 이 thread가 생존하고 있을지 어떨지를 판정합니다.

    • void join (): 이 thread가 종료하는 것을 대기합니다.

      • void join() throws InterruptedException
    • void run (): 이 thread가 별개의 Runnable 실행 객체를 사용해 작성되었을 경우, 그 Runnable 객체의 run 메서드가 호출됩니다.

    • void suspend (), void resume ()

      • dead lock 발생 가능성 있음 (추천 x)



Lifecycle of Java Thread Instance



2. Java Thread Using Methods


  • 사용 방법

    (1) Thread 클래스 상속을 사용하여 Thread 정의

    Thread_Class extends Thread {}
    
    -> new Thread_Class; creation of thread object
    
    -> start(); start of thread object
    
    -> run() {} : define what the thread object will do

    (2) Runnable 인터페이스 사용

    • 현재 클래스가 이미 다른 클래스에서 상속 된 경우 주로 사용합니다.

    • 다중 상속의 경우 'Runnable 인터페이스 구현'사용

    Thread_Class extends Other_class implements Runnable {-> new Thread_Class; creation of thread object
    
    -> start(); : start of thread object
    
    -> run() {} : define what the thread object will do
    

(1) Thread Using Method

  • Thread를 상속받았기 때문에 사용할 때 바로 Thread를 생성시킨다.

① Thread 클래스를 상속하여 Thread를 정의합니다.

② Runnable 클래스에 정의 된 run () 메서드를 구현합니다.

③ 다른 클래스에서 Thread 클래스를 만들고 시작합니다.


(2) Runnable interface Using Method

  • 객체를 생성 후, new Thread를 통해 Thread를 생성해주어야 한다.

    • 이로 인하여, run()을 바꿀 수 있다는 장점이 있다.

    ① Runnable 클래스를 상속하여 RunnableThread를 정의합니다.

    ② Runnable 인터페이스에 정의 된 run() 메서드를 구현합니다.

    ③ 다른 클래스에서 Thread 클래스를 만들고 시작합니다.



[실습 1]

  • sleep()사용 시, 스레드가 랜덤으로 실행되는 것을 볼 수 있다.



[실습 2]






[실습 3]



  • 이미지가 제대로 뜨지는 않지만 thread 작동은 잘 됨



[실습 4]






3. Java Thread Stop


  • Thread 종료 방법

    (1) run() 메소드가 끝나면 , 자동으로 종료하는 방법 (자체적인 종료)

    • 제일 좋은 방법

    (2) 무한 반복에서 쓰레드를 종료하는 방법 (타 Thread 의 도움)

    ① 반복문의 조건문 이용

    while(stop == false) {}

    ② 반복문 내에 if의 조건문 사용

    while(true ) {;
    if(Thread.isInterrupted ) break;
    
    }

    (3) InterruptException 사용 (수행 중에 Interrupt 발생 시킴 , 자체적으로도 가능)

    ① Timer 기능을 활용하여 InterruptException 유발 : thread.interrupt

    ② 후에 , isInterrupted () 또는 interrupted() 로 확인 및 종료


    (4) Stop() 은 사용안함



[실습 5] - 종료 조건 추가

  • insert ‘thread stop condition’ in run() method of Lab3

  • Dal을 자동차 프로그램 처럼 종료 조건을 주는 것이 숙제

    • True를 다른 것으로 바꿔보는 것

  • while문의 조건을 true에서 x < 300으로 변경

  • 에러 종류 InterrruptedException으로 변경



4. Java Thread’s concurrency


  • 스레드의 동시 처리

    • Temporary stop of thread

      • suspend (): 잠시 정지

      • resume (): 다시 재생



[실습 6]

  • insert suspend and resume method in Lab4 for Thread’ concurrent processing






5. Java Thread’s Mutual Exclusion


  • 스레드의 상호 배제

    • 동시 처리를 위한 모니터 개념

      • Read / Write
    • Synchronized keyword in Java

      • 동시에 돌아갈 수 없는 함수들



[실습 7]

  • program for producer and consumer with Monitor concept




[HomeWork] - Thread 기능 구현

  • Term Project 내에 Thread 기능을 구현 할 것

  • 혹시 , Team 중심의 Term Project 내에 Thread 기능의 구현이 힘든 경우에는 개인별 Thread 기능을 구현하여 제출하여도 됨

  • 개인별 Thread 기능의 구현 제출은 13 주 과제 요약 제출 시에 제출하시면 됨









참고:참고1, 참고2, 참고3, 참고4, 참고5

profile
Studying Computer Science

관심 있을 만한 포스트

0개의 댓글