[정리] 프로세스

shininghyunho·2021년 6월 14일
0

CS

목록 보기
8/8

프로세스

프로세스는 프로그램이 실행중인 상태를 말한다. 파일은 disk에 존재하는데 이를 메모리로 가져와서 실행하면 이를 프로세스라고 한다. 우리가 음악을 들으며 메신저를 켜두고 웹서핑을 하는것은 여러개의 프로세스가 실행되고 있는것이다. 이를 멀티테스킹이라고 하고 이는 CPU를 시분할하여 사용한것이다.

프로세스의 상태

프로세스는 CPU가 실행시키는데 다음과 같은 상태를 가진다.

  • Ready - 프로세스를 새롭게 생성해서 실행을 기다리는 상태다. 프로세스가 Ready Queue에 들어가게 된다.(Run 상태로 가는것을 dispatch라고도 부른다.)
  • Run - 차례를 기다리다 CPU가 프로세스를 실행시킨 상태다.
  • Blocked(Wait) - 프로세스가 I/O 요청을 실행하면 매우 오래 기다려야하기 때문에 따로 Block 상태가 된다. 프로세스가 Waiting Queue에 들어가게 된다.
  • Ready Suspended - 차례를 기다리기 위한 Ready queue가 꽉차게 되면 Ready를 기다리는 상태가 된다.
    (Suspended 상태는 memory 영역이 모자라 disk영역으로 넘어가는 것을 의미하고 memory로 넘어올때를 swap-in, disk로 넘어갈때를 swap-out이라고한다.)
  • Blocked Suspended - 위와 비슷하게 Block queue가 꽉차서 기다리는 상태다.

프로세스 메모리 구조

프로세스는 6 영역의 메모리 구조를 가진다.

  • Code(Text) 영역
    실행에 필요한 코드들이 들어간다. 실행에 필요한 코드를 타이핑하면 컴파일러가 기계어로 번역해주는데 이 기계어가 code 영역에 들어가게된다.
  • BSS 영역
    초기화 값이 정해지지 않은 전역변수와 정적 변수가 들어간다.
  • Data 영역
    초기화 값이 정해진 전역변수와 정적 변수가 들어간다. BSS와 Data는 둘다 전역변수 값이 들어간다. 대신 Data에서 초기화된 값은 ROM에 저장되는데 BSS는 초기화된 값이 없어 RAM만 사용하므로 나누었다.
  • Heap 영역
    malloc, new 와 같이 동적 할당해준 값이 들어간다. 메모리 주소 값에 의해서만 참조되고 사용된다.
  • Stack 영역
    프로그램이 자동으로 사용하는 메모리 영역으로 지역변수나 파라미터 값이 들어간다. Heap과 Stack 영역은 나머지 메모리와 다르게 컴파일 이후에도 변경이 가능하며 같은 공간을 사용한다. 대신 Heap은 낮은 주소부터 할당되고 Stack은 높은 주소부터 할당된다. 그러다 둘이 겹쳐지면 Stack Overflow, Heap Overflow가 발생한다.

상세한 메모리 구조

프로세스 스케줄링

싱글 프로세서 시스템(CPU가 1개)에서는 CPU가 하나의 프로세스만 실행시킬수 있다. 그래서 어떤 프로세스를 얼마나 실행시켜야하는지가 참 중요한데, 이러한 역할을 프로세스 스케줄링이라고하고 운영체제가 담당한다.

빈도수에 따른 스케줄링

스케줄링은 빈도수에 따라서 3가지로 나눌수있다.

  • 장기 스케줄링(Longterm) - 어떤 프로세스를 커널에 등록할 것인가를 결정한다. 이를 통해 어떤 프로세스를 Ready Queue에 넣을지 결정한다. 다시 말해 디스크의 job pool에서 Ready Queue로 이동할지를 결정한다. 느린것이 특징이며 현대에 와서는 장기 스케줄링없이 바로 준비 큐에 넣는다.
  • 중기 스케줄링(Midterm) - 어떤 프로세스에게 메모리를 할당할지를 결정한다. 실행중인 프로세스 중에서 disk로 내보내고 들이는 역할을 한다. 메모리에 너무 많은 프로세스가 올라와 있으면 I/O가 빈번하게 일어나고 성능에 큰 영향을 끼치기 때문에 중요하다.
  • 단기 스케줄링(Shorterm) - 어떤 프로세스에게 CPU를 할당할지를 결정한다. Ready Queue에서 CPU로 할당하여 실행할 프로세스를 정하게된다. ms 이하의 시간 단위로 매우 빈번하게 일어난다.

