[OS] Process(프로세스)

뚜비·2023년 6월 9일
1

OS

목록 보기
3/4

Process(프로세스)

  • 컴퓨터에서 실행되고 있는 프로그램
  • CPU 스케쥴링의 대상이 되는 작업(task) 라는 용어와 같은 의미로 쓰임

🤔 Program VS Process

  • Program
    : HDD/SDD(disk)의 파일에 저장된 수동 명령 모음
    EX) 크롬 프로그램(chrome.exe)과 같은 실행 파일

  • Process
    : Program이 disk에서 memory(RAM)로 로드된 후 해당 명령을 실행하는 것(실행 중인 프로그램)
    : Program으로부터 인스턴스화된 것
    : 이후 OS의 CPU 스케쥴러에 따라 CPU가 프로세스를 실행시킴
    EX) 크롬 프로그램을 두 번 클릭하면 크롬 '프로세스'가 시작

프로세스와 컴파일 과정

  • 프로그램
    : 컴파일러가 컴파일 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일이 되는 것

🤔 잠깐
여기서 프로그램은 C언어 기반(컴파일 언어)의 프로그램을 의미
인터프리터 언어(파이썬 등)로 된 프로그램과 다름
→ 인터프리터 언어로 된 프로그램은 별도의 컴파일 과정 없이 한 번에 한 줄씩 읽어들여서 실행

🤔 잠깐 프로그램의 컴파일 과정

  • 전처리 : 소스 코드의 주석을 제거하고 #include 등 헤더 파일을 병합하여 매크로를 치환
  • 컴파일러 : 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환
  • 어셈블러 : 어셈블리어는 목적 코드(object code)로 변환, 확장자는 운영체제마다 다름 (EX. 리눅스 : .o)
  • 랑커 : 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드를 결합하여 실행 파일 만듬(확장자는 .exe 혹은 .out)
  • 정적 라이브러리와 동적 라이브러리
    : 정적 라이브러리는 프로그램 빌드라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
    → 시스템 환경 등 외부 의존도가 낮음, 코드 중복 등 메모리 효율성 떨어짐
    : 동적 라이브러리는 프로그램 실행필요할 때만 DLL(Dynamic-link library)이라는 함수 정보를 통해 참조하는 방식
    → 메모리 효율성, 외부 의존도 높아짐


프로세스의 상태

프로세스는 실행되면서 상태가 변한다. 이름은 임의적이고 운영체제마다 변한다.

생성 상태(create)

  • 프로세스가 생성 중이다.
  • fork() 또는 exec() 함수를 통해 생성
  • PCB 할당

🤔 잠깐

  • fork()
    부모 프로세스의 주소 공간을 그대로 복사, 새로운 자식 프로세스를 생성하는 함수
    주소 공간만 복사할 뿐 부모 프로세스의 비동기 작업 등을 상속하지 않음
  • exec()
    새롭게 프로세스를 생성하는 함수

대기 상태(ready)

  • 프로세스가 처리기에 할당되기를 기다린다.
  • 메모리 공간이 충분하면 메모리 공간을 할당받고, 아니면 아닌 상태로 대기
  • CPU 스케쥴러로부터 CPU 소유권이 넘어오기를 기다리는 상태

대기 중단 상태(ready suspended)

  • 메모리 부족으로 일시 중단된 상태

실행 상태(running)

  • 명령어들이 실행되고 있다.
  • CPU 소유권과 메모리를 할당받고 명령어(instructions)을 수행 중
  • CPU burst가 일어났다고도 표현

중단 상태(blocked)

  • 프로세스가 어떤 이벤트(입출력 완료 또는 신호의 수신 같은)가 일어나기를 기다린다.
  • 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
  • I/O 디바이스에 의한 인터럽트로 인해 많이 발생 EX) 프린트 인쇄 버튼을 눌렀을 때 프로세스가 잠시 멈춘 듯한 현상

일시 중단 상태(blocked suspended)

  • 대기 중단과 유사
  • 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태

종료 상태(terminated)

  • 프로세스의 실행이 종료
  • 메모리와 CPU 소유권을 모두 놓고 가는 상태
  • 비자발적 종료(abort: 부모 프로세스가 자식 프로세스를 강제시키는 종료)도 존재

    🤔 언제?
    자식 프로세스에 할당된 자원의 한계치를 넘어섬
    부모 프로세스가 종료
    사용자가 process.kill 등 여러 명령어로 프로세스를 종료할 때



프로세스의 메모리 구조

