Bias는 부동소수점에서 지수를 양수로 표현하기 위해 사용하는 보정값을 말한다.

 

📌 Bias가 필요한 이유

컴퓨터는 보통 부호 없는 이진수를 쉽게 다룬다.

하지만 부동소수점의 지수는 양수도 되고 음수도 되어야 한다.

예를 들어

이처럼 지수가 음수, 0, 양수 모두를 포함해야하므로, 이를 컴퓨터가 쉽게 표현할 수 있도록 모든 지수에 일정한 수를 더해서

양수로 만들어서 저장해야한다.

 

📌 32비트 ( float ) 기준

  • 지수는 9비트 -> 표현 범위 : 0 ~ 255
  • 이 중 실제 지수로 사용되는 범위는 -126 ~ +127 이다
  • 그래서 Bias를 127로 설정한다.

'CS' 카테고리의 다른 글

[CS] 부동소수점  (0) 2025.04.15
[CS] 힙 단편화  (0) 2025.04.09
[CS] 스택과 힙  (0) 2025.04.09
[CS] 메모리 보호 기법 ( ASLR )  (0) 2025.03.11
[cs] 문자열 상수  (0) 2025.02.23
부동 소수점은 컴퓨터에서 실수를 표현하는 방식 중 하나다.
정수만으로 표현할 수 없는 소수점이 있는 수들을 다룰 수 있도록 설계된 방식을 말한다.


📌 개요

컴퓨터는 이진수 체계를 사용하므로 실수도 이진 소수로 표현해야한다.

하지만 실수는 무한히 많은 수가 존재해서 모든 실수를 정확하게 표현할 수 없다.

따라서 일정한 근사치로 표현하게 되는데, 이때 사용하는 대표적인 방식이 바로 부동소수점 방식이다.

 

📌 구조

IEEE 754 표준에 따라 부동소수점 수는 다음과 같은 세 부분으로 구성된다.

일반적인 구조( 32비트 단정도 )

부호(S) 지수(E) 가수(M)
1비트 8비트 23비트
  • 부호(S) : 0이면 양수, 1이면 음수
  • 지수(E) : 2의 몇 제곱인지를 나타낸다
  • 가수(M) : 실제 유효숫자( 정규화된 소수 부분 )

 

📌 정규화 표현

 

부동소수점 수는 일반적으로 다음과 같은 형식으로 표현된다.

  • Bias( 지수 편향 ) : 표현 가능한 음수 지수를 양수로 바꾸기 위해 사용된다.
    • 32비트 단정도 : Bias = 127
    • 64비트 배정도 : Bias = 1023

 

📌 예시

 

실수 10.375를 IEEE 754 32비트 부동소수점으로 변환해 보자.

  1. 부호 비트(S)를 구한다.
    • 10.375는 양수 -> 부호 비트 = 0
  2. 정수부와 소수부를 이진수로 바꾼다.
    • 10 = 1010 ( 2진수 )
    • 0.375 =
      • 0.375 * 2 = 0.75 -> 정수부 0
      • 0.75 * 2 = 1.5 -> 정수부 1
      • 0.5 * 2 = 1.0 -> 정수부 1
        • 따라서 0.375 = 0.011
    • ▶️ 전체 이진 표현 : 1010.011
  3. 정규화
    • 1010.011 -> 1.010011 * 2^3 형태로 변환 ( 소수점 뒤에만 남기기 )
  4. 지수 구하기
    • 지수 = 3 ( 위에서 2^3 에서 3인 것을 확인 )
    • Bias = 127 ( IEEE 754 단정도 기준 )
    • E = 3 + 127 = 130
    • 130 = 10000010 ( 8비트 )
  5. 가수 구하기
    • 정규화된 수의 소수 부분 : 010011
    • 23비트로 채움: 01001100000000000000000
  6. 최종 32비트 구성
부호(S) 지수(E) 가수(M)
0 10000010 01001100000000000000000

 

최종 결과 (2진수) : 0 10000010 01001100000000000000000

16진수로 변환 : 0x41260000

 

'CS' 카테고리의 다른 글

[CS] Bias ( 부동소수점 보정값 )  (0) 2025.04.15
[CS] 힙 단편화  (0) 2025.04.09
[CS] 스택과 힙  (0) 2025.04.09
[CS] 메모리 보호 기법 ( ASLR )  (0) 2025.03.11
[cs] 문자열 상수  (0) 2025.02.23
힙 단편화는 동적 메모리 할당 및 해제 과정에서 메모리가 비효율적으로 조각나면서 사용 가능한 메모리가 줄어드는 현상을 말한다. 단편화가 심해지면 메모리가 충분히 남아 있어도 큰 크기의 할당이 불가능해져 성능 저하와 메모리 낭비를 초래할 수 있다.

 

