영역 바이너리 옵션 타입

마지막 업데이트: 2022년 7월 15일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
배포 대상 서버를 그룹으로 관리할 수 있습니다. Phase 속성으로 Develop, Staging, Product 등의 서버 장비를 구분하여 활용할 수 있습니다.

영역 바이너리 옵션 타입

Z 마운트 NIKKOR 렌즈

F 마운트 NIKKOR 렌즈(마운트 어댑터가 필요, 일부 기능 제한이 적용될 수 있음)

35.9 × 23.9mm CMOS 센서(Nikon FX 포맷)

이미지 센서 클리닝, 이미지 더스트 오프 참조 데이터(NX Studio 필요)

이미지 영역에서 [ FX (36 × 24) ] 선택:

8,256 × 5,504 (L: 45.4 M)

6,192 × 4,128 (M: 25.6 M)

4,128 × 2,752 (S: 11.4 M)

이미지 영역에서 [ DX (24 × 16) ] 선택:

5,392 × 3,592 (L: 19.4 M)

4,032 × 2,688 (M: 10.8 M)

2,688 × 1,792 (S: 4.8 M)

이미지 영역에서 [ 1:1 (24 × 24) ] 선택:

5,504 × 5,504 (L: 30.3 M)

4,128 × 4,128 (M: 17.0 M)

2,752 × 2,752 (S: 7.6 M)

이미지 영역에서 [ 16:9 (36 × 20) ] 선택:

8,256 × 4,640 (L: 38.3 M)

6,192 × 3,480 (M: 21.5 M)

4,128 × 2,320 (S: 9.6 M)

NEF (RAW): RAW 14비트(무손실 압축, 고효율 m , 고효율)

JPEG: Fine(약 1:4), Normal(약 1:8) 또는 Basic(약 1:16) 압축으로 JPEG 기준 준수, 사이즈 우선 또는 화질 우선 선택 가능

NEF(RAW)+JPEG: NEF(RAW)와 JPEG 포맷으로 기록된 단일 사진

Picture Control System

자동, 표준, 자연스럽게, 선명하게, 모노크롬, 인물, 풍경, 단조롭게, Creative Picture Control (꿈, 아침, 팝, 일요일, 엄숙, 드라마틱, 영역 바이너리 옵션 타입 고요, 탈색, 우울, 순수, 데님, 토이, 세피아, 청색, 적색, 핑크, 차콜, 그래파이트, 바이너리, 목탄), 선택한 Picture Control 보정 가능, 사용자 설정 Picture Control등록 가능

CFexpress (Type B) 및 XQD 메모리 카드

메모리 카드 순차 기록(대체용), 백업 기록, RAW+JPEG 분할 기록, JPEG+JPEG 분할 기록 및 카드간 복사가능

DCF 2.0, Exif 2.32

전자식 뷰 파인더, 1.27cm/0.5형 Quad-VGA OLED, 약 369만 도트, 밝기 조정 가능(오토, 매뉴얼 16단계), 컬러 밸런스 조절 가능

상하좌우 모두 약 100% (실제 화면 대비)

약 0.8배(50mm 렌즈, 무한대, −1.0m −1 )

23mm(−1.0m −1 , 뷰파인더 아이피스 렌즈의 가장 뒤쪽 면에서)

모니터와 뷰 파인더 표시를 자동 전환

틸트식 8cm/3.2형 TFT 액정 모니터(터치 패널), 약 210만 도트, 시야각 170°, 시야율 약 100%, 밝기 조정 가능(매뉴얼 11단계), 컬러 밸런스 조절 가능, 가로세로 틸트 가능

전자 셔터, 전자 셔터 소리 있음, 센서 쉴드

1 /32000~30초( 1 /3, 1 /2 및 1EV 간격으로 선택, M 모드에서 900초까지 연장 가능), 벌브(Bulb)、타임(Time)

1/250초 또는 1/200초 이하의 저속 셔터 스피드로 동조( 1 /200~ 1 /250초는 가이드 넘버가 감소). 자동 FP 고속 싱크로로 1 /8000 초까지 동조 가능

싱글 프레임, 저속 연속 촬영, 고속 연속 촬영, 고속 프레임 캡처, 셀프 타이머

저속 연속 촬영 속도: 약 1~10fps

고속 연속 촬영 속도: 약 10~20fps

고속 프레임 캡처(C30): 약 30fps

고속 프레임 캡처(C120): 약 120fps

니콘 시험 조건에서 최대 촬영 속도

작동시간: 2, 5, 10, 20초, 촬영컷수: 1~9컷, 연속촬영간격: 0.5, 1, 2, 3초

촬상 소자에 의한 TTL 측광 방식

중앙부 중점 측광: 표준( φ 12mm 상당), 작게( φ 8mm 상당), 화면 전체의 평균으로 변경 가능, 중앙부 중점도 약 75%

스팟 측광: 약 φ 4mm 상당을 측광, 포커스 포인트에 연동하여 측광 위치 가동

하이라이트 중점 측광

ISO 100, f/2.0 렌즈 사용시 온도 20 ℃

P: 프로그램 자동 (프로그램 시프트 가능), S: 셔터 우선 자동, A: 조리개 우선 자동, M: 매뉴얼

검출된 값에서 광도 고정(휘도값 잠금 방식)

ISO 감도(권장 노광 지수)

ISO 64~25600( 1 /3 및 1EV에서 선택), ISO 64에 대해 약 0.3, 0.7, 1단(ISO 32 상당)의 감감, ISO 25600에 대해 약 0.3, 0.7, 1단, 2단(ISO 102400 상당)의 증감, 자동 ISO 감도 제어 가능

액티브 D‑Lighting

자동, 매우 강하게 2, 매우 강하게 1, 강하게, 표준, 약하게, OFF

단순 가산, 가중 평균 가산, 밝게, 어둡게

HDR 합성, 사진 모드 플리커 저감

AF 보조광이 있는 하이브리드 위상차/콘트라스트 AF

−6.5~+19EV(스타라이트 뷰 사용시 −8.5~+19EV)

사진 모드, 싱글 AF 서보(AF-S), ISO 100, f/1.2 렌즈 사용시, 온도 20℃

자동 초점(AF): 단일 서보 AF(AF‑S), 컨티뉴어스 AF(AF‑C), 연속 AF(AF‑F, 동영상 모드에서만 사용 가능), 예측 구동 초점

수동 초점 (M): 초점 에이드를 사용할 수 있음

사진 모드, 촬상 범위 FX, 싱글 포인트 AF시

핀포인트 AF (사진 모드만), 싱글 포인트 AF, 다이내믹 AF (S, M, L, 사진 모드만), 와이드 영역 AF (S, L), 자동 영역 AF, 3D-트래킹 (사진 모드만), 피사체 추적 AF (동영상 모드만)

서브 셀렉터의 중앙부 누름, 또는 싱글 AF 서보(AF-S) 시에 셔터 버튼 반누름

이미지 센서 시프트 방식 5축 보정

렌즈 시프트 방식(VR 렌즈 사용 시)

TTL: i‑TTL 플래시 제어, i-TTL-BL 플래시 (멀티 패턴 측광, 중앙부 중점 측광 또는 하이라이트 중점 측광), 스탠다드 i-TTL 플래시 (스팟 측광) 가능

선막 싱크로, 슬로우 싱크로, 후막 싱크로, 적목 감소, 적목 감소 슬로우 싱크로, 발광 금지

별매 플래시가 완전히 충전되었을 때, 플래시가 최대로 발광한 후 노출 부족 경고시는 점멸

핫슈(ISO 518): 싱크로 접점, 통신 접점, 세이프티 락 포함

니콘 크리에이티브 라이팅 시스템 (CLS)

i-TTL 플래시, 전파 제어 어드밴스트 무선라이팅, 광제어 어드밴스트 무선라이팅, 모델링발광, FV잠금, 발광 색온도 정보 전달, 오토FP고속싱크로, 통합 플래시 컨트롤

고정 나사가 있는 ISO 519 싱크로 터미널

자동(3개 유형), 자연광 자동, 맑은날, 흐린날, 그늘, 백열등, 형광등(3개 유형), 플래시, 색온도 설정(2500K~10000K), 수동 프리셋(최대 6개 값 저장 가능), 모두 미세 조정 가능

AE•플래시 브라케팅, AE 브라케팅, 플래시 브라케팅, 화이트 밸런스 브라케팅, 액티브 D-Lighting브라케팅

촬상 소자에 의한 TTL 측광 방식

멀티패턴 측광, 중앙부 중점 측광, 하이라이트 중점 측광

화상 사이즈 (픽셀) 및 프레임 수

7,680 × 4,320(8K UHD): 30p/25p/24p

