Fundamental of CS 24

정렬 별 성능비교

1. 정렬 방법 별 성능 비교 알고리즘최선평균최악삽입 정렬O(n)O(n^2)O(n^2)선택 정렬O(n^2)O(n^2)O(n^2)버블 정렬O(n)O(n^2)O(n^2)셸 정렬O(n)O(n^1.5)O(n^1.5)퀵 정렬O(nlog_2 n)O(nlog_2 n)O(n^2)힙 정렬O(nlog_2 n)O(nlog_2 n)O(nlog_2 n)합병 정렬O(nlog_2 n)O(nlog_2 n)O(nlog_2 n)기수 정렬O(dn)O(dn)O(dn)      2. 정렬 알고리즘 별 실험 결과 (정수: 60,000개) 알고리즘실행 시간(단위: sec)삽입 정렬7.438선택 정렬10.842버블 정렬22.894셸 정렬0.056힙 정렬0.034합병 정렬0.026퀵 정렬0.014

x86-64 CPU 레지스터(Register) 종류, 32bit / 64bit 비교

1. 레지스터란?   CPU의 빠른 데이터 처리를 돕기 위해 사용되는 임시저장공간으로, 처리중인 데이터나 처리 결과를 담는다.  레지스터의 종류에는 범용 레지스터, 세그먼트 레지스터, 포인터 레지스터, 인덱스 레지스터, 플래그 레지스터가 있다.    32bit, 64bit 운영체제에서 32bit, 64bit 는 레지스터 및 데이터 경로의 크기 를 의미한다.  위 예시에서 AH 는 8bit 운영체제와 호환되는 레지스터라고 이해하면 된다.    운영체제의 발전에 따라, 수행해야할 기능이 많아지면서  많은 정보를 다룰 수 있도록 새로운 레지스터가 추가되고, 크기도 점점 커졌다. ※ E 는 Extended 의 약자. CPU의 아키텍쳐에 따라 레지스터의 종류가 다를 수 있다.     2. 범용 레지스터   범용 ..

[CSAPP] Ch 9. 가상메모리 : (1) 물리 및 가상주소 방식

0. Intro 제한된 자원인 물리메모리를 보다 효율적이게 관리하기 위해서 현대의 시스템은 가상메모리라는 메모리의 추상화를 제공한다.가상메모리는 각 프로세스에 하나의 크고 통합된, 사적 주소공간(가상메모리)를 제공한다.​   가상메모리의 중요한 기능 세가지     1. 메인메모리를 디스크에 저장된 주소공간에 대한 "캐시"로 취급하여, 메인메모리를 효과적으로 사용한다.    2. 각 프로세스마다 통일된 주소공간을 제공하여 메모리 관리를 단순화한다.    3. 각 프로세스의 주소공간을 다른 프로세스에 의한 손상으로부터 보호한다.    1. 물리 및 가상주소 방식   9.1 물리 및 가상주소 방식   컴퓨터의 메인메모리(RAM)은 M개의 연속적인 바이트 배열로 구성된다.  각 바이트는 "물리주소(PA)" 라고..

LLVM

he LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines, though it does provide helpful libraries that can be used to build them. The name "LLVM" itself is not an acronym; it is the full name of the project.LLVM 프로젝트는 모듈식의 재사용 가능한 컴파일러와 툴체인의 집합입니다. 이 이름에도 불구하고 LLVM은 기존의 가상머신과는 그것을 만드는데 ..

[CSAPP] Ch 3. 프로그램의 기계수준 표현 : (6) 제어문

3.6  제어문   3.6.1  조건코드   앞서 보았듯, CPU에는 정수 레지스터와 함께 가장 최근의 산술 또는 논리연산의 특성을 설명하는 레지스터들을 운영한다.CF: 캐리플래그(carry flag). 가장 최근의 연산에서 가장 중요한 비트로부터 올림이 발생한 것을 표시→비부호형 연산에서 오버플로우를 검출ZF: 영플래그 (Zero flag). 가장 최근 연산의 결과가 0인것을 표시SF: 부호 플래그 (Sign flag). 가장 최근 연산이 음수를 생성한것을 표시OF: 오버플로우 플래그 (Overflow flag). 가장 최근 연산이 2의 보수 오버플로우를 발생시킨 것을 표시→ 부호형 연산에서 오버플로우를 검출​​다른 레지스터들은 변경시키지 않으면서 조건 코드만 변경해 주는 두 개의 인스트럭션이 있다. ..

[CSAPP] Ch 3. 프로그램의 기계수준 표현 : (5) 산술연산과 논리연산

