Til Home

2020-08-11-TIL

Fact

  • 11일차

Feelings

  • 아 너무 어렵다

Findings

cvcs와 dvcs

  • cvcs(centralized version control system) dvcs(distributed version control system)
  • 제일 큰 차이점은 버전 관리는 서버에서만 한다.
  • dvcs에서 로컬 저장소라는 개념이 생긴다. 그래서 나만의 버젼 관리가 가능 하다.
  • cvcs에서는 push를 하게 되면 바로 서버 레포에 간다. 안되는거 올리면 큰일 난다.

    • 에러가 뜨게 되면 이제 해결 할때 까지 아무것도 못한다.
    • 반면 dcvs는 로컬 레포라는게 있으니 바로 롤백이 가능하다.
  • dcvs에서는 나의 레포를 거쳐서 서버/remote 레포에 들어간다.
  • 브렌치와 머지 라는 개념도 dcvs에서 나온다.
  • 예) cvcs => svn, dvcs => git

cvcs vs dcvs

[출처1]https://ojava.tistory.com/157

출처2

스케쥴링

  • scheduler가 호출되는 시기
  • 의사결정모드

    • Preemptive: 스케줄러가 주기적으로 호출됨 (이중 지향) 또는 시스템 상태가 변경되는 경우
    • Nonpreemptive: 프로세스가 종료되거나 프로세스가 종료될 때 스케줄러가 호출됨 블록
  • 우선순위가 가장 높은 프로세스를 어떻게 선정하는가?

    • 우선순위함수: P = 우선 순위(p)
    • 중재규칙 : 관계파악화
    • 랜덤
    • 연대순(최초 입력 = FIFO)
    • 주기적(원형 로빈 = RR)
  • 우선순위를 결정하는 다양한 방법
  • 우선순위를 정의하는 데 사용되는 프로세스의 가능한 속성:

    • 달성된 서비스 시간(a): 할당된 CPU 시간
    • 시스템에서의 실시간 (r): 도달시간 + 대기시간
    • 총 서비스 시간(t): 도착과 출발 사이의 총 시간
    • 주기성(d): 연산 반복
    • 기한(주기에 의해 명시되거나 암시됨): 실시간 포인트 어떤 과정을 완료해야 하는가에 따라
    • 외부우선순위(e)
    • 메모리 요구사항(대부분 배치의 경우)
    • 시스템 부하 (공정별이 아님)
  • First-Come, First-Served (FCFS) Scheduling

    • 오는 순서대로 처리 하는 방식
    • 우선순위 함수 r (r 은 도착 시간)
    • 의사결정 모드: 비선제적
  • Shortest Job First(SJF)

    • cpu burst 길이 에 따라 스케쥴링 방식
    • 두 가지 체계:
    • nonpreemptive – 일단 프로세스에 CPU를 제공하면 다음과 같을 수 없음 CPU 버스트가 완료될 때까지 사전 예방

      • 우선순위 함수 = -총 서비스 시간
    • preemptive – CPU 버스트 길이와 함께 새로운 프로세스가 올 경우 현재 실행 프로세스의 남은 시간으로 스케쥴링.

      • 최단-잔여 시간-최초(SRTF) 라고도 알려진다.
      • 우선순위 함수 = -(t-a), t = 총 서비스 시간, a = 총 쓴 시간
  • priority

    • 우선순위 번호(integer)가 각 프로세스와 연관됨
    • CPU가 가장 높은 우선순위로 프로세스에 할당됨 (최대 정수 ≡ 최고 우선순위)
    • 선제적
    • 비선제적
    • SJF는 우선순위 스케줄링이며, 우선순위가 다음 CPU 버스트 시간 로 예측됨
    • 문제 ≡ 기아 – 우선순위가 낮은 프로세스는 실행 안될 수 있음
    • 해결책 ≡ 고령화 – 시간이 지날수록 우선순위 증가
  • multi-level queue

    • ready queue은 별도의 대기열로 분할:
    • foreground (interactive)
    • background (batch)
    • 각 대기열에는 고유의 스케줄링 알고리즘이 있음
    • foreground – RR
    • background – FCFS
    • 대기열 간 스케줄링 수행
    • 고정 우선순위 스케줄링 (foreground 다 하고 background 하기 등) 배경에서. 기아 가능성.
    • Time Slice – 각 대기열에서 일정량의 CPU 시간을 얻음 프로세스 간에 스케줄링할 수 있는 것, 즉 80% ~ RR의 전경
    • FCFS의 20% ~ 백그라운드

multi queue

멀티 스레드 스케줄링 방식