운영체제는 프로세스에 적절한 메모리를 할당하는데 다음 구조를 기반으로 한다.

  • text 및 data 영역은 프로그램 실행 시간 동안 크기가 변하지 않는다.
  • stack과 heap은 프로그램 실행 중에 동적으로 줄어들거나 커질 수 있다.

Stack

  • 함수를 호출할 때 임시 데이터 저장장소(ex. 함수 매개변수, 복귀 주소 및 지역 변수)
  • 지역변수, 매개변수, 함수가 저장
  • 컴파일 시에 크기가 결정되며 '동적'인 특성을 가짐
  • 재귀적으로 호출(함수가 함수를 호출)하면서 동적으로 크기가 늘어날 수 있음
    → 힙과 스택의 메모리 영역이 겹쳐질 수 있으니 충분한 공간 확보 필요

Heap

  • 프로그램 실행 중에 동적으로 할당되는 메모리
  • 동적 할당 할 때 사용
  • 런타임 시 크기가 결정되며 '동적'인 특성을 가짐
    EX) vector와 같은 동적 배열은 heap에 동적 할당

Data(BSS segment+Data segment)

  • 전역 변수(초기화된 global data)
  • 전역변수, 정적변수가 저장
  • 정적인 특징을 갖는 프로그램이 종료되면 사라지는 변수가 들어 있는 영역
  • BSS segment : 초기화 되지 않은 변수가 0으로 초기화되어 저장
  • Data segment : 0이 아닌 다른 값으로 할당된 변수들이 저장

Text(code segment)

  • 실행 코드
  • 프로그램에 내장되어 있는 소스 코드가 들어감
  • 수정 불가능한 기계어로 저장


PCB(Process Control Block)

  • 프로세스에 연관된 메타데이터를 저장한 '데이터'를 말한다.
  • 각 프로세스는 운영체제에서 PCB(프로세스 제어 블록 혹은 태스크 제어 블록)에 의해 표현된다.
    → 프로세스가 생성되면 운영체제는 해당 PCB를 생성

🤔 잠깐 메타데이터란?

  • 데이터에 관한 구조화된 데이터이자 데이터를 설명하는 작은 데이터
  • 대량의 정보 가운데에 찾고 있는 정보를 효율적으로 찾아내서 이용하기 위해 일정한 규칙에 따라 콘텐츠에 대해 부여되는 데이터

✅ 따라서..

  1. 프로그램이 실행
  2. 프로세스가 생성
  3. 프로세스 주소 값들에 메모리 할당(스택, 힙 등의 구조를 기반)
  4. 이 프로세스의 메타데이터들이 PCB에 저장되어 관리(커널 스택의 가장 앞부분에서 관리)

PCB의 구조

메타데이터설명
프로세스 스케쥴링 상태'ready', 'waiting' 프로세스가 CPU에 대한 소유권을 얻은 이후 또는 이후 경과된 시간과 같은 기타 스케쥴링 정보
프로세스 ID프로세스 ID, 해당 프로세스의 자식 프로세스 ID
프로세스 권한컴퓨터 자원 또는 I/O 디바이스에 대한 권한 정보
program counter(PC)프로세스가 실행해야 할 다음 명령어의 주소에 대한 포인터
CPU registers프로세스를 실행하기 위해 저장해야 할 레지스터에 대한 정보
CPU scheduling informationCPU 스케쥴러에 의해 중단된 시간 등에 대한 정보
Accounting information(계정 정보)프로세스 실행에 사용된 CPU 사용량, 실행한 유저의 정보
I/O status information(I/O 상태 정보)프로세스에 할당된 I/O 디바이스록

Context Switching(컨텍스트 스위칭)

  • PCB를 교환하는 과정
  • CPU가 다른 프로세스로 전환할 때, 운영체제는 context switching을 통해 이전 프로세스의 상태를 저장하고 새 프로세스에 대해 저장된 상태를 로드한다.
  • 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생

🤔 잠깐 여러 프로그램이 동시에 실행되는 거 아니었어?

  • 많은 프로세스가 동시에 구동되는 것처럼 보이는 것은 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문
  • 동시에 실행하는 것처럼 보여도 어떤 시점에서 실행되고 있는 프로세스는 단 한 개임
  • 참고)
    현대 컴퓨터는 멀티코어의 CPU를 가지기 때문에 한 시점에 한 개의 프로그램이라는 말은 틀린 설명이나, 컨텍스트 스위칭을 이야기 할 때는 싱글 코어를 기준으로 설명하겠어요


1. 한 개의 프로세스 A가 실행하다 멈춤
2. 프로세스 P0의 PCB를 저장하고 프로세스 P1을 로드하여 실행
3. 다시 프로세스 P1의 PCB를 저장하고 프로세스 P0의 PCB를 로드함

