운영체제 - 프로세스1

WooHyeong·2022년 12월 27일
0

OS(Operating System)

목록 보기
4/7

프로세스의 개념

"Process is a program in execution"

프로세스의 문맥이란 특정 시점을 놓고 봤을 때 이 프로세스가 어디까지 수행을 했는 지를 규명하기 위해 필요한 요소이다.

프로세스란 실행되면 프로세스만의 독자적인 주소 공간(code, data, stack)을 생성한다. 이 프로세스가 cpu를 잡게 되면 Program Counter register가 프로세스의 코드 어느 부분을 가르키고 있고, 매 순간 인스트럭션을 하나씩 읽어서 처리한다.

프로세스의 문맥(context)

  • CPU 수행 상태를 나타내는 하드웨어 문맥
    • Program Counter
    • 각종 register
  • 프로세스의 주소 공간
    • code, data, stack
  • 프로세스 관련 커널 자료 구조
    • PCB(Process Control Block)
    • Kernel stack

프로세스의 상태

프로세스는 상태가 변경되며 수행된다.

  • Running
    • CPU를 잡고 instruction을 수행중인 상태
  • Ready
    • CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)
  • Blocked (wait, sleep)
    • CPU를 주어도 당장 instruction을 수행할 수 없는 상태
    • Process 자신이 요청한 event(예:I/O)가 즉시 만족되지 않아 이를 기다리는 상태
    • (예) 디스크에서 file을 읽어와야 하는 경우
  • New : 프로세스가 시작되어 필요한 각종 자료구조는 생성되었지만 아직 메모리 획득을 승인받지 못한 상태
  • Terminated : 수행(execution)이 끝났으나 운영체제가 프로세스와 관련된 자료구조를 완전히 정리하지 못한 상태

Process Control Block(PCB)

PCB

  • 운영체제가 각 프로세스들을 관리하기 위해 프로세스당 유지하는 정보들을 담는 커널 내의 자료구조
  • 다음의 구성요소를 가진다. (구조체로 유지)
    • 프로세스의 상태(process state)

    • 프로그램 카운터(program counter)의 값 : 다음에 수행할 명령의 위치

    • cpu 레지스터(cpu register)의 값 : cpu연산을 위해 현 시점에 레지스터에 어떤 값을 저장하고 있는 지

    • cpu 스케줄링 정보(cpu scheduling information) : cpu스케줄링과 메모리 할당을 위해 필요한 정보

    • 메모리 관리 정보(memory management information) : cpu스케줄링과 메모리 할당을 위해 필요한 정보

    • 자원 사용 정보(accounting information) : 사용자에게 자원 사용 요금을 계산해 청구하는 등의 용도

    • 입출력 상태 정보(I/O status information) : 프로세스가 오픈한 파일 정보 등 프로세스의 입출력 관련 상태 정보

    • (1) OS가 관리상 사용하는 정보

      • Process state, Process ID
      • sheduling information, priority
    • (2) CPU 수행 관련 하드웨어 값

      • Program counter, registers
    • (3) 메모리 관련

      • code, stack, data의 위치 정보
    • (4) 파일 관련

      • Open file descriptors

문맥 교환 (Context Switch)

  • CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
  • CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
    • CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
    • CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴


시스템 콜은 프로세스가 본인이 필요해서 운영체제한테 요청할 때 하는 작업이고, 인터럽트(하드웨어 인터럽트)는 컨트롤러 같은 장치가 cpu한테 정보를 전달한 목적으로 거는 것이다.

문맥 교환은 사용자 프로세스로부터 또다른 프로세스로 cpu가 넘어가는 것을 뜻하지, 사용자 프로세스로부터 운영체제한테 넘어가는 것은 문맥 교환이 아니다.

문믹교환에 소요되는 시간은 시스템 입장에서 일종의 오버헤드라고 볼 수 있다. 문맥교환 중에 일어나는 작업이 실제 시스템에게 유용한 작업이 아니기 때문이다. 타이머에 CPU 할당시간을 작게 세팅해서 프로세스 간 문맥교환이 빈번하게 발생하도록 하면 오버헤드도 상당히 커진다. 또 반대로 CPU할당시간을 너무 크게 설정하면 시분할 시스템의 의미가 퇴색하게 되므로 적절한 CPU할당시간을 정하는 것이 중요하다.

