3-1주차. 프로세스 관리

나우히즈·2024년 7월 12일

OS

목록 보기
4/27

파일 시스템 내에 실행파일 A -> 실행하면 메모리 상에 올라가서 "프로세스" 가 됨.

이 과정 중간에 Virtual memory 단계를 거치게 됨.
프로그램 만의 독자적인 주소 공간(address space) 생겨나는데 그걸 virtual memory 라고 함.
Virtual Memory: 프로그램이 사용하는 주소 공간을 물리적 메모리와 분리하여 관리하는 시스템. 이로 인해 프로그램은 자신만의 연속적인 주소 공간을 가짐.

각각의 프로그램들은 0x0부터 시작하는 자기만의 메모리 주소공간이 있다.
당장 필요한 부분은 물리적인 메모리 상에 올라가게 되고, 그렇지 않은 부분은 swap area에 올라가게 된다.

물리적인 메모리 상에 가상 메모리를 올리기 위해선, 주소 변환 과정이 필요하다.
주소 변환 과정은 운영체제와 하드웨어(MMU, Memory Management Unit)의 협력을 통해 이루어짐.

virtual memory의 address space는

code - data(데이터 저장 영역) - stack(로컬 변수, 함수 호출과 리턴에 대한 정보)

으로 구성이 된다!

  • 추가적으로 datastack 사이에 heap 영역이 존재하며, 동적 메모리 할당을 관리함.

  • PCB : 프로세스를 다루기 위해 존재.
  • data 영역에 컴퓨터의 하드웨어들을 다루기 위한 자료구조들이 존재.
  • stack 영역에 각 프로세스마다 별도의 커널 스택을 둔다. 커널의 스택이기 때문에 커널의 동작과 관련된 내용들을 담게됨.

사용자 프로그램이 사용하는 함수

함수(Function)

  • 사용자 정의 함수
    자신의 프로그램에서 정의한 함수
  • 라이브러리 함수
    자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
    자신의 프로그램의 실행 파일에 포함되어 있다.
  • 커널 함수
    운영체제 프로그램의 함수
    커널 함수의 호출 == 시스템 콜

사용자 정의 함수, 라이브러리 함수는 프로세스의 address space 상에 존재.
커널 함수는 커널 영역의 address space 상에 존재.

커널 함수(시스템콜)를 사용하기 위해선 CPU 제어권을 운영체제로 넘겨야해서 인터럽트를 발생하여야한다.
시스템콜을 부르는 것은 오버헤드가 큰 일이다.(유저모드 -> 커널모드 -> 유저모드)


프로세스의 개념

"Process is a program in execution"

  • 프로세스의 문맥(context): 프로세스의 상태를 나타낸다.
    1) CPU 수행 상태를 나타내는 하드웨어 문맥(CPU에서 프로세스의 주소공간 어디까지 수행했는가)
    - Program Counter
    - 각종 레지스터
    2) 프로세스의 주소 공간
    - code, data, stack
    3) 프로세스 관련 커널 자료구조
    - PCB(Process Control Block)
    - Kernel stack

운영체제는 프로세스의 context를 중요히 여김.

프로세스의 상태

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

  • Running
    CPU를 제어하면서 명령어를 실행하고 있는 프로세스를 running 상태라고 한다.
  • Ready
    다른 프로세스들은 CPU 사용을 위해서 큐에 대기중인 ready 상태라고 한다.
  • Blocked(wait, sleep)
    CPU를 주어도 당장 명령어를 수행할 수 없는(입출력 명령 수행중인 경우 등) blocked 상태.
  • New: 프로세스가 생성중인 상태
  • Terminated: 수행(execution)이 끝난 상태

운영체제는 PCB를 통해 프로세스가 어떤 상태인지를 일일히 확인.
자료구조 큐를 활용해 줄을 세워놓고 프로세스 처리를 진행함.
디스크에서 어떤 파일을 읽어오는 경우, 디스크 I/O 큐에 줄세우고 프로세스를 Blocked 상태에 두게 된다.