📌 힙 단편화의 종류

힙 단편화는 크게 외부 단편화와 내부 단편화로 나뉜다.

1️⃣ 외부 단편화

  • 할당과 해제를 반복하면, 작은 크기의 빈 공간(조각)이 여러 곳에 생겨 새로운 할당이 어려워지는 현상을 말한다.
  • 힙 메모리 전체 용량은 충분해도, 연속된 큰 블록을 할당할 공간이 부족해진다.
  • 메모리의 낭비가 발생하게 된다.
[  할당됨  ][  할당됨  ][ 빈 공간 ][  할당됨  ][ 빈 공간 ][  할당됨  ][ 빈 공간 ]

 

위와 같이 작은 빈 공간들이 여기저기 퍼져 있으면, 큰 크기의 데이터를 할당할 공간이 부족할 수 있다.

 

2️⃣ 내부 단편화

  • 메모리 할당 단위와 실제 요청 크기 간 차이로 인해 발생하는 낭비를 말한다.
  • 일반적으로 OS나 메모리 할당자는 페이지 크기( 보통 4KB ) 또는 특정 블록 크기 단위로 메모리를 관리한다.
  • 만약 64바이트 단위로 메모리를 할당하는 시스템에서 50바이트를 요청하면, 14바이트가 낭비 되는 것
[  64B 블록  ][  64B 블록  ][  64B 블록  ][  64B 블록  ]
[  50B 사용  ][  30B 사용  ][  10B 사용  ][  5B 사용   ]

 

위와 같이 일부 공간이 채워지지 않고 낭비된다.

 

📌 힙 단편화가 성능에 미치는 영향

1️⃣ 메모리 부족 문제 발생

  • 실제로 사용할 수 있는 메모리는 충분해도 단편화로 인해 새로운 할당이 불가능하다.

2️⃣ 메모리 접근 성능 저하

  • 캐시 친화도가 낮아지고, 불필요한 페이지 테이블 조회가 증가한다.

 

📌 힙 단편화를 줄이는 방법

1️⃣ 메모리 풀 사용

  • 미리 정해진 크기의 메모리 블록을 관리하여 단편화를 방지한다.

2️⃣ 메모리 압축

  • 외부 단편화를 줄이기 위해 메모리를 재정렬하는 방법을 말한다.

'CS' 카테고리의 다른 글

[CS] Bias ( 부동소수점 보정값 )  (0) 2025.04.15
[CS] 부동소수점  (0) 2025.04.15
[CS] 스택과 힙  (0) 2025.04.09
[CS] 메모리 보호 기법 ( ASLR )  (0) 2025.03.11
[cs] 문자열 상수  (0) 2025.02.23

스택의 용량이 무제한이라면, 힙이 필요할까?

 

📌 스택과 힙 간단 비교

특징 스택
할당 방식 자동 ( 컴파일러가 관리 ) 수동 ( 프로그래머가 malloc / free 관리 )
메모리 크기 일반적으로 작음 상대적으로 큼
할당 속도 매우 빠름 상대적으로 느림
데이터 수명 함수 실행 동안만 유지 free() 호출 전까지 유지
사용 방식 지역 변수, 함수 호출 스택 동적 할당된 객체, 대량 데이터

 

스택이 무제한이라면, 할당 속도가 빠르고, 자동 해제되므로 힙을 대체할 수 있을것 처럼 보인다.

하지만, 다음과 같은 이유 때문에 여전히 힙이 필요하다.

 

1️⃣ 데이터의 수명이 함수 호출을 넘어야 하는 경우

스택 변수는 함수가 종료되면 자동으로 해제된다.

 

int* createNumber() {
    int num = 42;  // 스택에 할당됨
    return #   // 잘못된 포인터 반환! (dangling pointer)
}

 

위 코드는 num의 주소를 반환하나, 함수가 끝나면 해당 변수의 메모리는 해제(소멸) 된다.

이때 힙을 사용하면, 함수가 끝난 뒤에도 데이터를 유지할 수 있다.

 

2️⃣  동적으로 크기가 변하는 데이터를 다룰 때

스택에서는 변수가 컴파일 타임에 크기가 정해져야 한다.

 

void stackExample(int size){
    int arr[size];
}

 

위 코드에서 size가 런타임에 결정되면, 일부 컴파일러에서 오류가 발생할 수 있다.

반면, 힙은 런타임에 동적으로 크기를 정할 수 있어 유연하다.

void heapExample(int size){
    int* arr = (int*)malloc(size * sizeof(int));
    free(arr);
}

 

동적 크기 조정이 필요한 경우, 힙이 필수적이다.

 

3️⃣ 동적으로 크기가 변하는 데이터를 다룰 때

