동시성과 병렬성

동시성 : 특정한 순서 없이 겹치는 기간에 시작, 실행 및 완료되는 여러 작업에 관한 것을 의미합니다.

병렬성 : 멀티코어 프로세서에서 동시에 실행되는 동일한 작업의 여러 작업에 관한 것을 의미합니다.

 

 

동시성

  • CPU가 한 번에 많은 일을 처리하는 것에 중점을 두고 있습니다. 즉 많은 작업들을 아주 빠른 시간으로 교체하면서 전체 작업을 처리합니다.
  • 작업의 처리를 빠르게 하기 위한 목적이 아닌 CPU를 효율적으로 사용하는 것에 중점을 둡니다.
    • 스레드가 작업을 처리하다가 I/O 블록에 걸렸을 경우 CPU는 다른 스레드로 전환해서 작업을 진행합니다.
    • I/O에 대한 작업은 CPU 담당이 아니기 때문에 I/O 블록으로 인해 대기하는 것보다는 다른 스레드로 전환해서 작업을 진행하는 것이 효율적입니다.
  • 작업에 대한 처리 방식을 어떤 식으로 진행할 것인가에 대한 설계적 관점을 이해해야 되고 동시성은 작업해야 할 수가 CPU 코어수보다 많을 경우 해당되고 동시성이 없으면 작업을 순차적으로 진행해야 합니다.

 

 

병렬성

  • CPU가 동시에 많은 일을 수행하는 것을 중점을 두고 있습니다. 즉 CPU가 놀지 않고 최대한 바쁘게 동작해야 합니다.
  • 런타임에 동시에 물리적으로 작업을 실행하는 것이며 한 개의 코어에서는 절대 병렬성을 구현할 수 없어 여러 컴퓨팅 리소스가 있는 하드웨어가 필요합니다.
  • 동시성의 하위개념으로 여러 작업을 여러 스레드로 분리하고 운영체제는 그 스레드를 여러 CPU에 적절히 분배하여 동시적으로 실행되도록 합니다.
  • 동시성이 작업 처리하는 방식에 대한 설계에 관한 것이라면 병렬성은 하드웨어 계층에서 작업 수행방식에 관한 것입니다.
  • 작업해야 할 수가 CPU 코어수와 같거나 적을 경우에 가장 효율적입니다.

 

 

 

병렬성과 동시성 조합

ThreadPoolExecutor : 병렬성으로 처리 성능을 극대화하고 동시성으로 CPU 자원을 효율적으로 운용하는 방식입니다.

 

 

Parallelism - Divide and Conquer

ForkJoinPool : 하나의 태스크를 서브 태스크로 분할하여 병렬처리함으로써 전체 작업 성능을 높이는 방법입니다.

 

 

  • ForkJoinPool 방식은 자바 7에서 제공하는 방식입니다.
  • 자바 8에서는 병렬처리를 쉽게 하기 위해 parallelStream을 제공하고 있습니다.

 

자바 8에서 제공하는 ParallelStream 

 

public class ParallelStream {

    public static void main(String[] args) {
        int cpuCount = Runtime.getRuntime().availableProcessors();
        System.out.println("사용 가능한 CPU 수 = " + cpuCount);
        List<Integer> provideJava8parallelStreamTestData = new ArrayList<>();
        for(int i = 0; i < cpuCount * 2; i++) {
            provideJava8parallelStreamTestData.add(i);
        }
        provideJava8parallelStreamTestData.parallelStream().forEach(data -> {
            try {
                String threadName = Thread.currentThread().getName();
                System.out.println("현재 실행중인 스레드 = " + threadName + ", data = " + data);
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });

    }
}

 

 

 

병렬처리를 하려고 하는데 실행하려는 스레드가 CPU 수보다 많을 경우 어떻게 되는가?

 

현재 사용 가능한 CPU 수 : 8

 

 

실행하려는 스레드 : 8

 

 

실행하려는 스레드 : 16

 

 

 

실행하려는 스레드 : 9

 

 

실행시켜야 하는 스레드 16개일 때와 9개일 때 실행시간이 동일한 것을 확인할 수 있습니다.

병렬 처리할 때 코어수만큼 처리하기 때문에 이와 같은 결과를 확인할 수 있습니다.

 

 

참고 강의

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%8F%99%EC%8B%9C%EC%84%B1-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%A6%AC%EC%95%A1%ED%8B%B0%EB%B8%8C-part1/dashboard

 

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1] | 정수원 - 인프런

정수원 | 자바의 동시성 메커니즘과 멀티스레딩 기법을 깊이 있게 다루고 실무에서 직면할 수 있는 다양한 병렬 처리 문제를 해결하는 데 필요한 지식과 기술을 익히게 됩니다. 기본적인 스레드

www.inflearn.com

'운영체제' 카테고리의 다른 글

[운영체제] 프로세스 & 스레드에 대하여  (0) 2024.03.26