질문
- 첫번 째 질문 : 메모리( 힙이나 스택 등 메모리 공간에 어떻게 Load 되는지)
- 두번 째 질문 : 주 메모리 (CPU, RAM) 가 어떻게 동작하는지? (어셈블리어 공부)
- 세번 째 질문 : Big endian, Little endian, 캐시 메모리
- 메모리의 시작지점을 높낮이로... 메모리의 정렬 방식
메모리는 공간에 어떻게 Load되는가?
기반 지식 정리
- 컴퓨터의 모든 연산은 CPU가 처리한다.
- 레지스터 : 연산을 수행하기 위해서 데이터를 저장하는 공간(64비트 cpu의 경우 약 16개 = cpu 최대 데이터는 128바이트)
- 연산을 수행할 때 읽어들여야할 정보가 128바이트를 넘는 경우는? (\0을 사용?, 하나의 정보라는 것을 어떻게 확인? )
- 연산수행 결과 저장되는 장소 레지스터(register), 레지스터당 64비트
- 램 8g정도 (cpu의 레지스터와 비교했을 때 6천만배)
- 연산속도 : 레지스터 > 캐시(L1 > L2 > L3) > 램 > 롬(ssd > hdd)
- 실제 0.4나노초 > 0.9 / 2.8 / 28 > ~100 > ~25 ~ 50~150마이크로 | 1~10밀리초
- 현실 1초 > 2, 7초, 1분 > 4분 > 1.5일 ~ 4일 > 1 ~ 9달
- 필요한 정보 (실행파일, 게임, 인터넷, 사진 등)를 ROM에서 RAM으로 옮겨놓은 뒤 실행
- 필요한 정보의 RAM 주소를 찾아서 데이터를 읽음
- 램의 크기는 16g인데 게임용량이 100g짜리인 경우는 어떻게 렉없이 실행할수 있을까?
- 롬에 있는 정보를 확인하는 것은 매우 느린데 게임 퍼포먼스에 영향을 끼치진 않는가?
- 페이지
- → 프로그램 크기와 메모리의 크기는 큰 상관이없다 : cpu gpu 연산.
- 앨리트1명 (모든 작업 1명 ) vs 노동자 1000명 (단순작업 전용)
- 가상 메모리와 물리 메모리
- cpu가 참조하는 메모리 주소값
- 실제 메모리의 주소값
- 이중포인터에서 문자열을 참조할때랑 비슷한 느낌인가?
- 페이징과 페이지 (1페이지는 4kb)
- 프로그램마다 각자의 페이지테이블을 가지고 있어서 같은 가상메모리 주소를 가져도 괜찮다
메모리 구조
Code(Text) Segment (코드 영역) : 실행되는 프로그램의 코드가 저장되는 공간
- 기계어로 번역된 소스 코드 (c언어를 통해 작성한 함수, 명령문 등)
Data Segment (데이터 영역) : 전역변수와 정적변수의 값이 저장되는 공간.
- 프로그램이 종료될 때까지 사라지지 않음
- 프로그램의 시작과 함께 할당
- 정적 데이터의 초기 문자열, 리터럴 상수
Read only
Random Access
- Data Segment : 초기화된 전역, 정적 변수
- BSS(Block Stated by Symbol) : 초기화되지 않은 전역, 정적 변수, 0으로 자동 초기화