Process Control Block(PCB)

  • PCB
    운영 체제가 각 프로세스를 관리하기 위해 프로세스 당 유지하는 정보
    크게 4가지의 구성 요소를 가진다(구조체로 유지)
  1. OS가 관리상 사용하는 정보
  • Process state, Process ID
  • Scheduling information, priority
  1. CPU 수행 관련 하드웨어 값
  • Program counter, registers
    CPU 제어권을 잃기 전에 그때까지 작업한 명령어에 대한 context를 저장해둬야함.
  1. 메모리 관련
  • Code, data, stack 위치 정보
  1. 파일 관련
  • Open file descriptors...

문맥 교환(context switch)

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

문맥교환이 일어날때는 CPU를 뺏기는 프로세스의 문맥을 저장하고, 얻는 프로세스의 문맥을 복원하는 과정이 필요하다. 그 내용들이 운영체제가 보관하는 PCB에 담긴다!

  • 시스템콜이나 인터럽트 발생 시 반드시 context switch가 일어나는 것은 아님.

(1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save(CPU 레지스터 값 등)해야 하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 큼 모든 context 관련 정보를 저장해야함.

A -> B 로 스위칭 될때, 캐시 메모리 flush하는 작업이 오버헤드가 크다.

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

  • Job Queue
    : 현재 시스템 내에 있는 모든 프로세스 집합

  • Ready queue
    : 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합

  • Device queues
    : I/O device 처리를 기다리는 프로세스의 집합

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


스케줄러

운영체제 함수 또는 스케줄링을 하는 코드의 일부분.

장기 스케줄러: 어떤 프로세스를 ready queue로 보낼지 결정
단기 스케줄러: 다음에 실행할 프로세스를 결정
중기 스케줄러: 메모리에서 프로세스를 내보내거나 다시 불러오는 역할

  1. Long-term scheduler(Job scheduler, memory scheduler)
  • 시작한 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
  • 프로세스에 메모리같은 각종 자원을 주는 문제 처리
  • degree of multiprogramming을 제어 -> 메모리에 여러 프로그램이 올라가는 경우를 다룬다.
  • time sharing system에는 "보통 장기 스케줄러가 없음"(무조건 ready)

일반적으로는 장기스케줄러가 없어서 프로세스가 생성되면 곧바로 레디로 넘어간다.
장기 스케줄러가 있는 시스템의 경우, 처음 프로세스가 생성될 때 new -> ready 로 넘어간다. 그 때 new가 완료된 프로세스를 admitted해주는 것이 장기 스케줄러.

처음 프로세스가 시작 될 때 큐에 들어오도록 허락해주는 역할을 하는 게 장기 스케줄러.

장기스케줄러는 메모리 자원에 대한 관리.

  1. Short-term scheduler (CPU Scheduler)
  • 어떤 프로세스를 다음번에 러닝시킬지 결정
  • 프로세스에 CPU를 주는 문제.
  • 충분히 빨라야함. 또한 자주 호출됨 (ms 단위)
  1. Medium-Term scheduler(Swapper)
  • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
  • 프로세스에게서 메모리를 뺏는 문제. 일단 프로세스에 메모리를 다 주고, 부족해지면 메모리를 뺏어오는 식.
  • degree of Multiprogramming 을 제어
  • 보통 시스템에 장기 스케줄러의 역할을 대신한다.

중기 스케줄러가 들어오면서 추가적인 프로세스 상태가 생김.
-> Suspended(stopped)
: 외부적인 이유로 프로세스의 수행이 정지된 상태
프로세스는 통째로 디스크에 swap out 된다.
(예) 사용자가 프로그램을 일시 정지 시킨 경우(Ctrl + z)
시스템이 여러 이유로 프로세스를 잠시 중단시킴 (메모리에 너무 많은 프로세스가 올라와 있을 때)
-> 메모리를 다 뺏기고 디스크로 쫓겨남.

  • Blocked: 자신이 요청한 이벤트가 만족되면 ready
  • suspended: 외부에서 resume해 주어야 active.
    둘 다 CPU를 얻지 못하는 상황. 단 차이점은 프로세스가 시스탬 내부적으로 상태를 변경할 수 있는지 없는지에 달림.

0개의 댓글