프로세스, 스레드, 네임 맹글링, 페이징, 세그맨테이션, 커널 힙 알고리즘, vector, 덱

뭐라구요·2023년 8월 14일
1

프로세스란?

프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다.

프로세스는 프로세스 기술자라고 부르는 자료구조에 저장되어 있다.(PCB) 이 자료구조는 크게 다음과 같은 정보를 담고 있다.

  • PID : 운영체제가 각 프로세스를 식별하기 위해 부여된 프로세스 식별번호
  • 프로세스 상태 : CPU는 프로세스를 빠르게 교체하면서 실행하기 때문에 실행중인 프로세스도 있고 대기 중인 프로세스도 있는데 그런 프로세스 상태를 저장한다.
  • 프로그램 카운터 : CPU가 다음으로 실행할 명령어를 가리키는 값이다. CPU는 기계어를 한 단위씩 읽어서 처리하는데 프로세스를 실행하기 위해 다음으로 실행할 기계어가 저장된 메모리 주소를 가리키는 값이다.
  • 스케줄링 우선순위 : 운영체제는 여러개의 프로세스를 동시에 실행할 수 있도록 하는데 운영체제가 여러 개의 프로세스가 CPU에서 실행되는 순서를 결정하는 것을 스케줄링이라고 한다. 이 스케줄링에서 우선순위가 높으면 먼저 실행될 수 있는데 이를 스케줄링 우선순위라고 한다.
  • 권한 : 프로세스가 접근할 수 있는 자원을 결정하는 정보다.
  • 프로세스의 부모와 자식 프로세스 : 최초로 생성되는 init 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 복제해서 생성되고 이 계층관계는 트리를 형성한다. 그래서 각 프로세스는 자식 프로세스와 부모프로세스에 대한 정보를 가지고 있다.
  • 프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터 : 프로세스는 실행중인 프로그램이다. 따라서 프로그램에 대한 정보를 가지고 있어야 한다. 프로그램에 대한 정보는 프로세스와 메모리에 가지는 자신만의 주소 공간에 저장된다. 이 공간에 대한 포인터값을 가진다.
  • 프로세스에 할당된 자원들을 가리키는 포인터

프로세스의 관리, 메모리 구조

운영체제는 프로세스들의 실행 사이에 프로세스를 교체하고 재시작할 때 오류가 발생하지 않도록 관리해야 하기에 운영체제는 프로세스의 상태를 실행, 준비, 블록 상태로 분류하고 프로세스들을 상태전이를 통해 체계적으로 관리한다.

프로세스는 code영역, data 영역, heap영역, stack 영역으로 존재하고 힙영역과 스택 영역 사이에는 빈 공간이 존재한다.

스레드

스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.

스레드를 사용하면 프로그램이 동시에 여러 가지 작업을 수행할 수있는데 예를 들어, 웹 브라우저에서는 사용자 인터페이스를 처리하는 스레드와 웹 페이지를 다운로드하는 스레드 등 여러 개의 스레드가 실행된다. 이렇게 여러 개의 스레드가 동시에 실행될 때는 각각의 스레드가 서로 독립적으로 실행되는 것처럼 보이지만, 실제로는 컴퓨터의 프로세서에서는 각각의 스레드가 번갈아가면서 실행된다.

스레드를 사용하면 프로그램의 성능을 향상시킬 수 있다. 예를 들어, 웹 서버에서는 각각의 요청에 대해 새로운 스레드를 생성하여 처리함으로써, 여러 클라이언트로부터 동시에 요청이 들어왔을 때도 모든 요청에 대해 빠르게 응답할 수 있다.

  • 스레드를 사용할 때 주의할 점은 스레드 간의 데이터 공유 문제나 스레드가 충돌하는 문제 등 다양한 문제가 발생할 수 있다.

프로세스와 스레드 차이

스레드는 프로세스와 달리, 수행방식에 있어서 부모 프로세스 전체의 복사본을 만들지 않고, 필요한 코드 덩어리 만을 생성하여 동시에 수행한다.
스레드들 모두가, 동일 프로그램으로 생성되나(동일 생성), 서로 독립되어 실행된다.(독립 실행)
주요 메모리 공간을 함께 공유한다.
따라서, 부모 스레드가 갖고 있는 모든 데이터를 완전하게 접근할 수 있기 때문에 효율적이고 메모리 제약이 있는 시스템에 널리 사용된다.

  • 과거 유닉스 시스템은 각 프로세스가 단 하나의 스레드로 만 구성되어있었지만 현대적 운영체제 대부분은 한 프로세스가 다중 스레드를 포함하여 지우너한다.

