본문 바로가기

크래프톤 정글/TIL

[5주차] 공부키워드

1. 가상메모리, 페이징

 


2. 동적메모리할당 (힙, sbrk, malloc, free)

2.0 가상메모리와의 비교

가상메모리란?)

가상메모리는 프로그램이 물리적인 실제 메모리보다 큰 메모리 공간을 사용할 수 있게 하는 기술. 프로그램이 필요한 메모리 공간을 물리적인 RAM 이외에도 디스크 공간을 활용하여 확장하는 방법을 제공

동적 메모리와의 비교)

동적 메모리는 프로그램이 실행 중에 런타임에 할당되고 해제되는 메모리를 의미.

추가적인 가상메모리를 런타임에 획득할 필요가 있을때,

이는 c언어에서 malloc, free 또는 c++언어에서 new, delete와 같은 동적 메모리 할당 함수를 사용하여 이루어짐

정적메모리 할당과 달리, 동적 메모리 할당은 프로그램이 실행 중에 동적으로 조절할 수 있기 때문에 효율적인 메모리 사용 및 자원 활용이 가능하다

비교 요약)

가상 메모리는 물리적인 메모리를 확장하여 사용하는 기술

동적 메모리는 프로그램이 실행 주에 동적으로 할당되고 해제되는 메모리를 관리하는 개념

 

2.1 힙(heap)

동적 메모리 할당기는 "힙(heap)"이라고 하는 프로세스의 가상메모리 영역을 관리

힙이 미초기화딘 데이터 영역 직후에 시작해서, 위쪽으로(높은 주소 방향으로) 커지는 무요구 메모리 영역이라고 가정

커널은 힙의 꼭대기를 가리키는 변수brk("break"이라고 발음)을 사용함. -> 마치 스택 포인터와 흡사함

출처) CS:APP

 

2.2 malloc과 free ( + sbrk 함수)

c표준 라이브러리는 malloc 패키지라고 하는 명시적 할당기를 제공

c프로그램은 malloc함수를 호출해서 블록을 할당하며, free함수를 호출해서 블록을 반환

malloc 함수를 호출해서 힙으로부터 블록들을 할당받는다

#include <stdlib.h>
void *malloc(size_t size);

//리턴 값: 잘 할당되었으면, 할당된 블록을 가리키는 포인터를 반환, 에러면 NULL을 반환

최소 "size"만큼의 바이트를 가진, 연속된 블록을 가리키는 포인터를 반환

viod형 쓰는 이유는 어떤 종류의 데이터 객체든 담을 수 있게, 

 

2.2.1 더블워드의 경계

32비트 모드(gcc -m32)에서는 malloc 주소가 항상 8의 배수인 블록을 리턴

64비트 모드(기본설정)에서는 주소는 항상 16의 배수 블록을 리턴

 

-malloc은 리턴하는 메모리를 초기화하지 않는다.

-calloc은 할당된 메모리를 0으로 초기화한다.

-realloc은 이전에 할당된 블록의 크기를 변경하려는 응용은 realloc 함수를 사용

 

2.2.2 malloc 함수의 구현

malloc 같은 동적 메모리 할당기는 mmap과 munmap 함수를 사용해서 명시적으로 힙 메모리를 할당하거나 반환하며, 또는 sbrk 함수를 사용할 수 있다.

#include <unistd.h>
void *sbrk(intptr_t incr);

//리턴값: 성공시, 이전의 brk 포인터, 에러일 경우, -1 반환

 

sbrk 함수는 커널의 brk 포인터에 incr를 더해서 힙을 늘리거나 줄인다.

성공한다면, brk값을 리턴하고, 아니면 -1을 리턴한다.

 

2.2.3 free 함수의 호출

#include <stdlib.h>
void free(void *ptr);

//리턴 값: 없음!!

 

ptr인자는 malloc, calloc, realloc에서 획득한 할당된 블록의 시작을 가리켜야 함.(그렇지 않으면, free 동작이 정의되지 않는다.)


3. 메모리 단편화

3.1 정의

- 나쁜 heap의 주요 이유는 단편화라고 알려져 있다.

- 발생 이유는 가용(free)메모리가 할당 요청을 만족시키지만큼 free되지 않았을때 발생

출처)https://lsi.vc.ehu.eus/pablogn/docencia/manuales/UCLACS111/scribe/12/index.html

