프로세스 & 스레드, CPU 스케줄링

msg016·2022년 6월 30일
1

CS Study

목록 보기
5/6

용어 정리

프로그램

컴퓨터에서 실행될 때 특정 작업(specific task)을 수행하는 일련의 명령어들의 모음(집합).

HDD나 SDD같은 보조기억장치에 저장된 사용자가 작성한 코드 또는 컴파일 된 결과물로 대부분의 프로그램은 사용자의 입력에 반응하도록 구현된 일련의 명령어들이 바이너리 형식으로 저장되어 있다.

프로세스

보조기억장치에 저장되어 있던 프로그램이 실행되어 리소스를 할당받아 주기억장치(메모리)에 올라온 것.

프로세서

하드웨어적 측면에서 컴퓨터 내에서 프로세스를 처리하는 유닛으로 일반적으로 중앙처리장치(CPU)를 칭한다.

동시성 / 병렬성

Concurrency & parallelism from Pithikos

  • 동시성(Concurrency)
    중복 되는 기간에 두 개 이상의 작업(task)이 시작되고, 실행되고, 완료되는 것. 실제로 작업들이 동시에 실행될 필요는 없다.
  • 병렬성(Parallelism)
    실제로 두 개 이상의 작업이 동시에 실행되는 것.

프로세스

현재 실행되고 있는 프로그램.

구조

Process Memory Structure from Operating System Concepts, 10th

프로세스는 크게 4가지 영역으로 구분되는 독립된 메모리를 할당받는다.
  • Text
    실행될 코드가 저장되는 영역.
  • data
    전역 변수가 저장되는 영역.
    초기화 여부에 따라 initialized와 uninitialized(bss)로 구분된다.
  • Heap
    프로그램이 실행되는 시점에 동적으로 할당되는 메모리.
  • Stack
    함수 매개변수, 지역변수, 리턴 주소 등 함수가 호출 될 때 임시적으로 저장되는 데이터 영역.

여기서 Text와 Data는 고정된 영역으로 실행 시점에 영역의 크기가 변하지 않으며, Stack과 Heap 영역은 동적 영역으로 줄었다 늘었다한다.
JavaScript나 Java같은 고수준 언어는 직접적으로 메모리 영역에 접근하지 않고 자동으로 메모리가 할당되며 필요하지 않을 때 자동으로 GC가 동작하여 메모리를 해제한다. Node JS의 경우 최대 heap 메모리 크기를 설정할 수 있으며, Heap 영역이 초과되면 out of heap memory 에러를, 너무 많은 재귀 함수 호출 등으로 Stack 영역이 초과되면 Maximum call stack size exceeded 에러가 발생된다.

상태

Diagram of process state from Operating System Concepts, 10th

프로세스는 실행과 함께 상태가 변하며, 프로세스의 상태는 해당 프로세스의 현재 활동에 의해 정의된다.
  • New
    프로세스가 생성됨.
  • Running
    명령이 실행되고 있음.
  • Waiting
    I/O 작업의 완료 또는 신호 수신 등의 이벤트를 기다리고 있음.
  • Ready
    프로세서 점유 대기.
  • Terminated
    프로세스 실행 완료.

PCB

Process Control Block from Operating System Concepts, 10th

운영 체제는 각각의 프로세스를 Process Control Block(PCB)로서 나타낸다.
PCB는 특정 프로세스의 관리가 필요한 정보들을 담고 있으며, 사용자가 접근 불가능한 메모리 영역에 존재한다.
일반적으로 CPU는 여러 프로세스를 계속 바꿔가며 실행하므로, 중단 후의 작업을 위해 이전의 작업 정보를 어딘가에 보관해야 한다. 이 정보를 저장하는 곳이 PCB이며, 프로세스의 상태, 프로세스 번호, 다음 실행할 명령문의 주소(program counter), 레지스터 값, 할당받은 I/O 디바이스 리스트 등이 저장된다.

스레드

멀티 스레드 프로세스 개념도 from heejeong Kwon

프로세스가 할당받은 자원을 이용하는 실행, 작업의 단위.

기본적으로 프로세스는 적어도 하나의 스레드(작업 흐름)을 가진다.
스레드는 프로세스 내에서 각각의 Stack 영역과 Register, Program Counter를 가지며, 나머지 영역은 공유한다. 즉, 한 프로세스 내부의 스레드는 독자적인 실행환경을 가지고 코드를 실행할 수 있으며, 다른 스레드들과 동일한 자원을 공유하여 읽고 쓰기가 가능하다.

참고

profile
프론트엔드 개발자 지망생

0개의 댓글