Post

병렬성과 비동기성

병렬성과 비동기성

개요

컴퓨터는 한 번에 둘 이상의 작업을 수행하는 멀티태스킹을 지원한다. 하지만 동시에 여러 프로그램이 동작해도 처리 순서가 중요한데, 이를 어떻게 처리하는지 알아보자

경합 조건

  • 여러 프로그램이 동시에 같은 자원에 접근할 때, 자원 사용 순서에 따라 결과가 달라지는 것을 뜻한다.
  • 즉, 공유 자원에 각 프로그램이 접근하는 타이밍에 따라 결과가 달라진다.

공유 자원

  • 데이터뿐만 아니라 메모리, I/O 장치 같은 모든 것들이 다 공유 자원이다.

프로세스와 스레드

  • 운영체제는 사용자 공간에서 실행되는 프로세스를 관리한다.
  • 스레드는 정적 데이터와 힙을 공유하지만 자체적으로 스택을 갖는 프로그램의 일부분이다.
  • 스레드 간의 전환 시 스레드 스케줄러가 CPU 레지스터를 저장해야 한다.
  • 프로세스 문맥 전환보다 스레드 문맥 전환이 더 빠르다.
  • 프로그램 = 프로세스, 프로세스 내부의 작업 단위 = 스레드
  • 운영체제를 효율적으로 활용할 수 있게 코드를 작성해야 한다.

  • 공유 자원도 중요하지만 더 중요한건 작업의 원자성이다.
  • 코드에서 중요한 부분을 상호 배제 메커니즘을 통해 원자적으로 처리하게 해야한다.
  • 어드바이저리 락을 사용하면 먼저 접근한 프로그램이 락을 얻는다.
  • 락을 얻은 프로그램의 작업이 끝날 때까지 다른 프로그램들은 락이 풀리길 기다려야한다.

트랜잭션과 작업 크기

  • 한 프로그램에서 처리하는 작업을 하나의 트랜잭션으로 묶어서 성능을 향상 시킬 수 있다.
  • 락 시간이 길면 그만큼 다른 프로그램이 기다리는 시간이 늘어나 동시성이 떨어진다.
  • 그래서 트랜잭션의 크기를 가능한 작게 가져가는 것이 좋다.

락 대기

  • 락을 성공적으로 얻을 때까지 스핀을 통해 락 획득을 반복 시도 할 수 있다.
  • 락 획득 요청을 락 관리 측에 등록 후 통지를 받는 식으로 락을 획득 할 수도 있다.
  • 블로킹은 시스템이 락을 할당할 수 있을 때까지 락을 요청한 프로그램을 일시중단 시킨다.
  • 논블로킹은 프로그램이 계속 실행되고 나중에 락 획득 여부를 통지 받는다.

교착 상태

  • 둘 이상의 프로그램이 같은 락을 필요로 해서(A는 B를, B는 A를) 본인 락의 해제 지점까지 갈 수 없을 때 발생한다.
  • 가능한 교착 상태를 피하도록 코드를 잘 작성해야 한다.
  • 상호 배제, 점유 대기, 비선점, 순환 대기 이 네 가지 조건을 모두 동시에 만족할 때만 발생한다.
  • 자원을 상호 배제하지 않고 언제든 공유할 수 있게 만들거나, 한꺼번에 필요한 모든 자원을 요구하게 하거나, 선점형으로 바꾸거나, 자원마다 우선순위를 부여하는 방식을 사용해 해결할 수 있다.
  • 하나의 조건만 처리해도 교착 상태가 풀린다는 것을 기억하자.

단기 락 구현

  • 검사 후 설정
  • 비교 후 바꾸기

장기 락 구현

  • 락은 가능한 짧은 것이 좋지만 상황에 따라 오히려 락을 길게 소유하면 좋을 때도 있다.
  • 예를 들면 같은 문서를 동시에 변경하지 못하게 장기간 락을 사용할 수 있다.
  • 이런 경우에는 메모리보다 더 영구적인 저장소에 저장되는 것이 좋다.

브라우저 자바스크립트

  • 자바스크립트는 단일 스레드로 동작한다.
  • 자바스크립트 구현은 이벤트 루프 모델을 사용한다.
  • 실행할 작업을 이벤트 큐에 추가하고 하나씩 꺼내 실행한다.
  • 단일 스레드기에 작업을 인터럽트할 수 없다.
  • 프로그래머가 이벤트가 큐에 추가되는 순서를 제어할 수도 없다.
  • 단인 스레드지만 서버와의 상호작용은 동시에 이뤄지기에 동작의 신뢰성 보장이 어렵다.

비동기 함수와 프로미스

  • 프로미스는 비동기 콜백 메커니즘을 언어 고유 기능으로 넣어 잘못된 비동기 연산을 구현하지 못하게 막는다.
  • 프로미스는 체이닝을 지원한다.
  • 프로미스 기반으로 만들어진 async와 await 방법이 있다.
This post is licensed under CC BY 4.0 by the author.