컴퓨터 구조

메모리의 구조, 트랜지스터 키고 끄는 원리, 변수가 메모리에서 어떻게 크기를 차지하는지, CPU가 어떻게 처리하는지

jennyiscoding 2024. 3. 16. 16:04

내 맥OS의 메모리 크기:

터미널에 sysctl hw.memsize | awk '{print $2/1024/1024/1024 " GB"}' 쳤더니 8GB나옴.

 

아래 코드를 치면 실행하기 전에는 HDD에 있다가 실행하면 RAM에 올라가게 된다

a = 15
print(a)

 

메모리 : 전기신호를 저장할 수 있는 트렌지스터로 구성됨.

이 트렌지스터는 전구와 같은 역할을 하는데 켜 있는 것은 1, 꺼있는 것은 0으로 해석됨. 

 

재료공학 관점에서 트렌지스터를 어떻게 키고 끌 수 있나?(쳇 GPT)

 

 RAM (랜덤 액세스 메모리)은 전기적 신호를 이용하여 데이터를 읽고 쓸 수 있는 휘발성 메모리입니다. RAM에서는 페르미 에너지 레벨을 조절하여 트랜지스터를 키고 끌 수 있습니다. RAM은 주로 MOSFET (금속-산화물-반도체 필드 효과 트랜지스터)로 구성되어 있습니다.

MOSFET의 작동: MOSFET은 게이트, 소스 및 드레인으로 구성되어 있습니다. 게이트에 전압을 인가하면 채널이 형성되고, 이 채널을 통해 전류가 흐를 수 있습니다. 이 과정에서 페르미 에너지 레벨을 조절하여 전자의 운동 상태를 변경합니다.

키는 작동: RAM에서 키는 작동은 게이트에 양수 전압을 인가하여 MOSFET의 채널을 형성하는 과정입니다. 이는 페르미 에너지 레벨을 변경하여 전자의 운동 상태를 활성화시키고, 전류의 흐름을 유도합니다. 이러한 작동은 데이터를 RAM 셀에 쓸 때 발생합니다.

끄는 작동: RAM에서 끄는 작동은 게이트에 반대 전압을 인가하여 MOSFET의 채널을 차단하는 과정입니다. 이는 페르미 에너지 레벨을 변경하여 전자의 운동 상태를 비활성화시키고, 전류의 흐름을 차단합니다. 이러한 작동은 데이터를 RAM 셀에서 읽을 때 발생합니다.

따라서 RAM에서는 게이트에 인가되는 전압을 조절하여 페르미 에너지 레벨을 변경하고, 이를 통해 MOSFET의 채널을 형성하거나 차단하여 트랜지스터를 키고 끌 수 있습니다.

 

결론 : 하나의 트렌지스터에 양수 전압을 인가하면 MOSFET의 채널을 형성해서 1로 만들고 음수 전압을 인가하면 0으로 만든다는 것임. 

 

이진수는 메모리 주소를 표기하기에 너무 길어져서 거의 16진수 사용함. 

이진수 4자리 = 16진수 1자리

 

참고 : https://www.youtube.com/watch?v=JHxY08iENxs

 

그래서 내 컴퓨터 메모리 8GB는 얼마만큼의 데이터를 저장한다는 말인가?

1 bite = 8 bit

1 kB = 2^10 bite

1 mB = 2^10 kB

1 gB = 2^10 mB

 

내 컴퓨터는 8gB임. 즉, 8 * 8 * 2 ^ 30 bit(68,719,476,736 bit) 680억개 전구가 있는거다?

 

메모리 주소는 16비트로 구성됨.

제일 첫번째 주소는 0x0

두번째 주소는 0x1

 

만약에 첫번째 주소를 할당했다면 내 메모리 크기는 680억 - 16 비트겠지.

 

int로 변수 선언을 했다면 Int는 4 바이트 크기를 차지한다. 즉, 32비트. 

32개의 전구를 쓰는거다. 

 

문자는 아스키 코드로 저장이 되며 작은 숫자기 때문에 1바이트 크기를 차지한다. 

 

만약에 [1,2,3,4] 라는 배열을 선언했다면 int가 4개이기 때문에 16바이트를 차지한다. 

key와 value로 구성된 dict의 경우 메모리에 연속적으로 저장되지 않고 value와 주소값을 가지고 있기 때문에 주소가 4바이트를 차지해서 총 8바이트의 메모리를 쓴다. 

 

그렇다면 우리가 코드를 실행했을 때 함수는 메모리 차지를 안하는 걸까?