비용 1. 유후 시간(idle time)

  • 컨텍스트 스위칭이 일어날 때 유후 시간이 발생

비용 2. 캐시미스(cache miss)

  • 컨테스트 스위칭이 일어날 때 이전의 프로세스가 가지고 있는 메모리 주소가 그대로 있으면 잘못된 주소 변환이 생김
  • 기존의 캐시 메모리에 저장되어 있던 데이터들은 cache clear 과정을 겪게 되고 이 때문에 cache miss가 발생
  • 스레드에서 컨텍스트 스위칭이 일어나지만 스택 영역을 제외한 모든 메모리를 공유하기 때문에 비용이 더 적고 시간도 더 적게 걸림


멀티프로세싱

  • 여러 개의 프로세스, 즉 멀티프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것
  • 하나 이상의 일을 병렬로 처리 가능
  • 특정 프로세스의 메모리, 프로세스 중 일부에 문제가 발생되어도 다른 프로세스를 이용해서 처리할 수 있어 신뢰성이 높은 강점이 있음

웹 브라우저의 멀티프로세스 구조

  • Browser Process : 주소 표시줄, 북마크 막대, 뒤로 가기 버튼, 앞으로 가기 버튼 등을 담당, 네트워크 요청이나 파일 접근 같은 권한을 담당
  • Renderer Process : 웹 사이트가 '보이는' 부분의 모든 것을 제어
  • GPU Process : GPU를 이용해 화면을 그리는 부분을 제어
  • Plugin Process : 웹 사이트에서 사용하는 플러그인을 제어

IPC(Inter Process Communication)

  • 멀티프로세스는 IPC가 가능
  • IPC란 프로세스끼리 데이터를 주고받고 공유 데이터를 관리하는 메커니즘
  • 메모리가 완전히 공유되는 스레드보다는 속도가 떨어짐

🤔 예시) 클라이언트와 서버
클라이언트 : 데이터를 요청
서버 : 클라이언트 요청에 응답하는 것

  • IPC의 종류
    공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메시지 큐

공유 메모리(shared memory)

  • 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어 프로세스가 서로 통신할 수 있도록 공유 버퍼를 생성하는 것
  • 각 프로세스의 메모리를 다른 프로세스가 접근할 수 없지만 공유 메모리를 통해 여러 프로세스가 하나의 메모리를 공유할 수 있음
  • IPC 방식 중 가장 빠르다
    : 매개체를 통해 데이터를 주고 받는 것이 아니라 메모리 자체를 공유하기 때문에 불필요한 데이터 복사 오버헤드가 발생하지 않음
  • 같은 메모리 영역을 여러 프로세스가 공유하므로 동기화 필요

파일

  • 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터
  • 이를 기반으로 프로세스 간 통신

소켓

  • 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터를 의미
  • TCP와 UDP가 있음

익명 파이프(unnamed pipe)

  • 프로세스 간에 파이프(FIFO 방식으로 읽히는 임시 공간)를 기반으로 데이터를 주고 받음
  • 단방향 방식의 읽기 전용, 쓰기 전용 파이프를 만들어서 작동하는 방식
  • 부모, 자식 프로세스 간에만 사용 간으 다른 네트워크 상에서는 사용 불가

명명된 파이프(named pipe)

  • 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 (명명된) 단방향 또는 이중 파이프
  • 클라이언트/서버 통신을 위한 별도의 파이프를 제공하며, 여러 파이프를 동시에 사용할 수 있음
  • 컴퓨터 프로세스 간 뿐만 아니라 다른 네트워크 상 컴퓨터와도 통신 가능


하나의 파이프 서버 당 하나의 클라이언트 파이프

하나의 서버 파이프 인스턴스에 여러 개의 클라이언트 파이프


메세지 큐

  • 메시지를 큐(queue) 데이터 구조 형태로 관리하는 것
  • 커널에서 전역적으로 관리
  • 사용 방법이 직관적이고 간단, 사용방법이 간단함
  • 공유 메모리를 통해 IPC를 구현하면 쓰기 및 읽기 빈도가 높으면 동기화 땜누에 긴으을 구현하는 것이 매우 복잡해져서 대신 메시지 큐를 사용하기도 함


참고자료

면접을 위한 CS 전공지식노트
operating system concepts 10th
Process (computing)
What is a Process in Operating System and what are the different states of a Process?
context switching과 cache memory
최신 브라우저의 내부 살펴보기 1
Using Named Pipes
메세지 큐

profile
SW Engineer 꿈나무 / 자의식이 있는 컴퓨터

0개의 댓글