프로세스를 스케줄링하기 위한 큐

Job queue (작업 큐)
  • 현재 시스템 내에 있는 모든 프로세스의 집합
  • 반드시 메모리를 가지고 있지는 않다.
Ready queue (준비 큐)
  • 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
  • 준비 큐에 있는 프로세스들은 준비 상태에 있다.
Device queues (장치 큐)
  • I/O device의 처리를 기다리는 프로세스의 집합
  • 장치 큐에 있는 프로세스들은 봉쇄 상태에 있다.

프로세스들은 각 큐들을 오가며 수행된다.
프로세스의 상태 관리는 커널의 주소 영역 중 데이터 영역에 다양한 큐를 두어 수행하게 된다. 즉 커널(운영체제) 내에 준비 큐, 장치 큐, 작업 큐가 다 모여 있다.

스케줄러 (Scheduler)

Long-term scheduler (장기 스케줄러 or job scheduler)

  • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
  • 프로세스에 memory(및 각종 자원)을 주는 문제
  • degree of Multiprogramming(메모리에 올라가 있는 프로세스의 수)을 제어
  • time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready)

메모리에 너무 많은 프로그램이 동시에 올라가도 컴퓨터의 전체 성능이 안좋아지고, 프로그램이 너무 적게 올라가도 성능이 안좋아진다.
예를 들어, 메모리에 프로그램이 하나 올라가있을 때, 그 프로그램이 CPU를 사용하다가 I/O를 하게 되면 CPU가 놀게 된다.

보통 우리가 사용하는 CPU에서는 장기 스케줄러는 없다. 그렇다면 degree of Multiprogramming은 어떻게 조절할까? 이것은 중기 스케줄러가 처리해준다.

Short-term scheduler (단기 스케줄러 or CPU scheduler)

  • 어떤 프로세스를 다음번에 running 시킬지 결정
  • 프로세스에 CPU를 주는 문제
  • 충분히 빨라야 함(millisecond 단위)

Medium-Term Scheduler (중기 스케줄러 or Swapper)

  • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
  • 프로세스에서 memory를 뺏는 문제
  • degree of Multiprogramming을 제어

중기 스케줄러로 인해 추가된 프로세스의 상태

  • Suspended(stopped)
    • 외부적인 이유로 프로세스의 수행이 정지된 상태
    • 프로세스는 통째로 디스크에 swap out 된다.
    • (예) 사용자가 프로그램을 일시 정지시킨 경우 (break key) 시스템이 여러 이유로 프로세스를 잠시 중단시킴 (메모리에 너무 많은 프로세스가 올라와 있을 때)

앞서 말했던 3가지 상태(Ready, Running, Blocked)에다가 Suspended 상태를 추가해놓은 상태도가 아래 그림이다.

프로세스가 자신의 코드를 실행하다가 System call을 해서 운영체제 코드가 실행 중일 때, 사용자 프로세스가 커널 모드에서 running 하고 있다고 부르지, 운영체제가 running 하고 있다고 부르지 않는다. 또한 인터럽트가 들어왔을 때, 사용자 프로그램이 실행되다가 운영체제 커널의 코드가 실행된다.

inactive : 외부적인 이유로 프로세스가 얼어붙은 상태
외부에서 프로세스를 정지시켰으면 다시 외부에서 재개를 해줘야지만 active 상태로 올라갈 수 있다.
Suspended는 메모리를 잃어버리는 것이기 때문에 cpu 관점에서 아무 일을 할 수 없지만, I/O 같은 작업은 계속 진행하여서 Suspended Ready 상태로는 넘어갈 수 있다.

본 포스팅은 이화여대 반효경교수님 운영체제 강의를 바탕으로 작성하였습니다.

profile
화이링~!

0개의 댓글