[Android] View/ViewGroup 개념 정리

View/ViewGroup

안드로이드 어플리케이션 UI에서 버튼, 스위치, 이미지, 상태바 등은 기본적으로 모두 View로 구성되어 있습니다. 이러한 View 들이 위치 정보 등을 보함하여 화면에 구성되기 위해서는 View를 담기 위한 컨테이너가 필요한데 이것이 바로 ViewGroup 입니다. 개발자가 화면을 어떻게 구성하느냐에 따라 ViewGroup은 계층적으로 다수의 ViewGroup과 View를 가질 수 있습니다.

View

View란 기본적으로 화면에 보이는 것들을 말하는데 흔히 Widget(Control)이라 불리는 UI 구성 요소들이 View 입니다. View를 상속받는 직접적인 자식 클래스로는 ImageView, TextView, ProgressBar 등이 있습니다. 아래에 설명할 ViewGroup 또한 View를 상속받습니다.

SurfaceView

SurfaceView는 기존의 View 클래스를 상속받는 View 입니다. 일반 View는 onDraw 메소드를 자동으로 호출하여 화면을 그리기 때문에 시스템 상황에 따라서 화면이 다소 늦게 그려질수 있지만, SurfaceView는 스레드를 이용해 강제로 화면에 그리기 때문에 원하는 시점에 화면을 그릴 수 있습니다.  SurfaceView는 더블 버퍼링 기법을 이용하여 SurfaceHolder가 Surface에 미리 이미지를 그리고 이 Surface가 SurfaceView에 반영되는 방식입니다. 또한, SurfaceView는 자기 영역 크기 만큼의 Window를 뚫어서(punch) 자신이 보여지게끔 하고 Window와 View를 블렌딩하여 화면에 그립니다.

TextView

TextView는 안드로이드 UI를 구성함에 있어 화면에 텍스트를 표시하는 기능을 담당하며, 안드로이드에서 제공하는 위젯 중 가장 많이 사용되는 위젯입니다. 텍스트 출력 기능을 가진 기본 위젯이므로, 텍스트와 연관된 기능을 포함하는 Button 또는 EditText의 부모 클래스이기도 합니다.

TextView가 안드로이드에서 제공하는 가장 기본이 되는 위젯인 만큼 사용 방법도 간단합니다. 기본 속성을 사용하여 단순한 문자열(Plain Text)을 출력하는 용도라면, Layout 리소스에 TextView를 정의하고 “text” 속성에 출력될 문자열을 지정하면 됩니다.
하지만 간단하다고 해서 확장성이 부족한 것은 아닙니다. TextView는 View 클래스에서 상속받은 속성과 TextView 자신의 속성을 포함하여 아주 많은 종류의 속성을 제공합니다. 이러한 속성들을 사용하여 기본적으로 단순한 TextView에 아주 많은 확장성을 부여할 수 있습니다.

ViewGroup

ViewGroup은 여러 개의 View들은 묶기 위한 요소로서 주로 View의 배치를 위해 사용됩니다. 앞서 설명했듯이 View 클래스를 상속받고 있기 때문에 View의 속성을 그대로 갖습니다. ViewGroup의 종류는 LinearLayout, RelativeLayout, FrameLayout 등이 있습니다.
그렇기 때문에 아래 그림과 같이 ViewGroup은 여러가지 Layout 형태를 갖으며 다양한 형태의 View 요소를 포함합니다.

ViewGroup에 LinearLayout, RelativeLayout, FrameLayout 가 포함되기 때문에 ViewGroup은 Layout과 용어적으로 동일하게 취급됩니다. 이는 구글 안드로이드 공식 문서 및 여타 레퍼런스 자료에서도 동일하게 취급됩니다.

LinearLayout

View가 가로 또는 세로로 순차적으로 나열되는 Layout입니다. 다음과 같이 android:orientation 옵션을 통해 가로(horizontal) 또는 세로(vertical)로 설정할 수 있습니다. (기본값 : horizontal)

