개발자식

[운영체제] 프로세스 상태, 프로세스 스케줄러, 프로세스 시스템 콜 본문

Computer Science/Operating System

[운영체제] 프로세스 상태, 프로세스 스케줄러, 프로세스 시스템 콜

밍츠 2023. 3. 23. 12:03

프로세스란?

프로세스 : 프로그램을 메모리 상에서 실행중인 작업, 실행중인 프로그램, 스케줄링의 대상이 되는 작업

→ 즉 디스크에 있던 프로그램이 메모리에 적재되면 프로세스, 현대의 컴퓨팅 시스템에서 작업(task)의 단위

→ 그래서 오늘날의 운영체제는 “멀티 프로세스 운영체제”

→ 프로세스는 각각 별도의 주소공간 할당 (독립적, 프로세스 하나당 하나씩 존재)

 

프로그램과 프로세스

  • 프로그램: 실행되기 전 상태의 명령어, 코드 및 정적인 데이터의 묶음, 메모리에 올라가 있지 않은 정적인 상태
  • 실행 파일 클릭 → 실행을 위한 메모리 할당 → 메모리 공간으로 바이너리 코드 올라감 → 그 순간부터 프로그램은 프로세스라고 불림 → CPU 스케줄러에 따라 CPU가 프로세스 실행

 

Dispatcher

  • OS 프로그램 일부로, 실행중인 프로그램을 중단하고 다른 프로그램을 실행시키도록 하는 프로그램이다.
  • Interrupt(timeout, I/O request)가 발생하거나 종료된 프로세스로부터 준비 중인 프로세스를 수행 상태로 만들 때 항상 Dispatcher가 수행된다.

 

2-State Process Model

  • 가장 간단한 모델로, Not Running과 Running 상태 두 가지로 나뉜다.
    • Not Running : 실행 대기 중인 상태
    • Running : 현재 실행 중인 상태

 

5-State Process Model

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

  1. Running
    • CPU를 잡고 instruction을 수행중인 상태
    • 오직 하나의 프로세스만이 실행된다.
  2. Ready
    • CPU를 기다리는 상태(메모리 등 다른 모든 조건을 만족하고)
  3. Blocked(wait, sleep)
    • CPU를 주어도 당장 instruction을 수행할 수 없는 상태
    • 프로세스 자신이 요청한 event(ex I/O)가 즉시 만족되지 않아 이를 기다리는 상태
    • 디스크에서 파일을 읽어와야 하는 경우
  4. New
    • 프로세스가 생성중인 상태
  5. Terminated
    • 수행이 끝난 상태(정리할게 남아있음)
  • 4,5번은 프로세스 상태에 필수로 넣진 않음
  • ready, blocked 상태에는 여러 프로세스가 존재할 수 있지만, (싱글코어 cpu에서) running 상태의 프로세스는 단 하나만 존재한다.
  • Ready vs Waiting: 둘다 어떤 상태의 변화를 기다리고 있지만 Waiting은 다른 이벤트가 발생하기를 기다리는 것이고 Ready는 실행 준비가 다 된 상태에서 CPU를 기다린다.

 

프로세스 상태 과정 설명

  • new -> ready  new 상태에서 프로세스가 생성되게 되면 OS 커널에 존재하는 Ready Queue에 올라가게된다.
  • ready -> running - Ready Queue에 있는 프로세스들을 OS가 위에서 말한 프로세스 스케줄링 알고리즘에 의해서 Running 상태로 가야할 프로세스를 CPU로 할당하게 된다. 그러면 프로세스가 Running 상태가 된다.
  • running -> ready 현재 running 상태에 있는 프로세스A 보다 Ready Queue에서 대기하고 있는 프로세스 B가 우선순위가 높으면, preemptive schedule(선점형)인 경우 프로세스A는 Ready 상태로 오게되고 프로세스B가 running 상태로 가서 CPU를 할당 받게된다.
  • running -> blocked - 현재 running 상태에 있는 프로세스A에서 입출력(I/O) 이벤트가 발생했을때 프로세스A가 blocked 상태로 가게된다.
  • blocked -> ready 입출력(I/O)이벤트가 종료된 프로세스는 다시 Ready상태로 오게된다.
  • running -> terminate - 프로세스 종료.

 

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

  • 여러개의 프로세스들을 관리하기 위한 자료구조가 필요하다.

→ CPU를 할당받을 준비하고 있는 여러개의 프로세스들을 저장,관리할 자료구조가 필요하다.

  • 작업 큐(Job Queue), 준비 큐(Ready Queue), 장치 큐(Device Queue)가 있다.
  • 작업 큐: 현재 시스템 내에 있는 모든 프로세스의 집합, 그러므로 작업 큐에 있다고 해서 메모리를 가지고 있는 것은 아님
  • 준비 큐: 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
  • 장치 큐: I/O 디바이스의 처리를 기다리는 프로세스의 집합

→ 프로세스들은 각 큐들을 오가며 수행된다.

 

 

프로세스 스케줄러

