• 동시 컴퓨팅은 한 번에 여러일 가능
  • 동시 시스템이란 여러 일을 동시에 처리하는 시스템
  • 현실 세계는 여러 일이 동시에 일어남. 이런 현실을 모델링하려면 동시성 프로그래밍이 필요
  • 동시성 이용시, 지연 시간을 가리고, 기존 처리 자원 활용도 높여 시스템 성능과 처리율 크게 개선 가능
  • 순차 프로그래밍의 반대 개념
    • 동시성은 임의 순서로 실행해도 같은 결과를 낳는 독립적인 연산이 있다는 것을 전제로 삼는 개념

1.1 동시성의 중요성

  • 고성능 애플리케이션
  • 동시성 갖춘 시스템 만들기
  • 현대 컴퓨터 시스템이 갖춘 코어와 프로세서 수가 점점 늘어나면서 동시성 프로그래밍이 소프트웨어 개발하기위한 꼭 필요한 지식이 됨
    • 한정된 자원으로 빠른 성능 얻기 위해 필요한 동시성

1.1.1 시스템 성능 끌어올리기

동시성 도입 시 왜 시스템 성능이 좋아지는가

지연시간 vs 처리율

동시성 이용시 다음 3가지 방법으로 시스템 성능 개선 가능

  • 지연 시간 줄이기(한 가지 작업 더 빨리 처리)
  • 지연 시간 숨기기(지연 시간 긴 작업중에 다른 일 함께 처리)
  • 처리율 개선(같은 시간 동안 시스템이 더 많은 작업 처리)

1.1.2 크고 복잡한 문제 풀기

현실 세계 관리하는 시스템 개발시 엔지니어가 마주치는 문제 중 대부분은 매우 복잡해서 순차적으로 처리 못할 정도임.

이런 문제의 복잡성은 문제 자체의 크기 또는 우리가 만들려는 시스템을 잘 이해하지 못해서 이기도함.

확장성(scalability)

  • 확장성이란
    • 시스템에 자원을 추가하는 방법으로 시스템의 성능 늘릴수 있는 시스템의 성질
    • 확장성은 수직(vertical), 수평(horizontal) 로 나뉨
  • 수직 확장성(scale up)
    • 프로세서를 더 쎈걸로 교체
    • 메모리 증설
    • 제한없이 좋은걸로 할 수 없기에 성능 한계 도달이 쉽기에 확장성 제한됨
  • 수평 확장성(scaling out)
    • 기존 처리 자원과 새로 추가된 처리 자원에 부하를 분산
    • 처리 자원 수 늘릴수 있는 한 시스템 성능도 높일 수 있음
    • 이건 수직 확장성에 비해 확장성 제한 문제 일어날 여지 적기에 업계는 이거 채택
  • 수평 확장을 구현하려면 시스템에 동시성이 도입되야한다. 그것도 컴 여러 대에 걸친 동시성이 적용된 컴퓨팅 클러스터(데이터 처리 목적으로 만들어진 서로 연결된 여러대 컴퓨터)가 필요

느슨한 결합

  • 복잡성 관리를 위해 개발자는 이에 대응해 시스템을 좀 더 단순한 구성 요소로 분할하고, 이들이 서로 통신하게끔 설계를 바꿔야함
  • 책임의 분할
  • 할 일과 수행 시점을 분리하는 방법도 성능, 확장성, 신뢰성과함께 앱의 내부 구조를 극적으로 개선해줌

1.2 동시성의 계층

  • 최상위층
    • 개념적 설계 계층(애플리케이션 계층)
    • 작곡가가 쓴 곡에 해당
    • 알고리즘이 마치 악보의 음표 같이 컴퓨터 시스템의 각 구성요소에 해야 할 일 맡김
  • 그 아래
    • 런타임 시스템 계층
    • 멀티 태스킹 일어남
    • 악보 기반으로 연주자들이 서로 다른 악기 가지고 함께 연주하는 것
  • 가장 하위
    • 저수준(하드웨어 계층) 실행
    • 각 악기에 비유 가능
    • 컴터 시스템에서는 특정 작업 실행하는 단일 프로세스
  • 하드웨어 계층에선 주변 기기 접근 위해 신호 사용해 처리 자원이 실행하는 기계명령어 직접 실행. 현재 솦 설계는 점점 복잡해지는데 이런 설계에서 앱성능 최적화 하려면 하드웨어 구성 요소와 앱의 상호작용 깊게 이해해야됨
  • 런타임 시스템 계층에선 프로그래밍 추상과 관련된 여러 결점이 시스템콜이나 장치 드라이버, 스케줄링 알고리즘 뒤로 가려짐. 이들도 동시성 갖춘 시스템에 큰 영향 끼치기에 철저히 이해!
    • 주로 운영체제에 해당
  • 애플리케이션 계층의 추상화 수준은 현실 세계 수준까지로 높아짐. 이 계층에서 개발자는 비즈니스 로직을 반영하는 복잡한 알고리즘을 구현하는 소스 코드를 작성. 이 코드는 프로그래밍 언어의 기능 사용해 실행 흐름 변경하거나 개발자만이 고려할 만한 추상적 개념 나타내는 역할 함.