미새문지

크래프톤 정글 week07, day55 - 4BSD, Nice, Busy Waiting, 잔디심기 본문

크래프톤 정글/TIL

크래프톤 정글 week07, day55 - 4BSD, Nice, Busy Waiting, 잔디심기

문미새 2024. 3. 3. 02:07
728x90

4BSD(4th Berkeley Software Distribution)

  • 4BSD 스케줄링 또는 BSD 스케줄링은 미국 캘리포니아 대학 버클리의 CSRG(Computer Systems Research Group )에서 개발한 유닉스 운영 체제의 버전 중 하나인 BSD에서 사용된 스케줄링 방식이다.
  • 4BSD 스케줄링은 다단계 멀티 피드백 큐 스케줄링(MLFQS)을 기반으로 하며, 프로세스의 특성에 따라 우선순위를 변경하는 동적 우선순위 결정 방식을 사용한다.
  • 4BSD의 특징
    • 대화형(Interactive) 프로세스와 배치(batch) 프로세스를 구분한다. 대화형 프로세스는 사용자와 상호작용을 많이 하므로 빠른 반응 시간이 요구되며, 배치 프로세스는 CPU를 많이 사용하므로 높은 처리량이 요구된다.
    • 프로세스의 우선순위를 동적으로 변경한다. 프로세스가 CPU를 많이 사용하면 우선순위를 낮추고, 입출력을 많이 요구하면 우선순위를 높인다.
      • 이를 통해 CPU 사용량과 시스템 반응 시간 사이의 균형을 유지하게 된다.
  • 우선순위의 조정은 ‘우선순위 감소(Decay)’라는 개념을 통해 이루어지며, 프로세스나 쓰레드가 CPU를 사용할 때마다 그 우선순위가 감소하며, 이는 프로세스가 CPU를 계속 점유하지 못하게 막는다.
  • 4BSD 스케줄링에서 프로세스의 우선순위는 두 가지 요인에 의해 동적으로 변경된다.
    • CPU 사용량
      • 프로세스가 CPU를 많이 사용함, 즉 계속 CPU를 점유하려 할 때 그 프로세스와 우선순위를 낮춘다. 이렇게 하면 다른 프로세스들에게도 CPU를 사용할 기회를 제공하게 된다.
      • 이를 통해 시스템은 프로세스 간의 공정한 CPU 사용을 보장하게 된다.
    • 입출력 요청
      • 프로세스가 입출력을 많이 요구하거나 대기 상태에 들어가면 그 프로세스의 우선순위를 높인다. 입출력을 많이 요구하는 프로세스는 대게 사용자와의 상호작용이 많은 프로세스인 경우가 많다.
      • 이런 프로세스들에게 높은 우선순위를 부여함으로써 사용자에게 빠른 반응 시간을 제공할 수 있다.
  • 두 가지 요인만으로 프로세스의 특성과 동작 방식을 가장 잘 반영하므로 대부분의 경우에 효과적인 스케줄링이 가능하다.

Nice

  • Unix와 Unix-like 시스템에서 프로세스의 우선순위를 조절하는데 사용되는 스케줄링 우선순위 조정 메커니즘이다.
  • Nice는 프로세스에 할당된 CPU 시간의 비율을 조절하는 역할을 하며, 이 값은 사용자나 시스템 관리자가 직접 설명할 수 있다.
  • Nice값의 범위는 시스템에 따라 다르지만, 일반적으로 -20에서 +19까지이다.
    • 기본적으로 nice 값은 0으로 설정되며, 이 때 nice 값이 낮을 수록 프로세스의 우선순위가 높아진다.
    • 즉, nice 값이 -20인 프로세스는 CPU 시간을 가장 많이 할당받고, +19인 프로세스는 CPU 시간을 가장 적게 할당 받는다.
  • Nice 값은 프로세스 생성 시에 설정되며, 실행 중인 프로세스의 nice 값을 변경하려면 nice 또는 setpriority라는 시스템 콜을 사용한다.
  • nice 값을 통해 프로세스의 우선순위를 조절하면, 시스템의 전반적인 성능을 향상시키고, 특정 프로세스의 실행 시간을 보장하는 등의 작업 수행이 가능하다.

 

nice() 함수

  • 지정된 우선순위 값을 매겨 새 프로세스를 시작하는데 사용된다.
#include <unistd.h>

int main() {
    int nice_value = 10;
    nice(nice_value);
    
}

 

setpriority() 함수

  • 이미 실행 중인 프로세스의 nice값을 변경하는데 사용
  • 이 명령어를 사용하면, 특정 프로세스의 우선순위를 동적으로 조절할 수 있다.
#include <sys/time.h>
#include <sys/resource.h>

int main() {
    int which = PRIO_PROCESS;
    id_t pid;
    int priority = 10;

    pid = getpid();  // 현재 프로세스 ID를 가져옵니다.
    setpriority(which, pid, priority);
    // 이후 코드
}

Busy Waiting

  • 바쁜 대기라고 불리며, OS에서는 권한을 얻을 때까지 확인하는 것을 의미한다.
  • CPU 자원을 쓸데없이 낭비하기 때문에 좋지 않은 쓰레드 동기화 방식
    • 쓰레드의 동기화를 위해선 busy waiting이 아니라 뮤텍스나 세마포어를 사용하는 것이 좋다.
  • 대신에 자원의 권한을 얻는 데 걸리는 시간이 짧다면 busy waiting이 효율적이다.

Thread_sleep()

  • 쓰레드의 동작을 일정 시간 유예하고, CPU가 다른 작업을 할 수 있도록 허용하는 함수
  • 해당 함수가 실행되면 쓰레드는 timed_waiting 상태로 일시 정지되며, 명시한 시간이 지난 후 runnable을 거쳐 작업 실행을 하게 된다.
    • 이 때 sleeptime이 지난 후 일시 정지된 작업을 바로 실행할 수 있다.
  • 쓰레드를 일시 정지 시키면 해당 쓰레드의 CPU 사용이 사라져 전체 CPU 사용량을 감소시킬 수 있다.

오늘의 잔디심기

백준
3474
자바스크립트
실버3
교수가 된 현우
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().split("\n");


const professor_hyunwoo = (T) => {
    for(let i = 1; i <= T; i++) {
        let num = input[i];
        let count = 0;
    
        while(num >= 5) {
            count += Math.floor(num / 5);
            num /= 5;
        }
        console.log(count);
    }
}

T = Number(input[0]);
professor_hyunwoo(T);

팩토리얼값의 뒷자리 0이 몇갠지 세는 문젠데 10의 단위 즉, 2*5의 n개 만큼 0이 생긴다. 하지만 2는 5보다 더 많기 때문에 최소값인 5의 n개를 구하면 끝

 

pintOS  busy waiting 방식보다 더 효율 좋은 실행 중지 함수를 짜야 하는데 너무 어렵다.

 

학습 시간 : 10 ~ 26시 

728x90