반응형

  이번에는 메모리에 올라간 프로세스들을 어떻게 실행하는지 알아보겠습니다. 언제, 어떤 프로세스를 실행할지를 결정하는 OS의 프로그램을 스케쥴러라고 합니다. 스케쥴러는 CPU를 비롯한 컴퓨터 자원들을 효율적으로 분배하는 역할을 하며, 일반적으로 다음과 같은 특징을 가지고 있습니다.

[스케쥴러의 특징]

 

1) 시분할 시스템 : CPU 사용시간을 잘게 쪼개어 나누어 사용하는 방법. CPU는 짧은 시간동안 돌아가면서 다양한 작업을 수행합니다.

2) 멀티 태스킹 : 프로세스를 잘게 쪼개어 수행하는 방법. CPU는 기본적으로 한번에 하나의 작업만을 수행할 수 있습니다.(동시에 여러가지 작업 수행 불가) 하지만 프로세스를 여러 개의 작업으로 잘게 쪼개어 수행하면, 여러 프로세스들이 동시에 실행되는 것과 같이 사용자가 느끼게 할 수 있습니다. 

3) 멀티 프로세싱 : 여러 개의 CPU에 잘게 쪼개진 프로세스를 병렬로 실행하여 실행속도를 극대화하는 방법.

4) 멀티 프로그래밍 : CPU의 효율적인 사용을 위하여, 프로세스 수행 과정에서 CPU를 활용하지 않을 때, 다른 프로세스를 수행하는 방법. 

 

ex) 특정 프로세스가 수행되던 도중 디스크에서 파일을 읽는 작업을 수행한다면, 디스크에서 파일을 읽어오는 동안 CPU는 놀게 됩니다. 이 시간을 효율적으로 사용하기 위하여, 기존 프로세스를 Block하고 다른 프로세스를 수행합니다. 이 Block된 프로세스는 파일 작업이 완료되었다는 신호를 받으면 다시 수행될 수 있습니다.

 

* DMA(Direct Memory Access) : 프로세스 작업 도중 디스크에 있는 데이터가 필요한 경우, CPU가 직접 데이터를 가져오는 것은 비효율적이기 때문에 만들어진 데이터를 디스크에서 읽어오는 별도의 작업을 하는 시스템

 

[스케쥴러의 종류]

 

1. 시간

  1) RTOS(Real Time OS) : 응용프로그램의 실시간 성능 보장을 목표로 하는 OS(정확한 시작/완료 시점을 보장) 

  2) GPOS(General Purpose OS) : (프로세스 실행시간에 민감하지 않은) 일반 용도의 OS

 

2. 방식

  1) FIFO : 들어온 순서대로 프로세스를 실행(배치 처리)

  2) SJF(Shortest Job First) : 작업시간이 짧은 순서대로 프로세스를 실행(작업시간 예측이 어렵다.)

  3) 우선순위 기반(Priority Based) : 프로세서에 할당된 우선순위가 높은 것부터 순차적으로 실행

     * 정적 우선순위 할당 : 미리 프로세스마다 우선순위를 지정해놓음

     * 동적 우선순위 할당 : 스케쥴러가 상황에 따라 우선순위를 동적으로 지정

  4) Round-Robin : 시분할 시스템에 따라 프로세스들은 정해진 시간씩 수행(A 프로세스 3초 - B 프로세스 3초 ...)

     * Time Quantum : Round-Robin 스케쥴러의 프로세스 실행 시간 단위, Time Quantum 이 3초라면 위와 같이 3초마다 프로세스를 바꿔가면서 실행합니다. 프로세스를 바꾸는 과정을 Context Switching이라고 하는데, Time Quantum이 짧아질수록 Context Switching이 자주 일어나 CPU에 부담이 될 수 있습니다.

 

3. 선점 여부

 

  1) 선점형 스케쥴러(Preemptive Scheduling) : 하나의 프로세스가 기존에 CPU를 선점하고 있는 프로세스를 중단시키고 실행할 수 있는 방식.

  2) 비선점형 스케쥴러(Non-Preemptive Scheduling) : 하나의 프로세스가 끝나지 않으면 다른 프로세스는 CPU를 사용할 수 없는 방식. 

 

[스케쥴러의 실행]

 일반적인 OS의 스케쥴러는 [Preemptive + Priority Based + Round-Robin] 방식을 사용합니다. 프로세스들을 여러 State으로 관리하며, 프로세스의 I/O Device를 비롯한 다양한 컴퓨터 자원 활용을 관리합니다. 

 

1. 쓰레드(Thread) : 

  프로세스의 Subset(Light Weight Process). 여러 개의 쓰레드가 하나의 프로세스를 이루며, 일반적으로 작업단위로 쓰레드를 구성합니다. 쓰레드들은 멀티 프로세싱을 통하여 여러개의 CPU에서 동시에 실행될 수 있습니다. 하나의 프로세스를 구성하는 쓰레드들은 프로세스의 PCB 중 Heap, BSS, Data, Text 영역을 공유합니다.(Stack은 쓰레드마다 별도 영역 생성) 

 