스택은 Last In, First Out ( LIFO ) 구조이므로 중간 데이터를 자유롭게 관리하기 어렵다.

 

void example(){
    int a = 10;
    int b = 20;
    // 스택에서 b를 해제하고 a만 유지하는 것이 불가능하다.
}

 

힙은 필요할 때마다 메모리를 할당(malloc)하고, 필요 없을 때 해제(free)할 수 있어 더 유연하다.

 

4️⃣ 멀티스레드 환경에서 공유 메모리가 필요

스택은 각 스레드마다 독립적으로 할당되므로, 스레드 간 공유 데이터를 저장할 수 없다.

힙에 할당된 메모리는 여러 스레드에서 공유할 수 있다.

 

 

결론, 대부분의 현실적인 프로그램에서는 힙이 꼭 필요하다.

'CS' 카테고리의 다른 글

[CS] 부동소수점  (0) 2025.04.15
[CS] 힙 단편화  (0) 2025.04.09
[CS] 메모리 보호 기법 ( ASLR )  (0) 2025.03.11
[cs] 문자열 상수  (0) 2025.02.23
[CS] 빅 엔디안, 리틀 엔디안  (0) 2025.02.23

📌 ASLR ( Address Space Layout Randomization )

ASLR은 프로세스의 메모리 주소를 매 실행마다 무작위로 배치하여 보안성을 높이는 기법이다.
이 기술은 버퍼 오버플로우 및 기타 메모리 기반 공격을 어렵게 만드는 역할을 한다.
  • 메모리 손상 취약점 공격을 방지하기 위한 기술
  • 스택, 힙, 라이브러리 등의 주소를 랜덤한 영역에 배치하여, 공격에 필요한 목표 주소를 예측하기 어렵게 만든다.
  • 프로그램이 실행 될 때마다 각 주소들이 변경된다.

'CS' 카테고리의 다른 글

[CS] 힙 단편화  (0) 2025.04.09
[CS] 스택과 힙  (0) 2025.04.09
[cs] 문자열 상수  (0) 2025.02.23
[CS] 빅 엔디안, 리틀 엔디안  (0) 2025.02.23
[CS] sleep 함수  (0) 2025.02.11

📌 구문 분석

어휘 분석을 통해 잘라낸 토큰을 비선형 트리 구조로 그린다.

 

비선형 트리 구조에서 문법 오류를 찾아낸다.

 

while b ≠ 0:
    if a > b:
        a := a - b
    else:
        b := b - a
return a

 

위 코드를 비선형 트리 구조인 Abstract_syntax_tree로 나타내면 아래 그림과 같다.

 

컴파일러는 프로그래밍 언어로 작성된 소스 코드를 기계어로 변환하는 프로그램이다.

 

📌 어휘 분석

컴파일러의 첫 번째 단계를 어휘 분석 또는 스캐닝이라 한다.

 

어휘 분석이란 소스 프로그램을 읽어들여 토큰이라는 의미 있는 문법적 단위로 분리하고 토큰 스트림을 생성하는 것이다.

이러한 어휘 분석을 담당하는 도구를 '어휘분석기' 또는 '스캐너'라고 한다.

 

언어마다 사용하는 토큰이 다르지만 일반적인 프로그래밍 언어에서 사용하는 토큰은 if, for, while과 같은 예약어, 3, 2.5와 같은 상수, +, -, *, /, =와 같은 연산자, 프로그래머가 정의한 식별자, 그리고 괄호나 쉼표(,), 세미클론(;)과 같은 구분자 등이 있다.

 

이러한 토큰은 다음 단계인 구문 분석에서 효율을 높이기 위해 순서쌍( 토큰 번호, 속성 값 )의 형태로 전달한다.

  • 토큰 번호는 모든 토큰을 구별하기 위한 유일한 번호를 말한다.
  • 속성 값은 기호표에 저장된 항목을 가리킨다.
형식 언어란, 인간과 기계 사이에 의사소통을 하는 언어로서 인위적으로 만들어진 언어다.

 

📌 종류

촘스키가 제안한 촘스키 위계에 따라 형식 언어를 네 가지로 계층을 나눠 분류 할 수 있다.

1. 재귀 열거 언어( Recursively Enumerable Language, REL )

🔹 개념

  • 튜링 기계에 의해 인식 될 수 있는 언어다.
  • 모든 계산 가능한 문제가 포함되고, 튜링 기계가 정답을 찾을 수 있는 언어다.
  • 튜링 기계가 항상 멈추는 것은 아니므로, 특정 문자열이 언어에 속하지 않는지 판별하는 것은 불가능 할 수 있다. (즉, 언어에 속하는 문자열은 확인할 수 있지만, 속하지 않는다고 확정할 수 없음)