스케줄러란?: 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 모듈

  • 프로세스 스케줄러: 여러 프로세스, 프로그램의 실행을 관리하는 모든 측면 포괄하는 용어
  • CPU 스케줄링: CPU 시간 할당을 특별히 다루는 특정 유형의 프로세스 스케줄링이다. 프로세스 스케줄러 중 하나
  • 스케줄러에는 장기, 단기, 중기 스케줄러가 있다.
  • 장기 스케줄러(Job scheduler): 어떤 프로세스를 준비큐에 넣을 것인가?
    • 프로세스에 메모리를 주는 문제로, 시작 프로세스 중 어떤 것들을 준비큐로 보낼지 결정한다. 그리고 메모리에 올라가 있는 프로세스의 수(degree of Multiprogramming)를 조절하는 역할을 한다. 하지만 지금의 시스템에서는 장기 스케줄러 없이 바로 메모리를 할당해 준비 큐에 넣는다.
  • 단기 스케줄러(CPU scheduler): 어떤 프로세스에게 CPU를 할당해 줄 것인가?
    • 준비 상태의 프로세스 중에서 어떤 프로세스를 다음 번에 실행(running) 상태로 만들 것인지 결정한다. ms 이하의 시간 단위로 매우 빈번하게 호출되어 수행 속도가 빨라야 한다.
  • 중기 스케줄러(Swapper): 메모리에 적재된 프로세스 수 관리
    • 프로세스에게 메모리를 뺏는 문제로, 여유 공간을 마련하기 위해 프로세스를 통째로 메모리에서 디스크의 스왑 영역에 저장한다(이런 행위를 swapout). 장기 스케줄러와 마찬가지로 degree of Multiprogramming를 제어한다.

 

Seven-State Process Model

  • 배경: 중기 스케줄러로 인한 추가된 프로세스 상태
  • suspended(stopped): 외부적인 이유로 프로세스의 수행이 정지된 상태, 메모리를 잃어버림
  • 중지 준비(suspenden ready) : 준비 상태의 프로세스가 중기 스케줄러에 의해 디스크로 swap out
  • 봉쇄 중지(suspenden block) : 봉쇄 상태의 프로세스가 중기 스케줄러에 의해 디스크로 swap out
  • Blocked vs Suspeded: blocked은 잠시 중단되어있다 끝나면 ready로 돌아오지만 suspended는 잠시 중지되어 있다 누군가가 재기시켜줘야 ready 상태로 돌아옴

 

 

프로세스 생성

  • 프로세스 생성은 부모 프로세스(1개)가 연산을 통해 자식 프로세스를 만들어낸다. 생성된 자식 프로세스 또한 새로운 자식 프로세스를 만들 수 있어 트리(계층 구조)를 형성한다.
  • 프로세스는 각자 고유의 PID를 갖는다.(데몬 프로세스 값: 1)
  • 프로세스는 자원을 필요로 함
    • 운영체제로부터 받음
    • 부모와 공유할 수 있다.
  • 자원의 공유
    • 부모와 자식이 모든 자원을 공유하는 모델
    • 일부를 공유하는 모델
    • 전혀 공유되지 않는 모델
  • 수행(Excution)
    • 부모와 자식은 공존하며 수행되는 모델 (멀티 프로세싱 환경)
    • 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델

프로세스 시스템콜

  • fork(): 자식 프로세스를 생성하는
  • exec(): 새로운 프로그램으로 덮어씌우는
  • wait(): 자식 프로세스가 끝날때까지 기다리는
  • exit(): 모든 리소스를 반납하고 종료하는

 

fork() 시스템 콜

  • 사용자 프로그램이 새로운 프로세스를 만드는 시스템 콜 함수
  • 생성된 자식 프로세스는 부모 프로세스의 데이터와 프로그램이 완전 복사 되어 똑같은 프로그램을 수행하는 프로세스가 된다.
  • 자식 프로세스는 fork() 실행된 후 부터 실행한다, program count를 복제하기 때문에
  • 자식과 부모를 구분한다. fork()의 return 값이 다름. 자식: pid==0, 부모 pid>0 (프로세스 ID가 다름)
int main()
{
	int pid;
	pid = fork(); #자식 프로세스 생성
	if(pid == 0) #자식 프로세스가 실행
	{
		printf("\n Hello, i am child!");
	}
	else if(pid > 0)
		printf("\n Hello, i am parent!");
}

 

exec() 시스템 콜

  • 프로세스를 새로운 프로그램을 실행하는 프로세스로 대체하는 시스템 콜 함수이다.
  • fork()와 다르게 자식 자식 프로세스를 생성하는 것이 아닌 현재 프로세스의 프로그램 코드를 새로운 프로그램 코드로 바꿔줍니다. 이로 인하여 프로그램 코드, 메모리, 파일 등 프로세스 자원이 새로 바뀌게 된다.
int main()
{
	int pid;
	pid = fork();
	if(pid == 0)
	{
		printf("\n Hello, i am child!");
		execlp("/bin/date") #새로운 프로그램
	}
	else if(pid > 0)
		printf("\n Hello, i am parent!");
}

-> 자식 프로세스를 만든 후 자식 프로세스는 새로운 프로그램 실행하는 방식

int main()
{
		printf("\n Hello, i am child!");
		execlp("/bin/date") #새로운 프로그램
		printf("\n Hello, i am parent!"); #여기는 실행안됨, 새로운 프로그램을 만들었기 때문에
}

→ 위 코드처럼 fork()를 실행하지 않고 자식 프로그램을 만들어도 된다.

 

wait() 시스템 콜

  • 자식 프로세스가 종료될 때까지 현재 프로세스의 동작을 멈추는 시스템 콜 함수이다.
  • 프로세스 A가 wait() 시스템 콜을 호출하면
    • 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다 (block 상태)
    • child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)

exit() 시스템 콜

  • 프로세스 종료
  • 자발적 종료
    • 마지막 statement 수행 후 exit() 시스템 콜을 통해
  • 비자발적 종료
    • 부모 프로세스가 자식 프로세스를 강제 종료시킴
      • 자식 프로세스가 한계치를 넘어서는 자원 요청
      • 자식에게 할당된 태스크가 더 이상 필요하지 않음
    • 키보드로 kill, break 등을 친 경우
    • 부모가 종료하는 경우
      • 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨
Comments