Computer Architecture
-
프로그램 카운터는 프로세서에 전원을 처음 공급하는 시점부터 전원을 끌 때까지 연속된 값들을 가정한다. 인스트럭션 Ik 에 대응되는 주소가 ak일 때 ak+1로의 전환을 제어이동이라고 부르고, 이러한 제어이동의 배열은 제어흐름이라고 한다. 점진적인 순서의 제어흐름은 Ik 와 Ik+1 이 메모리에서 서로 나란히 있는 경우다. Ik 와 Ik+1 이 인접해있지 않은 경우는 jump 나 call 인스트럭션이 발생한다. 시스템들은 내부 프로그램 변수에 의해 표시되지 않으며, 프로그램의 실행과는 관련 없는 시스템 상태의 변화에도 반응할 수 있어야 한다. 하드웨어 타이머는 규칙적인 간격으로 꺼지며, 시스템은 이것을 처리해야 한다. 패킷들은 네트워크 어댑터에 도착하고 메모리에 저장되어야 한다. 프로그램은 디스크로부터 데..
[CS] 예외 상황 및 프로세스 (Exceptions and Processes)프로그램 카운터는 프로세서에 전원을 처음 공급하는 시점부터 전원을 끌 때까지 연속된 값들을 가정한다. 인스트럭션 Ik 에 대응되는 주소가 ak일 때 ak+1로의 전환을 제어이동이라고 부르고, 이러한 제어이동의 배열은 제어흐름이라고 한다. 점진적인 순서의 제어흐름은 Ik 와 Ik+1 이 메모리에서 서로 나란히 있는 경우다. Ik 와 Ik+1 이 인접해있지 않은 경우는 jump 나 call 인스트럭션이 발생한다. 시스템들은 내부 프로그램 변수에 의해 표시되지 않으며, 프로그램의 실행과는 관련 없는 시스템 상태의 변화에도 반응할 수 있어야 한다. 하드웨어 타이머는 규칙적인 간격으로 꺼지며, 시스템은 이것을 처리해야 한다. 패킷들은 네트워크 어댑터에 도착하고 메모리에 저장되어야 한다. 프로그램은 디스크로부터 데..
2024.01.20 -
링킹(linking)은 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고, 실행될 수 있는 한 개의 파일로 만드는 작업이다. 컴파일 시 수행할 수 있으며 이때 소스코드는 머신코드로 번역된다. 주로 링커(linker)에 의해 실행되며 이는 각 소스파일들에 대해 독립적인 컴파일을 가능하게 한다. 컴파일러 드라이버 대부분의 컴파일 시스템은 사용자를 대신해서 언어 전처리기, 컴파일러, 어셈블러, 링커를 필요에 따라 호출하는 컴파일러 드라이버를 제공한다. (ex. gcc) 위 그림은 컴파일러 드라이버가 ASCII 소스 파일에서 Figure 7.1 프로그램을 실행 목적파일로 번역할 때 드라이버의 동작 내용을 요약한 것이다. C 전처리기(cpp)를 돌리고 소스 파일 main.c를 ASCII 중간 파..
[CS] 링킹, 목적 파일과 심볼 해석 (Linking)링킹(linking)은 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고, 실행될 수 있는 한 개의 파일로 만드는 작업이다. 컴파일 시 수행할 수 있으며 이때 소스코드는 머신코드로 번역된다. 주로 링커(linker)에 의해 실행되며 이는 각 소스파일들에 대해 독립적인 컴파일을 가능하게 한다. 컴파일러 드라이버 대부분의 컴파일 시스템은 사용자를 대신해서 언어 전처리기, 컴파일러, 어셈블러, 링커를 필요에 따라 호출하는 컴파일러 드라이버를 제공한다. (ex. gcc) 위 그림은 컴파일러 드라이버가 ASCII 소스 파일에서 Figure 7.1 프로그램을 실행 목적파일로 번역할 때 드라이버의 동작 내용을 요약한 것이다. C 전처리기(cpp)를 돌리고 소스 파일 main.c를 ASCII 중간 파..
2024.01.12 -
루프 풀기 루프 풀기는 루프의 매 반복 실행마다 계산되는 원소의 수를 증가시켜서 루프의 총 반복 횟수를 줄이는 프로그램 변환이다. 개선되는 점 루프 인덱스 계산과 조건부 분기와 같이 프로그램의 결과와는 직접적으로 관련이 없는 연산들의 수를 줄인다. 추가적인 최적화를 적용할 수 있게 된다. 2 x 1 루프 풀기 루프 한 번 마다 배열의 두 원소를 처리한다. 루프의 인덱스는 반복마다 2씩 증가한다. 벡터의 길이가 2의 배수가 아닐 가능성이 있으므로 임의의 벡터 길이에 대해서도 정확하게 동작해야 한다. 해결법은 루프의 한계를 n-1로 설정한다. k x 1 루프 풀기 위와 같이 임의의 인자 k에 대해 일반화할 수 있다. n-k+1를 한계로 설정한다. 2 x 1 루프 풀기에서 루프 오버헤드 연산을 줄여 정수 덧셈..
[CS] 루프 풀기 및 병렬성 높이기 (Loop unrolling)루프 풀기 루프 풀기는 루프의 매 반복 실행마다 계산되는 원소의 수를 증가시켜서 루프의 총 반복 횟수를 줄이는 프로그램 변환이다. 개선되는 점 루프 인덱스 계산과 조건부 분기와 같이 프로그램의 결과와는 직접적으로 관련이 없는 연산들의 수를 줄인다. 추가적인 최적화를 적용할 수 있게 된다. 2 x 1 루프 풀기 루프 한 번 마다 배열의 두 원소를 처리한다. 루프의 인덱스는 반복마다 2씩 증가한다. 벡터의 길이가 2의 배수가 아닐 가능성이 있으므로 임의의 벡터 길이에 대해서도 정확하게 동작해야 한다. 해결법은 루프의 한계를 n-1로 설정한다. k x 1 루프 풀기 위와 같이 임의의 인자 k에 대해 일반화할 수 있다. n-k+1를 한계로 설정한다. 2 x 1 루프 풀기에서 루프 오버헤드 연산을 줄여 정수 덧셈..
2024.01.12 -
최적화된 프로그램은 원본 프로그램이 겪게 될 모든 경우에 대해 C언어 표준이 제공하는 보장의 한계까지 정확히 동일한 동작을 가져야 하기 때문에 컴파일러는 오직 안전한 최적화만을 적용해야 한다. gcc의 -Og 옵션은 기본 최적화 세트를 적용하고, -01 이나 -02 , -03 옵션은 보다 광 범위한 최적화를 적용한다. 프로그램의 성능을 개선할 수 있으나, 크기가 커질 수 있으며 표준 디버거를 사용 한 디버깅이 어려워질 수 있다. 책에서는 컴파일러의 최적화 영향을 보기 위해 -01 옵션으로 컴파일하여 제한한다. 컴파일러가 방어적으로 최적화 해야만 하는 이유에 대한 예시를 알아보자. 최적화 한계 예시 1 위의 코드에서 twiddle1() 은 포인터 역참조를 6번 하고 있다. *xp = *xp + *yp; *..
[CS] 컴파일러의 최적화 성능과 한계 (Optimizing Compilers)최적화된 프로그램은 원본 프로그램이 겪게 될 모든 경우에 대해 C언어 표준이 제공하는 보장의 한계까지 정확히 동일한 동작을 가져야 하기 때문에 컴파일러는 오직 안전한 최적화만을 적용해야 한다. gcc의 -Og 옵션은 기본 최적화 세트를 적용하고, -01 이나 -02 , -03 옵션은 보다 광 범위한 최적화를 적용한다. 프로그램의 성능을 개선할 수 있으나, 크기가 커질 수 있으며 표준 디버거를 사용 한 디버깅이 어려워질 수 있다. 책에서는 컴파일러의 최적화 영향을 보기 위해 -01 옵션으로 컴파일하여 제한한다. 컴파일러가 방어적으로 최적화 해야만 하는 이유에 대한 예시를 알아보자. 최적화 한계 예시 1 위의 코드에서 twiddle1() 은 포인터 역참조를 6번 하고 있다. *xp = *xp + *yp; *..
2023.12.21 -
파이프라인 시스템의 일반적인 특징과 원리에 대한 간단한 예시 1. 파이프라인 시스템에서 수행해야 할 일은 여러 개의 일련의 단계들로 나누어진다. - 식당 : 에피타이저 -> 메인 음식 -> 디저트 -> 음료 - 세차장 : 물 -> 비누 -> 닦기 -> 왁스 -> 건조 2. 하나의 일이 다 끝날 때까지 전체 시스템 공정을 차지하지 않는다. - 세차장 : 이전의 차가 비누 단계에서 닦기 단계로 이동하면, 다음 차가 분사 단계로 바로 진행한다. , 하지만 일반적으로 충돌을 피하기 위해 같은 속도로 시스템을 통과해야 한다. * 결과적으로 주요 특징은 시스템 처리량을 증가시킨다는 점이다. 그러나 지연시간도 증가시킨다. - 식당 : 디저트만 원하는 고객이라도 파이프라인 시스템에서는 모든 메뉴를 거쳐야한다. 계산용 ..
[CS] 파이프라이닝의 일반 원리 (Pipelining)파이프라인 시스템의 일반적인 특징과 원리에 대한 간단한 예시 1. 파이프라인 시스템에서 수행해야 할 일은 여러 개의 일련의 단계들로 나누어진다. - 식당 : 에피타이저 -> 메인 음식 -> 디저트 -> 음료 - 세차장 : 물 -> 비누 -> 닦기 -> 왁스 -> 건조 2. 하나의 일이 다 끝날 때까지 전체 시스템 공정을 차지하지 않는다. - 세차장 : 이전의 차가 비누 단계에서 닦기 단계로 이동하면, 다음 차가 분사 단계로 바로 진행한다. , 하지만 일반적으로 충돌을 피하기 위해 같은 속도로 시스템을 통과해야 한다. * 결과적으로 주요 특징은 시스템 처리량을 증가시킨다는 점이다. 그러나 지연시간도 증가시킨다. - 식당 : 디저트만 원하는 고객이라도 파이프라인 시스템에서는 모든 메뉴를 거쳐야한다. 계산용 ..
2023.12.02 -
switch문은 정수 인덱스 값에 따라 다중분기 기능을 제공한다. GCC는 case 값의 밀집도와 case의 수를 고려해서 switch문의 번역 방법을 선택한다. 장점 switch문을 사용하면 C 코드를 읽기 쉽게 해줄 뿐만 아니라 점프 테이블을 사용해서 효율적인 구현을 가능케 한다. 다단계의 if-else문을 사용하는 것보다 switch문을 실행하는 데 걸리는 시간이 case 수에 관계없다는 장점이 있다. 예제 (a)는 C로 구현한 간단한 switch문 예제 (b)는 (a)를 컴파일할 때 생성된 어셈블리 코드의 동작을 C로 나타낸 것 점프 테이블인 배열 jt는 7개의 원소를 가지고 있으며, 이들은 각 코드 블록의 주소다. jt의 비어있는 원소에는 default 블록 주소를 넣는다. 컴파일러는 먼저 인자..
[CS] switch문 내부 동작 원리 (Switch Statement)switch문은 정수 인덱스 값에 따라 다중분기 기능을 제공한다. GCC는 case 값의 밀집도와 case의 수를 고려해서 switch문의 번역 방법을 선택한다. 장점 switch문을 사용하면 C 코드를 읽기 쉽게 해줄 뿐만 아니라 점프 테이블을 사용해서 효율적인 구현을 가능케 한다. 다단계의 if-else문을 사용하는 것보다 switch문을 실행하는 데 걸리는 시간이 case 수에 관계없다는 장점이 있다. 예제 (a)는 C로 구현한 간단한 switch문 예제 (b)는 (a)를 컴파일할 때 생성된 어셈블리 코드의 동작을 C로 나타낸 것 점프 테이블인 배열 jt는 7개의 원소를 가지고 있으며, 이들은 각 코드 블록의 주소다. jt의 비어있는 원소에는 default 블록 주소를 넣는다. 컴파일러는 먼저 인자..
2023.11.14 -
설명 void echo() { char buf[8]; // 대충 buf에 사용자 입력 값 삽입하는 코드 } void caller() { echo(); } char buf[8] 선언 시 여러 상태정보와 함께 스택에 24바이트 할당한다. buf와 저장된 리턴 포인터 사이의 16바이트는 사용되지 않는다. echo()의 buf에 8문자(널 문자 포함)를 입력하면 buf에 할당된 공간에 알맞게 저장한다. 하지만 보다 긴 문자열을 입력하면 스택에 저장된 정보의 일부를 덮어쓰게 된다. 23개 까지는 심각한 결과가 발생하지 않지만, 이 이상부터는 리턴 포인터의 값과 저장 상태까지도 손상된다. 리턴 주소가 손상되면 ret instruction이 프로그램을 전혀 예상하지 못한 곳으로 점프하게 한다. 저장 공간을 오버플로우..
[CS] 버퍼 오버플로우와 공격 대응 기법 (Buffer Overflow)설명 void echo() { char buf[8]; // 대충 buf에 사용자 입력 값 삽입하는 코드 } void caller() { echo(); } char buf[8] 선언 시 여러 상태정보와 함께 스택에 24바이트 할당한다. buf와 저장된 리턴 포인터 사이의 16바이트는 사용되지 않는다. echo()의 buf에 8문자(널 문자 포함)를 입력하면 buf에 할당된 공간에 알맞게 저장한다. 하지만 보다 긴 문자열을 입력하면 스택에 저장된 정보의 일부를 덮어쓰게 된다. 23개 까지는 심각한 결과가 발생하지 않지만, 이 이상부터는 리턴 포인터의 값과 저장 상태까지도 손상된다. 리턴 주소가 손상되면 ret instruction이 프로그램을 전혀 예상하지 못한 곳으로 점프하게 한다. 저장 공간을 오버플로우..
2023.11.14 -
실수를 표현하는 방식으로 꽤 많은 종류의 형태가 제안되었지만, 현재까지 가장 많이 사용하는 방식은 IEEE 표준 754 부동 소수점 표현이다. 십진수 표기법 이진수 표기법 (비트) 이진수 표기법의 한계 0.2 같은 경우에는 이진수 표기법으로 정확하게 표기가 불가능하다. 매우 큰 수를 표현하기에 부적합하다 : 예를 들어 5 * 2^100은 101000000000…. (0이 100개 필요) IEEE 부동소수점 S는 숫자가 음수인지 양수인지 결정, 해당 비트는 MSB(Most Significant Bit) 처리 M은 분수 이진수 (가수부) E는 2의 거듭제곱인 가중치 단정밀도 (float) : 앞 8비트 = 지수, 뒤 23비트 = 분수 배정밀도 (double) : 앞 11비트 = 지수, 뒤 52비트 = 분수 ..
[CS] 부동 소수점 (Floating Point)실수를 표현하는 방식으로 꽤 많은 종류의 형태가 제안되었지만, 현재까지 가장 많이 사용하는 방식은 IEEE 표준 754 부동 소수점 표현이다. 십진수 표기법 이진수 표기법 (비트) 이진수 표기법의 한계 0.2 같은 경우에는 이진수 표기법으로 정확하게 표기가 불가능하다. 매우 큰 수를 표현하기에 부적합하다 : 예를 들어 5 * 2^100은 101000000000…. (0이 100개 필요) IEEE 부동소수점 S는 숫자가 음수인지 양수인지 결정, 해당 비트는 MSB(Most Significant Bit) 처리 M은 분수 이진수 (가수부) E는 2의 거듭제곱인 가중치 단정밀도 (float) : 앞 8비트 = 지수, 뒤 23비트 = 분수 배정밀도 (double) : 앞 11비트 = 지수, 뒤 52비트 = 분수 ..
2023.11.14