웹 워커
  • JS는 싱글 쓰레드로 동작하지만 웹 워커를 사용하면 브라우저에서 멀티 쓰레드를 쓸 수 있다.
  • 긴 계산식이 있으면 싱글 스레드를 쓸 시에 마냥 기달려야 하지만 웹 워커를 쓸 시에 유사 멀티 스레드를 쓰는 마냥 새로운 스레드로 계산 맡기고 메인 스레드는 다른 작업을 수행 할 수 있게끔 할 수 있다.

setTimeout

  • 일정 시간이 지난 후에 원하는 함수를 예약 실행(호출)할 수 있게 하는 것을 ‘호출 스케줄링(scheduling a call)‘이라고 한다
function hello() {
  alert('Hello');
}

setTimeout(hello, 1000);

// 혹은 
setTimeout(()=>hello(), 1000);

setInterval은 settimeout와 달리 계속 실행 된다. clearinterval로 멈출 수 있다.

// 2초 간격으로 메시지를 보여줌
let timerId = setInterval(() => alert('째깍'), 2000);

// 5초 후에 정지
setTimeout(() => { clearInterval(timerId); alert('정지'); }, 5000);

1초 후에 hello() 가 실행 된다

  • 실행 방식

    • 브라우저의 타이머 스레드가 카운트다운을 시작하고 타임 업이 시작되면 콜백 기능이 자바스크립트 스레드의 실행 스택에 배치된다. 콜백 기능은 스택에서 그 위에 있는 다른 기능이 끝나기 전에 실행되지 않는다. 따라서 시간이 경과할 때 다른 시간 소모적인 기능이 실행될 경우 setTimeout의 콜백은 제시간에 완료되지 않는다.

타이머Timer를 구현하기

  • 대신 Date 개체를 사용하여 정확한 현재 시간(밀리초-)을 얻자. 그런 다음 콜백이 얼마나 자주 실행되었는지 계산하는 대신 현재 시간 값에 근거하여 논리를 작성하게 된다.

간단한 타이머 또는 클럭의 경우 시간 차이를 따라감.

let start = Date.now();
setInterval(function() {
    let delta = Date.now() - start; // milliseconds elapsed since startoutput(Math.floor(delta / 1000)); // in seconds
    // alternatively just show wall clock time:
    output(new Date().toUTCString());
}, 1000); // update about every second

그러나 점프 값의 문제를 가지고 있다. 간격이 약간 지연되어 990, 1993, 2996, 3999, 5002밀리초 후에 콜백을 실행하면 두 번째 카운트 0, 1, 2, 3, 5 (!)가 나타난다. 따라서 이러한 점프를 피하기 위해 약 100ms마다 업데이트하는 것이 바람직하다.

멀티 스레드가 공용 리소스에 접근할 때 임계구역을 다루는 방식

  • 두 프로세스가 작동하면 리소스를 동시 다발적으로 접근 할수 있으므로 이로 인해 시스템에 문제를 일으킨다. 그래서 쓰는게 semaphore, mutex 등이다.

    • Semaphore
    • 공용 리소스에 접근하는 여러 프로세스를 막는 것
    • mutex
    • 공용 리소스에 접근하는 여러 스레드를 막는 것
  • Critical section(임계구역)
  • 여러 프로세스가 공용 리소스에 접근하면서 수행될 때 각 프로세스에서 공용 리소스를 액세스하는 프로그램 코드 부분을 가리키는 말.
  • 공용 리소스에 여러 프로세스가 동시에 접근하면 잘못된 결과를 만들어 낼 수 있다.

임계점 방식

  • Mutual

    • Critical Section을 가진 쓰레드들의 Runnig Time이 서로 겹치지 않게 각각 단독으로 실행
    • 여러 프로세스들의 공용 리소스에 대한 접근을 조율하기 위해 locking과 unlocking을 사용한다.
    • 다중 쓰레드 사용 불가
  • Semaphore

    • 세마포어는 운영체제 또는 커널의 한 지정된 저장장치 내 값으로서, 각 프로세스는 이를 확인하고 변경한다.
    • 세마포어의 값에 따라 프로세스 리소스 접근을 허용/비허용. 리소스 접근을 못하면 일정한 시간을 기달렸다가 재시도 한다.
    • 세마포어는 보통 0 혹은 1을 사용하나 추가적인 값을 가질수도 있다.
    • 사용하는 동안 세마포어의 값을 변경하고 다른 세마포어 사용자들은 대기한다.

뮤텍스는 단일 스레드 사용할때 쓰고 세마포는 다중 프로세스를 쓸대 사용하면 된다.

출처

Future Action

  • 책을 많이 봐야 할것 같다.