RelativeLayout

위치를 지정하지 않으면 View 가 Layout의 0, 0 위치에 계속 쌓이는 레이아웃으로, 최상위 부모 레이아웃 상대위치 또는 id를 참조해 특정 뷰에 대해 상대적인 위치를 지정할 수 있습니다.
다음과 같이 위치를 지정하지 않으면 Layout의 0,0 위치에 View가 계속 쌓이는 것을 확인할 수 있습니다.

위치를 지정하면 다음과 같이 위치가 지정됩니다.

FrameLayout

같은 위치에 자식 View들을 겹치게 한 뒤에, VISIBLE/INVISIBLE/GONE 등의 옵션으로 교차하면서 보여줄 수 있습니다.

XML 레이아웃의 가장 아래쪽에 선언된 View 가 실제 Layout의 가장 위에 표시됩니다.

주로 버튼 클릭시 기존의 View를 숨기고 다른 View를 표시하는 탭기능에서 사용됩니다. 자바 코드에서는 View.setVisibility(“GONE”); 형식으로 사용한다.

  • visible : View를 Layout에 표시합니다.
  • invisible : View를 UI에 표시하지는 않지만, Layout의 크기만큼의 영역은 차지하고 있습니다.
  • gone : View를 Layout에 표시되지 않으며, View가 영역도 차지 하지 않게 합니다.

View/ViewGroup 속성

View 속성

속성
설명
padding View와 View 안에 포함된 View의 간격을 설정합니다. 즉 안쪽 여백입니다.
padding를 사용하여 상하좌우에 대해 동일한 값을 한번에 지정해 줄수 있으며 paddingTop/paddingBottom/paddingLeft/paddingRight를 사용하여 각각 개별적으로 여백 설정이 가능합니다.
min width, min height View가 가질 수 있는 최소 크기를 말합니다.
focus View가 focus를 갖도록 설정하기 위해서는 requestFocus()를 호출해 주고, focus가 있는지 확인하기 위해서는 isFocused()를 호출해 줍니다.
enable View가 경우에 따라 사용자 입력을 받을 수 없도록 하기 위해서는 enable속성을 사용합니다. setEnabled()로 View가 동작을 멈추도록 할 수 있습니다.
selected View가 선택되었는지 나타내기 위해서는 selected속성이 사용됩니다. View가 선택되었다고 설정하고 싶으면 setSelected()를 이용합니다.

View/ViewGroup 속성

속성
설명
android:background View의 배경을 설정합니다.
android:visibility View를 화면에 보여줄지 말지 선택하게 됩니다 옵션으로는 VISIBLE/INVISIBLE/GONE 이 있습니다.
– visible : View를 Layout에 표시합니다.
– invisible : View를 Layout에 표시하지는 않지만, View의 크기만큼의 영역은 차지하고 있습니다.
– gone : View를 Layout에 표시되지 않으며, View가 영역도 차지 하지 않게 합니다.
android:clickable View가 touch를 받을 수 있도록 할지 여부를 설정하게 됩니다. android:clickable=”true” 또는 android:clickable=”false” 로 사용되어 집니다.
android:focusable View가 focus를 가질 수 있는지 여부를 의미합니다. focus를 가진 다는 뜻은 키 이벤트가 발생했을 때 그 값을 받을 수 있는 상태가 되도록 만든다는 의미입니다.

View/ViewGroup ID 속성

  • 고유 식별자 (android:id)
    해당 View를 식별하기 위한 유일한 값입니다. XML안에 해당 id값을 문자열로 설정하게 되면 어플리케이션이 컴파일 될때 정수로써 레퍼런스 됩니다.

    • Inflation
      XML 레이아웃에 정의된 정보를 메모리 상에서 객체로 만드는 객체화 과정을 말합니다.
      어플리 케이션이 시작될 때 이 과정을 거쳐 메모리 상에 만들어진 객체들을 참조하기 위해 ID를 지정합니다.
    • ID속성은 자바 코드 상에서 R.id.[ID]와 같은 형태로 참조합니다.

      버튼의 ID를 추가합니다.

      버튼의 ID를 참조합니다.

