가상 메모리(Virtual Memory)
- 메모리 관리 기법 중 하나로, Memory Management Unit(MMU)과 운영체제의 지원이 필요하다.
- 컴퓨터 시스템에서 실제 물리적인 메모리(RAM)보다 큰 메모리 공간을 프로세스에게 제공하는 기술이다.
- 가상 메모리는 OS에 의해 관리되며, 프로세스가 사용하는 주소 공간을 물리적인 메모리(RAM)와 하드디스크의 조합으로 확장한다.
특징
- 가상 메모리는 각 프로세스에게 독립적으로 할당된다.
- 실제로 필요한 부분만 메모리에 적재하고, 필요하지 않은 부분은 하드디스크로 스왑하여 보관함으로써 메모리를 효율적으로 사용할 수 있다.
이점
- 일반적으로 사용되지 않는 프로세스나 프로그램의 코드나 데이터는 디스크에 저장되어 있으므로, 물리 메모리에서 낭비되지 않는다.
- 또한, 각 프로세스는 독립적인 주소 공간을 가지기 때문에 다른 프로세스의 메모리에 직접적으로 접근하거나 영향을 주는 일이 없도록 보호된다.
프로세스(Process)
- 프로세스는 OS로부터 자원을 할당받아 실행 중인 프로그램의 인스턴스이다.
- 프로세스 != 프로그램
- 프로세스 != 프로세서서
- 각 프로세스는 독립된 메모리 공간, 실행 상태, OS 자원에 대한 제어 권한 등을 가진다.
- 프로세스는 개별적으로 실행되며, 다른 프로세스와 독립적으로 메모리를 할당받아 작업을 수행한다.
- 하나의 프로세스는 최소한 하나의 쓰레드(Thread)를 가지고 있으며, 이를 메인 쓰레드(Main Thread)라고 한다.
프로레스 간 메모리 공유
프로세스는 개별적으로 실행되며, 다른 프로세스와 독립적으로 메모리를 할당받아 작업을 수행하기 때문에, 다른 프로세스들은 가상 메모리 영역을 직접적으로 공유할 수 없다(보안 및 안정성 이슈).
프로세스 간에 메모리를 공유해야 하는 경우에는 보다 특수한 메커니즘을 사용해야 한다. 이러한 메커니즘은 OS에서 제공하는 공유 메모리, 파이프, 파일, 소켓 등을 통해 구현될 수 있다.
그러나 예외적인 상황으로, 특정 OS나 프로그래밍 환경에서 명시적으로 프로세스 간 메모리 공유를 지원하는 메커니즘을 제공할 수도 있다. 이러한 경우에는 공유 메모리 세그먼트나 매핑된 메모리 등을 통해 여러 프로세스가 동일한 가상 메모리 영역을 공유할 수 있다. 그러나 이는 특수한 OS나 환경에서의 기능이며, 일반적인 상황에서는 가상 메모리는 프로세스 간에 공유되지 않는다.
프로세서(Processor)
프로세서는 컴퓨터 시스템에서 연산과 데이터 처리를 수행하는 하드웨어 유닛이다. 프로세서는 CPU로도 알려져 있다. 일반적으로 하나의 컴퓨터 시스템에는 하나 이상의 프로세서가 있을 수 있다. 다중 코어 프로세서 시스템에서는 여러 개의 코어를 가지고 있어 동시에 여러 작업을 처리할 수 있다. 그러나 단일 코어 시스템에서는 하나의 프로세서만 있다. 따라서 순차적으로 한 번에 하나의 명령어만 처리할 수 있다.
프로세서와 코어는 다른 개념이다. 코어 수는 하나의 프로세서에 포함된 실행 유닛의 수를 나타낸다. 프로세서 수는 시스템 전체에서 사용 가능한 프로세서의 수를 나타낸다. 일반적으로 프로세서 수는 코어 수보다 크거나 같을 수 있다. 예를 들어, 멀티 프로세서 시스템이라면 여러 개의 프로세서가 동시에 작업을 처리할 수 있지만, 이 때 각각의 프로세서는 여러 개의 코어를 가질 수도 있다.
쓰레드(Thread)
- 쓰레드는 하나의 프로세스 내에서 실행되는 작업 단위이다.
- 하나의 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
- 여러 쓰레드는 같은 프로세스의 주소 공간을 공유하면서 동시에 실행될 수 있다.
- 쓰레드는 프로세스 내에서 경량의 실행 단위로 간주되며, 생성 및 소멸이 비교적 빠르고 오버헤드가 작다.
- 쓰레드는 프로세스 내에서 각각 독립적인 실행 흐름을 가지며, 쓰레드 간에는 작업을 분할하고 병렬로 처리함으로써 프로그램의 응답성과 성능을 향상시킬 수 있다.
- 쓰레드를 사용하여 [[동시성과 병렬성]]을 실현할 수 있다.
이점
- 동시성(Concurrency): 여러 쓰레드가 동시에 작업을 수행하면서 프로그램의 응답성을 향상시킬 수 있다. 예를 들어, GUI 애플리케이션에서는 메인 쓰레드와 별도의 쓰레드를 사용하여 UI 응답성을 유지하면서 백그라운드 작업을 수행할 수 있다.
- 병렬성(Parallelism): 병렬 처리가 필요한 작업을 쓰레드로 나누어 동시에 실행함으로써 작업을 더 빠르게 처리할 수 있다. 이는 다중 코어 또는 다중 프로세서 시스템에서 성능을 극대화하는 데에 유용하다. -> 멀티스레딩(Multithreading)
쓰레드 간 데이터 공유
- 프로세스 내에서 여러 개의 쓰레드가 동시에 실행될 때, 이들은 동일한 메모리 공간(데이터 영역 및 코드 영역)을 공유하므로 데이터 및 자원에 대한 접근이 용이하다.
- 쓰레드 간에는 데이터 공유와 통신이 프로세스에 비해 비교적 쉽고 빠르게 이루어진다.
- 여러 쓰레드는 동시에 다른 작업을 수행하면서도 공유 자원에 대한 동기화와 협력이 필요하다.
- 쓰레드는 프로세스의 데이터 영역과 코드 영역을 공유한다.
- 데이터 영역에는 전역 변수, 정적 변수, 동적으로 할당된 메모리 등이 저장된다. 여러 쓰레드는 데이터 영역을 통해 정보를 공유하고, 데이터의 변경 사항도 공유된다.
- 코드 영역은 프로그램의 명령어들이 저장되는 영역이다. 프로세스의 실행 코드를 담고 있으며, 이 코드는 모든 쓰레드에 의해 공유된다.
그러나 쓰레드는 각각 독립적인 스택 영역을 가지고 있으므로, 로컬 변수 및 함수 호출과 같은 스택 기반의 작업은 독립적으로 처리한다. 이를 통해 쓰레드 간의 독립성과 동시에 공유된 데이터 및 코드를 활용한 협력적인 작업이 가능해진다.
쓰레드의 메모리 영역
쓰레드는 스택 영역을 독립적으로 가지지만, 데이터 영역과 코드 영역을 서로 공유한다. 쓰레드에서 데이터 영역과 코드 영역은 쓰레드가 속한 프로세스의 주소 공간 내에 속한다. 프로세스는 OS로부터 할당받은 독립적인 실행 환경을 가지며, 주소 공간에는 다양한 영역이 존재한다. 이 중에서도 프로세스의 주소 공간에는 코드 영역, 데이터 영역, 힙 영역, 스택 영역 등이 포함된다.
- 스택 영역
쓰레드가 생성될 때 동적으로 할당되며, 쓰레드의 수행 흐름에 따라 스택 프레임이 생성되고 소멸된다. 각 쓰레드는 자신만의 스택 영역을 가지므로, 스택 프레임은 독립적으로 쓰레드 간에 관리된다. 이는 쓰레드의 로컬 변수가 쓰레드 간에 독립적으로 유지된다는 것을 의미한다. 따라서, 쓰레드의 스택 영역은 각각의 쓰레드의 로컬 데이터와 실행 코드를 저장하는 영역이며, 독립적으로 관리되는 영역이다. - 코드 영역
코드 영역은 프로그램의 실행 코드, 즉 명령어들이 위치하는 영역이다. 주로 실행 파일의 코드 섹션에 해당하며, 프로세스의 주소 공간 내에서 고정적인 위치를 가진다. 모든 쓰레드는 이 코드 영역을 공유하며, 동일한 프로그램 코드를 실행한다. - 데이터 영역
데이터 영역은 전역 변수, 정적 변수, 상수 등이 저장되는 영역이다. 데이터 영역은 코드 영역 이후에 위치하며, 프로그램의 시작 시 초기화되고 프로그램의 종료 시 소멸한다. 모든 쓰레드는 이 데이터 영역을 공유하여 동일한 전역 변수나 정적 변수에 접근할 수 있다.
따라서, 쓰레드의 데이터 영역과 코드 영역은 프로세스의 주소 공간 내에서 공통된 영역으로 위치하며, 모든 쓰레드가 동일한 프로세스 내에서 실행되며 해당 영역을 공유한다.
'IT > CS' 카테고리의 다른 글
[OS] 운영체제 개요 (0) | 2023.05.28 |
---|---|
[OS] 동시성과 병렬성 (0) | 2023.05.26 |
[네트워크] 캐싱(Caching) (0) | 2023.05.25 |
[네트워크] 프록시 서버(Proxy Server) (0) | 2023.05.25 |
[네트워크] 소켓(Socket)과 포트(Port) (0) | 2023.05.24 |