운영체제

프로세스 관리

jwKim96 2022. 2. 23. 18:19

프로그램의 실행

image

  • 주소 변환(Address translation) : 가상 주소를 실제 주소로 변환하는 행위
    프로세스가 생성될 때는 물리 주소(Physical memory)에 생성되는데, 실제로 CPU는 가상 메모리(Virtual memory)를 통해 접근하기 때문에 주소 변환(Address translation)이 필요함
  • 프로세스의 주소 공간(Process Address space)
    • stack : 함수 내에서 사용되는 변수들
    • data : 전역 변수, 배열 등
    • code : 기계어 코드(main 함수, 사용자 정의 함수 등등)

커널 주소 공간의 내용

image

  • code 영역
    코드 영역에는 시스템콜로 인터럽트가 발생했을 때 어떤 함수들이 실행되어야 하는지커널 함수들이 저장됨
    ex)
  • data 영역
    • PCB : 프로세스들을 관리하기 위한 자료구조
    • 하드웨어 관리 영역 : CPU, Memory, Disk 등을 관리하기 위한 데이터를 저장하는 영역
  • stack
    사용자 프로그램이 시스템콜을 호출하면, 각 프로세스마다 할당된 커널 스택에서 시스템콜 함수들의 스텍프레임이 쌓임

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

  • 사용자 정의 함수
    • 자신의 프로그램에 정의해놓은 함수
  • 라이브러리 함수
    • 자신의 프로그램에 넣은 라이브러리의 함수
    • 컴파일 되면, 이 함수들도 프로세스의 코드 영역에 저장됨
    • 개발 단계에서는 남의 코드지만, 컴파일된 후 실행 단계에서는 내 코드와 함께 저장되어 사용됨
  • 커널 함수
    • 운영체제 프로그램의 함수
    • 커널 함수 호출 = 시스템 콜
      • 주로 하드웨어와 관련있는 작업 수행을 위해, 커널 함수를 사용자 프로그램이 부름

프로그램의 실행

image

사용자 프로그램을 실행 하다가 시스템콜을 호출하면, mode bit이 커널 모드로 변경된다.
커널 모드 에서는 커널 함수를 실행하고, 완료되면 다시 사용자 모드로 변경한 뒤 사용자 프로그램에 결과를 전달한다.

프로세스

프로세스의 문맥

문맥(Context) : 현재 어떤 상태인가

  • 하드웨어 문맥(CPU 실행 상태)

    • Program Counter : 다음에 어떤 명령(함수)를 실행해야 하는가
    • 각종 Register : 어떤 데이터들이 저장되어있고 계산되었는가
  • 프로세스의 주소 공간(code, data, stack)
    이 영역을 통해 다음과 같은 것들을 알 수 있습니다.

    • 어떤 함수를 실행했는가
    • 함수에 어떤 부분을 실행중인가 등등
  • 프로세스 관련 커널 자료구조

    • PCB(Process Control Block) : 각 프로세스의 PCB가 저장되는 영역
      프로세스의 현재 상태를 저장하는 영역으로 아래와 같은 정보들이 저장됩니다.

      • OS가 관리상 사용하는 정보
        • 상태 : 생성, 준비, 실행, 대기, 종료 상태를 저장
        • 프로세스 번호 : 프로세스 식별자(PID)를 저장
        • 메모리 제한 : 할당된 메모리에 대한 정보(페이지 테이블 등의 정보들이 포함됨)
        • 스케줄링 정보 : 운영체제의 프로세스 스케줄링 관련 정보
        • 우선순위 : 프로세스 작업 우선순위 정보
      • CPU 수행 관련 하드웨어 값
        • 프로그램 카운터 : 다음에 실행될 명령어 주소를 저장
        • 레지스터 : 레지스터에 저장되었던 정보들
      • 메모리 관련
        • 포인터 : 프로세스 현재 위치를 저장하는 포인터(code, data, stack의 위치정보)
      • 파일 관련
        • 열린 파일 목록 : 프로세스를 위해 열린 파일들의 목록이 저장됨
    • Kernal Stack : 프로세스가 커널을 사용할때 사용되는 커널 스택이 저장되는 영역

문맥 교환(Context Switch)

문맥 교환은 시스템콜 혹은 인터럽트가 발생하여, 현재 실행중인 프로세스가 다른 프로세스에게
CPU 제어권을 넘겨줘야할 경우 발생합니다.