3.2 종류

3.2.1 내부 단편화

상황)

할당된 블록이 데이터 자체보다 더 클 때 발생 (= 할당된 메모리 내에 비어있는 메모리가 발생)

예를 들어, 정렬 제한사항을 만족시키기 위해(32비트에서는 8의 배수, 64비트에서는 16의 배수)

 

3.2.2 외부 단편화

상황)

메모리 공간이 전체적으로 공간을 모았을 때에는 충분한 크기가 존재하지만, 이 요청을 처리할 수 있는 단일한 가용블록은 없는 경우 발생

(= free한 블록들이 산재되어 존재)

 

3.2.3 비교

내부단편화보다 외부 단편화가 훨씬 더 측정하기 어려움

(외부 단편화가 미래의 요청 패턴에 의존하기 때문에)

그래서, 할당기들은 더 작은 가용(free) 블록들보다는 더 적은 수의 더 큰 가용(free) 블록들을 유지하려는 방법을 추구

 


4. 메모리 할당 정책(first fit, next fit, best fit)

4.1 정의

응용이 k바이트의 블록을 요청할 때, allocator는 요청한 블록을 저장하기에 충분한 free한 블록을 리스트에서 검색한다.

allocator가 이 검색을 수행하는 방법은 First fit, Next fit, Best fit이 주로 사용

 

4.2 종류

 

4.2.1 First fit

정의)

free 리스트를 처음부터 검색해서 크기가 맞는 첫번째 가용 블록을 선택

장점)

리스트의 마지막에 가장 큰 가용 블록들을 남겨두는 경향이 있다.

단점)

리스트의 앞부분에 작은 가용 블록들을 남겨두는 경향이 있다.

 

4.2.2 Next fit

정의)

first fit과 비슷하지만 검색을 리스트의 처음에서 시작하는 대신, 이전 검색이 종료된 시점에서 검색을 시작

아이디어) 이진 검색에서 가용 블록을 발견했으면 다음 검색에서는 리스트의 나머지 부분에서 원하는 블록을 찾을 가능성이 높다는 아이디어에 착안한 방법

장점)

매우 빠른 속도

단점)

first fit 보다 최악의 메모리 이용도를 갖는다.

 

4.2.3 Best fit

정의)

모든 free 블록을 검사하며 크기가 맞는 가장 작은 블록을 선택

장점)

셋중에서 가장 좋은 메모리 이용도를 갖는다.

단점)

힙을 완전히 다 검색해야 한다

 

4.2.4 통합

메모리 이용도 관점)

Best fit > First fit > Next fit

속도)

Next fit > First fit > Best fit


 

5. implicit free list/ explicit free list

 


6. 무요구 페이지( demand-zero memory)

6. 1 정의

- 시스템이 정상적으로 동작하기 위해 필요한 프로그램 코드나 데이터를 미리 메모리에 로드하지 않고, 필요할 때, 메모리 로드를 요청.

- 메모리 매핑되는 두 유형의 파일 중 하나

 

6. 2 메모리 매핑이란?

- 리눅스는 가상메모리 영역(=segment)의 내용을 디스크의 객체object에 연결해서 초기화함.

- 가상메모리 영역들은 다음 두 종류의 객체 중 하나로 매핑

리눅스에서의 메모리 매핑은 가상 메모리 영역을 디스크 상의 객체와 연결하여 초기화하는 프로세스를 말합니다. 두 가지 유형의 객체에 영역을 매핑할 수 있습니다:

6.2.1 리눅스 파일 시스템의 일반 파일(Regular file)
   - 영역은 실행 가능한 오브젝트 파일과 같은 일반 디스크 파일의 일부에 매핑될 수 있다.
   - 파일 섹션은 페이지 크기의 조각으로 나뉘어 각 조각은 가상 페이지의 초기 내용을 포함
   - 요구 페이징 덕분에 이러한 가상 페이지는 CPU가 처음으로 해당 페이지 영역 내에서 가상 주소를 사용할 때까지 실제 메모리로 스왑되지 않는다.
   - 영역이 파일 섹션보다 크면 영역은 제로(0)로 채워진다.