View/ViewGroup 색상 지정

  • XML레이아웃에서 색상을 지정할 때는 ‘#’기호를 앞에 붙인 후, ARGB(A : Alpha, R : RED, G : Green, B : Blue)의 순서대로 색상의 값을 기록합니다.
  • 16진수 값을 지정할 때는 여러 가지 포맷을 사용할 수 있습니다.
    • #ff0000으로 지정하면 빨간 색이며, #00ff00으로 지정하면 녹색이 됩니다.
  • 알파 값은 투명도를 조절할 수 있습니다.

View/ViewGroup LayoutParams 속성

속성
설명
LayoutParams LayoutParams는 View의 자체의 속성이 아니라 View가 배치되는 Layout에 따라 달라지는 속성입니다.
LayoutParams로 설정된 속성은 View가 아니라 View가 배치된 Layout에서 사용합니다.
layout_width,
layout_height
View의 폭과 높이를 설정합니다. 미리 정의된 값을 넣을수도 있으며 사용자가 직접 크기를 입력할 수도 있습니다.
또한, match_parent/wrap_content과 같이 미리 지정된 속성값도 존재합니다.
– match_parent : 부모 View 의 크기만큼 width/height를 채웁니다.
– wrap_content : 내부에 있는 View 의 크기 만큼만 크기를 조정합니다.
layout_margin 부모 View 와 자신과의 간격을 설정합니다. 즉, 바깥쪽 여백 입니다.
layout_margin를 사용하여 상하좌우에 대해 동일한 값을 한번에 지정해 줄수 있으며 layout_marginTop/layout_marginBottom/layout_marginLeft/layout_marginRight를 사용하여 각각 개별적으로 여백 설정이 가능합니다.
layout_gravity View의 정렬 값을 나타냅니다.

View/ViewGroup 크기 표현 단위

단위
크기
설명
px 픽셀 화면 픽셀
in 인치 1인치 크기의 물리적 길이
mm 밀리미터 1밀리미터 크기의 물리적 길이 
em 텍스트 크기 글꼴과 상관 없이 동일한 텍스트 크기 표시
dp 밀도에 따른 크기(밀도 독립적 픽셀) 160dpi 화면을 기준으로 한 픽셀
sp 폰트의 가변적 크기(축척 독립적 픽셀) 가변 글꼴을 기준으로 한 픽셀로 dp와 유사하나 글꼴의 설정에 따라 달라진다.
카테고리: Android | 댓글 남기기

[Kotlin] IntelliJ IDEA 설치(with 학생 인증)

이번 글에서는 IntelliJ IDEA의 설치 및 라이센스 인증 방법에 대해서 설명합니다.

IntelliJ IDEA 란?

IntelliJ IDEA는 JetBrains사에서 제작한 상용 자바 통합 개발 환경입니다. 줄여서 IntelliJ 혹은 IDEA로도 부릅니다.

2001년 첫 출시 때부터 편리한 코드 컴플리션 및 리팩토링 기능으로 수많은 Java 개발자들이 IDEA로 유입되었으며, 2009년에 무료 커뮤니티 에디션이 나온 이후에는 본격적으로 Java 개발을 위해 많이 사용되기 시작합니다.  IntelliJ는 Java와 Swing을 이용해서 구현되었으며, 플러그인 개발에 사용되는 언어 역시 Java 입니다.  2019년 DeveloperWeek에서 ‘가장 혁신적인 코딩 툴’로 선정한 바 있으며, 윈도우/macOS/리눅스를 모두 지원합니다.

