❗️키워드 정리❗️
1. 가상 메모리, 페이징
가상 메모리(virtual memory)
실제 메모리를 추상화하여 가상 메모리에 올림으로써 프로세스들이 연속된 물리적 메모리 공간처럼 여기게 만들수 있을 뿐만 아니라 실제 메모리보다 많은 크기의 메모리도 운용이 가능
이슈
- 주소 번역(Address Translation) : 가상 메모리와 물리 메모리의 주소를 번역해 매핑
- 가상 공간에 대한 관리
페이징 기법(Paging)
가상 메모리와 물리 메모리의 매핑을 위한 기술
컴퓨터의 물리적 메모리는 연속적으로 할당되어 존재할 필요가 없으며, 반대로 연속적으로 존재하지 않는 물리적 메모리라도 페이징 기법을 통해 연속적으로 존재하는 것처럼 이용될 수 있음
특징
- 가상 메모리 상의 주소 공간을 일정한 크기로 분할(페이지)
- 주소 공간은 페이지 단위로 나뉘어져 있으며, 실제 기억공간은 페이지 크기와 같은 프레임으로 나누어 사용
- 페이지는 페이지 테이블(Page Table)이라는 자료구조 형태로 관리
- 페이지 테이블 엔트리(PTE)는 페이지 테이블의 레코드
페이지(Page) : 가상 메모리를 일정된 한 크기로 나눈 블록 -> 가상 메모리 블록 단위
프레임의 크기 == 페이지의 크기
페이지의 크기는 하드웨어에 의해 정의되면 대개 2의 제곱으로 증가
페이지 테이블 엔트리(Page Table Entry)
- 페이지 기본 주소(page base address)
- 플래그 비트
- Accessed bit : 페이지에 대한 접근이 있었는지를 나타낸다.
- Dirty bit : 페이지의 내용에 변경이 있었는지를 나타낸다.
- Present bit : 현재 페이지에 할당된 프레임이 있는지를 나타낸다.
- Read/Write bit : 읽기/쓰기에 대한 권한을 표시한다.
(추가 정리 필요..)
2. 동적 메모리 할당(힙, sbrk, malloc, free)
동적 메모리 할당은 프로그램 실행 중에 메모리의 할당 및 해제를 허용하는 프로세스
힙(Heap)
- 프로그램의 데이터를 동적으로 저장하기 위한 메모리 영역
- 전역 변수나 정적 변수와 달리, 힙 영역의 메모리는 프로그램의 수명과 독립적으로 존재
- 프로그래머가 직접 관리해야 하며, 사용이 끝난 메모리는 명시적으로 해제해야 함(free)
- 힙을 사용하여 할당된 메모리는 '동적 변수' 또는 '힙 변수'라고 함
sbrk()
- sbrk 함수는 힙 영역의 크기를 변경하기 위해 UNIX 시스템 호출로 사용됨
- 힙의 끝을 옮겨 메모리를 할당하거나 해제
- sbrk(0)을 호출하면 현재 힙의 끝 주소를 반환
- 양의 인자를 주어 호출하면 힙을 확장하고, 음의 인자를 주어 호출하면 힙을 축소(축소는 복잡해서 잘 사용하지 않음)
malloc()과 free()
- C 프로그래밍 언어에서 malloc (memory allocation) 함수는 힙에 특정 크기의 메모리 블록을 할당하기 위해 사용됨
- malloc은 할당된 메모리 블록의 포인터를 반환하며, 이 포인터는 할당된 메모리에 접근하기 위해 사용됨
- free 함수는 malloc에 의해 할당된 메모리를 해제함
- 프로그램이 malloc으로 할당한 메모리를 더 이상 사용하지 않을 때, 해당 메모리를 해제하기 위해 free를 호출(메모리 누수(memory leak)를 방지)
메모리 누수 (Memory Leak)
- 메모리 누수는 프로그램이 동적으로 할당한 메모리를 적절히 해제하지 않을 때 발생
- 사용하지 않는 메모리가 시간이 지남에 따라 계속 쌓이게 되고, 이는 시스템의 성능 저하 또는 크래시를 초래할 수 있음
3. 메모리 단편화
메모리 단편화는 시스템의 전반적인 성능에 영향을 미칠 수 있으며, 효율적인 메모리 관리 알고리즘과 가비지 컬렉션과 같은 메모리 회수 기술을 통해 이를 최소화할 수 있음
외부 단편화(External Fragmentation)
외할당된 메모리 블록 사이에 발생하는 미사용 공간의 축적으로 인해 발생
공간을 여러 개를 합치면 유용하게 사용할 수 있지만, 개별적으로는 너무 작아서 사용할 수 없는 경우
외부 단편화 관리방법
- 메모리 압축: 사용 중인 메모리 블록을 이동시켜 연속된 공간을 만드는 방법(비용이 많이 들고 시간이 오래 걸릴 수 있음)
- 페이징 및 세그먼테이션: 물리적 메모리를 페이지나 세그먼트로 나누고, 가상 메모리를 사용하여 연속성의 요구를 완화
- 베스트 핏, 퍼스트 핏, 넥스트 핏 할당 알고리즘: 각각 가장 적합한 크기, 첫 번째 적합한 크기, 마지막 할당 이후 다음 적합한 크기의 블록을 찾아 할당하는 방법
내부 단편화(Internal Fragmentation)
할당된 메모리 블록 내부에 사용되지 않는 공간이 생기는 현상
메모리가 고정된 크기의 블록(예: 페이지)으로 나뉠 때 일어남
프로세스가 메모리 블록을 요청하고, 할당된 블록이 요청한 크기보다 클 경우, 남는 공간이 생기는데, 이 공간은 해당 블록 내부에서는 다른 용도로 사용할 수 없으므로 낭비됨
외부 단편화 관리방법
- 슬랙 공간 사용: 필요한 것보다 조금 더 큰 메모리 블록을 할당하여, 요청한 크기와 블록 크기 사이의 차이를 최소화
- 변수 크기 할당: 가능한 경우, 메모리 블록을 요청받은 크기에 더 가깝게 할당
4. 메모리 할당 정책(first fit, next fit, best fit)
프로세스나 파일에 할당할 메모리 영역을 결정하는 방법
가변 파티션 할당 방식에서 중요하며, 메모리 단편화를 줄이고 메모리 사용 효율을 높이는데 도움을 줌
퍼스트 핏 (First Fit)
- 메모리에서 프로세스가 요구하는 크기와 같거나 큰 첫 번째 빈 공간에 메모리를 할당하는 방식
- 메모리를 순차적으로 탐색하며, 충분히 큰 첫 번째 빈 공간을 찾으면 그 자리에 프로세스를 할당
- 구현이 간단하고 빠른 할당이 가능하지만, 메모리의 앞부분에 작은 남은 공간들이 많이 생길 수 있어 외부 단편화를 야기할 수 있음
넥스트 핏 (Next Fit)
- 퍼스트 핏과 유사하지만, 매번 메모리 탐색을 시작하는 위치가 바뀜(이전 탐색이 종료된 위치부터 탐색)
- 마지막으로 할당된 공간의 다음 위치부터 탐색을 시작하여 프로세스가 들어갈 수 있는 충분히 큰 다음 빈 공간을 찾음
- 넥스트 핏은 퍼스트 핏보다 메모리 전체에 할당이 더 고르게 분포되는 경향이 있지만, 큰 프로세스를 할당하기 어려운 경우가 많아질 수 있음
베스트 핏 (Best Fit)
- 프로세스가 요구하는 크기와 가장 잘 맞는, 즉 가장 작은 크기의 빈 공간에 할당하는 방식
- 메모리 전체를 탐색하여 가장 적은 크기의 공간 낭비가 발생하는 곳에 프로세스를 할당
- 공간을 효율적으로 사용할 수 있으나, 메모리 전체를 탐색해야 하므로 할당에 시간이 오래 걸릴 수 있고, 매우 작은 크기의 남는 공간을 많이 생성하여 외부 단편화를 야기할 수 있음
5. 묵시적 가용 리스트(Implict), 명시적 가용 리스트(Explict)
Implicit Free List(묵시적 가용 리스트)
- 할당되지 않은 메모리 블록들이 연속적으로 메모리에 나열되어 있음
- 각 블록은 자신의 크기와 할당 여부를 나타내는 헤더로 시작
- 가용 블록 목록을 별도로 관리하지 않음
- 헤더와 푸터를 통해 메모리를 탐색하고 할당과 해제를 진행함
- 구현은 간단하지만 할당과 해제에서 효율성이 떨어질 수 있음(메모리 탐색이 오래 걸림)
Explicit Free List(명시적 가용 리스트)
- 모든 가용 블록들이 하나의 연결 리스트(Linked list) 또는 여러 연결 리스트로 관리
- 각 가용 블록은 다음과 이전 가용 블록을 가리키는 포인터를 가지고 있어서, 가용 블록 리스트를 통해 빠르게 사용 가능한 블록을 찾을 수 있음
- 할당시에는 리스트를 따라가면서 적절한 크기의 블록을 빠르게 찾을 수 있고, 해제할 때에도 해당 블록을 가용 블록 리스트에 추가하기만 하면됨
성능 비교
- 묵시적 가용 리스트(Implicit Free List)는 메모리 할당 및 해제 시 전체 메모리를 탐색해야 하므로 할당 시간이 오래 걸릴 수 있음
- 명시적 가용 리스트(Explicit Free List)는 가용 블록을 빠르게 찾을 수 있어 할당과 해제가 빠름
- 분리 가용 리스트(Segregated Free List)는 다양한 크기의 블록들을 서로 다른 가용 블록 리스트에 분리해 관리하는 방식(효율성과 속도의 균형)
6. demand-zero memory
페이지가 실제로 사용되기 전까지는 물리적 메모리에 할당되지 않는 방식
실제로 해당 페이지가 접근되어 사용될 때 '0'으로 채워진 페이지를 할당하고 초기화
대규모 멀티태스킹 환경이나 메모리 자원이 제한적인 시스템에 유용(메모리 사용의 효율성을 높임)
동작 방식
- 페이지 폴트: 프로세스가 아직 메모리에 로드되지 않은 주소에 접근하려고 하면 페이지 폴트가 발생
- 디맨드 제로: 페이지 폴트 핸들러가 해당 페이지를 물리적 메모리에 매핑하고, '0'으로 초기화(요구에 의해 제로화(demand-zero))
- 사용: 초기화된 페이지는 이제 프로세스에 의해 사용될 수 있으며, 프로세스는 '0'으로 초기화된 메모리를 사용하여 자신의 데이터를 저장
장점
- 메모리 절약: 실제로 사용되지 않는 페이지는 물리적 메모리를 차지하지 않음
- 효율성: 프로세스 시작 시 필요한 전체 메모리를 할당할 필요가 없으므로, 빠른 시작이 가능
- 유연성: 프로세스가 필요한 만큼의 메모리만 사용하므로, 시스템은 메모리를 더 유연하게 관리
단점
- 오버헤드: 페이지가 실제로 사용될 때마다 페이지 폴트 처리가 필요하므로 오버헤드가 발생할 수 있음
- 성능 지연: 페이지를 '0'으로 초기화하는 과정에서 미세한 지연이 발생할 수 있으며, 페이지 폴트가 빈번하게 발생하면 시스템의 전체적인 성능에 영향을 줄 수 있음
7. 시스템 콜(system call)
운영체제의 서비스를 요청하기 위해 사용자 프로그램이 커널에게 전달하는 인터페이스 또는 함수
사용자 모드에서 실행되는 프로세스가 운영체제의 커널 모드에 있는 기능을 안전하게 사용하고자 할 때 시스템 콜을 사용
하드웨어 리소스를 안전하고 효율적으로 관리하고, 다양한 운영체제 기능을 프로그램에서 활용할 수 있음
기능
- 프로세스 관리: 프로세스 생성(fork), 실행(exec), 종료(exit), 스케줄링과 같은 기능을 관리
- 파일 조작: 파일 생성, 삭제, 읽기, 쓰기, 재명명, 파일 속성 변경 등 파일 시스템과 관련된 작업을 수행
- 장치 관리: 장치 드라이버와의 통신을 위한 장치 열기, 읽기, 쓰기, 닫기 등의 기능을 담당
- 메모리 관리: 메모리 할당, 페이지 교체 등 메모리와 관련된 작업을 수행
- 통신: 프로세스 간 통신(IPC)이나 네트워킹과 관련된 시스템 콜을 제공
- 사용자 인증 및 관리: 사용자 권한 관리, 비밀번호 변경 등 사용자와 관련된 서비스를 제공
동작 방식
- 호출: 응용 프로그램은 특정 작업을 수행하기 위해 시스템 콜 함수를 호출
- 컨텍스트 스위치: 프로세스가 시스템 콜을 호출하면 CPU는 사용자 모드에서 커널 모드로 전환(제어권을 넘김)
- 실행: 커널은 요청된 서비스를 실행(커널은 모든 하드웨어 리소스에 대한 전체적인 제어 권한을 가지고 있음)
- 리턴: 작업을 완료한 후, 커널은 결과와 제어권을 반환하고 CPU는 다시 사용자 모드로 전환하여 프로그램 실행
8. DMA(Direct Memory Access)
CPU의 개입 없이 장치가 메모리에 직접 접근할 수 있게하는 기능
대용량 데이터를 빠르게 전송해야 할 때 유용하며, 시스템의 전반적인 성능 향상에 기여함
하드 드라이브, 네트워크 카드, 사운드 카드와 같이 대량의 데이터를 빠르게 전송해야 하는 입출력 장치에서 주로 사용
DMA의 작동 원리
- DMA 요청: 입출력 장치는 데이터 전송이 필요할 때 DMA 컨트롤러에 전송을 요청
- DMA 컨트롤러: CPU는 DMA 컨트롤러에게 데이터 전송 권한을 부여(CPU는 다른 작업을 수행할 수 있음)
- 메모리 접근: DMA 컨트롤러는 입출력 장치와 메모리 사이의 데이터 전송을 직접 관리(CPU는 데이터 전송 과정에 관여하지 않음)
- 전송 완료: 데이터 전송이 완료되면, DMA 컨트롤러는 CPU에 인터럽트를 보내어 전송이 끝났음을 알림
- CPU 개입: CPU는 인터럽트를 받고 전송된 데이터를 처리
DMA의 장점
- 효율성: CPU가 데이터 전송을 직접 관리하지 않으므로, CPU는 다른 계산 작업에 더 많은 시간을 할애할 수 있음
- 속도: 메모리와 장치 간의 데이터 전송이 빠르게 이루어질 수 있음
- 병렬 처리: CPU가 다른 작업을 계속하는 동안 데이터 전송이 이루어질 수 있으므로, 시스템의 병렬 처리 능력이 향상
DMA의 단점
- 복잡성: DMA 컨트롤러는 시스템 설계와 소프트웨어에 추가적인 복잡성을 추가
- 자원 충돌: 메모리 버스를 사용하는 다른 프로세스와 충돌이 발생할 수 있음(이를 관리하기 위한 추가적인 논리가 필요)
9. 이더넷(Ethernet)
지역 네트워크(LAN)에서 데이터를 전송하는데 가장 널리 사용되는 표준
1970년대에 개발되어, 그 이후로 데이터 링크 계층과 물리적 계층에서 사용되는 여러 표준들을 포함하게 됨
기본 작동 원리
- 이더넷은 데이터를 프레임 단위로 전송
- 각 프레임은 송신지와 목적지의 주소, 전송되는 데이터 및 오류 검사 코드를 포함
- 이더넷 네트워크에 있는 각 장치는 고유한 MAC(Media Access Control) 주소를 가지고 있으며, 이 주소를 통해 데이터가 올바른 목적지로 전송
이더넷의 특징
- 속도: 초기 이더넷은 10Mbps의 속도를 제공했지만, 기술이 발전하면서 100Mbps(페스트 이더넷), 1Gbps(기가비트 이더넷), 10Gbps 이상의 속도를 지원하는 표준이 개발
- 토폴로지: 이더넷은 별형 토폴로지(star topology)를 사용하는 것이 일반적이며, 스위치나 허브를 중심으로 연결
- 가용성: 이더넷은 거의 모든 현대 컴퓨터와 스마트 장치에 구현되어 있으며, 널리 사용되고 접근하기 쉬운 기술
- 표준화: IEEE 802.3은 이더넷의 표준 규격을 정의
이더넷 프레임 구조
- 목적지 MAC 주소: 데이터를 받을 장치의 MAC 주소
- 출발지 MAC 주소: 데이터를 보낸 장치의 MAC 주소
- 유형: 전송되는 데이터의 유형(예: IPv4, ARP 등)을 식별
- 데이터 및 패딩: 실제 전송되는 데이터와, 최소 프레임 길이를 충족시키기 위해 추가될 수 있는 패딩
- 오류 검사: 프레임이 정확하게 전송되었는지 확인하는 데 사용되는 오류 검사 및 수정 정보
충돌 감지(CSMA/CD)
- 이더넷의 초기 버전에서는 CSMA/CD(Carrier Sense Multiple Access with Collision Detection)라는 방식을 사용
- 이 방식에서 각 장치는 캐리어(데이터 전송 채널)를 감지하여 다른 장치가 데이터를 전송 중인지 확인하고, 채널이 사용 중이지 않을 때 데이터를 전송
- 만약 충돌이 감지되면, 각 장치는 무작위로 선택된 시간 동안 대기한 후 다시 전송을 시도
10. 데이터 세그먼트
데이터 세그먼트는 일반적으로 컴파일러나 어셈블러에 의해 생성됨
전역 변수, 정적 변수(static), 배열, 구조체 등의 데이터를 포함함
- data 세그먼트
쓰기 권한이 부여되는 세그먼트로, 프로그램이 실행되면서 값이 바뀔 수 있는 전역 변수가 여기에 위치 - rodata 세그먼트(read-only)
쓰기 권한이 부여되지 않은 세그먼트로, 전역 상수와 같이 프로그램이 실행되면서 변하면 안되는 값이 여기에 위치 - BSS 세그먼트
데이터 세그먼트와 같이 전역변수를 저장하지만, 초기화가 되지 않은 전역변수들을 담고 있음
0으로 초기화된 변수들도 여기에 위치
[출처]
https://velog.io/@orcasuit/posts
https://hojunking.tistory.com/110#%EA%B0%80%EC%83%81%EB%A9%94%EB%AA%A8%EB%A6%AC(Virtual%20Memory)-1
'크래프톤 정글 - TIL' 카테고리의 다른 글
크래프톤 정글 5기 TIL - Day 44 (0) | 2024.05.03 |
---|---|
크래프톤 정글 5기 TIL - Day 43 (0) | 2024.05.02 |
크래프톤 정글 5기 TIL - Day 39 ~ 41 (0) | 2024.04.29 |
크래프톤 정글 5기 TIL - Day 35 ~ 38(CS:APP) (0) | 2024.04.23 |
크래프톤 정글 5기 TIL - Day 34(CS:APP) (0) | 2024.04.23 |