Ch.13 동시성

songtofu·2023년 1월 9일

앞서

  • 병렬 시스템과 동시 시스템 어떻게 다른가?
  • 동시성 언제 필요?
  • 작업 스케쥴러? 널리 사용되는 스케쥴링 알고리듬은?
  • 동시성 프로그램이 어떻게 실행? 인터리빙이란?
  • 공유 상태? 얼마나 다양한 작업이 공유 상태에 접근할 수 있나?

13.1 동시성 소개

  • 동시성? 동시에 실행되는 프로그램 내부에 여러 로직이 있다는 의미.
  • 동시성은 주로 커널에서 지원, 커널은 운영체제의 심층부에 존재.
  • 동시적 != 병렬적

13.2 병렬성

  • 병렬 = 두 가지가 동시에 발생한다는 의미.
  • 동시 시스템에서는 다른 작업이 계속 실행하려면 한 작업을 일시 정지해야함.
  • 대부분의 알고리듬은 순차적이며 본질적으로 병렬적이지는 않다. 멀티스레딩조차 각 스레드는 병렬적인 실행 흐름으로 나눌 수 없는 여러 순차적 지시어를 가짐. = 순차적 알고리듬은 운영체제에 의해 실행에 병렬적인 흐름으로 쉽게 자동 분할 될 수 없고 개발자가 수행해야함.

13.3 동시성

  • 다중 작업 = 동시성
  • 작업 스케쥴러는 서로 다른 작업을 아주 빠르게 전환, 상당히 짧은 시간 동안 각각의 작업을 아주 조금씩 수행

13.4 작업 스케줄러 유닛

  • 스케줄러 대기열있음.
  • 작업? 실행 시 별도의 흐름에서 수행되어야하는 작업
  • 대기열은 우선 순위가 높은 작업이 먼저 시작되도록 선택
  • 모든 작업 사이 작업 스케줄러가 프로세스 유닛을 관리하고 공유. 작업 스케줄링을 작업 스케줄러가 단독으로 맡는다.
  • 스케줄링 알고리듬은 특정 요구사항(공평, 기아 상태 X)
  • 작업에 특정한 타임 슬라이스 또는 타임 퀀텀 지정. 스케줄러는 반드시 작업이 프로세서 유닛을 해제할 때까지 기다려야함.

13.5 프로세스와 스레드

  • 사분할 또는 선점형 스케줄러. 작업이 일정 시간 안에 로직을 완료 X. 작업 스케줄러가 CPU 코어를 강제로 회수. 작업은 다시 대기열로 들어감.
  • 선점형 스케줄러가 실행 중인 프로세스를 중단시키고 다른 프로세스를 실행 상태로 바꿀 때 문맥 교환이 발생. 문맥 교환 빠름-> 사용자는 작업이 병렬적으로 실행된다고 여김.
  • 문맥 교환 예측 X. 특정 명령어에 문맥 교환이 발생할 확률이 모든 명령어에 대해 같다고 가정.

13.6 발생 전 제약

  • 문맥 교환 발생 시간 불확실. 그런데도, 동시적으로 실행되는 명령어에 대해 확실한 것.
  • 명령어가 작업의 목적을 완수하려면 반드시 특정 순서로 실행되어야 한다는 의미
  • 기술 용어 = 모든 인접한 두 명령어 사이에 발생 전 제약이 있다고 표현.
  • 실행할 떄 마다 문맥 교환 발생해도 작업의 전체 상태는 동일하게 남아있음.
  • 중간 상태? 전체 상태와는 반대로 어떤 명령어에 있으며 값을 갖는 일련의 변수.
  • 작업 중 하나가 값을 쓸 수 있는 공유된 자원이 있는 몇몇 작업을 포함하는 동시 시스템 존재할 때, 시스템의 실행이 다르면 결과도 다르게 나온다.
  • 다른 실행에서 동일하게 결정되는 결과를 얻으려면 적절한 동기화 방법을 사용해야함.

13.7 동시성을 사용해야 하는 경우

  • 동시성에는 언제 사용해야 하는지를 알 수 있는 몇 가지 ㅍ턴 존재.
  • 순차적 실행. 블로킹. 블로킹 명령어.
  • 첫 번째 패턴 = 무기한으로 실행 흐름을 차단할 수 있는 명령어 있는 경우.
  • 종료 시각을 알 수 없거나 완료할 떄까지 시간이 오래 걸리는 블로킹 작업 있을 때마다 작업을 두 개의 동시 작업으로 나누어야함.
  • 스폰 명렁어 속도 빨라 새 클라이언트 받는 작업 블로킹 X.
  • 작업 언제 끝나느냐? 작업 내의 모든 명령어 실행되고 나면 작업 종료.(작업의 생명주기 = 이 작업을 스폰한 상위 작업에 따라 다름)
  • 서비스 거부(Dos): 인스턴스들 클라이언트가 숫자를 입력할 떄까지 모두 대기. 상당한 양의 자원 소모. 일정 시간이 지나 점점 더 많으 ㄴ연결 들어오면 서버 프로그램은 운영체제에 의해 종료되거나 더 이상 클라이언트에게 서비스 제공 X.
  • 두 번째 패턴 = 하나 또는 여러 명령어가 완료하는 데 시간이 너무 많이 걸릴 경우, 이들을 별도 작업에 넣고 새 작업을 메인 작업과 동시 실행.(대략적 완료 시간을 알고, 빨리 끝나지는 않는 경우)
  • 데이터 경쟁 문제.

13.8 공유 상태

  • 상태? 작업의 마지막 명령어가 실행되었을 떄 기존의 모든 공유되지 않은 변수와 그에 해당하는 값의 집합
  • 작업의 중간 상태? 작업이 특정 명령을 실행했을 떄 기존의 모든 공유되지 않은 변수 및 그에 해당하는 값의 집합.
  • 수정 가능한 공유 상태 세심하게 보호X. 심각한 문제
  • 각각의 시나리오 = 인터리빙 (예측 불가)
  • 실행 사이에 틈 존재. 틈 예측 X
  • 원자적 명령어? 더 작은 작업으로 나뉠 수 없으며 문맥 교환으로 인해 인터렙트될 수 X.
  • 작업 스케줄러 = CPU가 코어가 필요한 하나의 프로그램.
    1. 작업 스케줄러는 타이머인터럽트를 발생시키기 위해 타이머를 맞추기 전 대기열에서 작업을 선택
    1. CPU 코어를 떠나서 선택한 작업을 위한 자원을 할당.
  • 커널 = 다른 코어에서 작업을 스케줄링하는 동안 여러 코어 사용 O
profile
읽으면 머리에 안들어와서 직접 쓰는 중. 잘못된 부분 지적 대환영

0개의 댓글