IntelliJ는 이클립스와 다르게 워크스페이스 개념이 없고, 프로젝트 생성 시 기존에 생성된 빈 디렉토리에 프로젝트를 디렉토리화 시키는 방식입니다. 프로젝트 안에 서브 프로젝트를 생성하는 것도 가능한데, 이러한 서브 프로젝트는 ‘모듈’이라고 칭합니다. 또한 이클립스의 Project-Specific JRE는 IntelliJ IDEA의 Project SDK와 대응됩니다.

또한 자체 GUI GIT이 내장되어 있어, 별도의 GIT 클라이언트를 설치하지 않고도 간편한 버전 관리가 가능하다.

라이센스에 관하여

IntelliJ IDEA는 상업용인 Ultimate 버전과 무료 버전인 Community 버전으로 구분됩니다. 두 버전의 차이는 아래와 같습니다.
Ultimate 버전을 사용하기 위해서는 연간 구독을 신청해야 하기 때문에 비용이 지불됩니다.
다만, ac.kr 형태의 학교 이메일이 있거나 GitHub 학생 인증(Student Pack)이 되어 있다면 JetBrains 계정과 연동하여 Ultimate 버전을 무료로 이용할 수 있습니다.

 

학생 인증 및 설치 방법(ac.kr 학교 이메일이 있는 경우)

  • 젯브레인스(JetBrains) 사이트에 접속하여 학생 인증을 위한 페이지로 접속합니다. → https://www.jetbrains.com/
  • Support > FREE LICENSE PROGRAMS > “Academic Licensing” 클릭

  • 상단탭에서 “For students and teachers” 클릭 후 웹 페이지 아래 방향으로 이동하여 “Apply Now” 클릭

  • “Apply with:” 탭에서 “UNIVERSITY EMAIL ADDRESS” 탭을 선택한 뒤에 인증을 위한 정보를 입력합니다.

  • 다음과 같은 화면과 함께 학교 이메일주소로 인증 메일을 받아 볼 수 있습니다.

  • 입력한 학교 이메일 주소로 로그인하여 인증메일을 확인 후 “Confirm Request”를 클릭합니다.

  • “JetBrains Account” 사이트 창이 열리고, 맨 아래로 스크롤 후 활성화된 “I Accept”를 클릭합니다.

  • JetBrains 회원 가입이 되어있지 않은 경우 우측 하단에 이메일을 입력 후 “Sign Up”을 클릭하여 회원 가입을 진행 합니다.

  • 회원 가입 완료 문구를 확인 후 가입한 이메일에 로그인하여 확인합니다. 이메일 내용중 “Confirm your account” 클릭합니다.

  • 추가 정보를 입력하여 회원 가입을 마무리 합니다.

  • 이후 로그인 하여 확인 해 보면 학생 인증이 완료되어 라이센스가 발급 된 것을 확인할 수 있습니다.

  • Ultimate 버전을 다운로드 하여 설치 합니다. → https://www.jetbrains.com/idea/download/#section=windows
    (자신의 OS 맞게 다운로드하시기 바랍니다. 본 문서에서는 Windows르 기본으로 합니다. 자세한 설치 내용은 생략합니다.)

  • IntelliJ IDEA를 설치 후 최초 실행을 하면 아래와 같은 라이센스 인증 창이 실행됩니다. “Get license from:” 에서 “JB Account”를 클릭하고 이전 과정에서 생성한 계정 정보를 입력하여 인증을 완료합니다.

유용한 단축키

IntelliJ IDEA의 단축키 정보는 IntelliJ IDEA keyboard shortcuts 에 자세히 정리되어 있습니다. 그 중에서 자주 사용되는 단축키 몇개를 다음과 같이 정리하였습니다.