제어권을 넘겨줄 때는 다음 과정을 수행합니다.

  1. 제어권을 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
  2. 제어권을 얻는 프로세스의 상태를 해당 프로세스의 PCB에서 읽어서 CPU에 갱신
    • 프로그램 카운터 : 다음 실행할 명령
    • 레지스터 : CPU 레지스터에 저장되어있던 값들

image

하지만, 인터럽트나 시스템콜이 일어나면 무조건 문맥 교환이 일어나는것은 아닙니다.
물론 (1)의 경우도 운영체제에게 CPU 제어권을 넘겨주며 현재 상태의 일부를 PCB에 저장합니다.시스템콜 함수들도 결국 CPU의 PC나 레지스터를 사용해야 하기 때문입니다.
하지만 모든 정보를 저장하는 것이 아니기 때문에, 아예 다른 프로세스로 변경하는 것 보다는
부담이 적은 작업입니다.

그러나 다른 프로세스로 변경한다면, 현재 프로세스가 사용하던 캐시 메모리를 비워야 하는데
캐시 메모리에는 현재 프로세스의 페이지 테이블이 저장되어있습니다.
이를 비우고 다른 프로세스의 페이지 테이블을 불러오는 작업이 필요하기 때문에 오버헤드가 크다고 합니다.

프로세스 스케줄링

작업 큐

모든 프로세스들은 아래처럼 각 큐를 오가며 작업을 수행하게 됩니다.
각 큐는 연결리스트 구조로 되어있으며 PCB가 노드로 활용되는데요.
PCB의 포인터는 다음 프로세스의 PCB를 가리키는 형태로 큐를 구성하게됩니다.

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

  • Ready queue
    현재 메모리 내에 있으면서, CPU의 제어권만 주어지면 바로 실행 가능한 프로세스의 집합

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

image

스케줄러

프로세스 스케줄링을 하는 주체는 운영체제 입니다.

  • 장기 스케줄러(Job Scheduler)

    • 시작 프로세스 중 어떤 것들을 Reqdy queue로 보낼것인지 결정합니다.
    • 프로세스에 자원(memory 등)을 얼마나 할당할지 결정합니다.
  • 단기 스케줄러(CPU Scheduler)

    • CPU를 어떤 프로세스에게 얼마나 할당할지를 결정합니다.
    • millisecond 단위로 동작하며 스케줄링을 함
  • 중기 스케줄러(Swapper)
    time sharing system과 같은 시스템에는 보통 장기 스케줄러가 없습니다.
    이러한 시스템이 메모리에 여유공간 마련을 위해 디스크의 스왑 영역으로 현재 프로세스를
    이동시키는 작업을 수행합니다.

프로세스의 상태

image

  • New(생성) : 프로세스가 생성되는중인 단계
    • Ready(준비) : CPU 제어권만 넘겨주면 바로 실행할 수 있는 상태(메모리에 할당된 상태)
    • Running(실행) : CPU 제어권을 넘겨받아 기계어를 실행하는 단계
    • Blocked(Waiting, Sleep)
      I/O로 인해 blocked 상태, 작업이 끝나면 Ready 상태로 변경됨
      자신이 요청한 작업이 끝나면 Ready가 됨
    • Suspended(Stopped)
      외부적인 이유로 프로세스 수행이 정지된 상태
      프로세스는 통째로 디스크에 Swap out됨
      외부에서 재개시켜줘야함
  • Terminated(종료) : 종료되는중인 단계

Thread

스레드는 프로그램의 기본 단위 입니다.
모든 프로세스는 최소 하나 이상의 스레드를 가지게 됩니다.

  • 스레드의 구성

    • Register
      • FP(Frame Pointer) : 스택 프레임을 가리키는 포인터
      • SP(Stack Pointer) : 현재 스택의 상단을 가리키는 포인터
      • PC(Program Counter) : 실행할 명령어의 주소를 저장하는 레지스터
    • Stack space
  • 스레드간 공유하는 부분

    • code 영역
    • data 영역
    • OS resources

멀티 스레드

프로그램에서 동시에 여러가지 작업을 실행해야할 때, 멀티 프로세스로 실행하게 되면
code, data 영역을 각각 사용하게되어, 메모리를 비효율적으로 사용합니다.
그리고 이 때문에 프로세스간 문맥 교환에도 상대적으로 오버헤드가 큰 단점이 있습니다.

하지만 멀티 스레드로 작업하게 되면, 모든 스레드가 공유하는 부분 이외에 대해서만
문맥 교환이 일어나게 되어 상대적으로 오버헤드가 크지 않습니다.