songtofu.log
로그인
songtofu.log
로그인
Ch.13 동시성
songtofu
·
2023년 1월 9일
팔로우
0
앞서
병렬 시스템과 동시 시스템 어떻게 다른가?
동시성 언제 필요?
작업 스케쥴러? 널리 사용되는 스케쥴링 알고리듬은?
동시성 프로그램이 어떻게 실행? 인터리빙이란?
공유 상태? 얼마나 다양한 작업이 공유 상태에 접근할 수 있나?
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. 작업 스케줄러는 타이머인터럽트를 발생시키기 위해 타이머를 맞추기 전 대기열에서 작업을 선택
CPU 코어를 떠나서 선택한 작업을 위한 자원을 할당.
커널 = 다른 코어에서 작업을 스케줄링하는 동안 여러 코어 사용 O
songtofu
읽으면 머리에 안들어와서 직접 쓰는 중. 잘못된 부분 지적 대환영
팔로우
이전 포스트
백준) 14889.cpp
다음 포스트
CH.14) 동기화
0개의 댓글
댓글 작성