프로세스 메모리 구조

코드/텍스트 영역

  • 사용자가 작성한 프로그램이 CPU에 실행될 수 있는 기계어(or 컴파일된 명령어) 형태로 저장되는 곳
  • 정적 영역: 컴파일시 결정되고 나면 바뀌지 않으며, 수정 불가능하다.
  • 읽기 전용
  • bin/hex 파일로 되어있다.
  • PC(프로그램 카운터)가 가리키는 곳

데이터 영역

  • 전역(global) 변수 / 정적(static) 변수 / 정적 배열 / 구조체가 저장된다.
  • 정적 영역: 컴파일시에 결정된다. 그러나 안에 있는 데이터의 수정은 가능하다.
  • 읽기/쓰기 가능
  • BSS 영역: 초기화되지 않은 변수들이 저장된다
  • GVAR 영역: 초기화된 변수가 저장된다

 

스택 영역

  • 매개변수 / 지역변수 / 직전 함수의 리턴 주소 등 함수가 호출됐을 때 필요한 데이터가 임시로 저장되는 곳
  • 함수가 호출될 때마다 자신을 호출한 함수 위에 스택 형태로 쌓이는 구조이고, 수행이 완료되면 데이터가 제거된다.

힙 영역

  • 실행중 동적으로 할당되는 데이터(Object)가 저장되는 공간 ex) 객체, 자바의 리스트, 문자열
  • 스택과 힙은 하나의 영역을 공유하며, (양 끝을 사용), 정해진 공간 안에서 데이터가 동적으로 할당되고 해제된다.
  • 데이터가 계속 추가(ex: 함수 무한 호출)되면 서로 영역을 침범하는 상황이 발생하는데, 이를 stack overflow, heap overflow라고 한다.
  • 참조 형태로만 접근이 가능하다
    • ex) 함수에서 객체를 사용한다 -> stack의 객체 변수는 해당 객체의 주소를 갖고 있다 -> 주소로 heap 영역의 객체에 접근한다.

(출처: 야붕님 블로그)

참조

책) 쉽게 배우는 운영체제

https://yaboong.github.io/java/2018/05/26/java-memory-management/

https://zangzangs.tistory.com/107

 

안드로이드

리눅스 기반의 오픈소스 모바일 운영체제

Java와 Kotlin이 호환되는 이유

두 소스 코드 모두 Java 컴파일러와 Kotlin 컴파일러에 의해 .class파일(바이트 코드)로 변환되기 때문이다.

안드로이드에서 코틀린 컴파일 과정

Kotlin 파일 안에 Java 코드가 있을 경우, Java 컴파일러가 컴파일된 Kotlin 코드의 클래스 패스에 Java 코드를 컴파일한다.

안드로이드 컴파일 과정

  1. Java or Kotlin 파일을 바이트 코드로 변환
  2. 바이트 코드와 컴파일된 리소스 파일을 묶어서 dex파일로 변환(컴파일)
  3. ART에서 dex 파일을 실행 (💡 ART(Android Run Time): JVM처럼 dex 파일을 실행시켜주는 런타임 라이브러리)

Minimum sdk

앱이 최소로 서비스하는 API level(안드로이드 버전)을 의미한다. 예를 들어, min sdk가 21이면 API level 20 이하는 해당 앱을 설치할 수 없다. 왜냐면 그 이하에서는 지원하지 않는 API를 사용하기 때문이다.

프로젝트와 모듈

프로젝트 안에는 여러 모듈이 들어갈 수 있다. 안드로이드 프로젝트를 처음 시작하면 자동으로 프로젝트 이름으로 된 폴더와 그 안에 app이라는 폴더가 생성되는데, 이 app이 모듈을 의미한다. app외에도 추가적으로 모듈을 생성할 수 있다.

 

모듈이 여러 개면 모듈 수준의 gradle 파일도 여러 개가 되는 건가??

build.gradle 파일

Gradle 빌드 툴이 프로젝트를 빌드하기 위해 참조하는 파일이다. 빌드 환경 설정 파일이라고 볼 수 있다.

참고

https://sesac.seoul.kr/course/active/detail.do

https://stonybean.github.io/Kotlin-and-Java-compatible/

https://diqmwl-programming.tistory.com/115

+ Recent posts