본문 바로가기

CS/운영체제

프로그램을 더블클릭하거나 명령어를 통해서 실행시켰을때


프로그램은 HDD, SSD에 저장되어 있는 정적인 객체를 의미하는데, 프로세스는 이와 반대로 동적인 객체이며 실행 중인 프로그램을 의미한다.

그렇다면, 프로그램이 프로세스가 되어서 CPU, Memory, I/O Device를 확보하는 과정은 어떻게 이루어지는지 순서대로 알아보도록 하겠습니다.

일단 우리는 프로그램의 더블클릭 또는 명령어를 통해서 실행시키려고 할 것인데, 이 행위 자체가 프로세스를 만드는 것을 의미하고요.

일단 프로그램이 프로세스가 되기 전에, Input Queue라는 저장소로 삽입이 됩니다. 어떤 정보를 갖고 들어가게 되냐면, 최소한의 데이터만 들고 Input Queue에 삽입이 됩니다. 최소한의 데이터라는 것은 프로세스 ID, 초기 상태, 메모리 정보, 스케줄링 정보 등이 실리게 되고요.

Input Queue에 존재하는 애들이 어떻게 프로세스가 되기 위해서 선택받는지를 알아보도록 하겠습니다.

장기 스케줄러에 의해서 Input Queue에 존재하는 프로세스가 되기위한 애들을 고르게 되는데, 고르는 방식은 이렇게 진행이 됩니다.

처음에 모니터링 과정을 겪게되는데, Input Queue에 존재하는 모든 작업을 평가를 하고, 분석을 하게 됩니다. 어떤 종류의 평가를 하게 되냐면, 현재 자원 상태를 확인을 하게 됩니다. CPU 사용량이라던지, 메모리 사용량, I/O 대역폭을 확인하고 현재 실행 중인 프로세스가 많아서 CPU 작업량이 많아지게 되면 Input Queue에 있는 작업들은 선택되지 않습니다. 또한, 만약 512MB의 메모리를 요구하는 프로그램이 들어왔다고 한다면, 우리가 갖고 있는 메모리의 양을 확인하게 됩니다. 메모리의 양이 충분하다면 그대로 진행을 시키게 될 것이고요. 하지만 300MB 밖에 남지 않았다면 그것 또한 선택되지 않을 것입니다.

위와 같은 과정에서 한번도 걸림이 없이 진행이 되었다면, 프로세스가 될 작업들을 고르게 됩니다. 메모리도 여유가 있고, CPU 사용량에서도 여유가 있고 그리고 메모리에 동시에 존재할 수 있는 프로세스의 수가 남는다면 프로세스를 만들어 주게 되겠습니다.

프로세스를 만들어주게 되는데 이때, Kernel에서 프로세스를 생성하는 루틴을 따르게 됩니다. 어떻게 진행이 되냐면, 일단 PCB에 자원을 할당하고 PCB를 초기화시켜주는 과정을 겪게 됩니다. 그 이후 Kernel에서 관리 중인 프로세스 테이블이라고 있는데요. 프로세스 테이블에 Kernel에서 방금 만들어준 PCB를 삽입하게 됩니다. 프로세스 테이블은 아까 우리가 봤듯이 프로세스 ID를 할당받게 되는데 그 ID를 기준으로 상태 정보를 획득하기 때문에 보통 해시 테이블로 만들어져있습니다. 어쨌든, 그 이후에 메모리를 할당해 주면서 프로세스는 여기부터 - 여기까지 메모리를 사용할 수 있어요. 우리가 알다시피 프로세스는 독립적인 메모리 공간을 할당받게 되죠? 그래서 이렇게 메모리를 할당받고 메모리에 올려지고, Ready Queue에 삽입이 됩니다.
 

