프로세스와 스레드, 주소공간에 대한 이야기

JISU LIM·2023년 9월 30일
0

CS-Tech

목록 보기
9/16
post-custom-banner

🔴 프로세스가 무엇인가요?

  • 프로세스 란 실행을 위해 커널에 등록된 작업, 프로그램을 의미합니다.
  • 다음과 같이 정의할 수도 있습니다.
    • PCB를 할당 받은 프로그램
    • 각종 자원들을 요청하고 할당 받을 수 있는 능동적인 개체(Active Entity)

프로그램 vs 프로세스 vs 스레드

  • 프로그램(Program) / 작업(Job)
    • 저장 장치에 저장되어 있는 실행할 프로그램 + 데이터를 의미합니다.
  • 프로세스(Process)
    • 실행을 위해 시스템(커널)에 등록된 작업을 의미합니다.
    • 프로세스는 시스템 성능 향상을 위해 커널에 의해 관리 됩니다.
  • 스레드(Thread)
    • 스레드는 프로세스의 제어의 흐름을 의미하며 Light Weight Process(LWP)라고도 불립니다.
    • 프로세스 내에서 각 스레드는 제어 요소를 제외한 코드 영역, 전역 데이터, 힙 영역을 공유합니다.

PCB(Process Control Block)

  • PCB는 프로세스를 실행하는 데 필요한 정보를 보관하는 자료구조로, 메모리의 커널 영역(kernal space)에 생성됩니다.
  • OS는 PCB를 바탕으로 프로세스에 관리를 수행합니다.
  • 모든 프로세스는 고유의 PCB를 가지며, 프로세스 생성시 만들어지고 프로세스 종료시 폐기됩니다.
  • PCB는 아래와 같은 정보를 가집니다.
    • 포인터 : 프로세스 제어 블록을 연결해 준비 상태나 대기 상태의 큐를 구현할 때 사용합니다.
    • 프로세스 상태 : 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등으로 프로세스가 현재 어떤 상태에 있는지를 나타냅니다.
    • 프로세스 구분자 : 운영체제 내에 있는 여러 프로세스를 구별하기 위한 구분자를 저장합니다.
    • 프로그램 카운터 : 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값을 저장합니다.
    • 프로세스 우선순위 : 프로세스의 우선순위(중요도)로 CPU 스케줄러가 준비 상태에 있는 프로세스 중 실행 상태로 옮겨야 할 프로세스를 선택할 때 이 프로세스 우선순위를 기준으로 삼습니다.
    • 각종 레지스터 정보 : 다음에 실행할 때 사용하기 위해 이전에 실행할 때 사용한 레지스터의 중간값을 보관합니다.
    • 메모리 관리 정보 : 프로세스의 메모리 위치 정보, 메모리 보호를 위한 경계 레지스터 값과 한계 레지스터 값 등이 저장됩니다.
    • 할당된 자원 정보 : 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보가 저장됩니다.
    • 계정 정보 : 계정 번호, CPU 할당 시간, CPU 사용 시간 등에 대한 정보가 저장됩니다.
    • 부모 프로세스 구분자와 자식 프로세스 구분자 : PPID(Parent PID), CPID(Child PID)

TCB(Thread Controal Block)

  • PCB가 주로 프로세스 수준의 정보를 관리하는 데 사용된다면, TCB는 스레드 수준의 정보를 관리하는 데 사용됩니다.
  • TCB는 스레드의 상태, 레지스터 값, 스레드 고유 식별자, 스레드의 스케줄링 정보 등을 포함합니다.
  • 여러 스레드가 하나의 프로세스 내에서 실행될 때, 각 스레드마다 하나의 TCB가 생성되며, 스레드의 독립적인 관리와 스케줄링을 위한 정보를 담고 있습니다.

좀비 프로세스

  • 좀비 프로세스는 자식 프로세스가 상태를 알리지 않고 죽거나 먼저 죽는 경우이며, 좀비 프로세스 발생이 누적되면 전반적인 성능 저하를 일으킵니다.
  • 좀비 프로세스의 처리를 위해 자식 프로세스가 죽는 경우, 부모 프로세스가 자식 프로세스의 종료 상태를 회수할 수 있도록 커널이 자식 프로세스의 최소한의 정보를 남겨둡니다.
    • 이 때, 부모 프로세스는 wait 함수를 호출하여 이 상태를 회수할 수 있습니다. wait함수는 자식 프로세스의 종료 상태를 확인하고 해당 상태를 처리합니다.

고아 프로세스

  • 고아 프로세스는 부모 프로세스가 먼저 죽는 경우이며, 운영체제는 이러한 고아 프로세스를 허용하지 않습니다.
  • 이를 위해 부모 프로세스가 먼저 종료되면, 자식 프로세스의 새로운 부모 프로세스로 init(PID=1) 프로세스가 설정됩니다.
  • init(PID=1) 프로세스는 자식 프로세스가 종료될 때까지 기다린 후 wait 함수를 호출하여 고아 프로세스의 종료 상태를 회수하는 방법으로 고아 프로세스를 방지합니다.

데몬 프로세스

  • 데몬 프로세스란 운영체제에서 부팅시 자동으로 켜져 백그라운드에서 계속 실행되는 프로세스를 의미합니다.
  • 주로 서비스 제공, 특정 작업의 스케줄링, 네트워크 서비스 관리, 파일 시스템 관리 등과 같은 백그라운드 작업을 수행합니다.
    • ex) inetd, syslogd, crond, httpd 등