단축키
설명
사용 예
F2 에러 순서대로 찾기 Java 클래스를 Kotlin 클래스로 자동 변환 후 컴파일을 수행하면 무수한 에러가 발생합니다.
이때 에러가 발생한 Kotlin 클래스 파일을 클릭 후 F2를 입력하면 에러를 순서대로 찾아가며 에러를 수정할 수 있습니다.
Shift + Shift (double shift) Search Everywhere 프로젝트에 등록된 모듈(클래스)을 검색합니다. 클래스, 메소드, 프로퍼티, 심볼 등을 검색 할 수 있습니다.
Ctrl + B Go to declaration 커서가 위치한 심볼의 선언부로 이동합니다.
Ctrl + Alt + Left/Right 이전/이후 포커싱 이동 현재를 기준으로 이전/이후에 탐색했던 코드 위치로 이동합니다.
Ctrl + G 라인 찾아가기

Kotlin 컴파일러에서는 에러 발생시 아래와 같이 에러가 발생한 클래스의 행/열 번호를 모두 출력합니다.

HScreenConfiguration.kt:28:5: error: property must be initialized or be abstract

이런 경우 “Ctrl + G” 입력 후 “28:5″를 입력하여 에러가 발생한 클래스의 정확한 코드 위치로 이동하여 확인 할 수 있습니다.

Ctrl + R 문자 치환(Replacement) 설명 그대로 문자열을 치환할때 사용합니다.
보통 Java Getter/Setter가 Kotlin 프로퍼티로 정상적으로 변환되지 않은 경우 자주 사용됩니다.
프로젝트 설정시에 연관 클래스를 모듈로 등록해 두면 Java to Kotlin 변환기에서 클래스 간이 연관성을 참조 후,
Java Getter/Setter를 인식하여 Kotlin 프로퍼티로 정상적으로 변환시키지만 그렇지 않은 경우 문자 치환 등을 이용하여 수동으로 변환해야 합니다.
카테고리: Kotlin, Programming | 댓글 남기기

[Android] 외부저장소에 파일 Read/Write 시에 발생하는 Permission denied 해결 방법

안드로이드 어플리케이션 개발 중, external 저장 공간에 파일을 read 혹은 write 하려고 할때 다음과 같이 Permission denied 에러가 발생하는 경우가 있습니다.

Permission denied 에러가 발생하는 이유는 external 저장 공간의 파일에 접근하기 위해서는 별도의 read/write 권한이 필요하기 때문입니다.

AndroidManifest.xml 파일에 다음과 같이 external 저장 공간에 대한 read/write 권한을 선언하면 됩니다. 선언 위치는 <manifest> 안에 그리고 <application> 밖에 선언하면 됩니다.

Stop ‘app’ (Ctrl + F2) / Start ‘app’(Shift + F10) 을 수행한 뒤에 Settings > Device, Apps > (앱 선택) > Permissions, Storage 메뉴로 이동하여 권한을 활성화 합니다.

 

 

카테고리: Android | 댓글 남기기

[Android] 안드로이드 스튜디오 waiting for target device to come online 무한 로딩 해결 방법

안드로이드 스튜디오에서 개발 도중에 에뮬레이터를 실행하면 waiting for target device to come online 이라는 메시지가 출력되면서 무한 로딩에 빠지는 현상이 발생하였습니다. 이런 경우 아래와 같은 방법으로 해결 하였습니다.

  • Tool > AVD Manager > Android Virtual Device Manager 창 실행 > Device 우클릭 후 Wipe Data 클릭
카테고리: Android | 댓글 남기기

[Ubuntu 16.04] 고정 IP 설정

아래와 같이 <code>/etc/network/interface</code> 파일을 수정합니다.

 

다음의 명령어를 수행하여 networking.service를 재시작한다.

$ sudo systemctl restart networking.service

에러가 발생한다면 /etc/network/interfaces 의 내용이 잘못된 것으므로 확인한다.

다음 명령어를 수행하여 networking.service 의 상태를 확인 후 문제가 없다면 enable 하여 시스템을 재시작 하더라도 동일한 설정이 반영되도록 한다.