3.5  산술연산과 논리연산    3.5.1  유효주소 적재 (Load Effective Address)    leaq는 movq와 유사하나, leaq는 포인터를 생성하기 위해 사용된다는 차이가 있다. 즉, leaq 는 실제 데이터를 읽어오는게 아니라, 메모리의 주소자체 혹은 주소계산값을 가져온다.​  이 명령어는 가리키는 위치에서 읽기를 수행하는 대신 '유효주소'를 목적지에 복사한다. 그래서 목적 오퍼랜드에는 반드시 레지스터만 올 수 있다.    3.5.2  단항 및 이항 연산  여기서 단항연산은 c언어에서 i++ 과 같은 자기 혼자서도 연산이 가능한 연산, 이항연산은 a+=c 같은, 다른 항이 존재해야 하는 연산이다. 이항연산에서 두번째 오퍼랜드는 소스이면서 목적지로 사용된다.  소스에는 상수, 레지..

[CSAPP] Ch 3. 프로그램의 기계수준 표현 : (4) 정보 접근하기

3.4  정보 접근하기   x86-64 CPU 는 64bit 값을 저장할 수 있는 16개의 범용 레지스터를 보유하고 있다. 이 레지스터들은 정수 데이터와 포인터를 저장하는데 쓰인다. 64bit로 확장하면서 8개의 새로운 레지스터들이 추가되었으며, %r8 ~ %r15라 칭한다. 레지스터 관련 참고 :x86-64 CPU 레지스터(Register) 종류, 32bit / 64bit 비교 (tistory.com)   중첩된 사각형이 보여주듯, 인스트럭션들은 16개의 레지스터 하위 바이트들에 저장된 다양한 크기의 데이터에 대해 연산할 수 있다. 바이트수준 연산들은 가장 덜 중요한 바이트에 대해 연산을 할 수 있으며, 16비트 연산들은 가장 덜 중요한2바이트에 접근하고, 32비트 연산은 덜 중요한 4바이트에, 64비..

[CSAPP] Ch 3. 프로그램의 기계수준 표현 : (3) 데이터의 형식

3.3  데이터의 형식   인텔 프로세서들이 처음에는 16비트 구조를 사용했기 때문에, 워드라는 단어를 16비트 데이터 타입을 말할 떄 사용한다. 32비트는 '더블워드' , 64비트는 '쿼드워드' 라고 부른다.       • 포인터 : 64bit 머신에선 예상대로 8byte 쿼드워드로 저장됨.      • 부동소수점 : x86계열에서 특별히 10byte 부동소수점 형식 연산을 구현하였으나, 호환성과 성능을 고려하여 이용하지 않는 것이 좋다.   여기서 주목할 점은, 포인터 char * 은 쿼드워드로 표현된다는 것 → 모든 포인터가 다 q로 표현된다.  이 데이터의 형식이 각 인스트럭션의 접미사로 붙여쓰이게 된다.  예를 들면 movb (바이트이동), movw (워드이동), movl (더블워드 이동), m..

[CSAPP] Ch 3. 프로그램의 기계수준 표현 : (2) 프로그램의 인코딩

3.2  프로그램의 인코딩   GCC컴파일러를 통해 컴파일을 진행하면(커맨트 라인 옵션으로 -Og) 최적화 수준을 적용한다.  일반적으로 최적화 수준을 올리면 최종 프로그램은 더 빨리 동작하지만, 컴파일 시간이 증가하고 디버깅 도구를 실행하기 어려워질 위험이 있으며 만들어진 코드가 기존의 C코드에 비해 너무 많이 변경되어 본래 코드와 기계어 코드간의 관계를 이해하기 어렵게된다.   이러한 GCC 명령은 소스코드를 실행코드로 변환하기 위해 일련의 프로그램들을 호출한다. 앞서 1장에서 보았듯이, 전처리기, 컴파일러, 어셈블러, 링커까지 호출하게 된다.    3.2.1  기계수준 코드   컴퓨터 시스템은 보다 간단한 추상화 모델을 이용해서 세부구현내용은 감추며 추상화의 다른 형태를 사용하고 있다. 이들 중 "..

[CSAPP] Ch 3. 프로그램의 기계수준 표현 : (1) 역사적 관점

Ⅲ. 프로그램의 기계수준 표현   3.0  Intro   GNU GCC C 컴파일러는 어셈블리 코드의 형태로 출력을 만들어 프로그램의 각 인스트럭션을 만들어낸다.대개의 경우 고급 언어가 제공하는 추상화를 사용하는 것이 보다 더 생산적이고 안정적이다. 반면에 어셈블리 코드는컴퓨터 기계에 매우 의존적이기 때문에(회사마다 쓰는 어셈블리 셋이 약간씩 다르다) 컴퓨터 기계에 매우 의존적이라 할 수 있다. 특히 기계어 자체도 CPU가 채택하는 ISA(명령어셋)에 따라 다 다르기 때문에 어셈블리어의 명령어 역시 통일된 규격이 없다. 그렇다면 왜 어셈블리 코드를 알 면 좋을까?     1.  컴파일러의 최적화 성능을 알수있다.     2.  코드에 내재된 비효율성을 분석 가능하다.     3.  시스템의 취약성이 어떻..