본문 바로가기

CSAPP9

가상메모리 | (3) 세그멘테이션, 페이징 메모리를 관리하는 기법에는 대표적으로 1) 세그멘테이션, 2) 페이징이 있다. 그리고 이 둘을 혼합한 Segmented Paging이나 Paged Segmentation이라는 개념도 있다. 이 중, Linux를 포함한 현대 시스템에서는 주로 페이징이 쓰인다고 한다. 세그멘테이션(Segmentation) 세그먼테이션은 논리적 메모리 영역을 기반으로 프로세스의 데이터를 나누고, 이러한 세그먼트들을 물리적 메모리에 저장하는 방식이다. 세그멘테이션을 수행하는 주요 단계는 다음과 같다: 논리적 구조 기반 분할: 세그멘테이션은 프로그램의 논리적 구조(예: 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트 등)를 반영하여 메모리를 나눈다. 각 세그먼트는 프로그램의 특정 논리적 단위(함수, 데이터 구조 등)를 포함한다... 2023. 11. 15.
가상메모리 | (2) 가상메모리 개념, 가상 주소공간 가상메모리 정의 가상메모리: 메인 메모리의 추상화. 각 프로세스에 하나의 크고 통합된, private한 가상 주소공간을 제공한다. 도입 배경 초기의 cpu들은 물리 주소 방식을 사용했다. 따라서 프로세스가 메인 메모리에 직접 접근할 수 있었고, 이는 메인 메모리의 용량 한계로 인한 프로그램 확장성 제한, 프로세스 간 메모리 영역 침범, 일관되지 않은 주소 등의 문제로 이어졌다. 일반적으로 한 시스템의 여러 프로세스들은 CPU, 메인 메모리를 공유한다. CPU를 공유하는 부분에 대해서는 일반적으로 순서를 기다리느라 단지 느려질 뿐이고 심각한 오류는 발생하지 않는다. 그러나 프로세스들이 존재하는 메모리가 여유가 없이 지나치게 많은 요구에 의해 오염될 경우, 프로그램의 논리와 무관하게 오류가 난다. 이를 방지.. 2023. 11. 15.
가상메모리 | (1) 개발자 코드가 물리 메모리에 닿는 과정 우리가 사용하는 언어는 대개 인간이 읽고 쓰기 쉽도록 설계된 고급언어이다. 고급언어를 통해 소스파일을 작성하고, 큰 프로그램을 설계한다. 고급언어로 짠 코드는 우리의 언어와 비슷하게 생겼다. 근데 이게 어떻게 0과 1뿐인 메모리를 조작할 수 있는 걸까? (방대한 내용을 공부하면서 큰 그림을 이해해보고자 작성한 글이라, 틀린 내용이 있을 수도 있습니다 !! 혹시 발견하신다면 편하게 댓글로 남겨주세요. 공부에 큰 도움이 될 것 같습니다. 🙇🏻) 개발자의 코드가 물리 메모리까지 닿는 과정 우리가 작성한 소스코드는 전처리를 거친 후에 컴파일러가 이를 어셈블리어 코드로 바꾸고, 어셈블러가 이 코드를 다시 기계어로 바꾼다(C언어 기준). 기계어로 된 소스파일은 최종적으로 링킹을 거친다. 이렇게 되면 개발자가 작성.. 2023. 11. 14.
동적 메모리 할당 | Malloc Lab | (4) 할당기 배치 전략 개선 (next fit) 동적 메모리 할당 | Malloc Lab | (1) Malloc은 어떻게 구현되는가?에서, 동적 할당기의 배치 전략에는 대표적으로 세 가지가 있음을 살펴보았다. first fit: 처음부터 탐색하며, 먼저 발견된 충분한 용량의 가용 블록에 할당 next fit: 이전 탐색 지점부터 탐색하며, 먼저 발견된 충분한 용량의 가용 블록에 할당 (-> 빠른 검색) best fit: 모든 블록을 탐색하여, 요청 메모리에 가장 가까운 가용 블록에 할당 (-> 꼼꼼한 검색) 그리고 동적 메모리 할당 | Malloc Lab | (3) 기초적인 할당기 작동 원리, 구현에서, implicit free list의 블록 포맷을 가지고, first fit의 배치전략을 사용하는 기초적인 할당기를 이해해보았다. malloc-lab.. 2023. 11. 14.
동적 메모리 할당 | Malloc Lab | (3) 기초적인 할당기 작동 원리, 구현 컴퓨터 시스템 책의 9.9장에 설명되어 있는 기초적인 버전의 할당기는 다음과 같은 방식을 채택하고 있다. 블록 포맷: 묵시적 가용 리스트 배치 전략: first-fit 전략 연결 전략 즉시 연결: 블록이 반환될 때마다 인접 블록을 통합 인접 블록의 가용여부 확인: 경계 태그(Footer) 활용 해당 버전의 작동 원리, 코드를 이해해보자. 기초적 할당기: overview 우리가 흔히 보는 가상 메모리 그림에서 힙 공간에 돋보기를 대본다고 생각해보자. 그럼 힙 공간은 메모리 블록들의 배열로 표현할 수 있다. (이 '블록들'은 앞 포스팅에서 얘기한 묵시적 가용 리스트 등의 자료구조이다.) 힙 공간을 처음 생성할 때(init)는 최초의 힙 공간을 할당받고, 정렬 패딩, 프롤로그 헤더와 푸터, 에필로그 헤더를 .. 2023. 11. 12.
동적 메모리 할당 | Malloc Lab | (1) Malloc은 어떻게 구현되는가? 명시적 할당기, 묵시적 할당기 메모리 할당기는 명시적 할당기(explicit allocator), 묵시적 할당기(implicit allocator)로 나뉜다. 명시적 할당기는 malloc, free 묵시적 할당기는 가비지 컬렉터 명시적 할당기 (malloc) malloc은 힙으로부터 메모리를 할당받는다. 만일 sbrk를 사용한다면, 커널의 brk 포인터에 incr을 더해서 힙 공간을 늘리거나 줄인다. 힙은 블록들로 구성되어 있고, 블록은 워드 단위로 표시된다. (1 워드 = 4byte, 더블 워드 = 8byte) 예를 들어서 '4 워드 블록을 요청한다, 6 워드 블록을 요청한다.' 이런 식으로 표현한다. malloc을 활용한 프로그래밍을 할 시에 주의 사항이 있다. 메모리 블록을 반환 해주고 난 다음엔 .. 2023. 11. 10.
CS:APP | Chapter 3 | (2) 프로그램의 기계수준 표현 리틀 엔디안 vs 빅 엔디안 메모리에 데이터를 저장할 때, 바이트 저장 순서에 따라 리틀 엔디안, 빅 엔디안으로 나눌 수 있다. 리틀 엔디안 (Little Endian): 낮은 주소에 최하위 바이트(LSB, Least Significant Bit)부터 저장한다 - 사람이 읽고 이해하기엔 직관적이지 않을 수 있다. - 0x1A2B3C4D라는 4바이트 정수를 저장한다고 하면 아래와 같다. (MSB = 0x1A, LSB = 0x4D) 0x103: 0x1A (MSB) 0x102: 0x2B 0x101: 0x3C 0x100: 0x4D (LSB) - 무조건 낮은 메모리 주소에 최하위 바이트(LSB)가 위치하므로, 메모리 주소를 다루기가 쉽다. 낮은 주소(0x100)에서 시작해서 데이터를 읽으면, 그 값이 바로 LSB.. 2023. 11. 1.
어셈블리어 | VSCode에서 C to 어셈블리 변환 CSAPP 3장을 공부중인데, 어셈블리어에 대해서 더 많은 예제가 필요함을 느꼈다. 직접 코드를 쳐보면서 어셈블리어로 변환해보고, 확인해보고 하면 좋지 않을까? 이게 공부효율을 높여줄지는 미지수지만 그냥 재미있기도 해서 해봤다. 어차피 책에서도 직접 어셈블리 코드 뽑아내는 법을 소개하고 있다. C 파일로부터 어셈블리어 파일 생성 C파일로부터 어셈블리어 파일을 생성하는 방법은 다음과 같다. 1. 테스트해보고 싶은 C 소스파일을 아무거나 만든다. (대충 hello.c) 2. 해당 디렉토리로 가서, 터미널에 다음과 같이 입력한다. gcc -S -o hello.s hello.c 쉽쥬? gcc -S 명령어는 컴파일 중간에 어셈블리어 코드를 뽑아내서 따로 파일로 생성해주는 코드이다. 이렇게 하면 hello.s 가 .. 2023. 10. 31.
CS:APP | Chapter 1 | 컴퓨터 시스템 overview CSAPP 1장의 각 소단원을 읽으면서 주요 내용과 추가적으로 알아본 정보들을 기록하는 포스팅😎 1장은 컴퓨터 시스템 전반을 얕고 넓게 훑는 챕터이다. 글자색이 다른 부분은 내가 따로 추가한 생각 혹은 정보이다 (= 틀릴 수도 있다) 1.1 정보는 비트와 컨텍스트로 이루어진다 소스 프로그램은 byte(= 8 bit) 단위로 구성된다. 대부분의 컴퓨터 시스템은 text 문자를 아스키 표준을 사용하여 표시한다. 아스키 표준은 각 문자를 byte 길이의 정수 값으로 나타낸다. 텍스트 파일: hello.c 처럼 아스키 문자들로만 이루어진 파일 바이너리 파일: 텍스트 파일을 제외한 다른 모든 파일 컨텍스트(context) 모든 시스템 내부의 정보는 bit들로 표시됨. 서로 다른 객체들을 구분하는 유일한 방법은 이.. 2023. 10. 26.