관리 메뉴

사과하는 제라스

13. Concurrency(병렬 처리) 본문

대학 전공 공부/프로그래밍 언어

13. Concurrency(병렬 처리)

Xerath(제라스) 2022. 5. 27. 05:30

목차

    728x90
    반응형

    - Concurrency는 병행 처리로 프로그래밍에서는 보통 Synchronization(동기화)에서 쓰임.

     

    - 병행처리는 작업을 빠르게 하기 위해서 쓰임.

     

    - 방법 :

    1. Parallel Execution(병렬 처리)

    2. Pipeline(생산자/소비자)

    3. Client / Server

     

    - 단위:

    1. Process 단위 : program level

    2. Thread 단위 (=Process 안에 존재하는 독립된 실행단위) : "unit" level

     

    13.1

     

    Concurrency는 4가지 Level에서 이뤄짐.

    1. instruction level - 여러 machine

    2. statement level - 여러 high-level 언어

    3. program level - 여러 program

    4. unit level - 여러 subprogram

     

    13.1.2. 병렬처리의 categories

     

    - Physical Concurrency : CPU가 여러개가 실행되는 것.

     

    - Logical Concurrency : CPU 1개 안에서 여러 개 작업이 "동시에" 실행되는 것.

    => Time sharing방법으로 다음과 같음.

    13.1.3. Concurrency의 사용 이유

    => 한마디로 정리하자면 "속도를 높이기 위함"이다.

     

    13.2. Subprogram(=Thread=unit=함수)-Level Concurrency

     

    - Process(≡Task) : 자원 할당(Memory 공간)

     

    - Thread : LWP(Low Weight task)

    1. 자원 : 조금 씀.

    2. 생성시간 : 짧음.

    3. Communication : 쉽고 빠름. (Process간의 소통보다)

     

    - 여러개의 Process / Thread의 Synchronization(동기화)

     

    1. Competition : 자원을 공유하기 때문에 경쟁함 -> 상호 배제(배타적 사용권을 쓸 수 있어야 함. ∴ lock/unlock쓰는 거임.)

     

    2. Cooperation : 상호 도움을 주기도 해야 함.

     

    ex 1) Parallel Execution(병렬 처리)

    ex 2) Pipeline(생산자/소비자)

    ex 3) Client / Server

     

    직접적인 예시)

    - 서로 다른 ATM 기기에서 같은 계좌로 동시 송금 문제

    - DB나 Web에서의 트랜잭션 문제

    - Producer와 Consumer 간의 소통 과정

     

    -> 이런 문제들을 Race Condition(경쟁 상태)라고 함.

     

     

    13.3.2. Language Design for Concurrency

    - 병행 처리의 방법 중 하나로 "Library를 사용해서 그것이 대신 처리를 해주는 방법"이 있음.

     

    - 대표적인 것으로 OpenMP가 있음. => C, C++, Fortran 등에서 작동을 하고 O/S 수업 때 자세히 배울 것임.

     

    13.2.3. Design Issues

    - 병행 처리를 언어에서 지원하려면...

    1. 쓰레드를 만드는 기능을 지원해야 함. How?

    2. Competition, Cooperation 등의 상태에서 Synchronization을 지원해야 함. How?

    가 중요한 Issue이다.

     

    13.3. Semaphores(세마포어)

    : 가장 널리 쓰이는 동기화 기법. O/S때 배울 예정.

     

    13.4. Monitors

    : Java에서 쓰는 동기화 기법.

     

    13.5. Message Passing

    : Ada 언어에서 쓰는 동기화 기법. O/S때 배울 예정.

     

    13.7. Java Threads

    - 쓰레드 실행 메소드 = run()

     ∴ 모든 쓰레드는 run 메소드를 갖고 있어야 함.

     

    - 자바 쓰레드는 LWP이다.

     

    - Java에서 쓰레드를 생성하는 2가지 방법

    1. 쓰레드 클래스를 상속해서 새로운 클래스 생성

    MyThread extends Thread{

    run() {} //overriding

    }

     

    2. 여러 클래스로부터 상속해서 생성

    Mythread extends Stack implements Runnable{

    run() {} //implements

    }

     

    13.7.1

    - 쓰레드란 클래스는 오직 사용자가 쓰레드를 만들때만 사용하는 클래스다

    - 쓰레드 클래스는 5개의 생성자와 몇개의 메소드로 구성되어 있다.

    - 쓰레드 안에는 start라는 메소드가 있고, 쓰레드 생성 후 start를 해줘야 쓰레드가 실행이 됨.

    - Thread 클래스 상속-> 인스턴스 생성 -> start()-> run()

     

    - 여러 쓰레드가 실행되고 있으면, O/S의 스케쥴러라는 프로그램이 어떤 식으로 처리할 지 결정함.

    -> Java에선 JVM이 처리함.

     

    - sleep() : 쓰레드가 아무것도 안하고 정지하도록 만듦.

    - join() : 쓰레드들의 작업이 끝날 때까지 main함수가 wait하도록 함. 시간을 인자로 줄 수 있음.

    - run을 멈추려면 끝날 때까지 기다리거나 중간에 command를 줘서 멈출 수 있음.(Java에선 exception을 줌.)

     

    - synchronized : 메소드 앞에 붙는 modifier이고 경우에 따라서는 statement 앞에 붙기도 한다. 이 modifier가 붙은 메소드들이 실행될 때 배타적으로 실행되도록 하는 역할을 함.

    => 상호 배제가 보장이 됨. Orderly Execution 방식.

     

    - wait() : 대기 상태에 들어가도록 하는 메소드.

     

    - notify() : 대기 중인 쓰레드 하나를 깨워주는 역할을 하는 메소드.(여러개 중 하나를 골라야하는 경우 임의로 하나 고름.)

     

    - notifyAll() : 대기 중인 모든 쓰레드를 깨워주는 역할을 하는 메소드.

     

     

     

     

     

     

     

     

     

     

     

    728x90
    반응형