🟡 프로세스 주소 공간

  • 프로세스 주소 공간(Process Address Space)은 컴퓨터가 실행 중인 각 프로세스가 메모리에서 사용하는 공간을 의미합니다.
  • 하나의 프로세스는 메모리의 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됩니다.
    • 코드(Code) 영역
      • 실행할 수 있는 코드(기계어)로 이루어진 명령어가 저장되며, text 영역이라고도 합니다.
      • 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기 때문에 쓰기가 금지되어 있습니다.(읽기 전용 공간)
    • 데이터(Data) 영역
      • 전역변수와 같이 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간입니다.
      • 코드 영역과 데이터 영역은 코기가 고정된 영역이라는 점에서 정적 할당 영역이라고도 부릅니다.
    • 힙(Heap) 영역
      • 프로그래머가 직접 할당할 수 있는 저장 공간입니다.
      • 프로그래밍 과정에서 힙 영역 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 합니다.
      • 힙 영역은 실시간으로 그 크기가 변할 수 있기 때문에 동적 할당 영역이라고 부릅니다.
    • 스택(Stack) 영역
      • 매개 변수, 지역 변수 등 함수의 실행이 끝나면 사라지는 변수 등이 저장됩니다.

초기화 하지 않은 변수들이 저장되는 곳 : BSS 영역

  • 변수를 선언만 하고 초기화하지 않은 변수들은 데이터 영역(Data Segment)의 일부인 BSS(Block Started by Symbol) 섹션에 저장됩니다.
  • 이 섹션은 프로세스의 메모리 공간에서 초기화 되지 않은 전역 변수, 배열, 정적 변수 등을 저장하는데 사용됩니다.
  • 초기화 하지 않은 변수를 따로 구분하는 이유는 해당 변수들에는 값을 할당하지 않아도 되는 변수를 모아둠으로서 조금의 메모리 효율성을 확보하기 위함이라고 합니다. 다만 큰 차이는 없다고 합니다.

스택 영역과 힙 영역

  • 크기가 결정되는 시점
    • 스택 영역은 함수의 호출과 관계있는 지역 변수와 매개 변수가 저장되는 영역으로 컴파일 시간에 크기가 결정됩니다.
    • 힙 영역은 런타임에 동적으로 크기가 결정되는 메모리 영역입니다.
  • 접근 속도
    • 스택 영역은 CPU에 의해 효율적으로 관리되고, 메모리 단편화가 적게 일어나기 때문에 접근이 매우 빠릅니다. 또한, 스택에는 상대적으로 짧은 주기로 데이터가 추가 및 제거되므로 캐시 히트 확률이 높아 접근 속도가 빠릅니다.
    • 힙 영역은 동적으로 할당되고 해제되는 데이터의 저장 공간입니다. 힙은 메모리 관리자가 메모리 할당 및 해제를 담당하며, 할당된 메모리의 위치가 동적으로 결정됩니다. 이로 인해 힙 영역에 접근하려면 메모리 관리자를 통해 할당된 메모리의 주소를 찾아가야 하므로 접근 속도가 느립니다.
  • 각각 자료구조 Stack, Heap과 관련이 있을까?
    • 스택 영역의 동작은 LIFO(Last In First Out) 원칙에 따라 메모리의 함수 호출과 관련된 변수, 함수 호출 정보, 복귀 주소 등을 입출력하는 측면에서 자료구조의 Stack과 연관이 있습니다.
    • 힙 영역의 동작은 프로그램의 실행 중에 사용자에 의해 동적으로 할당되고 해제되는 방식으로 객체를 관리하는 특징이 있습니다. 자료구조의 Heap과는 연관이 없습니다.

🙏 본 개념의 정리에 대한 피드백과 질문은 환영입니다!

✏️ Tech Interview Study

본 개념의 다른 정리 및 피드백, 인터뷰 주제의 순서는 테크 인터뷰 스터디 Repository에서 확인 가능합니다.

📚 REFERENCE

블로그 - 좀비 프로세스와 고아 프로세스
티스토리 - 완전히 정복하는 프로세스 vs 스레드 개념
도서 - 쉽게 배우는 운영체제
도서 - 혼자 공부하는 컴퓨터구조 + 운영체제
유튜브 - [OS] Lecture 3. Process Management (1/2) / 운영체제 강의
유튜브 - [OS] Lecture 4. Tread management / 운영체제 강의
티스토리 - [Chapter 4. 스레드] 스레드, PCB와 TCB, 다중 스레드 모델
티스토리 - [운영체제] 좀비 프로세스, 고아 프로세스
티스토리 - Context Switching에서의 Thread와 Process의 관계 + PCB, TCB
티스토리 - Systemd란?
티스토리 - 좀비 프로세스와 고아 프로세스(Zombie process and Orphan process)
벨로그 - 리눅스 - 데몬Daemon
티스토리 - 프로세스(Process)의 주소공간(Address Space)
티스토리 - 프로세스 주소 공간에 대해 설명해주세요
벨로그 - [운영체제] 프로세스 주소 공간
티스토리 - 27. 프로세스 - IPC 기법(shared memory)
벨로그 - [운영체제] 프로세스 주소공간
티스토리 - [OS] 프로세스 주소 공간
티스토리 - 힙(Heap)과 스택(Stack)의 최대 할당 크기
벨로그 - 메모리 구조를 알아보자
티스토리 - 스레드의 공유자원 관리(동기화)
티스토리 - [OS] 프로세스 간 통신(Inter-Process Communication,IPC)
티스토리 - CS - 메모리 구조(feat.스택 Vs 힙
티스토리 - 스택과 힙 메모리 영역,Stack Heap Memory
티스토리 - #3 python의 메모리 할당과 관리

profile
Grow Exponentially
post-custom-banner

0개의 댓글