TIL (학습정리) - 170122, 180122

케이·2022년 1월 17일
0

TIL

목록 보기
4/13
post-thumbnail

스스로 부족한 것을 채우기 위한 학습 기록입니다. 부족함을 알고 채워나가려 노력하고 있습니다. 피드백은 언제나 환영합니다.😺

같은 부분을 이틀에 걸쳐 학습해서 하나의 TIL에 작성함

메모리에 어떻게 올라갈까?

OS가 있으면 OS에서 프로그램을 실행! 메모리에 프로그램이 올라가면 그것이 프로세스!

다시 정리하자면
실행파일이 있다면 실행 파일을 실행하면 운영체제가 프로그램의 정보를 읽고 메인 메모리에 공간을 할당한다. 그리고 프로그램 코드(함수, 변수 등등등)들을 메모리에 읽고 쓰면서 동작을 한다! 아래의 메모리 구조는 메모리에 어떻게 올라가는지 알아보기 위해서 살펴본다!

📌 프로그램은 저장장치에 있는 정적 상태, 프로세스는 실행을 위해 메모리에 올라가는 동적상태

메모리 구조


이미지 출처: http://www.tcpschool.com/lectures/img_c_memory_structure.png, https://t1.daumcdn.net/cfile/tistory/1815F9494E426B401C

  1. Stack - 함수, 지역변수 저장
  2. Heap - 동적, malloc(), new()
  3. BSS - 초기화 안한 변수
  4. Data - 초기화 한 변수 (전역변수, 정적(static)변수, 배열, 구조체 등이 저장됨)
  5. Text - 흔히 코드 영역이라고 함. 프로그램을 실행시키기 위해 구성되는 것들이 저장되는 영역.

Stack - 함수, 지역변수 저장

  • Heap과 반대로 높은 주소에서 낮은 주소로 메모리에 할당됨!

  • 함수를 호출 할 때 지역변수, 매개변수들이 저장되는 공간, 메인(main)함수 안에서 변수들도 이에 포함 됨.

  • 함수가 종료되면 해당 함수에 할당된 변수들을 메모리에서 해제

  • Stack에는 변수 저장. 메모리 주소는 큰 -> 작은 순으로 감소하며 저장. 스택은 변수 단위가 아니라 stack frame단위로 쌓이고 이건 결국 function단위로 쌓임.

  • 스택에는 값이 저장되는 것이 아니라 포인터가 쌓인다.

  • 지역변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역

  • 함수 호출 시 생성되고 함수 끝나면 시스템에 반환된다

Heap - 동적, malloc(), new()

  • 낮은 주소에서 높은 주소로 할당(적재)됨
  • 이 영역에 데이터를 저장하기 위해 c는 malloc(), c++은 new() 함수 사용
  • malloc() 함수는
    • 프로그램이 실행중 일때 사용자가 직접 힙 영역에 메모리 할당을 할 수 있게 해줌
    • 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달받음. 그리고 전달받은 메모리 크기에 맞고 아직 할당되지 않은 적당한 블록을 찾음. 이렇게 찾은 블록의 첫번째 바이트를 가리키는 주소를 반환.
    • 힙 영역에 할당할 수 있는 적당한 블록이 없으면 null point 반환
  • free() 또는 delete를 통해 해제가 가능
  • Java에서는 가비지 컬렉터가 자동으로 해제하는 곳.
  • Stack 영역이 클 수록 Heap 영역이 작아지고 Heap 영역이 클수록 Stack 영역이 작아진다

Data

  • 우리가 작성한 코드에서 전역변수(Global), 정적변수(Static)이 저장되는 공간.
  • 보통 메인(main)함수 전(프로그램 실행 전)에 선언되어 프로그램이 끝날 때 까지 메모리에 남아 있는 변수
  • Data는 초기화 된 변수 영역과, 초기화 되지 않은 변수 영역(BSS, Block Started by Symbol)으로 나뉨.

Text

  • 코드를 실행하기 위해 저장 되어 있는 영역.
  • 흔히 코드 영역이라고 한다.
  • 프로그램을 실행시키기 위해 구성되는 것들이 저장되는 영역.(==명령문)
  • 제어문, 함수, 상수들이 이 영역에 저장됨.
  • code, data, heap 영역은 하위 메모리부터 할당되고 stack은 상위 메모리부터 할당 된다.
  • data 영역: 프로그램 시작과 동시에 할당된 영역이 잡히고 끝나면 OS에 반환한다.
  • stack 영역: 함수 시작과 동시에 할당된 영역이 잡히고 끝나면 OS에 반환한다.

메모리 주소

  • 32bit, 64bit (window를 쓰면서 우리가 자주 볼 수 있던!) 이 둘의 차이점은 비트의 너비.
  • 32개의 비트가 있다는 건 2^32, 64비트가 있다는 건 2^64. 데이터 처리 단위이다.
  • 메모리 한칸은 1바이트, 32bit 운영체제는 32비트, 즉 4바이트 길이 주소 갖음. (0x0000000~0xFFFFFFFF)
  • 이에 비해 64bit 운영체제는 64비트, 8바이트 길이 주소 갖음. (0x0000000000000000~0xFFFFFFFFFFFFFFFF)

Stack Overflow & Heap Overflow

Stack Overflow

  • Stack Overflow는 호출 스택이 할당 된 스택 영역 경계선 밖으로 넘어갈 때 발생. 흔히 '재귀호출'에서 발생.
    이미지 출처: https://st-lab.tistory.com/198

Heap Overflow

  • Out of Memory.
  • Heap영역보다 큰 데이터가 들어올 경우 발생. 동적으로 관리되는 데이터들이 일정 공간 이상 차지하게 될 경우 발생.
    이미지 출처: https://st-lab.tistory.com/198

참고
https://www.youtube.com/watch?v=TxWOaKE5w_s&t=7s
http://www.tcpschool.com/c/c_memory_structure
http://www.tcpschool.com/c/c_memory_malloc
https://sfixer.tistory.com/entry/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%ADcode-data-Stack-Heap
**https://st-lab.tistory.com/198

이미지 출처 https://daeun28.github.io/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%B5%ED%95%99-%EC%8A%A4%ED%84%B0%EB%94%94/post17/
https://st-lab.tistory.com/198

profile
삽질하며 깨닫고 배웁니다. (a.k.a 프로삽질러) + 이 구역의 회고왕

0개의 댓글