본문 바로가기

Computer Science/Computer Organization

(9)
<메모리> V8 엔진의 메모리 1. 소개 * 소개 - V8 엔진은 웹 브라우저를 만드는 데 기반을 제공하는 오픈 소스 자바스크립트 엔진이다. 자바스크립트는 인터프리터 언어이기 때문에 코드를 해석하고 실행하는 엔진이 필요하다. V8은 자바스크립트를 컴파일하고 실행한다. - 필자는 웹 프론트 분야를 공부하며 자바스크립트를 사용하기 때문에 V8 엔진의 메모리 관리에 대해 공부하며 정리하고자 한다. - V8엔진은 노드JS, Deno, Electron과 같은 런타임 뿐만 아니라 크롬, 크로미움, 오페라, 엣지 등의 브라우저에서도 사용되므로 V8 엔진의 메모리 관리를 공부하는 것은 매우 중요하다. 2. 메모리 구조 * V8 메모리 구조 - 자바스크립트는 단일 스레드이고, V8 역시 자바스크립트 컨텍스트 당 단일 프로세스를 사용한다. - 실행 중..
<컴퓨터 구조> 메모리 교환, 스택, 힙 1. 메모리 교환 * 메모리 교환 - 변수 두 개의 값을 서로 바꾸는 함수를 만들어 보자. - 먼저 변수 두 개의 값을 바꾸려면 임시 변수(tmp)를 만들어서 넣어가며 바꿔야 한다. - 이를 구현하면 다음과 같을 것이다. #include void swap(int a, int b); int main(void) { int x = 1; int y = 2; printf("x is %i, y is %i\n", x, y); // x is 1, y is 2 swap(x, y); printf("x is %i, y is %i\n", x, y); // x is 1, y is 2 } void swap(int a, int b) { int tmp = a; a = b; b = tmp; } - 함수 내에서 값을 교환하는 것 같지만..
<메모리> 문자열과 메모리 1. 문자열 * 문자열 - cs50수업을 듣는 동안 string 자료형을 사용하기 위해서 cs50라이브러리를 사용했다. - 이 때의 문자열은 문자의 배열이므로 다음과 같이 메모리에 저장된다. (종단문자포함) - 실제로 c언어에는 string이라는 별도의 자료형은 존재하지 않으며, cs50라이브러리에서는 string을 다음과 같이 정의해두었다. typedef char *string - 따라서 string타입의 정의 없이 문자열을 출력하려면 다음과 같이 작성한다. #include int main(void) { char *s = "HARRY"; printf("%s\n", s); // HARRY printf("%p\n", s); // 0x402002 } - 이 때 포인터를 출력하면 문자열의 가장 첫 값인 H에 ..
<메모리> 메모리와 포인터 1. 16진수 - 컴퓨터 과학에서는 숫자를 16진수로 표현하는 일이 많다. 그 이유는 16진수가 10진수에 비해 2진수를 훨씬 더 간단하게 나타낼 수 있어서 컴퓨터 친화적이기 때문이다. - 예를 들어, 11110000(2) 이라면 16진수는 4자리씩 끊어서 f0이라고 나타낸다. 즉 4비트씩 간단하게 나눠진다. - 주로 16진수를 나타낼 때에는 앞에 0x를 붙여서 0xf0과 같이 구분하여 나타낸다. - 16진수는 정보를 훨씬 더 짧게 표현할 수 있다는 장점도 있다. 2. 메모리 주소 * 메모리 주소 - 정수형 변수 n에 24라는 값을 저장하고 출력한다고 가정하자. - n은 int 자료형이므로 메모리 어딘가에서 4바이트 만큼 자리를 차지한다. - n은 메모리상에서의 주소값을 갖고 있다. 메모리 상에서의 주소..
<컴퓨터 구조> 컴파일링과 디버깅 1. 컴파일링 - 우리는 C언어를 작성하면서 clang 명령어로 c파일을 컴퓨터가 이해할 수 있는 머신코드를 만들어 보았었다. 그 때 cs50라이브러리를 이용했었기 때문에 다음과 같이 명령어를 입력했었다. clang -o hello hello.c -lcs50 - 위는 clang에게 cs50 라이브러리에 있는 코드들까지 0 과 1로 만들어서 연결하라는 의미이다. 물론 위 명령어를 make로 단순하게 만들수도 있지만 기본적으로 거치는 단계는 동일하다. - 컴파일이 되는 과정은 전처리, 컴파일링, 어셈블링, 링킹 의 네 단계를 거친다. * 전처리 - 전처리 단계는 가장 처음에 일어나는 단계로써 우리가 처음에 선언한 라이브러리들을 읽고 가져오는 역할을 한다. - 예를 들면 stdio.h 라이브러리를 #inclu..
<컴퓨터 구조> 하드웨어의 한계 1. 메모리 한계 * RAM의 한계 - 컴퓨터는 RAM이라는 저장장치를 갖고 있다. 우리가 작성한 코드도 RAM에 저장되고 실행된다. - RAM은 당연히 유한한 크기만 저장할 수 있다. 필자의 RAM은 현재 12GB이므로 이 이상은 실행되지 못할 것이다. - 많은 이용자들이 이미 겪어 봤겠지만 한 컴퓨터로 동영상을 보면서 게임을 하는 등의 무거운 프로그램 여러개를 돌리면 흔히 말하는 렉이 걸리는 것을 알 수 있다. 이러한 것이 주로 RAM에서 오는 문제이다. * 부동 소수점 부정확성 - 1을 10으로 나누면 0.1이라는 것은 모두가 알 것이다. - 이 때 소수점이 아무리 길더라도 0.1 뒤는 0이 반복됨을 알 수 있다. - 이를 코드로 작성해보자. #include #include int main(void..
<컴퓨팅 사고> 알고리즘 * 알고리즘 - 지난 강의에서 컴퓨터가 이해할 수 있는 2진법으로 숫자뿐만아니라 글자나 색 등을 입력할 수 있음을 배웠다. 우리는 이러한 입력을 통해 원하는 출력(output)을 얻기를 원한다. 이 때 input을 output으로 만드는 일련의 과정을 알고리즘이라 한다. - 즉 알고리즘은 우리의 명령을 수행하는 규칙들을 나열한 것과 같다. 하지만 규칙을 어떻게 나열하느냐에 따라 다양한 알고리즘이 존재할 수 있다. 그리고 같은 결과가 나오더라도 얼마나 짧은 시간이 걸리는지, 얼마나 정확한지 그리고 얼마나 효율적인지도 다를 것이다. * 정확한 알고리즘 - 요즘은 보기 힘들지만 책으로 된 1,000페이지의 전화번호부가 있다고 가정하자. 여기서 윤해리를 찾는 작업을 해보자. - 우리는 첫페이지부터 한 장씩 넘겨..
<컴퓨터 구조> 정보의 표현 1. 문자의 표현 * 문자의 표현 지난 장에서 2진법으로 0,1 외에 더 큰 숫자를 표현하는 것을 보았다. 그렇다면 우리가 쓰고있는 문자는 어떻게 표현하는 것일까. 이 또한 숫자로 표현이 가능하다. 이 때 표준으로 정해진 부호가 바로 ASCII(아스키)코드이다. 미국정보교환표준부호(American Standard Code for Information Interchange)의 약자 답게 모든 영어가 숫자와 대응되어있다. * 아스키코드 각 알파벳에 대응되는 숫자는 아스키코드 표를 찾아보면 쉽게 알 수 있다. 아스키코드는 128개의 부호가 있다. 그 중 십진법으로 65부터 대문자A가 시작된다. 참고로 소문자a는 97이며, 숫자 1은 49이다. 특수 문자도 있으니 자세한 내용은 직접 찾아보는 것도 좋을 것 같다..
<컴퓨터 구조> 컴퓨터 과학과 2진법 1. 컴퓨터 과학 컴퓨터과학(Computer Science)는 CS라 불리며, 이는 단순히 문제 해결에 초점을 맞춘 하나의 학문이다. 여기서 문제 해결은 입력(input)을 전달받아서 출력(output)을 만들어내는 과정이다. 이 때 입력과 출력 사이에 존재하는 과정자체가 컴퓨터과학이다. 입력과 출력을 표현하기 위해서는 모두가 동의하는 표준이 필요한데, 그래서 알아보고자 하는 것이 컴퓨터의 표현 방법이다. 2. 2진법 2진법이라는 개념은 대부분의 사람들이 중학교 과정에서 이미 배웠기 때문에 알고 있다. 흔히 사용하는 10진법과 달리 모든 숫자를 0과 1로만 표현하는 진법이다. 컴퓨터는 이 0과 1로 우리가 아는 모든 숫자를 표현할 수 있을 뿐만아니라 문자부터 사진까지 게다가 영상과 소리도 표현할 수 있다..