Study Summary

03장 동시성과 병렬성

Chapter 03 - Concurrency & Parallelism

파이썬답게 코딩하기 (프로그래밍 언어의 개념과 흐름에 대한 고찰), 심경섭 저

책 속에 그림과 함께 보는게 제일 좋다. 마지막에 정리부분도 잊지마라.

- 다시 이걸 찾아볼 나에게 -

개요

동시성(Concurrency)과 병렬성(Parallelism)은 프로그래밍에서 아주 중요한 요소이다. 2가지 특성을 활용해야 한정적인 프로세서(processor) 자원으로 최대한의 성능을 끌어낼 수 있다. 프로세서는 CPU, GPU, NPU 등을 포함하지만 일반적으로 CPU를 기준으로 설명한다.

동시성과 병렬성

I/O Bound vs CPU Bound

I/O Bound : 입력(Input)/출력(Output)의 영향을 받는 작업. 입력 출력이 완료되기까지 대기하는 시간에 의해 작업시간이 결정됨. 대표적으로 소켓(socket)이나 파일의 입출력과 관계된 작업.

CPU Bound : CPU의 처리 시간에 따라 작업시간이 결정됨. 대표적으로 암/복호화 연산이나 수학적 연산.

병렬성

병렬성(Parallelism)은 물리적으로 동시에 여러가지 작업을 연산하는 것. 컴퓨터에서 CPU는 혹은 CPU의 코어는 한번에 하나의 연산만 수행할 수 있다. 병렬성을 구현하려면 동시에 작업할 수 있는 2개 이상의 연산장치 즉, 멀티코어가 필요.

병렬성은 병렬화하는 주체를 어떤 것으로 할지 선택가능. 작업을 병렬화하는 것은 작업 병렬성, 작업하는 데이터를 병렬화하는 것을 데이터 병렬성이라고 함.

작업 병렬성은 동시에 구분된 작업을 수행. 즉 동시에 2가지 이상의 작업을 처리한다. 그래서 각 CPU에서 다른 작업을 수행함.

데이터 병렬성은 동시에 같은 작업을 수행. 하지남 작업을 처리하는 데이터가 각기 다르다. 그래서 각 CPU에서 다른 데이터에 같은 작업을 처리.

결론: 작업을 여러명이서 나눠서 (병렬화) 수행하는 것.

동시성

동시성(Concurrency)은 서로 독립적인 작업을 작은 단위로 나누고 번갈아 가면서 연산하는 것. 컴퓨터의 연산 속도가 매우 빠르기 때문에 작은 단위의 작업을 번갈아 가면서 처리하면 마치 동시에 여러가지 작업을 수행하는 것처럼 보인다. 동시성은 스케줄링을 통해 작업을 나눠서 처리하므로 하나의 CPU에서도 사용이 가능하다.

결론: 혼자 작업을 잘게 나누어 여러가지의 일을 동시에 와리가리 수행하는 것.

동시성과 병렬성

병렬성은 CPU 코어 갯수라는 하드웨어에 의존적. but 동시에 작업분배, 결과로딩 등에 대한 소프트웨어적 설계 고려 필요.

동시성은 소프트웨어 의존적. 작업구성, 작업분배 등 고민 필요 —-> 스레드(thread) 탄생

Process & Thread

Process

프로세스(Process)는 실행 중인 프로그램. 운영체제로부터 자원을 할당받아 프로그램을 실행하는 작업의 최소 단위. 프로세스는 서로 독립적인 메모리와 주소 공간을 할당받음. 프로세스간 정보 교환에는 IPC(Inter-Process Communication)이 필요. 예시, socket, character device, shared memory 등.

Thread

스레드(Thread)는 프로세스 안에서 프로세스가 할당받은 자원을 이용하여 프로그램의 명령을 실행하는 최소 단위. 스레드는 한 프로세스 내에서 실행의 흐름, 프로세스 내 주소 공간, 메모리 등 자원을 다른 스레드와 공유. IPC 같은 별도 통신 채널이 불필요하나, 사용하는 자원의 무결성과 동기화를 보장하기 위한 별도의 처리는 필요함.

Multiprocessing & Multithreading

멀티프로세싱(Multiprocessing) : 2개 이상의 CPU가 메모리나 기타 입력장치 등을 공유하는 구조이며, 2개 이상의 CPU를 사용하여 병렬성을 구현하는 것.

  • SMP(Symmetric Multiprocessing)
  • ASMP(Asymmetric Multiprocessing)

멀티스레딩(Multithreading) : 하나의 CPU나 멀티 코어 CPU에서 하나의 코어가 동시에 여러개의 프로세스나 스레드를 처리하는 것.

  • 멀티프로세싱은 CPU들이 메모리를 공유.
  • 멀티스레딩은 CPU와 코어 안의 작업이 메모리를 공유.

Multi-tasking

멀티태스킹(Multi-tasking) : 동시에 (병렬성이 아닌 동시성) 하나 이상의 일을 처리하는 것. 작업을 나누어서 처리하여 프로세서의 개수보다 동시에 많은 일을 처리하는 것.

  • 선점형 (Preemptive Multi-tasking)
  • 협력형 (Cooperative Multi-tasking)

정리

  • 멀티프로세싱은 병렬성을 극대화하는 개념.
  • 멀티스레딩은 동시성을 극대화하는 개념.
  • CPU 안에서 프로세스는 CPU의 자원인 CPU 캐시(cache)나 TLB 등을 공유, 프로세스 내부에 여러개의 스레드를 띄울 수 있다.
  • 스레드들은 프로세스 안에서 동작하고, 프로세스가 할당 받은 메모리나 프로세스의 상태를 공유.
  • 멀티스레딩은 작업을 분리하고 공유할 자원을 선별하는 기술에 초점을 맞춘다.
  • 멀티태스킹은 나눠진 작업을 어떤 식으로 번갈아가며 작업할지에 조첨을 맞춘다.