네임 맹글링이란?

네임맹글링은 주로 객제 지향 언어에서 클래스와ㅏ 메소드 이름을 실제 메모리 주소와 연결하기 위해 사용되는 기술로, 프로그래밍 언어가 내부적으로 사용하는 이름과 사용자가 작성한 코드에서 사용하는 이름 사이의 변화 과정을 의미한다.

예를 들어 클래스에 포함된 멤버 변수와 메소드의 이름을 그대로 메모리 주소와 연결하게 되면 서로 다른 클래스나 메소드들과 이름이 충돌할 수 있기 때문에 컴파일러나 인터프리터가 이러한 충돌을 방지하기 위해 클래스나 메소드를 이름을 변환하는 과정이다.

언어에 따라 다양한 방식으로 구현될 수 있는데 주로 컴파일러나 런타임 환경에서 내부적으로 처리된다.

페이징이란?

페이징은 RAM을 작은 고정 크기의 블록으로 나누고 프로세스의 가상 메모리 주소를 이러한 블록에 매핑하여 사용하는 방식을 말한다. 이 과정으로 더 효율적이고 유연한 메모리 관리가 가능해짐.

주로 다음과 같은 목적으로 사용된다.
1. 가상 메모리 관리 : 각 프로세스에게 독립된 가상 주소 공간을 제공하기 때문에 각 프로세스가 시스템의 실제 물리적 메모리를 접근하지 않고도 자신만으 메모리 공간을 가질 수 있게 한다.
2. 메모리 보호 : 각각의 의 페이지는 보안 및 접근 권한 정보와 함께 관리되어 서로 다른 프로세스의 메모리에 접근하는 것을 방지한다. 이를 통해 프로세스 간의 데이터 무단 접근이나 수정이 일어나지 않도록 보호할 수 있다.
3. 물리적 메모리 관리 : 페이징을 통해 메모리는 고정된 크기의 페이지로 분할되므로, 물리적 메모리의 효율적인 사용이 가능해진다. 이를 통해 메로리 단편화를 최소화하고 더 많은 프로세스를 동시에 실행할 수 있다.
4. 스왑 아웃 : 페이징을 이용하면 더 많은 프로세스가 메로리에 로드도리 수 있지만, 실제 물리적 메모리가 부족한 상황에서는 일부 페이지를 보조 기억 장치로 스왑아웃하여 메모리를 확보 할 수있다.

세그맨테이션이란?

세그멘테이션은 컴퓨터 메모리 관리 기술 중 하나이다. 이는 메모리를 서로 다른 크기의 논리적 블록, 즉 '세그먼트'로 나누어 관리하는 방법이다. 각 세그먼트는 특정 유형의 데이터나 코드를 나타내며, 각 세그먼트는 세그먼트 번호로 식별된다. 이 방식을 통해 다양한 크기의 데이터나 코드를 효율적으로 다룰 수 있다.
세그멘테이션은 주로 다음과 같은 목적으로 사용된다:
1. 가독성 : 프로그램을 작성할 때 다양한 크기와 유형의 데이터 또는 코드 블록을 쉽게 식별할 수 있도록 한다. 각 세그먼트는 그 목적에 따라 논리적으로 분리되어 있으며, 코드나 데이터의 목적을 파악하는 데 도움이 된다.
2. 메모리 보호: 각 세그먼트는 보안과 접근 권한 정보와 함께 관리된다. 이를 통해 프로세스 간에 메모리의 무단 접근을 방지하여 데이터 또는 코드의 보안을 보장할 수 있다.
3. 공유 : 세그멘테이션을 이용하여 여러 프로세스가 동일한 세그먼트를 공유하도록 할 수 있다. 이는 여러 프로세스 간에 데이터나 코드를 효율적으로 공유하는 데 도움이 된다.
4. 확장성 : 세그멘테이션을 통해 물리적 메모리 크기에 제한을 받지 않고도 논리적 메모리 공간을 확장할 수 있다. 새로운 세그먼트를 추가하여 더 많은 데이터나 코드를 관리할 수 있다.

커널 힙 알고리즘이란?

