[CS] 프로세스

집중맞은 도둑력·2024년 3월 20일

CS

목록 보기
4/10
post-thumbnail

현재 포스트는 이후에 습득한 지식으로 인해 내용이 추가, 수정, 삭제될 수 있음

0. 🔖 목차


  1. 🔄️ 프로세스 생명주기
    1-1. 프로세스의 상태(Status)와 상태변화
    1-2. 대기 큐(Waiting Queue)
  2. 💿 프로세스 메모리
    2-1. 메모리 구조
    2-2. 커널 프로세스의 메모리

1. 🔄️ 프로세스 생명주기


1-1. 프로세스의 상태(Status)와 상태변화

  • 신규: 프로세스가 이제 막 메인메모리에 올라온 상태
  • 준비: 변수 초기화 등 기초 준비작업을 모두 마치고 수행을 기다리는 상태
  • 수행: CPU가 실제로 프로세스를 수행하고 있는 상태
  • 대기: 수행 도중 I/O 작업이 필요하여 I/O 작업을 수행하는 상태
  • 종료: 최종적으로 프로세스가 종료된 상태, 사용하던 메모리 영역이 해제됨

수용

신규 프로세스가 실행을 위해 준비 큐로 올라가는 동작

디스패치(Dispatch)

준비 큐에 있던 프로세스가 스케쥴러를 통해 발송(Dispatch)되는 동작

시분할 시스템에서 이전에 진척도가 있었던 프로세스의 레지스터 정보를 다시 꺼내서 현재 레지스터에 할당하는 프로그램을 Dispatcher라고 함

인터럽트(interrupt)

선점 스케줄링, 시분할, 과부하 등으로 인하여 수행 단계에서 준비 단계로 보내지는 동작

위 3가지 경우 외에는 거의 일어나지 않음

시분할 시스템에서 실행하던 프로세스를 다시 메모리로 보낼 때 직전까지의 레지스터 결과(PC, SP 등)들을 같이 저장함(다시 불러왔을 때 원래 했던 부분부터 다시 시작)

입출력 이벤트

프로세스 수행 도중 I/O 이벤트가 필요하여 I/O를 기다리는 대기 상태로 가기 위한 동작

대기 상태 진입시 CPU를 반환하고 이벤트가 끝나면 준비 상태로 진입한다.

종료

최종적으로 프로세스가 종료된 상태

1-2. 대기 큐(Waiting Queue)

각 상태에 진입할 때 보다 더 효율적인 처리를 위해 3가지의 큐가 존재한다.

Job Queue

HDD에 있던 프로그램들이 메모리에 올라올 때 메인 메모리가 가득 찼거나 CPU가 다른 작업을 수행 중이라면 메모리에 올라오기 전에 HDD의 프로그램들이 잠시 기다리는 곳

Job Queue의 프로그램들을 어떤 순서로 메모리에 올릴 것인지 결정하는 Job Scheduler가 존재함.

해당 스케줄러는 프로그램이 새로 시작될 때, 메인메모리가 가득찬 경우 등의 상황에만 실행되기 때문에 자주 일어나지 않아서 Long Term Scheduler라고 부름

Ready Queue

메모리에 올라온 프로세스들이 실행을 위해 대기하는 곳

Ready Queue의 프로세스들을 어떤 순서로 서비스 할 것인지에 대한 스케줄러가 존재함.

시공유 시스템의 경우 Context Switching은 1초에도 수십번에서 많게는 수백번도 일어나기 때문에 이러한 스케줄러를 Short Term Scheduler라고 부름

Device Queue

각각 I/O 장치들은 각자의 대기 큐를 가지고 있는데, 이러한 I/O 장치들의 큐들을 통틀어서 Device Queue라고 부름

마찬가지로 각각 장치들의 대기 큐를 관리하는 스케줄러를 통틀어서 Device Scheduler라고 함

Midium Term Scheduler

Swapping을 결정하는 Scheduler

메모리를 효율적으로 활용하기 위해 장시간 동작이 없는 프로세스는 메모리에서 잠시 HDD로(Swap Out) 내려놓고 프로세스 사용자가 돌아오면 다시 HDD에서 메모리에 올리는(Swap In)할 수 있음

2. 💿 프로세스 메모리


2-1. 메모리 구조

코드 영역(Code)

실행할 프로그램의 코드들을 저장

CPU가 이곳의 명령어를 한 줄 씩 읽어 실행함

데이터 영역(Data)

초기화된 전역 변수와 정적 변수를 저장

프로그램이 실행될 때 할당되는 곳, 프로그램의 수명 동안 유지됨.

이미 크기가 결정되어 변하지 않는 변수들이 할당됨(전역 변수, static 변수)

BSS 영역(Block Started by Symbol):

초기화되지 않은 전역 변수와 정적 변수를 저장

스택 영역(Stack)

함수 호출 및 지역 변수와 같은 임시 데이터를 저장

함수가 호출될 때마다 스택에 새로운 프레임이 생성되고, 함수가 반환될 때 스택에서 제거됨

컴파일 시 stack 영역의 크기가 결정되기 때문에 무한정 할당 할 수 없음

결정된 stack 영역을 초과할정도로 함수와 지역 변수가 선언되면 stack overflow가 발생

힙 영역(Heap)

동적으로 할당된 데이터를 저장

메모리 주소 값에 의해서만 참조되고 사용되는 영역, 따라서 프로그램이 동작 하면서(런타임) 크기가 결정

동적으로 크기가 조절되는 자료형(python의 리스트, 딕셔너리 등)과 객체, 동적 메모리 할당(C/C++의 malloc(), new 등)은 모두 힙에 할당됨

이렇게 할당된 데이터중 사용하지 않는 데이터를 정리하는 작업을 Garbage Collector가 수행

2-2. 커널 프로세스의 메모리

커널은 OS의 필수 구성 요소중 하나로 프로세스와 하드웨어의 인터페이스 역할을 한다.

프로세스이기 때문에 다른 프로세스와 똑같이 메모리의 한 공간을 할당받으나 예외적으로 힙 영역이 존재하지 않는다.

코드 영역

코드 영역에는 커널이 동작하기 위한 코드(시스템 콜, 인터럽트, 자원 관리 등)가 저장되어있다.

시스템 콜은 프로세스가 커널의 기능인 하드웨어 사용(파일 읽기, 프로세스 생성 등)을할 수 있게 하는 인터페이스다.

데이터 영역

데이터 영역에는 PCB(Process Controll Block)라는 자료구조가 저장되어있는데 이는 각 프로세스에 대한 다양한 정보를 담고 있는 데이터로 PC, Register, MMU 정보, Process의 상태, CPU Time, PID(Process ID)등 많은 정보들이 포함되어있다.

PCB는 OS내부의 Process Management 부서에서 관리된다.

스택 영역

프로세스가 커널의 기능을 사용할 때 스택 영역에 메모리를 할당할 일이 생기면 프로세스 자신의 스택 영역이 아닌 커널의 스택 영역을 사용한다.

profile
틀린_내용이_있다면_말해주세요.

0개의 댓글