$ **sudo systemctl status networking.service**
● networking.service - Raise network interfaces
Loaded: loaded (/lib/systemd/system/networking.service; enabled; vendor preset: enabled)
Drop-In: /run/systemd/generator/networking.service.d
└─50-insserv.conf-$network.conf
Active: active (exited) since 수 2020-08-05 16:02:56 KST; 21min ago
Docs: man:interfaces(5)
Main PID: 28235 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/networking.service

8월 05 16:02:52 JCHOI systemd[1]: Starting Raise network interfaces...
8월 05 16:02:56 JCHOI systemd[1]: Started Raise network interfaces.

$ sudo systemctl enable networking.service
Synchronizing state of networking.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable networking
카테고리: Linux | 댓글 남기기

[C] 구조체 정렬(메모리 패딩)

개요

C언어에서 구조체가 메모리에 적재되었을때 구조체의 멤버 변수들은 선언된 순서대로 인접한 주소 번지에 위치하게 됩니다. 첫번째로 선언된 멤버가 오프셋 0으로 지정되며 그 이후에 구조체 멤버 변수의 데이터 타입에 따라 오프셋이 지정됩니다.

다음의 코드를 보고 결과를 예상해 봅시다.

선언된 구조체 s 는 멤버 변수로 1바이트 크기의 문자형 타입 c, 4바이트 크기의 정수형 i 를 갖습니다.
(C언어 변수 타입에 대한 표준 정의는 ISO/IEC 9899:TC3, Programming languages — C 문서의 p21에 기술되어 있습니다.)
이를 토대로 유추되는 sizeof(st) 의 결과 값은 5입니다. 정말 그럴까요?

프로그램을 실행해 보면 실제로 출력되는 값은 sizeof(st) 의 결과 값은 8 입니다. 왜 이런 결과값이 출력되는 걸까요?

컴퓨터는 32비트/64비트 CPU 아키텍쳐에 따라 4바이트 혹은 8바이트 단위로 메모리에 접근합니다. 만약 32비트 컴퓨터에서 1바이트 크기의 데이터에 접근하려고 하면 추가적인 시프트 연산을 해야 하기 때문에 효율이 떨어집니다. 그래서 C언어 컴파일러는 데이터 접근의 효율성을 위해서 구조체를 일정한 크기로 정렬을 하게 됩니다. 이를 구조체 정렬(Data structure alignment)이라고 하며 이를 위해 남는 공간의 메모리를 채우는 것을 메모리 패딩이라고 합니다.

 

카테고리: C, Programming | 댓글 남기기

[Linux] tmux 설치 방법

tmux 란?

tmux는 terminal multiplexer의 약자로서, 하나의 터미널에서 여러 프로그램을 쉽게 전환하고 분리하며 다른 터미널에 다시 연결할 수 있습니다. 주요한 특징으로는 터미널을 빠져 나오거나 전환하더라도 기존 진행중이던 작업이 백그라운드에서 계속 실행되고 있기 때문에 갑작스럽게 터미널 연결이 끊기게 되더라도 중단없이 작업을 이어가실수 있습니다. 또한, tmux는 서버에 설치되기 때문에 다른 환경의 클라이언트에서 접속을 하더라도 동일한 기능을 사용할 수 있습니다. 기존에 사용되던 screen 이 tmux 로 대체되는 추세입니다.

tmux를 사용하기 전에 몇가지 알고 가셔야 되는 내용이 있습니다.

  • session : tmux 실행 단위. 여러개의 window로 구성.
  • window : 터미널 화면. 세션 내에서 탭처럼 사용할 수 있음.
  • pane : 하나의 window 내에서 화면 분할.
  • status bar : 화면 아래 표시되는 상태 막대.

tmux 설치