챗 GPT:

함수는 메모리를 차지합니다. 함수는 코드 세그먼트(Code Segment)에 저장되며, 해당 함수가 실행될 때 필요한 데이터 및 지역 변수는 스택(Stack) 또는 힙(Heap) 메모리에 저장됩니다.

코드 세그먼트: 함수의 명령어들은 프로그램의 코드 세그먼트에 저장됩니다. 이 세그먼트는 실행 가능한 명령어들을 보유하고 있으며, 각 함수의 명령어들이 저장되어 있습니다.

스택 및 힙 메모리: 함수의 실행 중에 필요한 데이터 및 지역 변수는 주로 스택 메모리에 저장됩니다. 스택은 함수 호출 및 복귀에 사용되는 메모리 영역으로, 함수 호출 시 매개변수, 지역 변수, 반환 주소 등이 스택 프레임에 저장됩니다. 또한 동적으로 할당된 메모리는 힙에 저장됩니다.

따라서 함수가 실행되는 동안 메모리를 사용하게 되며, 이는 함수의 지역 변수, 매개변수, 반환 주소 등을 저장하는 데 사용됩니다. 함수의 크기는 해당 함수에 포함된 코드 및 필요한 메모리 양에 따라 달라지며, 이는 프로그래밍 언어, 컴파일러 및 실행 환경에 따라 다를 수 있습니다.

 

함수는 메모리 내에서 코드 세그먼트에 저장된다고함. 

 

os가 당장 업무처리를 할 수 없을 때(cpu가 다른 일을 처리 중) 메모리의 힙, 스택, 코드 영역에 저장되어있는 것이다. (커널영역과 반대로 운영체제 서비스를 제공받을 수 없는 실행 모드 일때 변수들이 스택과 힙에 저장되는거)

 

즉, 내가 파이썬 코드를 파일로 가지고 있을 때는 하드디스크에 저장이 되어있다가, 실행(Run)을 하면 메모리의 힙, 스택, 코드 영역의 주소에 저장이 된다. 사용자 모드에서 프로세스로 대기하다가 내 차례가 오면 CPU가 처리를 해주는 것이다. 각 프로세스마다 타임 리미트가 있어서 일정 시간이 지났는데도 처리를 다 못했으면 맨 뒤로가서 또 기다려야 한다. 이런 CPU스케줄링이나 문맥교환은 OS(운영체제)가 해주는거다. 각 제조사(Inter, Apple..)마다 다른 언어를 사용한다. 

 

 

 

 

커널 영역에서 프로세스 처리가 완료되면 메모리 누수가 일어나지 않게 가비지 컬렉션을 해주어야 한다. 파이썬은 언어가 알아서 해준다함?? (GPT선생님)

네, 맞습니다. 파이썬은 가비지 컬렉션(Garbage Collection)을 자동으로 수행합니다. 가비지 컬렉션은 프로그램이 동적으로 할당한 메모리 중에서 더 이상 사용되지 않는 메모리를 찾아내고 해제하는 프로세스를 말합니다. 파이썬의 가비지 컬렉션은 자동으로 동작하여 개발자가 직접 메모리 관리를 신경 쓸 필요가 없도록 합니다.

파이썬의 가비지 컬렉션은 참조 카운팅(Reference Counting)과 세대(generation) 기반의 가비지 컬렉션을 결합하여 사용됩니다.

참조 카운팅: 파이썬은 객체의 참조 개수를 추적하여 객체가 더 이상 사용되지 않을 때 메모리를 해제합니다. 객체에 대한 참조 개수가 0이 되면 해당 객체가 가비지 컬렉션의 대상이 되어 메모리에서 해제됩니다.

세대 기반 가비지 컬렉션: 파이썬은 세대 기반 가비지 컬렉션을 사용하여 가비지 컬렉션의 효율을 향상시킵니다. 이는 객체가 생성된 세대에 따라 가비지 컬렉션을 적용하는 방식입니다. 파이썬은 주기적으로 객체를 검사하여 여러 세대로 나누고, 오래된 객체일수록 더 자주 가비지 컬렉션을 수행하여 메모리를 관리합니다.

이러한 방식으로 파이썬은 가비지 컬렉션을 통해 메모리 누수를 방지하고 메모리를 효율적으로 관리합니다. 따라서 파이썬 개발자는 메모리 관리에 대해 걱정할 필요가 없으며, 가비지 컬렉션을 통해 자동으로 메모리 관리가 이루어집니다.