* 쓰레드의 장점

  1) 자원 공유

  2) 응답성 향상

  3) 코드 간결

  4) CPU 활용도 ↑

 

* 쓰레드의 단점

  1) 하나의 쓰레드에 문제가 있으면, 전체 프로세스가 영향을 받음(자원공유)

  2) 쓰레드가 많으면 Context Switching이 많이 일어남

 

2. 프로세스의 상태 : 

  스케쥴러는 프로세스를 여러 State으로 관리하며, 다음과 같은 State들 중 하나에 프로세스는 존재합니다.

[Process State Diagram]

  1) new : 프로세스가 생성되는 상태

  2) ready : 프로세스가 실행되길 기다리는 상태

  3) waiting : 프로세스가 특정 작업이 끝나길 기다리는 상태(ex : I/O device 처리)

  4) running : 프로세스가 실행되고 있는 상태

  5) terminated : 프로세스가 종료된 상태

 

프로세스가 생성될 때 [new] state에 들어가게 되고 생성이 완료된 프로세스는 [ready] state로 전환됩니다. 자신이 수행될 차례(Scheduler의 우선순위/Round-Robin 방식에 의해 결정)가 되면 [running] state이 되고, I/O Device 관련 처리 혹은 특정 event가 발생할 때, CPU를 다른프로세스에게 넘겨주고 [waiting] state로 전환됩니다. [waiting] state에 있다가 특정 event가 완료되면 프로세스는 다시 [ready] state으로 전환되고, [running] state로 전환되어 프로세스의 수행이 완료되면 [terminated] state로 전환됩니다.

 

3. IPC(Inter Process Communication) : 

  프로세스가 실행되다 보면, 프로세스 간의 데이터를 공유하거나 상호간에 신호를 보내야하는 경우가 있습니다. 이럴 때 사용하는 프로세스간 통신 기법을 IPC라고 하며, 다음과 같은 여러가지 방식이 존재합니다.

 

  1) Message Queue : Message Queue가 존재하고, Key를 바탕으로 메시지를 전달하는 기법

  2) Shared Memory : Kernal Space에 메모리 공간을 만들고, 해당 공간에 변수를 생성하여 데이터를 공유하는 기법

  3) Pipe : 부모 프로세스에서 자식 프로세스로 데이터를 보낼 수 있는 구조(파이프)를 활용하는 기법(부모,자식 프로세스에 대해서는 리눅스 장에서 공부)

  4) Signal : 커널 또는 프로세스에서 다른 프로세스에 특정 Event 발생 여부를 알려주는 기법

  5) Semaphore : 특정 영역에 대해 접근할 수 있는 쓰레드 개수를 한정하여 메모리를 공유하는 기법(IPC만을 위하여 개발된 기법은 아님.)

  6) Socket : 컴퓨터 간 네트워크 통신을 위해 개발된 기법(IPC만을 위하여 개발된 기법은 아님.)

 

* Dead Lock(교착상태) : 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다려서 다음 단계로 진행하지 못하는 상태
* Starvation(기아상태) : 특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태(부족한 자원 하에) => 우선순위 변경으로 해결(오래 기다린 프로그램 우선순위 높여주는 등)

 

4. 인터럽트(Interrupt) : CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외 상황이 발생하여 처리가 필요할 경우에 CPU에 알려서 처리하는 기술

  ex) CPU가 프로세스를 실행하는 도중, 사용자가 마우스(Input Device)를 움직이는 Event가 발생했다고 생각해봅시다. 사용자 입장에서는 마우스를 움직였는데 실행중인 프로세스가 종료될 때까지 마우스가 움직이지 않으면 매우 당황스럽죠. 이런 I/O Device의 입력이 들어왔음을 CPU에 알려주는 기능을 Interrupt라고 합니다.(이 외에도 다양한 용도로 사용됩니다.) 이 기능이 없다면, I/O Device Event가 발생했음을 알기 위하여 매번 I/O Device의 상태를 확인해야 할 것입니다.

 

5. Context Switching : 스케쥴러에 의해 실행중인 프로세스가 중단되고 다른 프로세스가 실행되는 전반적인 과정
  단순한 과정으로 생각할 수 있지만, 자세히 생각해보면 새로운 Process의 PCB를 메모리에 올리고, 기존 프로세스가 실행된 위치를 저장하고 종료해야 하며, PC(Program Counter)를 새로운 위치로 이동시켜야 합니다. 컨텍스트 스위칭이 일어나면 Program Counter(다음 명령어 실행할 곳), Stack Pointer(스택 내에 다음 저장 공간)값을 PCB(Process Control Block)에 저장하고 다른 프로세스를 시작하게 됩니다. 

반응형

+ Recent posts