[Computer Lesson] Process(1) - What is Process?

먹보·2023년 4월 7일
1

MUK_BO's Computer Lesson

목록 보기
4/4

이번 게시글에서는 프로세스와 멀티 프로세스 그리고 스레드와 멀티스레드 관련 이야기의 첫 시작인 프로세스란 무엇인가에 대해서 다두려고 합니다.

프로그래밍을 배우지 않은 사람도 프로세스에 대해서는 한 두번은 들어봤을 법하고 게임을 하는 청소년들도 알게 모르게 CTRL + ALT + DEL 버튼을 누르면서 작업 관리자에서 하고 있던 작업을 강제 중단해본 경험이 한 두번은 있을 것이다.

오늘은 이 게시글에서 그런 프로세스에 관련된 지식을 잠깐 다루고 다음 게시글에서는 멀티프로세스를 그리고 그 이후에는 스레드와 멀티스레딩에 대해서 다루게 될 것 같다.

✍ Process란?

프로세스는 컴퓨터에서 실행 중인 프로그램의 인스턴스(instance) 또는 실체(entity)를 의미합니다. 즉, 컴퓨터에서 실행 중인 프로그램은 모두 프로세스로 볼 수 있습니다. 각 프로세스는 독립적으로 실행되며, 운영체제(OS)에서는 각 프로세스에 대한 자원 및 우선순위를 관리합니다.

좀 다르게 표현해보자면, 프로세스는 프로그램으로부터 인스턴스화된 것을 가리킨다고 보면 될 것 같다. 그렇기에, 프로그램과 프로세스는 다른 개념이지만 프로그램을 실행시키면 프로세스가 생성된다.

📝 Program -> Process

우선, 어떤 방식으로 프로그램이 프로세스가 되는 것인지 알기 위해 전반적인 과정을 적어본다. 하지만 아직 다루지 않은 부분도 포함되어 있기에 '아 이런 것이 있구나'라는 것만 알고 간단히 짚고 넘어갈 예정이다.

  1. 프로그램이 작성됩니다. 이 과정에서 개발자는 소스 코드를 작성하고, 이를 컴파일러나 인터프리터를 사용하여 컴퓨터가 이해할 수 있는 기계어로 변환합니다.

  2. 컴파일된 코드나 인터프리터에 의해 해석된 코드가 실행됩니다. 이때 실행 파일이 메모리에 로드됩니다.

  3. 실행 파일이 메모리에 로드되면, 운영체제는 이를 프로세스라는 개체로 추상화합니다. 이때 운영체제는 프로세스의 식별자(PID), 메모리 영역, 실행 상태 등의 정보를 관리합니다.

  4. 운영체제는 프로세스에게 CPU 시간을 할당합니다. 이를 스케줄링이라고 합니다.

  5. 프로세스는 CPU를 사용하여 자신이 수행해야 할 작업을 처리합니다.

  6. 프로세스가 작업을 수행하는 동안, 운영체제는 이를 관리합니다. 이때 프로세스가 필요로 하는 자원(예: 메모리, 파일, 네트워크 등)을 할당하고, 다른 프로세스와의 충돌을 막기 위해 상호작용을 제어합니다.

  7. 프로세스가 작업을 완료하면, 운영체제는 해당 프로세스를 종료시킵니다. 이때 해당 프로세스가 사용하던 자원들은 운영체제에 반환됩니다.

📝 Program Compile 과정