3,840 × 2,160(4K UHD): 120p/100p/60p/50p/30p/25p/24p

1,920 × 1,080: 120p/100p/60p/50p/30p/25p/24p

120p: 119.88fps, 100p: 100fps, 60p: 59.94fps, 50p: 50fps, 30p: 29.97fps, 25p: 25fps, 24p: 23.976fps

Apple ProRes 422 HQ(10비트), H.265/HEVC(8비트/10비트), H.264/AVC(8비트)

Linear PCM(MOV 형식으로 녹화된 동영상의 경우) 또는 AAC(MP4 형식으로 녹화된 동영상의 경우)

감쇠 장치가 있는 내장 스테레오 또는 외장 마이크; 감도 조정 가능

ISO 감도(권장 노출 지수)

M 모드: 수동 선택(ISO 64~25600, 1 /3 및 1EV 단계 중에서 선택), ISO 25600에 대해 약 0.3, 0.7, 1단, 2단(ISO 102400 상당)의 증감, 감도 자동제어(ISO 64~Hi 2.0)가 가능, 제어 상한 감도가 설정 가능

P, S, A 모드: 상한 선택 가능한 ISO 감도 자동 제어(ISO 64~Hi 2.0)

액티브 D‑Lighting

매우 강하게, 강하게, 표준, 약하게, OFF

타임랩스 동영상, 전자식 손떨림 보정, 타임 코드, N-Log 및 HDR(HLG) 동영상

1컷 재생, 썸네일(약 4, 9, 72분할), 확대 재생, 확대 재생중의 트리밍, 동영상 재생, 히스토그램 표시, 하이라이트 표시, 촬영 정보 표시, 위치 정보 표시, 촬영 화상의 세로 위치 자동 회전, 화상 등급 평가 , 음성 메모 입력/재생 가능, IPTC 프리셋 첨부/표시 가능

C형 USB 커넥터(SuperSpeed USB), 내장형 USB 포트에 연결 권장

Type A HDMI 커넥터

스테레오 미니 잭( φ 3.5mm), 플러그 인 파워 마이크 대응

스테레오 미니 잭( φ 3.5mm)

있음 (별매 리모트코드 MC-30A/MC-36A 등 사용 가능)

규격: IEEE 802.3ab (1000BASE-T), IEEE 802.3u (100BASE-TX), IEEE 802.3 (10BASE-T)

데이터 속도 * : 1000/100/10Mbps (자동 인식)

포트: 1000BASE-T/100BASE-TX/10BASE-T (AUTO-MDIX)

표시의 수치는 규격의 이론상 최대치이며 실제 데이터 전송속도를 나타내는 것은 아닙니다.

규격: IEEE 802.11b/g/n/a/ac

작동 주파수: 2,412~2,472MHz (채널 13) 및 5180~5825MHz

최대 출력 전력(EIRP):

인증: 개방 모드, WPA2-PSK, WPA3-SAE

통신 프로토콜: 블루투스 규격 버전 5.0

Bluetooth Low Energy: 2,402~2,480MHz

최대 출력 전력(EIRP):

Bluetooth Low Energy: 1.4dBm

전파 간섭이 없는 경우.통신 거리는 차폐물이나 전파 상태 등에 의해 영향을 받습니다.

지원되는 GNS 시스템

GPS(미국), GLONASS(러시아), QZSS(일본)

위도, 경도, 고도, UTC(협정 세계시)

GNSS를 통해 취득한 시간으로 카메라 시계 설정

15초, 30초, 1분, 2분, 5분

최대 로그 기록 시간

EN‑EL18d 충전식 Li-ion 배터리 1개 *

EN-EL18d 대신에 EN-EL18c/EN-EL18b/EN-EL18a/EN‑EL18도 사용할 수 있습니다. 다만, EN-EL18d를 사용했을 때보다 촬영 가능 컷 수 (배터리 사용 가능 시간)가 적습니다. 본체충전 AC 어댑터 EH-7P를 사용한 충전은 EN-EL18d/EN-EL18c/EN‑EL18b 사용시에만 가능.

본체 충전 AC 어댑터

EH‑7P 본체 충전 AC 어댑터

AC 어댑터 EH-6d(파워 커넥터 EP-6a와 조합하여 사용, 별매)

0.635cm( 1 /4 인치, ISO 1222)

약 149 × 149.5 × 90.5mm

약 1,340g(배터리 및 메모리 카드 포함, 바디 캡, 액세서리 슈커버 제외), 약 1,160g(본체만)

85% 이하(결로 현상이 없을 것)

달리 명시되지 않는 한 모든 측정은 CIPA(Camera and Imaging Products Association, 카메라 영상기기공업회) 규격 또는 가이드 라인에 준거하고 있습니다.

모든 수치는 완충된 배터리가 장착된 카메라를 기준으로 합니다.

카메라에 표시되는 샘플 이미지와 이 설명서의 이미지와 그림은 설명을 위한 것입니다.

Nikon은 사전 통지 없이 본 설명서에 설명된 하드웨어와 소프트웨어의 모양과 사양을 언제든지 변경할 수 있는 권한을 보유합니다. Nikon은 본 설명서의 오기로 인해 발생할 수 있는 손해에 대해 책임지지 않습니다.

MH‑33 배터리 충전기

EN‑EL18d, EN‑EL18c 및 EN‑EL18b 충전식 Li-ion 배터리

약 4시간(EN‑EL18c/EN‑EL18b 배터리 사용 시 약 3시간)

배터리 잔량이 없는 상태에서의 충전시간(주위 온도 25℃)

약 87 × 25 × 86.5mm, 돌출부 제외

이 제품에 표시된 기호는 다음을 나타냅니다.

EH‑7P 본체 충전 AC 어댑터

AC 100~240V, 50/60Hz, MAX 0.5A

EN‑EL18d, EN‑EL18c 및 EN‑EL18b 충전식 Li-ion 배터리

약 65.5 × 26.5 × 58.5mm, 플러그 어댑터 제외

약 135g, 플러그 어댑터 제외

필요한 경우, EH‑7P에는 국가 또는 지역에 따라 플러그 어댑터가 부속되어 있습니다. 플러그 어댑터의 모양은 판매 국가에 따라 다릅니다. 플러그 어댑터를 제거하려고 시도하지 마십시오. 제품이 손상될 수 있습니다.

이 제품에 표시된 기호는 다음을 나타냅니다.

m AC(교류), p DC(직류), q II등급 장비(제품이 이중절연 구조임)

EN‑EL18d 충전식 Li-ion 배터리

약 56.5 × 27 × 82.5mm

약 175g, 단자 커버 제외

화상을 삭제하거나 메모리 카드 또는 기타 데이터 저장장치를 포맷하더라도 원본 이미지 데이터는 완전히 삭제되지 않는 점에 유의하십시오. 시판되는 소프트웨어를 사용하여 폐기된 저장 장치에서 삭제된 파일을 복구할 수 있으며 이 과정에서 개인 이미지 데이터가 악의적으로 사용될 수 있습니다. 이러한 데이터의 개인 정보를 보장하는 것은 사용자의 책임입니다.

데이터 저장 장치를 폐기하거나 소유권을 다른 사람에게 양도하기 전에 상용 삭제 소프트웨어를 사용하여 모든 데이터를 지우거나 장치를 포맷한 다음 개인 정보가 포함되지 않은 화상(예: 빈 하늘 사진)으로 모두 채웁니다. 데이터 저장 장치를 물리적으로 파손할 때 부상을 입지 않도록 주의해야 합니다.

카메라를 폐기하거나 다른 사람에게 소유권을 양도하기 전에 카메라 설정 메뉴의 [ 모든 설정 초기화 ] 항목을 사용하여 네트워크 설정 및 기타 개인 정보를 삭제해야 합니다.

DCF Version 2.0: DCF(Design File for Camera File System)는 디지털 카메라 업계에서 널리 사용되는 표준으로 다양한 카메라 제조업체 간의 호환성을 보장합니다.

Exif Version 2.32: 이 카메라는 프린터와 디지털 카메라의 상호 운용성을 향상하기 위해 도입된 표준 Exif(디지털 카메라 화상 교환 파일 형식) 버전 2.32을 지원하여 고품질 인쇄물을 보다 쉽게 제작할 수 있습니다. 사진에 저장된 정보는 화상이 Exif 호환 프린터로 출력될 때 최적의 색 재현을 위해 영역 바이너리 옵션 타입 사용됩니다. 자세한 내용은 프린터 설명서를 참고하십시오.

HDMI: HDMI(High-Definition Multimedia Interface)는 가전 및 AV 장치에 사용되는 멀티미디어 인터페이스의 표준입니다. 이 표준은 시청각 데이터 및 제어 신호를 단일 케이블 연결을 통해 HDMI 호환 장치로 전송할 수 있도록 합니다.