🔹 특징

  • 가장 강력한 언어 클래스로, 모든 다른 언어를 포함한다.
  • 비결정적 튜링 기계로도 인식이 가능하다.
  • 어떤 문자열이 언어에 속자히 않는지를 결정하는 것은 불가능 할 수 있다. ( 정지 문제와 관련 )

 

형식 언어 중 컴퓨터와의 의사소통에 사용되는 언어를 프로그래밍 언어( = 컴퓨터 언어 )라고 한다.

 

프로그래밍 언어는 사용 목적, 형태와 기능, 세대 등에 따라 여러 가지로 분류할 수 있다.

  • 형태와 기능에 따라 저급 언어와 고급 언어로 나눈다.
    • 저급 언어에는 기계어와 어셈블리어가 있다.
    • 고급 언어에는 C, 파스칼, 코볼 등이 있다.
문자열이란 char 타입의 배열이며, 널 종료 문자(\0)를 포함하는 연속된 문자들의 집합을 말한다.

 

여기서 말하는 배열이라는 것은 그 본질이 메모리의 어느 공간에 저장되어 있는 것이라고 생각할 수 있다.

배열이라면, 그 값을 당연히 수정할 수 있다.

 

실제 코드에서도 char[] 에 문자열을 담고 char[0], char[1], ... 로 접근을 해서 배열의 항목을 수정할 수 있다.

그렇다면 문자열 상수는 어떨까?

#include<stdio.h>

int main()
{
	const char* str = "Hello World\n";
	printf(str);  // 1
	printf("Hello World\n"); // 2

	return 0;
}

위와 같이 str은 문자열 상수로 Hello World 문자열의 주소를 담고 있다.

위와 같은 예제가 있을때 1번 printf에서 중단점을 잡고 디버깅에 진입하고

 

 

str이 있는 메모리 주소로 가면 위 그림처럼 Hello World가 저장되어 있는 것을 볼 수 있다.

 

 

만약 메모리에서 Hello World값을 수정하고 2번 printf에서 Hello World를 출력하면 어떤 값이 출력될까?

 

 

이처럼 2번째 printf에서 TESTING_rld로 바뀐것을 확인할 수 있다.

 

정리해보면 다음과 같다.

1. str이 가리키고 있는 문자열과 2번 printf에서 출력하는 Hello World는 같은 주소다.

2. 문자열 상수라고 하더라도 그 본질은 배열이고 배열이라면 메모리에 연속된자리에 문자들이

저장되어 있는 것이기 때문에 메모리의 값을 수정하면 해당 값이 수정되는 것을 확인할 수 있다.

'CS' 카테고리의 다른 글

[CS] 스택과 힙  (0) 2025.04.09
[CS] 메모리 보호 기법 ( ASLR )  (0) 2025.03.11
[CS] 빅 엔디안, 리틀 엔디안  (0) 2025.02.23
[CS] sleep 함수  (0) 2025.02.11
[CS] 디스패처( Dispatcher )  (0) 2025.02.11
엔디안( Endianness )은 멀티바이트 데이터를 메모리에 저장하는 방식을 의미한다.
컴퓨터는 데이터를 메모리에 저장할 때 바이트 단위로 저장하는데, 
하나의 데이터가 여러 바이트로 구성될 경우 어떤 바이트를 앞에 배치할 것인가에 따라
빅 엔디안과( Big Endian )과 리틀 엔디안( Little Endian ) 방식으로 나뉜다.

 

📌 빅 엔디안( Big Endian )

  • 큰 바이트(= 상위 바이트)를 앞에 배치하는 방식이다.
  • 이 방식은 평소 우리가 숫자를 사용하는 선형 방식과 같은 방식이다.
    • 메모리에 저장된 순서 그대로 읽을 수 있어서 이해하기가 매우 쉽다.
  • RISC CPU 계열에서 이 방식으로 데이터를 저장한다.
  • 네트워크에서 데이터를 전송할 때 사용한다. ( TCP/IP 프로토콜은 빅 엔디안 방식 사용 )

 

📌 리틀 엔디안( Big Endian )

  • 큰 바이트(=상위 바이트)를 뒤에 배치하는 방식이다.
  • 대부분의 x86 아키텍처( Intel, AMD )는 리틀 엔디안을 사용한다.

'CS' 카테고리의 다른 글

[CS] 메모리 보호 기법 ( ASLR )  (0) 2025.03.11
[cs] 문자열 상수  (0) 2025.02.23
[CS] sleep 함수  (0) 2025.02.11
[CS] 디스패처( Dispatcher )  (0) 2025.02.11
[CS] 디자인 패턴  (0) 2024.11.11

+ Recent posts