CS 7

Virtual Memory와 Paging System

CPU는 프로세스의 빠른 실행을 위해 필요한 코드를 메모리에 올려두어야 한다. 하지만 필요해질 모든 데이터를 메모리에 올릴 경우, 메모리의 용량은 제한적이고 특정 순간에 모든 데이터를 다 사용하진 않기 때문에 메모리 점유에 비효율이 생긴다. 가상 메모리는 이 "특정 순간에 사용되는 메모리 영역은 제한적이다"는 점에 초점을 두어, 필요한 데이터만 메모리에 두고 나머지는 보조기억장치에 저장된 상태를 유지하는 시스템이다. 프로세스가 요구하는 데이터는 OS에 의해 메모리에 올라가기 때문에 모든 프로세스는 메모리를 전적으로 사용하고 있는 것 같은 환경에서 동작하고, 이런 프로세스의 착각(?) 때문에 가상 메모리라 불린다. 가상 메모리 시스템에서 프로세스가 점유중인 CPU는 실제 물리적 메모리 주소가 아닌 Virt..

CS 2022.03.22

프로세스 메모리의 구조, 동적 할당과 가용 리스트의 관리

프로세스가 실행되면 프로세스를 수행하기 위한 정보가 메모리에 로드되는데, 이는 크게 코드, 데이터, 힙, 스택 영역으로 구분된다. 코드 영역은 프로세스를 구성하는 코드 텍스트, 데이터 영역은 프로세스 전체에 선언된 전역 변수를 관리하는 영역이고, 프로세스에 할당된 메모리에서 가장 앞(값이 작은 주소)에 존재한다. 반대로 스택 영역은 각 스레드별로 선언된 지역변수, 매개변수를 관리하는 영역이고, 이름에서 알 수 있듯이 할당된 메모리 구역의 끝에서부터 역순으로 채워지는 스택의 구조이다. 이 세 영역은 컴파일 단계에서 그 크기가 정해지는데, 프로세스의 런타임에 인터랙션이 존재하는 경우 컴파일 단계에서는 크기를 예측할 수 없는 메모리의 요구가 발생한다. 이 요구에 대해 메모리를 할당하기 위해 존재하는 것이 데이..

CS 2022.03.21

이진 탐색 트리의 한계와 이를 보완하는 Red Black Tree

Red Black Tree는 이진 탐색 트리의 일종이고, 이진 탐색 트리는 이진 트리의 일종이다. 이진 트리는 단순히 자식이 최대 2개인 트리로 그냥 위상적 개념이니 넘어가고, 이진 탐색 트리는 이 이진 트리에다가 왼쪽 자식은 부모보다 작고, 오른쪽 자식은 부모보다 크다는 규칙을 적용해 탐색을 용이하게 만든 트리구조이다. 이러한 이진 탐색 트리에서 탐색을 진행할 시, 탐색에 소요되는 시간는 최대 트리의 깊이가 되며 이는 평균 시간복잡도 O(logn)으로 표현된다. 하지만 평균 O(logn)의 시간복잡도는, 트리의 구성에 따라 최대 O(n)까지 늘어나게 된다. 예를 들어 루트 노드 생성 후 트리에 새 엘레먼트의 삽입이 항상 이전 값보다 큰 값만 들어올 경우, 트리의 깊이는 n이 되며 이는 linked li..

CS 2022.03.21

Array와 Linked list

array와 linked list가 둘다 선형 자료구조라 그런지, 이 둘의 비교대조가 기술면접의 단골 질문인 것 같다. 머리속에서 가물가물한 온갖 트리들과는 다르게 이쪽은 지금도 확실히 기억나니 한번 정리해보자. array는 엘레먼트에의 액세스가 시간복잡도 O(1)의 상수 시간에 가능한 선형 자료구조이다. 이를 가능케 하기 위해 각 엘레먼트는 물리적으로 정렬되어 있다. 예를 들어 8바이트 char* 포인터를 저장하는 array의 경우, array의 시작인 0번째 원소의 주소가 X라면 10th 엘레먼트는 X+80바이트의 위치에 액세스하는 것으로 접근이 가능하다. 가장 단순한 자료구조이긴 하지만, 이 O(1)의 액세스를 유지하기 위해 원소의 삽입과 삭제 시에는 재편이 필요하다. 예를 들어 100개의 엘레먼트..

CS 2022.03.21

[ML] 신경망이란 무엇인가

https://yuihyun.notion.site/1-c917939293444bdebf7a930479658ed5 1장 : 신경망이란 무엇인가 이해를 돕기위한 예시부터 시작 : 숫자 이미지가 어떤 숫자를 나타내는지 판단 yuihyun.notion.site 유튜브 3Blue1Brouwn 채널의 딥러닝 강의 1장을 보며 생각을 정리한 내용이다. 생각을 정리해볼 필요가 있어서 노션으로 작성했다. 머신러닝이 말이 러닝이지 사실 함수를 커스텀한다는건 머신러닝을 하는 지인들에게 들어서 알고는 있었다. 물론 "알고만" 있었는데... 이번 강의를 들으면서 본질적으로 무엇인지에 대해 좀더 디테일하게 알게 된 것 같다. 머신러닝에서의 "머신"은 X차원 데이터 입력층을 [0,1]^N의 실수 치역, 즉 기계가 답을 내야 하는 ..

CS 2022.03.21

Garbage Collection과 Memory Leak

정글의 malloc 구현 전산학 프로젝트를 진행하면서 묵시적, 명시적 가용리스트를 구현하고, 가용리스트 탐색 방식을 first, next, best fit으로 바꿔보기도 하며 수많은 동적 할당 방식을 접했다. 하지만 어떤 방식의 동적 메모리 할당을 택하더라도, 그것이 개발자의 판단에 기반하는 "동적" 할당인 이상, 할당한 당사자가 명시적으로 메모리를 해제할 의무가 있다. 그리고 그 의무로 인해 해제된 메모리에 접근하여 에러가 발생하거나, 해제를 하지 않아 memory leak이 발생하는 등의 각종 문제가 유발된다. Garbage Collection은 동적 할당의 해제를 자동화하는 시스템으로, 이를 통해 위의 각종 문제들을 개선한 환경을 보장한다. C에서는 개발자가 메모리를 사용 후 해제해야하는 전적인 책..

CS 2022.03.20

Dynamic Programing

Dynamic Programing은 목표한 문제를 풀기 위해 위상적으로 연결된 부분 문제들로 나누어 푸는 방법이다. 예를 들어 "D"라는 해결하기 까다로운 문제가 있을 때, 먼저 "A"라는 답을 자명히 낼 수 있는 부분문제로부터 시작한다. 이 자명해로부터 "B"를 해결하고, 그로부터 "C"를 해결하는 연속적인 과정을 거쳐, 마지막으로 문제 "D"를 해결하는 것이 DP이다. 이때, A로부터 B를 도출하고, B로부터 C를 도출하고, C로부터 D를 도출하는 이 부분문제간의 간선, 즉 규칙성은 문제가 무엇이냐에 따라 다르며, 이를 점화식으로써 명확히 하는 것이 DP의 핵심이다. 점화식을 구한 뒤에는, 문제가 단순하고 변수가 적을 경우 (피보나치, 하노이 등) 점화식으로부터 수학적으로 일반항을 직접 구해 바로 본..

CS 2022.03.20