여기까지 내용이 우리가 프로그램을 더블클릭 또는 명령어를 통해 실행시켰을때, Ready Queue까지 삽입되는 과정을 글로 작성을 해보았는데요. 간단하게 프로세스의 상태가 New라고만 알고 있었는데 자세하게 알아보니까 여러 가지 과정을 통해서 Ready Queue에 삽입된다는 것을 파악했습니다.


애매하거나 보완할 점

  1. Input Queue와 PCB 초기화
    글에서는 "Input Queue에는 최소한의 데이터만 저장된다"라고 언급되었으나, 실제로는 Input Queue 자체가 PCB를 포함하지 않을 가능성이 큽니다. PCB는 프로세스 생성 이후 초기화됩니다. 따라서 "Input Queue에 최소한의 데이터가 저장된다"는 설명은 다소 애매하며, 정확히는 "Input Queue는 작업 요청을 보관하며 PCB는 아직 생성되지 않았다"가 더 적절합니다.
  2. Input Queue의 자원 평가 방식
    Input Queue의 작업이 선택되는 기준으로 "CPU 사용량, 메모리 상태, I/O 대역폭"을 확인한다고 되어 있지만, 실제 운영체제 구현에 따라 자원 평가 기준은 다양합니다. 일부 OS에서는 장기 스케줄러가 단순히 작업의 우선순위와 메모리 요구량만 평가할 수도 있습니다.
  3. Ready Queue 삽입 과정
    글에서는 PCB 생성 후 Ready Queue에 삽입된다고 했으나, 이 과정은 실제 운영체제의 구조에 따라 더 복잡할 수 있습니다. 예를 들어, 초기화 중 추가적인 I/O 작업이 필요한 경우 Waiting Queue에 삽입될 수도 있습니다.
  4. Kernel 루틴과 프로세스 테이블
    Kernel이 PCB를 프로세스 테이블에 저장하고 해시 테이블을 이용한다고 언급했으나, 해시 테이블 사용은 특정 운영체제의 설계에 따라 달라질 수 있습니다. 예를 들어, 일부 OS는 선형 리스트나 트리 구조를 사용할 수 있습니다.

 추가로 알아봐야 할 사항

  1. 장기 스케줄러의 설계 방식
    • 현대 운영체제에서 장기 스케줄러는 자주 사용되지 않을 수 있습니다. 특히 메모리 자원이 풍부한 시스템에서는 Input Queue 없이 곧바로 프로세스를 생성하는 경우도 있습니다.
  2. 메모리 초기화 및 주소 공간 할당
    • 프로세스가 메모리를 할당받고 초기화되는 과정에서 발생하는 세부 작업(예: 코드 세그먼트, 데이터 세그먼트, 스택 및 힙 설정)을 더 깊이 파악할 필요가 있습니다.
  3. Ready Queue로의 전환 조건
    • 프로세스가 Ready Queue에 들어가기 전 I/O 작업 등 추가적인 검증 작업이 필요한 상황을 고려해 설명을 보완해야 합니다.

요약 (Summary)

  • 프로그램: 저장 매체(HDD, SSD)에 저장된 정적인 객체.
  • 프로세스: 메모리에서 실행 중이며, 운영체제의 제어를 받는 동적인 객체.

프로세스 생성 과정 요약

  1. Input Queue 삽입
    • 작업이 Input Queue로 들어감. 이때 PCB는 아직 생성되지 않음.
  2. 장기 스케줄링
    • 자원의 가용성(CPU, 메모리, I/O 대역폭)을 평가하고, 다중 프로그래밍 수준에 따라 작업 선택.
  3. PCB 생성 및 초기화
    • 선택된 작업은 PCB를 생성하여 프로세스 정보를 저장. 프로세스 테이블에 삽입.
  4. 메모리 할당
    • 프로세스에 독립적인 메모리 공간 할당(코드, 데이터, 스택, 힙 세그먼트 설정).
  5. Ready Queue 삽입
    • 초기화된 프로세스는 Ready Queue로 들어가 CPU 스케줄링을 기다림.