적용 시점에 따른 스케줄링

스케쥴링은 적용 시점에 따라 선점형, 비선점형으로 나눌 수 있다.

상태 변화중 4가지를 표현했을때
1. Running -> Blocked
2. Running -> Ready
3. Blocked -> Ready
4. Running -> Terminated

비선점형은 1,4인 상황에서만 수행되고 선점형은 1~4번 모든 상황에서 수행된다.

비선점형 스케줄링

어떤 프로세스가 CPU를 할당 받으면 그 프로세스가 종료되거나 입출력 요구가 발생하여 자발적으로 중지될때까지 계속 실행되도록 보장받는다.
순서대로 처리되는 공정성이 있고 다음 처리해야 할 프로세스와 관계없이 응답 시간을 예상할 수 있으며 선점 방식보다 스케쥴러 호출 빈도가 낮고 문맥 교환에 의한 오버헤드가 적다.
배치(일괄처리) 시스템에 적합하지만 다른 프로세스가 무조건 기다려야해서 처리율이 떨어진다.

스케줄링 종류

  • FIFO(First In Fisrt Out)
  • SJF(Shortest Job First)
  • HRRN(Highest Response Ratio Next)

선점형 스케줄링

어떤 프로세스가 CPU를 할당받아 실행중에 있어도 다른 프로세스가 실행 중인 프로세스를 중지하고 CPU를 강제로 점유할 수 있다.
모든 프로세스가 CPU 사용 시간을 동일하게 부여받아 빠른 응답시간을 요구하는 시분할 시스템에 적합하며 긴급한 프로세스를 제어할수 있다.
운영 체제가 CPU 자원을 선점하고 있다가 각 프로세스의 요청이 있을 때 특정 요건들을 기준으로 자원을 배분하는 방식이다.

스케줄링 종류

  • RR(Round Robin)
  • SRTF(Shortest Remaining-Time First)
  • 다단계 큐
  • 다단계 피드백 큐
  • RM(Rate Monotonic)
  • EDF(Earlist Deadline First)

간단히 정리하자면 배치 처리나 I/O 시간이 크다면 비선점형을 사용하고
여러 프로세스를 골고루 사용하고 특정 프로세스를 먼저 처리해야한다면 선점형 스케줄링을 사용하면 될듯하다.

프로세스 제어 블록(PCB)

프로그램이 프로세스가 되면 프로세스만의 정보를 가져야하는데 이때 사용되는것이 프로세스 제어 블록이다. 프로그램이 메모리에 올라와 PCB(프로세스 제어 블록)을 얻어야 프로세스가 되는것이다.

구조는 다음과 같다.

  • 포인터 - PCB를 연결한다. Ready Queue나 Waiting Queue 구현에 사용된다.
  • 프로세스 상태 - 현재 Ready,Waiting,Block인지 나타낸다.
  • 프로세스 구분자 - PID, 운영체제 내에 여러 프로세스를 구분하기 위한 키값이다.
  • 프로그램 카운터 - PC, 다음 실행될 명령어의 위치를 가리킨다.
  • 프로세스 우선순위 - Ready Queue에서 Running 상태로 갈 우선순위.
  • 레지스터 정보 - 이전에 실행할 때 사용한 레지터의 값을 보관해야 다음에 실행할 수 있기에 프로세스가 실행되는 중에 사용하던 레지스터의 값을 저장한다.
  • 메모리 관련 정보 - 프로세스가 메모리의 어디에 있는지를 나타내는 메모리 위치 정보. 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등이 저장된다.
  • 할당된 자원 정보 - 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보.
  • 부모 프로세스 구분자와 자식 프로세스 구분자 - PPID,CPID. 모든 프로세스는 트리 구조이므로 부모와 자식의 ID를 갖고있는다.

문맥교환(Context switching)

Running 상태에서 빠져나가 다른 프로세스가 CPU를 점유하면 두 프로세스(실행중이던 프로세스, 앞으로 실행할 프로세스)의 PCB가 교환되는데 이를 문맥 교환이라고 한다. CPU 할당 시간을 모두 사용해 다시 Ready 상태로 가거나 인터럽트가 걸려 Waiting 상태로 갈때 발생한다.

profile
shining itself

0개의 댓글