사용자가 특정 차트를 고르면, 전 종목의 과거(10년) 차트들을 모두 탐색하여 가장 유사한 차트 10개를 골라 사용자에게 보여줍니다.
비슷한 차트 검색기
전 종목의 최근 10년간 모든 차트를 탐색합니다. 내 종목의 차트는 과연 상승하는 차트일까요?
www.similarchart.com
시스템 프로그래밍 수업을 듣고 인상 깊었던 점들, 저에게 필요하다 싶은 내용들을 몇 가지 정리했습니다.
1. bit
시프트 연산
<< 시프트 연산은 오른쪽을 0으로 채웁니다.
>> 시프트 연산에는 두가지 종류가 있습니다.
- logical shift : 왼쪽을 0으로 채웁니다
- arithmetic shift : 왼쪽을 most significant bit(맨 왼쪽비트)로 채웁니다.
signed와 unsigned
0과 1을 뒤집고 1을 더하기
overflow, underflow
곱셈의 오버플로우는 초과된 상위비트를 버립니다. (= <<연산)
2. float
컴퓨터는 오로지 $x/2^k$의 소수만 정확히 표현할 수 있습니다.
1/3 : 0.010101010...
1/5 : 0.001100110011...
float형은 아래와 같이 이루어져 있습니다.
예를 들어 15213.0의 경우
15213 = 11101101101101 = 1.1101101101101 x 213 -> E = 13
exp에서는 지수가 -인 수들도 고려해야 하므로 기준(bias)이 28-1 - 1 = 127이 됩니다.
s = 0 (양수)
exp = bias + E = 127 + 13 = 140
frac = 1.1101101101101에서 앞에 1을 제외하고 뒤를 0으로 채운 11011011011010000000000
또한 가장 인상깊었던 점은 exp이 가지는 특성으로 인하여 exp가 작을수록 수를 더 촘촘하게 표현하게 된다는 점입니다.
3. Optimization
여러 가지 기억에 남는 최적화들을 나열하겠습니다.
1. 반복문 안에서의 연산 줄이기
2. 곱셈보다는 덧셈이나 시프트 연산을 사용하기
3. 컴파일러의 자동 최적화
컴파일러가 자동으로 최적화해주는 경우가 있는데 컴파일러가 함수 안에서 무슨 일이 일어날지 몰라 fun1을 fun2로 최적화하지 못합니다.
4. 동시에 여러 명령어를 실행하는 컴파일러
컴파일러는 명령어를 실행할 때 한 줄씩만 실행하는 것이 아니라 여러 줄을 동시에 실행할 수 있는데(명령어 파이프라인), 이전 결과가 있어야 다음 명령이 실행되는 경우, 속도가 느려질 수 있습니다.
4. Linking
여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고 실행될 수 있는 한 개의 파일로 만드는 작업입니다.
링커 덕분에 우리는 모듈 중에 한 개를 변경할 때, 다른 파일들을 재컴파일할 필요 없이 이 파일만을 간단히 재컴파일하고 이를 다시 링크하여 변경사항을 적용할 수 있습니다.
링킹의 기능 중 하나는, 컴파일 이후, 실행하기 이전에 작성한 프로그램이 사용하는 다른 프로그램이나 라이브러리를 가져와 연결하는 과정을 말합니다.
정적 링킹
실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하는 방식을 말합니다.
빠르긴 하지만 함수를 사용할 때마다 중복이 발생합니다. 따라서 정적 링킹으로 만들어진 프로그램은 크기가 크고 메모리 효율이 좋지 않습니다.
동적 링킹
실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하지 않고 해당 모듈의 주소만을 가지고 있다가, 런타임에 실행 파일과 라이브러리가 메모리에 위치될 때 해당 모듈의 주소로 가서 필요한 것을 들고 오는 방식입니다. 런타임에 운영체제에 의하여 이루어집니다.
목적파일에서 함수가 있는 곳의 주소만 가리키고 있기 때문에 정적 링킹 방식에 비해 실행 가능한 목적파일의 크기가 작습니다.. 즉, 메모리와 디스크 공간을 더 아낄 수 있습니다.
주소만 가리키기 때문에 함수에 변화가 생겨도 그 변화를 적용하기 위해 다시 컴파일하여 다시 링킹 할 필요가 없습니다.
단점으로는 정적 링킹 방식에 비해 느리고, 불일치에 대한 문제를 고려해야 합니다. 예를 들어 기존 함수가 제거되면, 주소를 따라가 보아도 실행이 되지 않을 것입니다.(DLC 오류)
시스템 프로그래밍 느낀 점
시스템 프로그래밍 수업에는 중요한 내용들이 꽤 많았던 것 같습니다. C언어를 기반으로 하여 수업을 하지만, 프로그래밍을 할 때 전체적으로 필요한 내용들을 배운 좋은 시간이었습니다.
'대학수업정리' 카테고리의 다른 글
규칙 기반 챗봇 만들기 프로젝트(22.12.24) (0) | 2024.02.14 |
---|---|
디지털시스템설계 정리(래치, 플립플롭)(22.12.23) (1) | 2024.02.14 |
2-2 인공지능개론 정리(22.12.19) (0) | 2024.02.14 |