영역 바이너리 옵션 타입

이 문서에서는 다음과 같은 내용을 다룹니다.

메뉴 설명

deploy_ref_01_2018.png

1. 아티팩트 메뉴 영역

배포를 관리하는 Deploy 구성의 기본 단위입니다. 생성된 아티팩트는 화면 위쪽에 목록 형태로 표시됩니다.

2. 배포 메뉴 영역

배포를 진행하는 페이지로 시나리오 생성과 설정을 할 수 있습니다. 시나리오에는 Jenkins-CLI 템플릿, 바이너리 배포, 파일 배포가 있으며, 사용자가 원하는 스크립트를 실행할 수 있도록 직접 명령어를 입력할 수 있습니다.

  • 배포 시나리오 관리
    • 복사
    • 설정
    • 새로 만들기
    • 업로드/다운로드
      • 시나리오 단위의 가져오기/내보내기

      배포 옵션

      서버 그룹
      • 배포할 서버 그룹을 선택할 수 있습니다. 서버 그룹은 서버 그룹 탭에서 생성할 수 있습니다.
      실행 서버
      동시 실행 수

      지정된 서버 그룹 내 서버들에 동시 또는 개별 배포합니다.

      • 0: 동시 실행
      • 1: 한대씩 배포
      • N: 동시 배포 수 지정
      시나리오 실행 실패 시
      • 실행 중단
        • 시나리오 실행 중 오류가 발생하면 시나리오 실행이 중단됩니다.
        • 오류 여부와 관계없이 시나리오가 계속 실행됩니다.

        진행 중인 배포 상태 보기

        배포 중인 시나리오의 진행 상황을 확인할 수 있습니다.

        deploy_ref_02_2018.png

        • 배포 중인 아티팩트를 클릭하면 나타나는 헤더에서 확인하고자 하는 배포 항목을 클릭합니다.
        • 배포 이력 화면에서 'deploying' 상태를 클릭합니다.

        배포 이력

        배포 영역 바이너리 옵션 타입 이력과 배포 설정, 배포 노트의 자세한 내용을 확인할 수 있습니다. * 배포 이력과 이력별 자세한 내용 확인 * 배포 결과 * 결과 보기에서 이력별 시나리오 설정 내용과 태스크별 실행 결과, 배포 노트를 확인할 수 있습니다. * 'deploying' 상태일 때 클릭하면 배포 중인 상태 보기 화면으로 이동합니다.

        배포 이력을 실행일 및 서버 그룹을 기준으로 검색할 수 있습니다. * 배포 이력을 실행일 및 서버 그룹을 기준으로 검색 * 서버 그룹 선택 창 및 실행일 시작일~종료일로 검색할 수 있습니다. * 실행일 기간이 1년을 초과하여 선택할 수 없습니다(예: 2020-06-07~2021-06-17).

        검색된 배포 이력을 Excel 파일로 다운로드할 수 있습니다. * 검색된 배포 이력을 Excel 파일로 다운로드 * 원하는 서버 그룹 및 실행일을 선택한 후 다운로드 버튼을 클릭합니다. * 바이너리 파일 없는 이력 제외 옵션을 선택하여 다운로드할 수 있습니다. * 바이너리 파일 없는 이력 제외 선택 없이 다운로드 클릭 시 영역 바이너리 옵션 타입 * 바이너리 파일 없는 이력 제외 선택 후 다운로드 클릭 시

        바이너리 그룹

        바이너리 그룹 탭에서는 바이너리를 그룹으로 관리할 수 있습니다. Develop, Staging, Product 등의 서버 장비에 배포되는 바이너리를 구분할 때 활용할 수 있습니다.

        deploy_ref_04_2018.png

        • 그룹을 생성, 수정하고, 바이너리 파일을 업로드, 다운로드할 수 있습니다.

        deploy_ref_05_2018.png

        • Client 타입일 때는 바이너리 그룹의 비밀번호를 설정할수 있으며, 공유된 클라이언트 다운로드 페이지의 접근을 제어할 수 있습니다.
          • 바이너리 그룹을 생성할 때 바이너리 그룹 비밀번호 사용을 선택하면 비밀번호를 입력할 수 있습니다.
          • 해당 그룹 다운로드 페이지는 NHN Cloud에 로그인하지 않고도 설정된 비밀번호로만 접근할 수 있습니다.

          deploy_ref_06_2018.png

          서버 그룹

          deploy_ref_07_2018.png

          배포 대상 서버를 그룹으로 관리할 수 있습니다. Phase 속성으로 Develop, Staging, Product 등의 서버 장비를 구분하여 활용할 수 있습니다.

          • 그룹, 서버 정보를 수정할 수 있습니다.
          • 그룹에서 사용할 시나리오를 설정할 수 있습니다.

          서버 그룹 추가

          deploy_ref_08_2018.png

          • Deploy 아래의 탭 중 배포 >서버 그룹 생성을 클릭하거나, 서버 그룹 >새로 만들기를 클릭합니다.
            • 이름(필수), 설명(선택) 항목을 입력합니다.
            • OS를 선택한 후 Shell Type를 지정합니다. 목록에서 항목을 선택하거나 직접 입력할 수 있습니다.
            • Phase를 선택합니다. 서버 장비를 구분합니다. 지정하지 않으려면 NONE을 선택합니다.
            • 생성 버튼을 클릭합니다.

            서버 정보 추가/삭제

            서버 그룹 생성(수정) 창에서 서버 정보를 추가하거나 삭제할 수 있습니다.

            서버 정보 추가

            deploy_ref_08_2018.png

            • 호스트 이름(필수), IP 주소(필수), OS(선택) 입력 후 추가 버튼을 클릭합니다.
            • 아래 서버 목록에 추가된 내용을 확인합니다. 왼쪽 체크 박스에 선택된 서버만 등록됩니다.

            생성 버튼을 클릭합니다. 수정할 때는 수정 버튼을 클릭합니다.

            deploy_ref_09_2018.png

            아래와 같은 형식으로 서버 정보를 입력합니다. test.host.name1;1.1.1.1;CentOS6.8; test.host.name2;2.2.2.2;;

            Spark Internal Part 2. Spark의 메모리 관리(1)

            Spark 사용 시 여러가지 문제를 겪을 수 있는데, 그 중 가장 많이 겪게 되는 부분이 메모리 관련(주로 GroupBy 계열 Transformation을 사용할 때 발생하는 Out Of Memory Exception)문제입니다.

            Spark 공식 문서를 보면 메모리 구조나 옵션 등에 대해 상세히 나와 있지만, 사용하다보면 옵션을 잘 적용했다고 해도 종종 오류가 발생하는 경우가 있습니다. 모든 내용이 Spark 문서에 기재되어 있지 않을 뿐더러(물론 Databricks에서는 많은 강의를 통해 내부 구조에 대해 설명하고 있긴 합니다), 써드파티 라이브러리(Parquet 등)에서의 문제(아래에서 기술할 예정입니다)도 있기 때문입니다.

            물론 이 글에서도 전체 내용을 다루지는 못하며(워낙 Spark 코드가 방대하고 현재도 변화하고 있기 때문에), 일부 내용의 경우 잘못 이해하고 작성했을 수도 있습니다.

            만일 글 내용 중 틀렸거나 부족한부분이 있다면 피드백 부탁드립니다. 글을 쓰고 공개적인 장소에 공유하는 이유는 이 글을 읽는 다른 분들께 약간이나마 도움을 드릴 수 있고, 저도 피드백을 받아 더 성장할 수 있다고 생각하기 때문입니다.

            그럼, 시작하겠습니다.(아래부터는 말투가 바뀌어도 이해해주시기 바랍니다)

            Spark의 메모리 관리를 알아보기 전에, JVM Object Memory Layout, Garbage Collection, Java NIO, Netty Library 등에 대한 이해가 필요하다.

            첫 두 용어(JVM Object Memory Layout, Garbage Collection)는 Spark의 메모리 구조나 관리가 왜 현재와 같이 설계되었는지에 대한 원인에 가까우며, 나머지 두 용어(Java NIO, Netty Library)의 경우 이러한 원인의 해결책에 가깝다고 할 수 있다.

            물론 이러한 주제를 모른다고 해서 Spark의 메모리 구조를 파악하는데 큰 어려움이 있는 것은 아니며, 대부분의 Spark 사용자들은 많은 메모리 관련 오류를 겪으며 어렴풋이 메모리 구조에 대한 이해가 생겼을 수도 있다고 생각한다.

            하지만 이 내용들을 이해하고 넘어간다면, 좀 더 확실히 오류의 원인을 파악할 수 있고 빠르게 문제를 해결해 나갈 수 있다고 믿는다.

            JVM Object Memory Layout

            From Java code to Java heap

            This article gives you insight into the memory usage of Java code, covering the memory overhead of putting an int value…

            이 내용은 IBM developerWorks의 From Java code to Java Heap을 참고하여 작성하였습니다.

            32비트 OS에서 java 명령어를 사용하여 Java Application을 실행 시켰을 때, 점유하는 메모리 공간을 크게 2가지 영역으로 나누어 볼 수 있다.

            • Native Heap 영역(JVM 자체는 Native Heap 영역의 일부를 사용한다)
            • Java Heap 영역

            우리가 ‘일반적인’ 자바 프로그램을 작성할 떄 사용하는 부분은 Java Heap 영역이다.

            Java에는 원시 타입(Primitive Type | int, boolean 등 기본형)과 참조 타입(영역 바이너리 옵션 타입 Reference Type | Integer, Boolean, 사용자 정의 클래스 등)의 2가지 타입을 제공한다.

            기본적으로 참조 타입은 원시 타입에 비해 많은 메모리를 사용한다. 참조 타입은 값에 대한 메모리 공간에 객체메타정보에 대한 메모리 공간도 추가적으로 사용하기 때문이다.

            위 글에서는 int와 Integer를 기준으로 비교가 이루어졌는데, Integer의 경우 int보다 약 4배 정도의 메모리 공간을 소모한다고 기술되어 있다.

            JVM 벤더에 따라 다를 수 있겠지만 Object 메타데이터는 보통 3가지로 이루어져 있다고 한다.

            • Class 포인터: 객체가 자신이 속한 클래스를 가리키는 포인터. Integer 객체의 경우 java.lang.Integer 클래스를 가리키고 있을 것이다(설명은 나와 있지 않지만, ClassLoader에 의해 PermGen 영역에 로드된 Class 객체를 가리킬 것이라 생각한다)
            • Flags: 객체 상태에 대한 정보(객체의 hashcode나 이 객체가 Array인지 아닌지 등)
            • Lock: 동기화(Synchronization)에 사용되는 정보(Object 기반 Lock을 건다면 사용될 듯 하다)

            위 그림을 보면 Integer의 실제 값을 저장하는 공간을 32bit(4byte)인데 메타데이터가 96bit(12byte)를 사용하고 있는 것을 알 수 있다.

            Array 객체(여기서는 primitive를 Element로 가진 Array로 설명했다)의 경우 Array Length를 알리는 Size 필드가 추가된다.

            String과 같은 객체의 경우 내부적으로 Array[char]를 사용하기 때문에 위와 같이 2개의 메모리 구조를 사용하게 된다.

            JVM 메모리 구조를 다루는 글은 아니기 때문에(후에 좀 더 깊이 공부하고싶은 내용이긴 하다) 이 정도까지의 내용을 기술하도록 하겠다.

            여기까지 읽으신 분께서는 ‘생각보다 참조 타입이 메모리를 많이 사용하는구나’ 라고 생각하셨을 것이다. 더 나아가, ‘Spark과 같은 대용량 데이터 처리 프레임워크에서는 이러한 JVM Object의 Overhead를 줄이는 방향을 연구하겠구나’ 라는 생각도 하셨을 것이라 생각한다.

            Garbage Collection

            사실 Java의 Garbage Collection은 너무나 많은 국내/외 문서나 블로그에 잘 정리되어 있어, 이 글에 작성하는 것보다 그 글들을 보는 것이 더 효율적일 것이다.(Naver D2의 Java Garbage Collection이 잘 정리되어 있다고 생각하여 공유드린다)

            NAVER D2

            Java Garbage Collection

            이 내용은 Databricks에서 2015년 5월 28일에 작성한 Tuning Java Garbage Collection for Apache Spark Applications의 내용과 내 생각(은 이텔릭체로 표기하겠습니다)을 바탕으로 작성하였다.

            Garbage Collection은 ‘weak generational hypothesis’에 기반하여 만들어졌으며, ‘weak generational hypothesis’의 내용은 아래와 같다.

            • Most of the objects become unused quickly
            • The ones that do not usually survive for a (very) long time

            대부분의 객체는 생성된 후 얼마가지 않아 사용되지 않으며, 살아남는 객체의 경우 매우 시간을 살아남는다는 것이다.

            위의 객체를 RDD에 대응하여 생각해본다면 어떨까?

            RDD[T]에 대해 map(f)를 호출하여 RDD[T]를 만든다고 생각해보자. 특정 Executor에 RDD의 파티션들이 할당되고, Executor는 연산을 위해 메모리에 파티션 데이터를 로드하고, 이 데이터들을 우리가 넘긴 함수 f(T->U)에 적용하여 새로운 RDD의 파티션을 만들어 낼 것이다.

            함수 f에서 T에 해당하는 이전 데이터들은 U로 변환되고 나면 더이상 참조되어지지 않을 것이다. T에 해당하는 데이터들은 Minor GC가 발생했을 때 Survive하지 못하고 없어질 것이다.(여기까지는 영역 바이너리 옵션 타입 ‘stop the world’가 발생하지 않기 때문에 큰 성능 이슈는 발생하지 않는다)

            만일 만들어진 RDD들에 대해 cache를 호출한다면 어떻게 될까?

            Spark의 Default Storage Level은 MEMORY_ONLY이기 때문에 cache를 호출하고, 다른 RDD들을 만들어나갈 때마다 cache된 RDD들은 Eden -> Survive -> Old로 이동해나갈 것이다.

            결과적으로 메모리 공간이 부족해지면 Full GC가 발생하고, 이에 우리의 Executor JVM은 ‘stop the world’에 직면하여 작업이 지연될 것이다.

            JVM Object Memory Layout 특성에 따라 하나의 값을 표현하는데 많은 메모리가 소요되고, 이러한 메모리 소요에 의해 부족해진 공간을 확보하기 위해 Garbage Collection이 발생한다.

            대용량 데이터를 처리하는 프로그램에서는 이러한 특징들이 처리 속도를 저하시켰을 것이고, Spark 개발진 또한 이러한 문제를 해결하기 위해 고민했을 것이다. 현재 Spark에 적용되어 있는 다양한 기술(Project Tungsten, Netty)들은 이 고민에 대한 답이라 생각할 수 있을 것이다.

            지금부터는 Spark 개발진이 이러한 문제를 해결하기 위하여 적용한 Project Tungsten과 Netty에 대해 알아보려 한다.

            Project Tungsten

            Project Tungsten은 Spark의 실행 엔진 개선(CPU와 메모리 위주)을 위해 2014년에 실행되었던 Umbrella Project의 코드네임이다.

            위의 Project Tungsten 링크로 들어가보면, 7가지 주요 특징에 대해 서술해 놓았는데, 이 중 Software Level에 가까운 3개를 추려보자면 아래와 같다.(사실 Code Generation 또한 Hardware Level에 가깝다고 생각하지만 위 페이지를 들어가 나머지 3개를 보면 왜 Code Generation이 Software Level에 가깝다고 말한지 이해할 것이다)

            • Memory Management and Binary Processing: 메모리를 좀 더 명시적으로 관리하며 JVM 객체와 Garbage Collection의 Overhead를 없애는 것
            • Cache-aware computation: 메모리 계층 구조(L1, L2, Memory, Disk 순으로 느려지니까)를 활용하는 알고리즘과 데이터 구조 도입
            • Code generation: 모던 컴파일러와 CPU를 활용할 수 있는 코드 생성

            위 내용을 좀 더 자세히 설명해놓은 자료는 2015년 4월 28일에 올라온

            Project Tungsten: Bringing Apache Spark Closer to Bare Metal

            Project Tungsten focuses on improving the efficiency of memory and CPU for Spark applications. Motivated by…

            이며, 이를 통한 Spark SQL의 성능 개선은

            Spark SQL: Another 16x Faster After Tungsten - Databricks

            Apache Spark 2.1.0 boosted the performance of Apache Spark SQL due to Project Tungsten software improvements. Another…

            첫번째로 링크한 페이지의 내용 중 1. Memory Management and Binary Processing 을 정리해보았다.

            처음 내용의 대부분은 이 글의 위에서 기재한 JVM Object Memory Layout과 Garbage Collection에서 오는 성능 저하에 대한 내용을 다루고 있다.

            여기서부터 글 영역 바이너리 옵션 타입 내용에 나오는 부분에 대해서는 일반적인 글씨체, 제 생각이 추가된 부분은 이텔릭체로 작성하겠습니다.

            Spark의 경우 데이터가 어떤 방식으로 구성(Job, Stage, Task)되어 연산되는지, 데이터의 Life Cycle은 어떻게 되는지에 대한 정보를 가지고 있기 때문에 JVM Garbage Collector보다 더 효율적으로 메모리를 관리할 수 있다.

            범용적인 목적의 Application을 가정하고 만들어진 ‘weak generational hypothesis’이 Spark에는 잘 적용되지 않는 모델이라고 생각하는 것 같다.

            JVM 객체와 Garbage Collection의 오버헤드를 없애기 위해 JVM Object가 아니라 Binary Data로 직접 연산할 수 있도록 Spark 연산자를 변환하는 메모리 관리자(현재 Spark Code에서 확인할 수 있는 Unified Memory Manager를 가리키는 것 같다)를 도입했다.

            사실 이 부분이 가장 애매하게 해석했던 문장인 것 같습니다. 제가 코드를 확인했을 때는(제가 못보거나 잘못 봤을 수도 있겠지만) 연산자를 바꾸는 동작은 확인하지 못했었으니까요. 이 부분에 대해서는 추후 소스 코드 분석 글에서 더 자세히 다루도록 하겠습니다.

            이 기능은 C 스타일의 메모리 접근(malloc, dealloc 등)을 허용하는 sun.misc.UnSafe 기반으로 구현되었습니다.

            대부분의 Java Class들은 구글에 검색해보면 Oracle JavaDoc이 나오는데, sun.misc.UnSafe의 경우에는 문서가 나오지 않는다. OpenJDK7 JavaDoc을 Hosting하는 http://www.docjar.com/html/api/sun/misc/Unsafe.java.html 페이지에서 겨우 발견할 수 있었다. 클래스 주석을 보면 다음과 같이 적혀 있다.

            Low-Level의 Unsafe한 기능을 수행하는 함수들을 모아놓은 클래스이며, 이 클래스와 클래스에 속한 모든 methods는 Public 접근자이지만 Trusted Code에서만 이 객체를 얻을 수 있는 제한이 있습니다.

            그렇다면 JVM Object를 사용하는 것과 Unsafe를 사용하는 것이 얼마나 차이가 있을까? 직접 테스트를 수행해 보았다.

            1. JVM Object를 사용하는 버전(Java로 작성)

            Total Memory: 128974848
            Max Memory: 1908932608
            Free Memory: 127611672

            Elapsed: 30192
            Total Memory: 1547698176
            Max Memory: 1908932608
            Free Memory: 547102752

            2. Unsafe를 사용하는 버전(Scala로 작성, 왜인지 모르겠지만 Java 환경에서 sun.misc.Unsafe가 import되지 않음…)

            Total Memory: 128974848
            Max Memory: 1908932608
            Free Memory: 127611672
            Elapsed: 200
            Total Memory: 128974848
            Max Memory: 1908932608
            Free Memory: 126929656

            눈여겨 보아야 할 점은 2가지이다.

            Unsafe를 사용할 경우 200ms, Java Object를 사용했을 경우 30192ms가 소요되었다.(맥북에어 2014 기준)

            언어의 차이를 배제하고도 거의 15배 정도의 차이가 발생하는 것을 확인할 수 있다.

            2. Memory 사용량의 변화

            위 두 코드 모두 Xmx, Xms 등의 Heap 영역 설정을 주지 않고 실행하였으며, Java의 경우 힙 사용량이 거의 0MB에서 800MB 정도로 늘어난 것을 확인할 수 있고, Unsafe를 사용한 Scala의 경우 힙 공간에 변동이 거의 없는 것을 확인할 수 있다. 이는 Unsafe가 위의 JVM Object Memory Layout에서 언급했던 Native Heap 영역을 사용하기 때문이다. Native Heap 영역의 경우 Garbage Collection 의 영향을 받지 않기 때문에 ‘stop the world’ 또한 발생하지 않는다.

            이렇게 sun.misc.Unsafe를 사용하게 되면 JVM 에서 연산하는 것보다 속도/메모리 관리 면에서 더 많은 이점을 가지게 된다.

            다시 Spark의 Tungsten 글로 돌아와서, Spark에서 java.util.HashMap을 UnSafe를 이용한 Binary Map으로 변경하여 성능 최적화 한 부분을 보여준다.

            Java HashMap(LinkedHashMap인 것으로 추정된다)을 도식화 해놓았는데, 사실 좀 더 자세히 그렸다면 HashMap 자체의 Object 메타데이터, 각 Entry의 Object 메타데이터, Key의 Object 메타데이터, Value의 Object 메타데이터 등이 포함되어 매우 많은 메모리를 소모하는 것을 예상할 수 있다.

            이에 반해 Spark Binary Map의 경우 선형적 메모리 공간에 Key,Value를 연속적으로 할당하였으며(mmap과 비슷한…), Java Object가 아니기 때문에 메타데이터 공간도 절약되고 Garbage Collection의 영향도 안 받게 영역 바이너리 옵션 타입 된다.

            따라서 아래와 같은 그래프에서 극적인 성능 개선이 이루어지는 것이다.

            개인적으로 위의 도식과 비교 방식이 좀 아쉽다고 생각한다. 일단 HashMap의 경우 Linked List기반의 Linked HashMap이고 Binary Map의 경우 Array에 더 가까운 모습이다. 물론 이를 제외하고라도 성능 차이가 극명한 것은 눈에 보이긴 하지만…

            이 기능은 Spark 1.4 부터 적용되어 있고 Spark SQL의 엔진에서도 사용하는 것으로 알고 있다.

            Spark의 경우 UnifiedMemoryManager를 통해 Heap, Off-Heap 메모리의 비율이나 사용량을 측정/조절한다.

            여기까지는 좋은데, Third Party Library에서 사용하는 Off-Heap 공간이 문제다. Netty, Parquet 등의 Third Party Library에서도 성능 향상을 위해 Unsafe를 사용하고 있는데, 이러한 Library들에서 사용하는 메모리 공간에 대해서는 Spark에서 관여하지 않는 듯 하다.

            가끔 Parquet 포맷의 파일을 사용할 때 “java.lang.OutOfMemoryError: Direct buffer memory”와 같은 오류 메시지를 볼 수 있는데, Parquet Library에서 허용하는 Direct Memory 이상의 메모리를 사용했기 때문에 발생하게 된다.(https://issues.apache.org/jira/browse/SPARK-4073)

            여기까지 Spark Tungsten Project에 관련된 내용을 정리하였다. Part 1에 비해 약간은 코드가 적고 이론적인 설명이 많다.

            원래 Spark의 BlockManager, UnifiedMemoryManager, NettyUtils, PooledByteBufAllocator에 대한 코드 분석과 Java NIO, Netty를 연계한 설명도 이 글에 포함할 계획이었다.

            하지만 워낙 양이 많아 하나의 글로 풀어 내기에는 방대할 것 같아 여기까지의 내용을 1편으로 정리하고 이어지는 2편에서 다룰 예정이다.

            KR101113342B1 - 이동통신 단말기의 부트로더 버전 관리 방법 - Google Patents

            Publication number KR101113342B1 KR101113342B1 KR1020040074706A KR20040074706A KR101113342B1 KR 101113342 B1 KR101113342 B1 KR 101113342B1 KR 1020040074706 A KR1020040074706 A KR 1020040074706A KR 20040074706 A KR20040074706 A KR 20040074706A KR 101113342 B1 KR101113342 B1 KR 101113342B1 Authority KR South Korea Prior art keywords boot boot loader version bootcode flash memory Prior art date 2004-09-17 Application number KR1020040074706A Other languages English ( en ) Other versions KR20060025854A ( ko Inventor 양종규 Original Assignee 엘지전자 주식회사 Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.) 2004-09-17 Filing date 2004-09-17 Publication date 2012-02-28 2004-09-17 Application filed by 엘지전자 주식회사 filed Critical 엘지전자 주식회사 2004-09-17 Priority to KR1020040074706A priority Critical patent/KR101113342B1/ko 2006-03-22 Publication of KR20060025854A publication Critical patent/KR20060025854A/ko 2012-02-28 Application granted granted Critical 2012-02-28 Publication 영역 바이너리 옵션 타입 of KR101113342B1 publication Critical patent/KR101113342B1/ko

            Links

            • Espacenet
            • Global Dossier
            • Discuss
            • 238000010295 mobile communication Methods 0.000 title claims abstract description 22
            • 238000007726 management method Methods 0.000 claims abstract description 5
            • 230000000875 corresponding Effects 0.000 claims description 5
            • 238000000034 method Methods 0.000 description 4
            • 238000004891 communication Methods 0.000 description 1
            • 238000010586 diagram Methods 0.000 description 1

            Images

            Classifications

              • G — PHYSICS
              • G06 — COMPUTING; CALCULATING; COUNTING
              • G06F — ELECTRIC DIGITAL DATA PROCESSING
              • G06F9/00 — Arrangements for program control, e.g. control units
              • G06F9/06 — Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
              • G06F9/44 — Arrangements for executing specific programs
              • G06F9/4401 — Bootstrapping
              • G — PHYSICS
              • G06 — COMPUTING; CALCULATING; COUNTING
              • G06F — ELECTRIC DIGITAL DATA PROCESSING
              • G06F8/00 — Arrangements for software engineering
              • G06F8/70 — Software maintenance or management
              • G06F8/71 — Version control; Configuration management
              • H — ELECTRICITY
              • H04 — ELECTRIC COMMUNICATION TECHNIQUE
              • H04B — TRANSMISSION
              • H04B1/00 — Details of transmission systems, not covered by a single one of groups H04B3/00 - H04B13/00; Details of transmission systems not characterised by the medium used for transmission
              • H04B1/38 — Transceivers, i.e. devices in which transmitter and receiver form a structural unit and in which at least one part is used for functions of transmitting and receiving
              • H04B1/40 — Circuits

              Abstract

              본 발명은 이동통신 단말기의 부트로더 버전 관리 방법에 관한 것으로, 종래 NAND 타입 플래쉬 메모리 및 부트로더를 사용하는 이동통신 단말기의 주 제어부에서는 부트코드와 함께 저장된 부트로더를 이용하여 해당 부트코드를 램으로 복사하는 동작을 시스템 부팅시 실시하게 되며, 상기 부트코드는 독립적으로 생성되어 상기 플래쉬 메모리의 부트코드 영역에 저장될 수 있다. 하지만, 상기 부트코드는 적합한 버전의 부트로더를 사용해야만 정확한 동작을 보장하므로 원하는 부트로더 버전과 기 저장되어 있는 부트로더 버전이 일치하지 않는 경우 단말기 동작에 오류가 발생할 수 있으나, 저장되어 있는 부트로더의 버전을 확인할 수 있는 방법이 없어 부트로더의 버전 관리가 불가능한 문제점이 있었다. 이와 같은 문제점을 감안한 본 발명은 부트코드 작성시 지원하는 부트로더의 버전 정보를 입력하도록 하고, 상기 부트코드 작성시 동시에 작성되는 부트로더는 컴파일시 상기 부트코드의 부트로더 버전 정보를 참조하도록 하며, 상기 부트코드와 부트로더를 컴파일한 바이너리 파일을 플래쉬 메모리에 다운로드하는 경우 상기 부트로더 저장 영역의 고정 위치에 해당 부트로더 버전 정보가 위치되도록 한 후, 부팅시마다 플래쉬 메모리의 일정 위치에서 부트로더 버전 정보를 획득하여 램으로 전달되는 부트코드에 포함된 부트로더 버전 정보와 비교하여 일치하지 않으면 사용자에게 부트로더 버전 오류를 알려줄 수 있도록 함으로써, 부트코드에 적합하지 않은 부트로더 버전의 사용에 따른 이동통신 단말기 오동작을 방지할 영역 바이너리 옵션 타입 영역 바이너리 옵션 타입 수 있고, 정확한 버전의 부트로더 사용을 보장할 수 있도록 하는 효과가 있다.

              Description

              본 발명은 이동통신 단말기의 부트로더 버전 관리 방법에 관한 것으로, 특히 이동통신 단말기의 주제어기에 포함된 NAND타입 플래쉬 메모리에 부트로더(Boot-loader)를 컴파일하여 기록할 경우 부트로더의 버전 정보를 일정 위치에 저장하도록 하고, 부팅시 부트코드에 설정된 부트로더의 버전과 실제 부트로더의 버전을 비교하도록 하여 올바른 부트로더의 사용을 보장하도록 한 이동통신 단말기의 부트로 더 버전 관리 방법에 관한 것이다.

              부트로더란, 간단히 말해서 컴퓨터를 켰을 때 가장 먼저 실행되는 프로그램으로서, 일반 피씨(PC)의 경우 제일 먼저 일어나는 부팅 동작은, 부팅 디바이스(하드디스크)의 0사이드 0트랙 0섹터에서 정보를 가져오는 일이다.

              도스(Dos)나 윈도우즈(Windows) 시스템과 같은 하드디스크를 부팅 디바이스로 이용하고 있는 대부분의 시스템에서는, 이 부트 섹터에 자신이 부팅하기 위한 정보(인터럽트 테이블 등)를 복사하여 사용하게 된다.

              그러나, 이동통신 단말기와 같이 대용량의 하드디스크를 구비하기어려운 소형 임베디드 시스템에서는, 시스템 부팅을 위한 프로그램 및 운영 체제(OS), 응용 프로그램 등을 내부 메모리에 저장하여 사용하도록 하고 있다.

              일반적으로, 단말기 내부에서 부팅 시스템, 운영체제(OS) 등을 저장하기 위한 용도로 사용하는 플래쉬 메모리는, NOR 타입 플래쉬 메모리로서 바이트(Byte) 단위로 리드 액세스(Read Access)가 가능하기 때문에, 플래쉬 메모리 상에서 직접 프로그램을 실행할 수 있는 장점이 있지만, 전류소비가 많고 가격이 비싸기 때문에 상대적으로 저용량(1~32MB)을 실장 하게된다.

              따라서, 상기와 같은 고가의 가격이나 제어의 복잡성 및 많은 전류소모 때문에 최근에는 리드(Read)와 라이트(Write) 시에 모두 블록단위로 액세스하며 전류소비가 적은 NAND 타입 플래쉬 메모리를 이용하는 경우가 많아지고 있다. 하지만, NAND 타입 플래쉬 메모리는 블록단위로만 액세스가 가능하므로 그 자체에서 프로그램을 실행할 수 없고, 실행하고자 하는 프로그램을 램(RAM)으로 모두 복사한 후 램에서 실행해야 한다. 이를 위해 사용되는 것이 부트로더로서, NAND형 플래쉬 메모리에 저장되는 부트 코드를 역시 NAND형 플래쉬 메모리에 저장되는 전용 부트로더를 이용하여 램으로 복사하는 역할을 하게 된다.

              상기 램의 크기는 부트코드를 저장할 수 있는 만큼 큰 용량의 것을 사용해야 하지만, 플래쉬 메모리의 용량을 확장하는 것에 비해서 보다 저렴하며, 램의 리드(read)속도가 플래쉬 메모리의 리드 속도보다 빠르므로, 동작 속도가 빨라지게 된다.

              특히, 이동통신 단말기의 주 제어부로 많이 사용되는 퀄컴(Qualcomm)사의 MSM6xxx 부터는 NAND 타입 플래쉬 메모리를 이용하고 있으며, 이를 위해 부트로더가 사용되기 시작하였다. 이러한 부트로더를 통해 부트코드를 램으로 복사하여 부팅을 실시하도록 하며, 새로운 기능이 부가되거나 특정한 개선 사항이 있는 경우 상기 부트코드를 새롭게 작성하여 부트코드만 이동통신 단말기의 NAND 타입 플래쉬 메모리에 다운로드하여 변경된 부트코드를 적용할 수 있게 된다.

              하지만, 부트코드는 앞서 설명한 바와 같이 독립적으로 변경이 가능하기 때문에 해당 부트코드에 적합한 버전의 부트로더가 사용되어야하만 한다. 만일 부트코드가 원하는 부트로더의 버전과 실제 저장된 부트로더의 버전이 맞지 않는 경우 오동작의 발생 가능성이 있게 된다. 즉, 부트코드 작성시 해당 부트코드를 지원하는 부트로더의 버전이 결정되는데, 이동통신 단말기에 기 저장된 부트로더의 버전 이 새롭게 다운로드할 부트코드를 지원하는 버전이 아닐 수도 있으며, 적합하지 않은 버전의 부트로더를 이용하게 되면 부팅과정에서 심각한 오류를 발생시킬 수 있으며, 오동작의 위험을 가진 상태로 부팅이 실시될 수도 있다. 그러나, 저장되어 있는 부트로더의 버전을 알 수 있는 방법이 없기 때문에 부트코드 다운로드시 이를 알 수 없으며, 부팅시에도 부트코드 버전 오류를 검증할 방법이 없었다.

              상기한 바와 같이 종래 NAND 타입 플래쉬 메모리 및 부트로더를 사용하는 이동통신 단말기의 주 제어부에서는 부트코드와 함께 저장된 부트로더를 이용하여 해당 부트코드를 램으로 복사하는 동작을 시스템 부팅시 실시하게 되며, 상기 부트코드는 독립적으로 생성되어 상기 플래쉬 메모리의 부트코드 영역에 저장될 수 있다. 하지만, 상기 부트코드는 적합한 버전의 부트로더를 사용해야만 정확한 동작을 보장하므로 원하는 부트로더 버전과 기 저장되어 있는 부트로더 버전이 일치하지 않는 경우 단말기 동작에 오류가 발생할 수 있으나, 저장되어 있는 부트로더의 버전을 확인할 수 있는 방법이 없어 부트로더의 버전 관리가 불가능한 문제점이 있었다.

              이와 같은 문제점을 감안한 본 발명은 부트코드 작성시 지원하는 부트로더의 버전 정보를 입력하도록 하고, 상기 부트코드 작성시 동시에 작성되는 부트로더는 컴파일시 상기 부트코드의 부트로더 버전 정보를 참조하도록 하며, 상기 부트코드와 부트로더를 컴파일한 바이너리 파일을 플래쉬 메모리에 다운로드하는 경우 상기 부트로더 저장 영역의 고정 위치에 해당 부트로더 버전 영역 바이너리 옵션 타입 정보가 위치되도록 한 후, 부팅시마다 플래쉬 메모리의 일정 위치에서 부트로더 버전 정보를 획득하여 이를 램으로 전달되는 부트코드에 포함된 부트로더 버전 정보와 비교하여 일치하지 않으면 사용자에게 부트로더 버전 오류를 알려줄 수 있도록 한 이동통신 단말기의 부트로더 버전 관리 방법을 제공하는데 그 목적이 있다.

              상기와 같은 목적을 달성하기 위한 본 발명은, 부트코드 작성시 지원가능한 부트로더의 버전정보를 삽입한 후 컴파일하여 부트코드 바이너리 파일을 생성하는 단계와; 상기 부트코드 작성과 동시에 부트로더를 생성할 경우 컴파일시 상기 부트코드에 삽입된 버전정보를 참조하여 해당 정보를 일정 위치에 포함하는 부트로더 바이너리 파일을 생성하는 단계와; 상기 부트코드 바이너리 파일을 이동통신 단말기 플래쉬 메모리의 일정 영역에 다운로드 하며, 부트로더 바이너리 파일이 있는 경우 이를 플래쉬 메모리의 일정 영역에 다운로드하는 단계와; 이동통신 단말기를 부팅하는 경우 상기 부트로더가 기동하여 상기 부트코드를 램으로 옮겨 실행하면서 플래쉬 메모리에 저장된 부트로더 바이너리 파일의 일정 위치에 포함된 부트로더 버전정보를 획득하여 램으로 옮겨진 부트코드에 포함된 부트로더 버전정보와 비교하여 상이한 경우 사용자에게 버전 오류를 알리는 단계를 포함하는 것을 특징으로 한다.

              도 1은 본 발명 일 실시예의 동작 개념을 설명하기 위한 것으로, 도시한 바 와 같이 부트코드와 부트로더를 같이 생성할 경우, 부트로더 컴파일시 부트코드에 삽입된 부트로더 버전정보를 참조하여 그 정보를 일정 위치에 삽입한 부트로더 바이너리 파일을 생성한다는 것을 보인 것이다.

              이동통신 단말기의 제어기로 사용되는 퀄컴사의 MSM6xxx칩의 운용체제로는 REX가 주로 사용되며, 이를 지원하기 위하여 DMSS라는 코드 및 개발툴을 이용한다. 상기 DMSS 개발툴을 이용하여 부트코드를 작성할 경우, 소정의 옵션을 조절하고 특정한 설정을 조작하면 해당 부트코드를 위한 부트로더를 작성할 수 있게 되는데, 동일한 개발툴을 이용하게 되므로 상기 부트코드의 내용을 일부 참조할 수 있다.

              따라서, 본 발명에서는 부트코드 작성시 해당 부트코드를 로드해 줄 부트로더의 버전 정보를 삽입하도록 한다. 이는 도시된 바와같이 #define 문형을 이용할 수 있다. 이렇게 정의된 부트로더의 버전 정보는 해당 부트코드 컴파일시 부트코드에 삽입되도록 하며, 상기 부트코드와 같이 생성되는 부트로더 컴파일시에도 상기 부트코드에서 정의된 부트로더의 버전 정보를 참조하여 이를 부트로더 바이너리 파일 중 고정된 위치에 삽입되도록 한다. 이는 본 발명을 위해 DMSS 개발툴에서 추가되어야 할 부분이다.

              즉, 부트로더는 부트코드와 동시에 생성되어야 하기 때문에 부트코드에 정의된 부트로더 버전 정보를 참조하여 자신의 버전 정보로 이용한다는 점과, 부트코드만 작성할 경우(부트코드는 단독 컴파일 및 생성이 가능)에도 부트로더 버전 정보를 정의하여 영역 바이너리 옵션 타입 생성되는 부트코드가 적용될 부트로더의 버전을 명시한다는 점에 주의한다.

              상기와 같은 방법으로 부트코드 바이너리 파일과 부트로더 바이너리 파일이 생성되면, 이를 이동통신 단말기의 주제어기(MSM6xxx)에 포함된 NAND 타입 플래쉬 메모리의 부트코드 영역과 부트로더 영역에 각각 다운로드 한다.

              도 2는 NAND 타입 플래쉬 메모리(10)의 부트코드 영역(11)과 부트로더 영역(12)을 보인 것으로, 도시한 바와 같이 부트코드 영역(11)과 부트로더 영역(12)은 분리되어 있으며, 부트로더 영역(12)의 시작 위치 혹은 종료 위치를 고정시켜 해당 부트로더 바이너리 파일의 고정 위치에 삽입된 부트로더 버전 정보가 실제 플래쉬 메모리의 고정 위치(13)에 존재하도록 한다. 이를 통해 직접 억세스 방식으로 언제든지 부트로더 버전 정보를 확인할 수 있다. 이는 외부 개발 툴을 이동통신 단말기에 연결하여 NAND 타입 플래쉬 메모리(10)의 고정 위치(13) 데이터를 읽어들이는 방법으로 부트로더의 버전 정보를 확인하는 것이 가능하다는 것을 의미한다.

              하지만, 이러한 방법은 개발자에게 장비연결의 부담을 주게 되는 방법이며, 서비스 센터등에서 통신포트를 이용하여 부트코드를 갱신하는 경우등에는 사용이 어려운 방법이다. 따라서, 부팅시 부트코드에 정의된 지원 부트로더 버전 정보와 실제 저장된 부트로더 버전 정보를 확인하여 오류 여부를 알려주기 위한 방법이 더 필요하게 된다.

              따라서, 본 발명에서는 부팅시 부트로더가 기동하여 부트코드를 SD램(20)에 복사하여 실행시키면, 상기 SD램(20)에서 동작하는 부트코드에서는 자신의 코드 상에 정의된 지원 부트로더 버전 정보를 획득하고, NAND 플래쉬(10)의 고정된 위치에 저장된 실제 부트로더 버전 정보(13)를 직접 억세스 방식등으로 획득하여 상호 비 교한다. 그리고, 버전이 일치하지 않는다면, 그 정보를 이동통신 단말기의 표시부표시하거나 알람등을 발생시켜 사용자에게 알려준다.

              도 3은 상기 설명한 본 발명의 구동 방법 중 부팅시 실시되는 이동통신 단말기의 동작을 설명하는 순서도로서, 부트코드를 새롭게 다운로드 한 경우에만 실시될 수도 있고, 모든 (콜드)부팅시 항상 실시될 수도 있다.

              먼저, 사용자가 이동통신 단말기에 전원을 인가하면(S10), 부트로더가 동작하여 부트코드를 램으로 로드하고(S20), 상기 램에 로드된 부트코드에 의해 기본적인 시스템 점검이나 부팅 절차를 실시하게 되는데, 그 전에 부트로더가 저장된 플래쉬 메모리의 일정 위치에 저장된 부트로더의 버전 정보를 획득하여 부트코드에 포함된 지원 부트로더 버전 정보와 비교한다.(S30~S40)

              이때, 부트로더 버전 정보가 일치한다면 부팅절차를 수행하도록 하고(S50), 부트로더 버전 정보가 일치하지 않는다면 부트로더 버전 오류 상태를 이동통신 단말기의 표시부에 문자로 알려주거나, 알람등을 발생시키는 등의 방법으로 사용자에게 알려주도록 한다.(S60)

              전술한 바와 같이, 본 발명은 버전 관리가 불가능한 부트로더의 버전과 부트로더의 버전에 영향을 받는 부트코드 사이의 버전충돌을 부팅 단계에서 확인시켜줄 수 있도록 하여 부트코드에 적합한 부트로더 버전의 사용을 보장할 수 있도록 한다.

              상기한 바와 같이 본 발명 이동통신 단말기의 부트로더 버전 관리 방법은 부 트코드 작성시 지원하는 부트로더의 버전 정보를 입력하도록 하고, 상기 부트코드 작성시 동시에 작성되는 부트로더는 컴파일시 상기 부트코드의 부트로더 버전 정보를 참조하도록 하며, 상기 부트코드와 부트로더를 컴파일한 바이너리 파일을 플래쉬 메모리에 다운로드하는 경우 상기 부트로더 저장 영역의 고정 위치에 해당 부트로더 버전 정보가 위치되도록 한 후, 부팅시마다 플래쉬 메모리의 일정 위치에서 부트로더 버전 정보를 획득하여 램으로 전달되는 부트코드에 포함된 부트로더 버전 정보와 비교하여 일치하지 않으면 사용자에게 부트로더 버전 오류를 알려줄 수 있도록 함으로써, 부트코드에 적합하지 않은 부트로더 버전의 사용에 따른 이동통신 단말기 오동작을 방지할 수 있고, 정확한 버전의 부트로더 사용을 보장할 수 있도록 하는 효과가 있다.

              Claims ( 2 )

              상기 부트코드 바이너리 파일을 이동통신 단말기 플래쉬 메모리의 일정 영역에 다운로드 하며, 부트로더 바이너리 파일이 있는 경우 이를 플래쉬 메모리의 일정 영역에 다운로드하는 단계와;

              이동통신 단말기를 부팅하는 경우 상기 부트로더가 기동하여 상기 부트코드를 램으로 옮겨 실행하면서 플래쉬 메모리에 저장된 부트로더 바이너리 파일의 일정 위치에 포함된 부트로더 버전정보를 획득하여 램으로 옮겨진 부트코드에 포함된 부트로더 버전정보와 비교하여 상이한 경우 사용자에게 버전 오류를 알리는 단계를 포함하되,

              상기 부트로더 바이너리 파일을 생성하는 단계는 상기 부트로더 바이너리 파일이 플래쉬 메모리에 저장되는 경우, 포함되는 부트로더 버전정보가 항상 메모리의 고정된 위치에 존재할 수 있도록 컴파일을 실시하는 단계를 포함하는 것을 특징으로 하는 이동통신 단말기의 부트로더 버전 관리 방법.

              [lazenca] Protection Tech / RELRO & PIC & PIE

              모든 동적라이브러리 함수는 PLT(Procedure Linkage Table) stub코드를 통해 호출.

              PLT의 stub 코드는 상대 주소를 이용하여, 사용할 GOT(Global Offset Table)의 주소 값을 검색.

              PLT는 GOT의 위치를 알고 있으며, 해당 GOT에 저장된 대상 함수의 주소를 읽고 이동.

              Lazy Binding은 함수 호출이 처음 요청될 때 stub 코드를 이용해 GOT영역에 해당 함수의 심볼 주소를 생성.

              Stub 코드는 런타임 링커가 제공하는 바인딩 함수에 필요한 정보를 설정하는 역할을 하며, 설정이 완료되면 스텁 코드는 바인딩 함수로 이동.

              바인딩 함수는 "_dl_runtime_resolve" 함수에 대한 인수를 설정 후에 해당 함수를 호출, "_dl_runtime_resolve" 함수에서 반환 된 주소로 이동.

              이후부터는 유저가 함수를 호출 할 때 PLT stub code는 호출한 함수로 바로 이동.

              - PIC (Position Independent Code)

              = 주기억 장치의 어딘가에 배치되어 절대 주소와 관계없이 모든 메모리 주소에서 수정없이 실행되는 기계 코드 (해당 기술은 보호 기술은 아님)

              PIC는 일반적으로 공유 라이브러리에서 사용되며, 동일한 라이브러리 코드는 각 프로그램의 메모리 영역에 로드됨.

              각 프로세서 들은 PIC를 서로 다른 주소에서 실행 할 수 있으며, 실행 시 재배치가 필요 없음.

              - Relocatable code

              = 재배치가 필요한 코드를 의미

              재배치 과정은 동적 링커에 의해 코드에 생성 된 label과 symbol의 주소를 수정하는 것을 의미.

              - Compare files(Non-PIC vs PIC vs NoStart) - Section Headers

              PIC가 적용된 바이너리: ".rela.plt" 섹션이 추가 되어 있음.

              PIC와 nostartfiles 옵션이 적용된 바이너리: ".rela.dyn", ".init", ".plt.got", ".fini", ".init_array", ".fini_array", ".jcr", ".got", ".data", ".bss" 섹션이 없음.

              - Compare files(Non-PIC vs PIC vs NoStart) - Dynamic section

              PIC가 적용되지 않은 파일: TEXTREL 섹션이 존재하며, PLTRELSZ, PLTREL, JMPREL 섹션은 존재하지 않음.

              PIC가 적용된 파일: PLTRELSZ, PLTREL, JMPREL 섹션이 존재하며, TEXTREL 섹션은 존재하지 않음.

              PIC와 nostartfiles 옵션이 적용된 파일: PLTRELSZ, PLTREL, JMPREL 섹션이 존재하며, INIT, FINI, INIT_ARRAY, INIT_ARRAYSZ, FINI_ARRAY, FINI_ARRAYSZ, RELA, RELASZ, RELAENT, RELACOUNT 섹션은 존재하지 않음.

              -각 바이너리는 다음과 같은 재배치 정보를 포함

              PIC가 적용되지 않은 라이브러리의 경우 재배치 필요.

              PIC가 적용된 라이브러리의 경우도 재배치 필요.

              -nostartfiles 옵션이 적용된 파일의 경우 재배치 불필요.

              - Static Library

              = 여러 오브젝트 파일을 하나의 아카이브 파일(.a)로 만든 것

              정적 라이브러리를 사용하는 실행 파일을 빌드 할 경우 정적 라이브러리의 코드를 복사하여 실행 파일 생성.

              정적 라이브러리를 이용해 여러 프로그램을 빌드 하게 되면 모든 파일에 똑같은 정적 라이브러리 함수의 코드가 포함됨.

              ˙gcc의 -c 옵션을 사용하여 오브젝트 코드 생성

              ˙ar 프로그램을 이용하여 라이브러리 파일(.a) 생성

              - Shared Library

              = 여러 오브젝트 파일을 하나의 오브젝트 파일로 만들어 이를 공유할 수 있도록 한 것

              실행시 공유 라이브러리를 참조하는 방식으로 링크. (실행 파일에 포함X)

              동적 링커 로더(ld.so)가 해당 실행 파일에서 필요한 공유 라이브러리를 찾아내어 실행시 해당 프로세스의 메모리 맵을 조작해서 공유 라이브러리와 실행 바이너리가 같은 프로세스 공간을 사용하도록 만듬.

              실제 라이브러리 코드는 공유 라이브러리에만 존재. (실행 파일에 포함X)

              실행 파일과 공유 라이브러리를 함께 배포해야 함. (함게 배포되지 않을 시 라이브러리를 찾을 수 없다는 에러 메시지 출력)

              ˙Build shared library

              $ gcc -fPIC -shared -o libPIC.so lazenca.c

              ˙Setting shared library

              ld.so.conf 파일을 설정

              "/etc/ld.so.conf.d" 디렉토리 안에 libmy.conf라는 파일을 생성 후 공유 라이브러리 파일(.so)의 전체 경로를 입력

              공유라이브러리를 다른 모든 실행파일 내에서 사용할 수 있도록 하기 위해 캐쉬 갱신

              - Check for shared library in the executable file

              ldd(List Dynamic Dependencies)는 프로그램에서 요구하는 공유 라이브러리를 출력해 주는 프로그램.

              ldd를 이용하여 dynamic_test 프로그램에서 libmy.so라는 공유 라이브러리를 참조하는 것을 확인 가능.

              - PIE(Position Independent Executable)

              = 위치 독립 코드로 이루어진 실행 가능한 바이너리

              ˙PIE 파일 빌드 방법

              $ 영역 바이너리 옵션 타입 gcc -fPIE -pie -o PIE PIE.c

              ˙PIE 적용 여부 비교

              PIE가 적용되지 않은 파일은 프로그램을 실행할 때마다 전역 변수와 사용자 정의 함수의 주소가 변경되지 않음.

              PIE가 적용된 파일은 프로그램을 실행할 때마다 전역 변수와 사용자 정의 함수의 주소가 매번 달라짐.

              PIE가 적용되지 않은 바이너리의 경우 코드 영역의 값이 고정된 주소값.

              PIE가 적용된 바이너리의 경우 코드 영역의 값이 offset 값(offset 값을 이용해 할당된 메모리 영역에 동적으로 위치 가능).


0 개 댓글

답장을 남겨주세요