6.2.2 익명 파일(Anonymous file)
   - 영역은 커널에 의해 생성된 이진 제로(0)로 채워진 익명 파일에 매핑될 수 있다.
   - 이 영역에서 처음으로 CPU가 가상 페이지에 접근하면, 커널은 물리 메모리에서 적절한 희생 페이지를 찾는다.
   - 희생 페이지가 dirty하면 커널은 희생 페이지를 스왑아웃하고 희생 페이지를 이진 제로로 덮어쓴다. 그리고 페이지 테이블을 업데이트하여 페이지를 레지던트로 표시한다.
   - 실제로 디스크와 메모리 간에 데이터가 전송되지 않으므로 익명 파일에 매핑된 영역의 페이지를 때때로 demand-zero page라고 부른다.

두 경우 모두 가상 페이지가 초기화되면 커널에 의해 특별한 스왑 파일 사이로 스왑됩니다. 이 스왑 파일은 커널에 의해 유지되며 스왑 스페이스 또는 스왑 영역으로도 알려져 있습니다. 중요한 점은 언제나 스왑 공간이 현재 실행 중인 프로세스가 할당할 수 있는 총 가상 페이지 양을 제한한다는 것입니다.


7. 시스템 콜 (system call)

7. 1 정의

- 시스템 호출은 운영 체제이 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스

- 운영체제는 커널 모드와 사용자 모드로 나뉘어 구동된다.

- 운영체제에서 프로그램이 구동되는데 있어 파일을 읽어 오거나, 파일을 쓰거나 혹은 화면에 메시지를 출력하는 등 많은 부분이 커널 모드를 사용한다.

- 시스템 콜은 이런 커널 영역의 기능을 사용자 모드가 사용 가능하게, 즉 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용할 수 있게 해준다.

 

7. 2 유형

5가지의 범주로 나눌 수 있다.

- 프로세스 제어

끝내기, 중지/ 적재, 실행/ 프로세스 생성/ 프로세스 속성 획득과 설정/ 시간 대기/ 사건 대기/ 사건을 알림/

메모리 할당 및 해제: malloc, free

- 파일 조작

파일 생성, 파일 삭제/ 열기, 닫기/ 읽기, 쓰기, 위치 변경/ 파일 속성 획득 및 설정

- 장치 관리

장치를 요구, 장치를 방출/ 읽기, 쓰기, 위치 변경/ 장치 속성 획득, 장치 속성 설정/ 장치의 논리적 부착 또는 분리

- 정보 유지

시간과 날짜의 설정과 획득/ 프로세스 파일, 장치 속성의 획득 및 설정

- 통신

통신 연결의 생성, 제거/ 메세지의 송신, 수신/ 상태 정보 전달/ 원격 장치의 부착 및 분리

 

7. 3 커널(Kernel)

반드시 kernel에 관련된 것은 커널모드로 전환한 후에야, 해당 작업을 수행할 권한이 생긴다.

출처) CS:APP


8. DMA (Direct Memory Access)

8. 1 정의

- CPU를 거치지 않고,  메모리에 직접적으로 접근하는 방법 = 메인메모리로 바로 읽기/복사 하는 것

- 이때 CPU가 개입하지 않는 DMA를 전송하므로써, CPU는 그동안 다른 작업을 수행할 수 있음. ( 디스크 읽기는 시간이 많이 걸리므로, 이걸 CPU가 기다리고 있으면 낭비이다.)

- DMA 전송이 완료되고, 디스크 섹터의 내용이 메인메모리에 잘 저장되면 디스크 컨트롤러는 CPU에게 I/O 작업이 끝났다고 인터럽트(Interrupt)로 알려줌. -> CPU는 하던 일을 멈추고 OS모드로 돌아옴. (I/O 작업이 끝났다고 기록을 하고, 제어를 CPU가 정지한 곳으로 돌려준다.)

 

8. 2 CPU가 디스크에서 데이터를 읽을 때 발생하는 단계

(0) preview 구조

출처) CS:APP

(a) CPU는 디스크를 읽기 시작.

"명령어, 논리블록 번호, 목적지 메모리 주소"를 디스크와 관련된 메모리를 매핑한 주소에 써주어 디스크 읽기를 개시

출처) CS:APP, (a)단계

 

(b) Disk Controller는 이 섹터를 읽고, 메인메모리로 DAM 전송을 수행한다.

출처) CS:APP, (b)단계

(c) DMA 전송이 완료될 때, 디스크 컨트롤러는 CPU에 인터럽트(Interrupt)로 알려준다.

출처) CS:APP, (c)단계


9. 이더넷