<aside> ❗ 목차

  1. 프로세스

  2. 쓰레드

  3. 스케줄링

  4. 동기화, 상호배제

</aside>

  1. 프로세스

    1. 프로세스란?

      프로세스란 현재 실행중인 프로그램이라고 할 수 있다. 프로그램은 하드디스크에 보관 중이다. 하드에 보관 중이던 프로그램을 커널에 등록하면 프로세스가 된다. 이를 그림으로 나타내면 아래와 같다.

      Untitled

      현재 실행중인 프로그램은 가장 간단한 정의이다. 따라서 다른 정의 몇가지를 소개하면 다음과 같다.

      • 커널에 등록되고 커널의 관리하에 있는 작업
      • 각종 자원들을 요청하고 할당 받을 수 있는 개체
      • PCB를 할당 받은 개체
      • 능동적인 개체: 실행 중에 각종 자원을 요구, 할당. 반납하며 진행
    2. PCB(Process Control Block)

      PCB는 OS가 프로세스 관리에 필요한 정보를 저장한다. 프로세스 생성 시 커널에 생성된다.

      PCB에는 PID, 프로세스 상태, Context save area 등 프로세스 관리에 필요한 정보들이 있다.

      PCB 정보는 OS 별로 서로 다르며 PCB 참조 및 갱신 속도는 OS의 성능을 결정 짓는 중요한 요소 중 하나이다.

      Untitled

    3. 프로세스 상태

      Untitled

      위 그림은 프로세스의 주기를 나타내는 그림이다. create, ready, running, asleep, terminated, suspended 상태를 각각 설명해보면 다음과 같다.

      1. create

        Untitled

        Job(프로그램)을 커널에 등록하며 커널에 PCB 할당 및 프로세스를 생성한다. 만약 메모리(DRAM)에 바로 할당 가능하다면 ready, 못 한다면 suspended ready 상태로 전환한다.

      2. ready

        Untitled

        ready 상태는 CPU를 제외한 모든 자원을 할당 받은 상태이다. 즉 CPU만 할당 받으면 바로 실행 가능한 상태이다. CPU를 할당 받아 running 상태가 되는 것을 schedule이라 한다.

      3. running

        Untitled

        현재 CPU를 할당 받아 모든 자원을 할당 받은 상태이다. running 상태 에서는 preemption 또는 block 과정을 을 통해 ready 또는 asleep 상태로 변할 수 있다. preemption(선점)은 OS의 스케줄링으로 인해 CPU 제어권을 선점 당해 ready 상태로 바뀐다. block은 I/O등 자원 할당을 요청한 상태이다. I/O등 자원 할당은 CPU 처리 속도 보다 매우 느리기 때문에 자원 할당을 기다리는 것보다 다른 프로세스를 처리하는 것이 효율적이다.

      4. asleep

        Untitled

        I/O등 기타 자원을 기다리는 상태이다. 기타 자원을 할당 받으면 wakeup을 통해 ready 상태가 된다. 하지만 asleep 상태에서 running 상태로 바로 바뀌지 않는다.

      5. terminated

        Untitled

        프로세스 수행이 끝난 상태이다. 모든 자원을 반납하고 PCB 정보 중 일부를 남겨 둔다. 다음에 비슷하거나 동일한 프로세스를 진행할 때 참고하여 효율을 높인다. 마치 캐시처럼 사용하는 것이다.

      6. suspended

        Untitled

        우리가 사용하는 메모리는 하드디스크 보다 빠르지만 용량이 적다. 그래서 실행시키고자 하는 모든 프로그램을 모두 메모리에 올릴 수 없다. 그래서 실행 도중 메모리에서 하드디스크(swap device)로 옮겨간다. 이때 프로세스의 진행 정도(Memory Image)를 하드디스크에 저장했다가 추후 메모리로 다시 올라갈때 활용한다. 이 과정이 없으면 다시 처음부터 진행해야 할 것이다. 메모리에서 하드디스크로 내려가는것을 swap-out, 메모리로 다시 올라가는 것을 swap-in이라고 한다.

    4. 인터럽트(interrupt) 처리과정

      인터럽트란 예상치 못한 외부에서 발생한 이벤트이다. 예를 들면, 우리가 마우스를 클릭하거나 키보드로 입력하는 것이다. 이외에도 I/O 인터럽트, 시간 인터럽트(프로젝트1의 알람클락), 시스템 콜 인터럽트 등 매우 많다. 이러한 인터럽트는 커널에 의해 관리되고 처리된다. 이러한 과정을 간단히 나타낸 그림은 아래와 같다.

      Untitled

      1. 인터럽트 발생

        인터럽트가 발생하면 커널이 개입하여 현재 진행중인 프로세스를 중단한다.

      2. Context Saving

        진행 중이던 프로세스의 진행상황을 커널의 PCB에 저장한다.

      3. 인터럽트 핸들링

        인터럽트 발생장소, 원인을 파악하여 인터럽트 서비스 할 것인지 결정한다.

      4. 인터럽트 서비스

        인터럽트 서비스 루틴(Interrupt Service Routine)을 호출하여 서비스 한다. ISR도 프로그램이라고 생각하면 된다.

      5. Context restoring

        ISR 수행 이후 커널은 ready 상태인 프로세스 중 하나에 CPU 제어권을 할당한다. 이때 반드시 Pi가 다시 할당되지 않고 운영체제의 방침에 따른다.

    5. Context Switching

      Context(문맥)이란 프로세스와 관련된 정보들의 집합이다. CPU register context는 CPU 내부에 있다. 반면 나머지 Code, data, Stack, PCB는 메모리에 있다. 커널의 스케줄링에 의해 프로세스가 CPU 제어권을 잃으면 CPU register에 있는 데이터를 저장해 두어야 다시 CPU 제어권을 할당 받았을때 프로세스를 이어서 진행 할 수 있다. 이와 같이 CPU register context를 저장하는 작업을 Context Saving이라 하며 저장된 Context를 다시 불러오는 것을 Context Restoring이라 한다. 이러한 일련의 과정들을 Context Switching이라 한다.

      이러한 Context Switching은 커널의 개입으로 이루어 지며 OS 성능에 큰 영향을 준다. Context Switching 자체가 비용이기 때문이다. Context Switching이 빠를 수록 좋은 CPU이다. 하지만 CPU는 비싸기 때문에 쓰레드를 활용하여 불필요한 Switching을 줄여준다.

  2. 쓰레드

    1. 쓰레드란?

      쓰레드란 프로세서 활용의 기본단위로 자원을 제외한 제어의 기능만 가지고 있는 상태이다. 각 쓰레드는 코드, 데이터, 자원을 다른 쓰레드와 공유하며 각각의 Thread ID, Register Set(PC,SP등), Stack을 갖는다. 동일한 프로세스의 쓰레드들은 동일한 메모리 주소공간을 공유한다. 이를 나타낸 그림은 아래와 같다.

      Untitled

      쓰레드를 사용하는 이유, 즉 쓰레드의 장점은 다음과 같다.

      • 사용자 응답성

        일부 쓰레드의 처리시간이 길어도 다른 쓰레드는 작업을 계속하여 바로 응답한다.

      • 자원 공유

        자원을 공유하면 커널의 개입을 피할 수 있다.

      • 경제성

        각 쓰레드를 별개의 프로세서로 운영한다면 더 많은 메모리 공간이 필요하며 매번 context switching을 해주어야 한다. 이것은 cpu의 부담으로 다가온다.

    2. 사용자 수준 쓰레드

      사용자 영역의 쓰레드 라이브러리로 구현된다. 대표적으로 POSIX threads, Win32 Threads, Java thread API 등이 있다. 커널은 사용자 수준의 쓰레드가 있는지 모른다. 따라서 커널은 사용자 수준 쓰레드를 관리하지 않는다. 이는 부하가 적고 유연하게 관리 할 수 있다. 하지만 만약 프로세스가 block되면 전체 쓰레드가 대기하게 된다.(단일 쓰레드 커널의 경우)

      Untitled

    3. 커널 수준 쓰레드

      OS가 직접 관리하며 커널 영역에서 쓰레드를 직접 생성 및 관리한다. Context switch가 일어나 부하가 크다. 하나의 커널 수준 쓰레드가 block되어도 다른 커널 수준 쓰레드가 작업을 이어나간다.

      Untitled

    4. 혼합형(n:m) 쓰레드

      n개의 사용자 수준 스레드와 m개의 커널 스레드를 사용한다.(n>m) 이 경우 사용자는 원하는 수만 큼 스레드를 사용할 수 있고 커널스레드는 자신에게 할당된 하나의 사용자 스레드가 블락상태가 되어어도 다른 스레드를 수행 할 수 있다.

      Untitled

  3. 스케줄링

    1. 스케줄링의 개념 및 목적

      시스템에는 여러개의 프로세스가 존재한다. 시스템은 자원을 할당할 프로세스를 선택해야하며 이것을 스케줄링이라고 한다. 스케줄링은 결국 시스템 성능을 향상시키기 위해 고안된 방법이다. 대표적인 시스템 성능 지표로 대기시간, 응답시간, 반환시간, 공평성, 자원활용도 등이 있다.

      Untitled

    2. 스케줄링의 단계

      스케줄링은 발생하는 빈도 및 할당 자원에 따라 Long , Mid, Short term으로 나눌 수 있다.

      1. Long-term

        커널에 등록할 프로그램을 결정하는 Job scheduling이다. 즉, 프로세서가 관리 할 프로세스의 수를 조절하는 것이다. 이때, I/O bounded와 compute-bounded 프로세스들을 잘 섞어야 한다. 그 이유는 한 종류의 프로세스만 너무 많으면 나머지 종류의 프로세스는 놀고 있기 때문이다. 시분할 시스템에서는 모든 프로그램을 시스템에 등록 하므로 Long-term 스케줄링이 덜 중요하다.

      2. Mid-term

        메모리를 할당할지 말지 결정하는 scheduling 이다.

      3. Short-term

        프로세서를 선점할 프로세스를 결정하는 스케줄링으로 Low-level 스케줄링이다. 가장 빈번하게 발생하는 스케줄링으로 cpu 성능에 영향을 준다. 따라서 매우 빠르게 진행되어야 한다.

      Untitled

    3. 스케줄링 정책

    4. 기본 스케줄링 알고리즘

  4. 동기화, 상호배제

위 내용은 아래 유튜브 강의자료 및 강의내용을 참고하여 작성했습니다.

https://apption.co/embeds/54addc8d