지금 부터 tmux를 설치해 보도록 하겠습니다. 현재(2020.08.21) 시점에서 tmux 최신버전은 3.1a 입니다. 아래에서는 패키지 관리자를 통해서 설치하는 방법이 아닌 직접 tmux 오픈 소스를 빌드 후 설치하는 방법을 설명합니다. 패키지 관리자를 통해서 설치하셔도 무관하지만 되도록 tmux 2.6 버전 이상을 사용하시는 것을 추천드립니다. 왜냐하면 해당 버전을 기준으로 설정 파일(~/.tmux.conf)을 세팅하는 방법이 달라졌기 때문입니다.

tmux 다운로드: https://github.com/tmux/tmux/wiki

필요한 패키지 설치

설치 과정

설치 확인

카테고리: Linux | 댓글 남기기

[Docker] macOS에서 설치하는 방법

맥에서 도커를 설치해 봅시다. 먼저 brew 를 이용해서 도커를 설치합니다.

설치가 완료되면 버전 정보를 확인합니다.

버전 정보 확인시에 맨 마지막에 출력되는 콘솔 로그를 확인해 보면 도커 데몬에 접속할 수 없다고 하는데요. 엄밀히 말하면 앞서 brew 명령어로는 도커 클라이언트만 설치된 것입니다.

다음의 경로에서 Docker.dmg 파일을 다운로드하여 설치를 완료합니다.
https://download.docker.com/mac/stable/Docker.dmg

다운로드가 완료되면 Docker.dmg 파일을 마운트 후 Applications로 끌어당겨 설치를 진행합니다.

설치가 완료된 후 도커 버전을 확인해보면 도커 서버/클라이언트가 설치된 것을 확인할 수 있습니다.

카테고리: Docker | 댓글 남기기

[Linux] gcc -E 옵션

gcc --help를 입력하여 -E 옵션에 대한 설명을 살펴보면 아래와 같습니다.

GCC 10.2 Manual 에 34p에 gcc -E 옵션에 대한 설명은 다음과 같습니다.

Stop after the preprocessing stage; do not run the compiler proper. The output
is in the form of preprocessed source code, which is sent to the standard output.
Input files that don’t require preprocessing are ignored.

결과적으로, gcc -E 옵션은 preprocess 단계에서의 소스 코드를 확인할 수 있습니다.
실제로 바이너리에 포함되는 라이브리러 등의 정보 등을 확인할 때 -E 옵션을 유용하게 활용할 수 있습니다.

카테고리: Linux | 댓글 남기기

[Linux] Process Address

프로그램은 실행 가능한 바이너리와 바이너리가 실행되기 위해 필요한 데이터(라이브러리 등)으로 구성된다.
프로그램은 사용자에 의해서 실행되면 커널로 부터 CPU, 메모리 자원을 할당받고 프로세스로 실행된다.
이때 프로세스는 Process Address Space 구조에 의해 코드/데이터/힙/스택 영역으로 구분된 메모리 영역을 할당받는다. (https://jhnyang.tistory.com/32)

프로세스가 실행 중에 쓰레드를 생성하면 코드/데이터/힙 메모리 영역은 공유하고 스택 메모리에 해당 쓰레드를 위한 스택만 생성한다.
리눅스 커널은 메모리를 관리할때 프로세스가 요청하는 메모리를 가상 메모리는 할당하지만 실제 메모리는 사용할때 할당된다. (첨부된 메일의 memory.c 코드를 통해 확인)
해당 이슈처럼 과도하게 쓰레드가 생성되는 경우(과도하게 생성되었다기 보다 사용이 완료된 쓰레드 자원이 정리되지 않은 것으로 보임) 실제 시스템에 메모리는 충분하지만 스택 메모리를 할당하기 위한 가상 메모리 주소 공간이 부족할 경우가 발생할수 있다.
그렇기 때문에 해당 이슈는 JVM에서 java.lang.OutOfMemoryError: thread creation failed 로그를 출력하고 새로운 쓰레드 생성을 위한 스택 메모리를 할당하지 못하는 것이다.

카테고리: Linux | 댓글 남기기