위 과정을 살펴보면, 크게 컴파일, 메모리 로드, 스케쥴링, 관리, 그리고 종료로 나눌 수 있을 것 같은데 가장 기본적인 컴파일 과정에 대해서 다뤄보려고 한다.

  1. 전처리: 소스 코드 파일의 주석을 제거하고 전처리 지시문(#include, #define 등)등 헤더 파일을 벙합하여 매크로를 처리합니다.

  2. 컴파일러: 전처리기로 처리된 소스 코드를 오류 처리, 코드 최적화 작업을 하며 어셈블리어 또는 기계어로 번역합니다.

  3. 어셈블러: 어셈블리어로 작성된 파일을 바이너리 파일로 변환합니다. 이 때 OS에 따라 확장자가 다르게 적용됩니다.
    => 리눅스 : .o | 윈도우 : .obj

  4. 링커(Linker): 여러 개의 오브젝트 파일을 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 결합하여 실행 가능한 파일을 생성합니다 (예를들어, exe or .out 확장자)
    => 여기서 라이브러리는 '정적 라이브러리'와 '동적 라이브러리'로 나뉘는데...
    - 정적 라이브러리 : 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
    - 동적 라이브러리 : 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하는 방식

📝 Process의 상태

프로세스가 생성이 되고나서는 상태에 따라 관리를 다르게 진행하는데 이 때 상태들을 알아보자

  1. 생성 상태 (create) : 프로세스가 fork() 또는 exec() 함수를 통해 생성되며 이 때 PCB가 할당됩니다.

    • fork() : 말 그대로, 부모 프로세스의 주소 공간을 그대로 복사하며 새로운 자식 프로세스를 생성하는 함수
    • exec() : 새로운 프로세스를 생성하는 함수
  2. 준비 상태 (ready) : 프로세스가 실행을 기다리고 있지만 메모리 공간의 불충분과 같은 사유로 CPU 스케쥴러로부터 CPU 소유권을 할당받지 못한 상태입니다.

  3. 대기 중단 상태 (ready suspended) : 메모리 부족으로 일시 중단된 상태입니다

  4. 실행 상태 (running) : CPU를 할당받아 프로세스가 실행 중인 상태를 뜻하며 CPU burst가 일어났다고도 표현합니다.

  5. 중단 상태 (blocked) : 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태입니다. I/O 디바이스에 의한 인터럽트로 이런 현상이 많이 발생하기도 합니다.

  6. 일시 중단 상태 (blocked suspended) : 대기 중단과 유사한데 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 인해 일시 중단된 상태입니다.

  7. 종료 상태 (terminated) - 프로세스가 종료되었거나 종료될 예정인 상태입니다.

📝 Process의 메모리 구조

운영체제는 프로세스에 적절한 메모리를 할당하는데 이 때 동적 영역과 정적 영역으로 나뉘며 동적 영역에는 스택과 힙, 그리고 정적 영역에는 데이터와 코드 영역으로 나눠집니다.

✏️ 동적 영역

<스택>

스택에는 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정되며 '동적'입니다

스택 영역은 함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 늘어날 수 있는데, 이때 힙과 스택의 메모리 영역이 겹치면 안 되기 때문에 힙과 스택사이의 공간을 분리해야 합니다.

<힙>

힙(heap)은 프로세스의 동적 영역 중에서도, 데이터를 할당하고 해제하는 데 사용되는 영역입니다. 힙은 일반적으로 변수나 객체 등의 동적 메모리 할당에 사용됩니다. 힙 영역은 스택과 달리, 프로세스의 크기나 실행 시간에 따라 크기가 동적으로 변경될 수 있습니다.

힙에는 두 가지 중요한 함수가 있는데, 바로 malloc()과 free()입니다. malloc() 함수는 메모리를 할당하고, free() 함수는 할당된 메모리를 해제합니다. 이 두 함수를 통해 프로그램에서 필요한 만큼 메모리를 동적으로 할당하고 해제할 수 있습니다.

힙은 잘못된 사용으로 인해 메모리 누수(memory leak)와 같은 문제가 발생할 수 있으므로, 프로그래머는 메모리 할당/해제에 대한 주의를 기울여야 합니다.

✏️ 정적 영역

<데이터 영역>

전역 변수와 정적 변수를 저장하는 공간으로, 프로그램의 시작과 함께 할당되어 종료될 때까지 유지됩니다. 이 영역은 초기값을 지정할 수 있으며, 프로그램에서 읽고 쓸 수 있습니다.

이 때 데이터 영역은 BSS 영역과 Data 영역으로 나뉘는데

  • BSS 영역 : 초기화가 되지 않은 변수가 0으로 초기화 되어 저장됩니다.

  • Data 영역 : 0이 아닌 다른 값으로 할당된 변수들이 저장됩니다.

<코드 영역>

프로그램의 명령어가 저장되는 영역으로, 실행 파일의 실행 코드가 저장됩니다. 이 영역은 실행 파일의 메모리 맵에 의해 정해지며, 실행 파일이 로드될 때 할당됩니다. 코드 영역은 수정이 불가능합니다.

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글