커널 힙 알고리즘은 운영체제의 커널 내에서 동적 메모리 할당 및 관리를 담당하는 방식이다. 이 알고리즘은 커널이 실행되는 동안 필요한 메모리 공간을 효율적으로 할당하고 관리하는 역할을 한다. 일반적으로 운영체제 내부에서 작동하기 때문에 안정성과 효율성이 중요하다.
커널 힙 알고리즘은 다양한 방식으로 구현될 수 있다. 그 중에서도 가장 일반적으로 사용되는 방식은 '버디 시스템'과 '슬래브 할당'이다.
1. 버디 시스템 : 이 방식은 메모리 공간을 2의 거듭제곱 크기의 블록으로 분할한다. 초기에는 큰 블록을 할당하고, 필요한 메모리 크기에 맞게 블록을 쪼개어 할당하는 방식이다. 할당이 해제되면 인접한 블록들을 다시 합쳐서 더 큰 블록을 만들 수 있다. 이렇게 함으로써 내부 단편화를 최소화하고, 효율적인 할당 및 해제가 가능하다.
2. 슬래브 할당 : 슬래브는 고정된 크기의 메모리 블록을 의미한다. 각 슬래브는 특정 크기의 객체(예: 페이지 테이블, 파일 디스크립터)를 저장하기 위한 메모리를 제공한다. 객체가 필요할 때마다 해당 크기의 슬래브를 할당하여 객체를 저장하고, 해제되면 슬래브가 재사용된다. 이 방식은 각 슬래브 크기를 미리 정의하므로 버디 시스템보다는 메모리 공간 낭비가 조금 더 발생할 수 있으나, 할당 및 해제가 더 빠르다는 장점이 있다.
이러한 커널 힙 알고리즘들은 운영체제의 내부에서 효율적인 메모리 관리를 위해 사용되며, 프로세스와 시스템의 안정성을 유지하면서 동적 메모리 할당을 가능하게 한다.

vector란?

vector는 프로그래밍에서 사용되는 동적 배열 자료구조이다. 이는 배열과 유사하지만, 크기가 동적으로 조절될 수 있다는 점에서 차이가 있다. vector는 C++ 표준 라이브러리의 일부로 제공되며, 요소들을 연속적으로 저장하고 편리하게 접근할 수 있는 기능을 제공한다.
vector는 배열과 마찬가지로 같은 타입의 요소들을 저장하는데 사용되지만, 배열과는 달리 크기가 미리 지정되어 있지 않다. 새로운 요소가 추가될 때마다 자동으로 크기가 늘어나며, 요소가 삭제될 때는 크기가 줄어든다. 이를 통해 메모리를 효율적으로 사용할 수 있다.
vector의 주요 특징은 다음과 같다:
1. 동적 크기 조절 : 요소가 추가되거나 삭제될 때 vector의 크기가 자동으로 조절된다.
2. 연속적인 메모리 할당 : 요소들은 메모리에 연속적으로 할당되므로 인덱스를 사용하여 빠르게 접근할 수 있다.
3. 편리한 사용법 : C++ 표준 라이브러리에서 제공하는 함수와 연산자를 이용하여 요소의 추가, 삭제, 검색 등을 쉽게 수행할 수 있다.
4. 동적 배열이 장점 : 배열과 마찬가지로 요소들을 순차적으로 관리하면서 크기가 동적으로 조절되는 장점을 제공한다.
vector는 다양한 상황에서 유용하게 사용될 수 있는 자료구조로, 다수의 요소를 효율적으로 저장하고 관리하는데 사용된다.

덱이란?

덱은 "Double-Ended Queue"의 줄임말로, 양쪽 끝에서 삽입과 삭제가 모두 가능한 선형 자료구조를 말한다. 덱은 큐와 스택의 기능을 모두 결합한 형태로, 큐의 선입선출 속성과 스택의 후입선출속성을 모두 가지고 있다.
덱은 주로 다음과 같은 상황에서 유용하게 사용된다:
1. 큐와 스택의 융합 : 덱은 큐와 스택의 기능을 동시에 사용할 수 있어서 여러 용도로 활용이 가능하다.
2. 양쪽 끝에서의 삽입 및 삭제 : 덱은 양쪽 끝에서 요소를 삽입하거나 삭제할 수 있어서 다양한 상황에 유용하게 쓰일 수 있다.
3. 덱 구현 : 덱은 양쪽 끝에 효율적으로 요소를 추가하거나 제거할 수 있는 자료구조로, 큐나 스택을 구현할 때 활용할 수 있다.

2개의 댓글

comment-user-thumbnail
2023년 8월 14일

정보 감사합니다.

1개의 답글