본문 바로가기

컴퓨터 구조12

가상메모리 | (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 | (2) 과제 소개 Malloc Lab 과제 Malloc Lab은 CSAPP의 공식 과제 중의 하나이다. 두 저자가 교수로 재직 중인 카네기 멜론 대학은 물론, 세계 곳곳의 컴공과에서 진행 중인 과제이다. malloc을 통해 메모리를 매니징 하는 것을 넘어서, 명시적 할당기 자체를 구현해봄으로써 이해도를 한층 더 높이자는 것이 주 요지이다. 주요 파일 설명 mm.c 학생이 할당기를 구현하는 파일이다. 학생은 mm.c 파일만 수정할 수 있다. (디버깅을 위한 목적 제외) memlib.c 테스트 환경이 돌아갈 힙 공간을 추상화해놓은 파일이다. 학생들은 과제에서 지정해놓은, 제약된 리소스 하에서 힙을 할당받고 활용해야 한다. 힙 공간을 요청하는 함수들(sbrk() 등)이 포함되어 있다. mdriver.c 테스트를 담당하는 파일이.. 2023. 11. 11.
[혼공컴운] Ch4. CPU의 작동 원리 (레지스터) 레지스터 레지스터는 CPU 내부의 작은 임시저장장치. 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장된다 레지스터는 앞선 ALU와 제어장치 대비 프로그래머 입장에서 더 중요하다. 우리가 개발하고 실행하는 것이 명령어, 데이터이기 때문이다. 우리는 레지스터에 담긴 값들을 관찰할 수 있다. 업무상으로도 레지스터에 담긴 값을 관찰할 일이 생각보다 많다. 로우레벨(시스템, 임베디드, 해킹 등) 개발자들은 더더욱 많다. 레지스터의 종류 CPU 내부에는 다양한 종류의 레지스터가 있고, 각각의 역할이 있다 (CPU마다 레지스터 종류와 이름이 다르기에, 일단 공통적인 것들을 일반화해서 알아두자) 프로그램 카운터 (명령어 포인터, Instruction Pointer) 메모리에서 읽어들일 명령어의 주소를 저장한.. 2023. 10. 4.
[혼공컴운] Ch4. CPU의 작동 원리 (ALU, 제어장치) ALU와 제어장치 CPU는 ALU, 제어장치, 여러개의 레지스터 로 이루어져 있다. ALU: 계산하는 장치 (산술논리 장치) 제어장치: 제어 신호를 발생시키고 명령어를 해석하는 장치 ALU (산술논리 장치, Arithmetic logic unit) (해당 강의에서는 다루지 않으나, ALU 안에는 가산기, 검출기 등 다양한 회로가 있다.) ALU가 받는 정보 (input to ALU) 계산을 하기 위해서는 피연산자와 수행할 연산이 필요하다 2 + 1 을 수행하라 → 2와 1은 피연산자이고, +는 수행할 연산(연산자)이다 피연산자는 레지스터에서 받아들이고, 수행할 연산은 제어장치로부터 제어신호로써 받아들이게 된다 ALU가 내보내는 정보 (output from ALU) 1. 연산 결과 binary 형태의 연산.. 2023. 10. 4.
[혼공컴운] Ch3. 명령어 주소 지정 방식 명령어 주소 지정 방식 오퍼랜드 필드에 레지스터가 담길 수도 있고, 메모리 주소가 담길 수도 있고, 데이터가 직접 담길 수도 있다. CPU 입장에서는 연산에 사용될 데이터가 메모리 주소에 있든, 레지스터에 있든, 아니면 명령어에 직접적으로 명시되어 있든 연산에 사용될 데이터들을 빠르게 찾아 실행시킬 수 있어야 한다. '어떻게 해야 CPU가 데이터를 빠르게 찾을 수 있을까?' 에 대한 방법이 명령어 주소 지정 방식이다. 명령어 주소 지정 방식 (Addressing modes) - 연산에 사용할 데이터가 저장된 위치를 찾는 방법 - 유효 주소를 찾는 방법 - 다양한 명령어 주소 지정 방식들 즉시 주소 지정 방식 (Immediate addressing mode) 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명.. 2023. 9. 30.
[혼공컴운] Ch3. 명령어, 컴파일 고급 언어와 저급 언어 고급 언어: 개발자가 이해하기 쉽게 만든 언어 C, C++, 파이썬, 자바, 자바스크립트 등 저급 언어: 컴퓨터가 이해하고 실행하는 언어 기계어: 0과 1로 이루어짐 어셈블리어: 기계어를 사람이 이해하기 편하도록 만듦 컴파일 언어와 인터프리트 언어 고급 언어 → 저급 언어 변환 과정 컴파일 인터프리트 고급 언어는 변환 방식에 따라 컴파일 언어 혹은 인터프리터 언어로 구분된다. 그러나 칼로 무 자르듯 딱 나뉘는 것은 아니고(파이썬은 A, 자바는 B ..), 그냥 컴파일 방식과 인터프리터 방식 두 가지가 있다고 이해하는 편이 낫다 컴파일 언어 고급 언어(소스 코드) → 컴파일(컴파일러) → 저급 언어(목적 코드) 작성된 소스 코드는 컴파일러에 의해 저급 언어로 변환되고(컴파일), 컴파.. 2023. 9. 30.
[혼공컴운] Ch2. 데이터 1. 이진법 컴퓨터는 Binary만 이해 가능. 전기가 들어온 경우 vs 안 들어온 경우 이진법으로 음수를 표현하는 방법 2의 보수법: 음수를 표현하는 대표적인 방법 (보수: 보충해 주는 수) 현재의 숫자에서 자릿수가 1단계 올라갈 수 있는 수가 몇인지를 구하면 된다. 어떤 수를 그보다 큰 2^n에서 뺀 값 2의 보수 쉽게 구하는 법: 모든 0과 1을 뒤집고 1을 더한 값 Q1. 왜 2의 보수가 음수인가요? B가 A의 음수라면, -B 는 -(-A), 즉 A이겠지? 2의 보수로 구한 값의 보수를 또 구하면 제자리로 돌아오기 때문에, 음수를 표현하는 최적의 방법이다. Q2. 어떠한 이진수를 봤을 때 그게 음수인지 양수인지 어떻게 구별하죠? 예를 들어, -(1011)을 표현하기 위한 0101과 십진수 5를 표.. 2023. 9. 27.
[혼공컴운] Ch1. 컴퓨터 구조 개괄 1. 컴퓨터 구조를 알아야 하는 이유 좋은 개발자가 되기 위해서는, 프로그래밍 언어의 문법과 함께 컴퓨터의 근간을 알아야 한다. 이를 알아야 문제해결 능력이 향상되고, 성능/용량/비용을 고려한 개발을 할 수 있기 때문이다. 1) 문제해결능력 컴퓨터구조에 대한 이해는 프로그래밍 언어의 문법만으로는 해결하기 어려운 문제들을 해결할 수 있도록 돕는다. 분명 코드는 제대로 작성했는데 동작하지 않는 경우가 있다. 내 개발환경에서는 문제없이 돌아갔는데 실제 사용자들에겐 오류가 뜨는 것이다. 이런 케이스는 문법 오류가 원인이 아니다. 여기서 더 나아가지 못하는 개발자가 있고, ‘한 번 들여다 봐야겠다!’ 하고 컴퓨터 내부를 거리낌없이 들여다 보는 개발자가 있다. 좋은 개발자는 컴퓨터를 미지의 대상으로 여기지 않고, .. 2023. 9. 26.