SlideShare uma empresa Scribd logo
1 de 34
dependency hell과
빌드지옥 탈출
kth 신입사원 교육 2일차
시작하기 앞서
• 내 PC에선 안되던데요? (==내 브라우저에
선 되던데요?)
• debug로 돌리면 되던데…
• 10번 실행하면 2~3번 안되네요…
dll 지옥
증상
- 프로그램 실행이 안됨
- 실행은 되는데 자꾸 죽음
- 어쩌다 가끔 정상 작동하기도 함
dll 지옥
질문
- dll 이 뭔가요?
dll 지옥
질문
- dll 이 뭔가요?
- dll = dynamic linking library = 동적 링크
라이브러리
- 느낌상 런타임(=동적)에 연결(=링크)하는
라이브러리인가보다
compile
class foo {
private int _bar;
private int *_pBar;
private static int _s_bar1=7;
private static int[100000000] _s_bar2;
public int foobar(value bar) {
int local_bar=0;
_pBar = malloc(10000000*sizeof(int));
…
}
public static staticFoobar() {
…
}
}
compile
모든 프로그램은
- 자료
- 흐름(의 표현)
컴파일러의 입장에서..
- 이 프로그램을 메모리에 올려야 하겠는데
-> 메모리에 빈 공간이 얼마나 필요할까?
- 어떤 자료는 컴파일 타임에 크기를 앎
- 어떤 자료는 컴파일 타임에 모름
- 흐름은??
compile
class foo {
private int _bar;
private int *_pBar;
private static int _s_bar1=7;
private static int[100000000] _s_bar2;
public int foobar(value bar) {
int local_bar=0;
_pBar = malloc(10000000*sizeof(int));
…
}
public static staticFoobar() {
…
}
}
sizeof(int) 는 4bytes 라 가정
compile time 에 결정!!
_s_bar1 는 4bytes
_s_bar2 는 4*100000000bytes
compile time 에 사용할지 안할지 모름!!
프로그램 어딘가에서 x = new foo(); 수행할 때 memory에 할당
compile
0000 0000 0000 0000 0000 0000 0000 0000
…
0000 0000 0000 0000 0000 0000 0000 0111
…
…
_s_bar1 4bytes
0000 00f0
…
0000 00ff
…
…
주소 메모리 공간(에 이렇게 쓰겠다는 약속)
compile
0000 0000 0000 0000 0000 0000 0000 0000
…
0000 0000 0000 0000 0000 0000 0000 0111
…
…
???? ???? ???? ???? ???? ???? ???? ???? ????
???? ???? ???? ???? ???? ???? ???? ???? ????
???? ???? ???? ???? ???? ???? ???? ???? ????
…
…
???? ???? ???? ???? ???? ???? ???? ???? ????
_s_bar1 4bytes
주소 메모리 공간(에 이렇게 쓰겠다는 약속)
_s_bar2 약 100Mbytes
어떤 값이 올지도 모르는
데 미리 100Mbytes 나 잡
아두는 것이 효율적일까?
0000 00f0
…
0000 00ff
…
…
compile
0000 0000 0000 0000 0000 0000 0000 0000
…
0000 0000 0000 0000 0000 0000 0000 0111 _s_bar1 4bytes
주소 메모리 공간(에 이렇게 쓰겠다는 약속)
_s_bar2
실제로는 약 100Mbytes
의 공간을 _s_bar2가 사용
하겠다 라는 기록만 저장
해 둡니다.
???? ???? ???? ???? ???? ???? ???? ???? ????
0000 00f0
…
0000 00ff
…
…
compile
0000 0000 0000 0000 0000 0000 0000 0000
…
0000 0000 0000 0000 0000 0000 0000 0111 _s_bar1 4bytes
주소 메모리 공간(에 이렇게 쓰겠다는 약속)
_s_bar2
???? ???? ???? ???? ???? ???? ???? ???? ????
0000 00f0
…
0000 00ff
…
…
foo@foobar(value) …
…
foo@staticFoobar() …
…
class 의 생성, 또는
method call 시 무엇을 어
떻게 해야 한다는 정보가
수록된 영역
compile
data section
주소 메모리 공간(에 이렇게 쓰겠다는 약속)
bss section
0000 00f0
…
0000 00ff
…
…
code section
compile 결과물
(= foo.o file )의 내용
link
링커의 입장에서..
- 이 프로그램을 메모리의 어느 위치에 올려
놔야 실행 중에 참조 가능할까?
link
foo.o foo2.o
+ … +
a+ =
executable image
(=
foo.exe 또는
foo.lib 또는
foo.dll)(xx.lib 또는 xx.dll)
link
foo.o
foo2.o
• 나중에(프로그램 실행 시점에) offset 값만 결
정되면 프로그램의 모든 영역에 접근 가능
foo.exe 또는 foo.lib 또는 foo.dll
offset (어떤 값이 될지는 모름)
offset + 1
offset + 2
offset + 3
…
static link
이 프로그램을 빌드하면 foo.exe 또는 foo.lib
의 사이즈는 약 400Mb 정도 될거임
foo.lib
object file 에서는 공간을
차지하지 않던 bss(초기화
되지 않은 전역변수) 영역
프로그램 생성 시점에는
해당 영역을 실제로 할당
해 두어야 함
static link
foo.lib
foo2.o
+ =
foo2.exe
foo.lib
foo3.o
+ =
foo3.exe
• foo.lib 의 메모리 공간 낭비를 줄일 방법이
없을까?
program size
약 400mb
program size
약 400mb
dynamic link
• foo.dll은 필요할 때에만 load 됨
• 효율적이다. 하지만…
• 드디어 dll 지옥의 시작
foo2.o
+ =
foo2.exe
foo.dll
foo3.o
+ =
foo3.exe
foo.dll
foo.dll
runtime
class foo {
private int _bar;
private int *_pBar;
private static int _s_bar1=7;
private static int[100000000] _s_bar2;
public int foobar(value bar) {
int local_bar=0;
_pBar = malloc(10000000*sizeof(int));
…
}
public static staticFoobar() {
…
}
}
sizeof(int) 는 4bytes 라 가정
_pBar 는 동적 할당 변수,
약 400mb 크기의 memory를 할당할 수 있을
지 없을지는 시도해봐야 알 수 있다.
local_bar 는 지역변수, foobar()안에서 잠깐 쓰고 반환
runtime
bss
data
code
foo.exe process 실행중
stack
heap
stack
heap
new foo() , 또는 malloc(xxx) 수행 시 동적 할당
foo->foobar() method call 수행 시 동적 생성
foobar() call stack 안에 local_bar 영역 생성
foobar() 호출 종료 시,(=return) local_bar 영역 반환
stack
dynamic linked
library
heap
data
code
static linked
library
Run time Area
Design time Area
stack
dynamic linked
library
heap
data
code
static linked
library
Run time Area
Design time Area
DLL
dll 지옥
class foo {
private int _bar;
private int *_pBar;
private static int _s_bar1=7;
private static int[777777777] _s_bar2;
public int foobar(value bar) {
int local_bar=0;
_pBar = malloc(777777777*sizeof(int));
…
}
public static staticFoobar() {
…
}
}
_s_bar2 사이즈 변경
_pBar 사이즈 변경
• 변경된 foo.dll 을 v2.0 / 기존 foo.dll 을 v1.0 이라 하자
dll 지옥
• foo.dll은 system memory에 한 번만 load 되어 공유
• 현재 memory에 load 된 foo.dll 은 v1.0
• foo.dll v2.0 을 사용하는 foo3.exe는 어떤 동작을 할지 알 수
없다!!!
foo2.exe
foo.dll (v1.0)
foo3.exe
foo.dll (v2.0)
system memory
foo.dll (v1.0)
dll 지옥
• system directory 한군데에 모든 dll이 떡져있다
case1 : 윈도우 업데이트로 인한 system library 변경
case2 : 응용 프로그래머가 임의로 system library 변경
과거 MS Windows shared library 저장소
winsock.dll
c:windowssystem
msvcrt.dll
windows.dll
….
dll 지옥
• main 영역 / 임시 영역으로 이원화
• library 관리 책임이 사용자에게 있음
-> 사용자가 멋대로 library 업데이트 한다면?
-> 윈도우와 상황이 다르지 않다.
linux shared library 저장소
libc.so
/usr/lib
libpthread.so
glib.so
….
libc.so
/usr/local/lib
libpthread.so
glib.so
….
jar 지옥
• 내가 작성한 program 이 어느 jar 를 참조할지 모른다!!
• dll 지옥과 동일한 문제 발생 !!
java class path
/path/A
foo.jar (old)
/path/B
foo.jar (new)
dependency 지옥의 원인?
• PEBKAC(http://en.wikipedia.org/wiki/User_error)
• 프로그램은 거짓말을 하지 않아요
• 모든 문제의 원인은 닝겐입니다
해결
• library metadata
– 빌드 날짜 / 크기 / 유니크 키 등을 빌드 시점에 적어둠
• 버전 관리되는 build/package manager
– 모든 종속성 library 의 버전을 관리하는 도구 사용
• virtual environment
– 가상환경에 library를 넣어두면 설령 떡지더라도 가상환경
만 재구성하면 된다
해결
• 버전 관리되는 build/package manager
– maven
– biicode
– pip / setuptools
– npm
– yum / apt-get
해결
• virtual environment
– virtualenv
– docker
Q & A
• 질문 ?

Mais conteúdo relacionado

Mais procurados

파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
SeongHyun Ahn
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
효준 강
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
OnGameServer
 
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
Esun Kim
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
Esun Kim
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
흥배 최
 

Mais procurados (20)

파이썬 스터디 9장
파이썬 스터디 9장파이썬 스터디 9장
파이썬 스터디 9장
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017Python vs Java @ PyCon Korea 2017
Python vs Java @ PyCon Korea 2017
 
Boost
BoostBoost
Boost
 
모두의 JIT 컴파일러
모두의 JIT 컴파일러모두의 JIT 컴파일러
모두의 JIT 컴파일러
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
 
WTL 소개
WTL 소개WTL 소개
WTL 소개
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
 
Let's Go (golang)
Let's Go (golang)Let's Go (golang)
Let's Go (golang)
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
알고리즘 시각화 라이브러리 ipytracer 개발기
알고리즘 시각화 라이브러리 ipytracer 개발기알고리즘 시각화 라이브러리 ipytracer 개발기
알고리즘 시각화 라이브러리 ipytracer 개발기
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...Nexon Developers Conference 2017 Functional Programming for better code - Mod...
Nexon Developers Conference 2017 Functional Programming for better code - Mod...
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scopeJavascript 함수(function) 개념, 호출패턴, this, prototype, scope
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
 

Destaque

Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
Byeongsu Kang
 
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
OpenStack Korea Community
 

Destaque (10)

Stash 사용자 교육
Stash 사용자 교육Stash 사용자 교육
Stash 사용자 교육
 
신규 협업도구 사용자 교육(공통 비개발자)
신규 협업도구 사용자 교육(공통 비개발자)신규 협업도구 사용자 교육(공통 비개발자)
신규 협업도구 사용자 교육(공통 비개발자)
 
멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면
 
생각이라는 벽돌로 만드는 집
생각이라는 벽돌로 만드는 집생각이라는 벽돌로 만드는 집
생각이라는 벽돌로 만드는 집
 
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
Exception log practical_coding_guide, 예외와 로그 코딩 실용 가이드
 
예외처리가이드
예외처리가이드예외처리가이드
예외처리가이드
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
 
Concurrent programming 2
Concurrent programming 2Concurrent programming 2
Concurrent programming 2
 
코딩소림사 Rx java
코딩소림사 Rx java코딩소림사 Rx java
코딩소림사 Rx java
 
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
[OpenStack Days Korea 2016] Track1 - 카카오는 오픈스택 기반으로 어떻게 5000VM을 운영하고 있을까?
 

Semelhante a Dependency hell과 빌드지옥 탈출

[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
진현 조
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340
Samsung Electronics
 

Semelhante a Dependency hell과 빌드지옥 탈출 (20)

NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
 
[OpenTRS-001] Vitor
[OpenTRS-001] Vitor[OpenTRS-001] Vitor
[OpenTRS-001] Vitor
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340
 
Node.js at OKJSP
Node.js at OKJSPNode.js at OKJSP
Node.js at OKJSP
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
[2010 CodeEngn Conference 04] hahah - Defcon 18 CTF 문제풀이
 
Javascript
JavascriptJavascript
Javascript
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
 
Before OTD EDU Assignments
Before OTD EDU AssignmentsBefore OTD EDU Assignments
Before OTD EDU Assignments
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespace도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespace
 
[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California[OpenTRS-001] Hotel California
[OpenTRS-001] Hotel California
 
android stuff1
android stuff1android stuff1
android stuff1
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
 
cross compile
cross compilecross compile
cross compile
 
리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"
리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"
리얼리눅스 제 1 회 세미나: "리눅스, 제대로 알고 코딩하자!"
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 

Mais de Byeongsu Kang (7)

Kotlin study #1
Kotlin study #1Kotlin study #1
Kotlin study #1
 
Kotlin study #0
Kotlin study #0Kotlin study #0
Kotlin study #0
 
Aws summit 2017 사내전파교육
Aws summit 2017 사내전파교육Aws summit 2017 사내전파교육
Aws summit 2017 사내전파교육
 
알고리즘2
알고리즘2알고리즘2
알고리즘2
 
알고리즘 문제해결전략 #1
알고리즘 문제해결전략 #1알고리즘 문제해결전략 #1
알고리즘 문제해결전략 #1
 
Rx java essentials
Rx java essentialsRx java essentials
Rx java essentials
 
개발자 환경 설정
개발자 환경 설정개발자 환경 설정
개발자 환경 설정
 

Dependency hell과 빌드지옥 탈출

  • 1. dependency hell과 빌드지옥 탈출 kth 신입사원 교육 2일차
  • 2. 시작하기 앞서 • 내 PC에선 안되던데요? (==내 브라우저에 선 되던데요?) • debug로 돌리면 되던데… • 10번 실행하면 2~3번 안되네요…
  • 3. dll 지옥 증상 - 프로그램 실행이 안됨 - 실행은 되는데 자꾸 죽음 - 어쩌다 가끔 정상 작동하기도 함
  • 4. dll 지옥 질문 - dll 이 뭔가요?
  • 5. dll 지옥 질문 - dll 이 뭔가요? - dll = dynamic linking library = 동적 링크 라이브러리 - 느낌상 런타임(=동적)에 연결(=링크)하는 라이브러리인가보다
  • 6. compile class foo { private int _bar; private int *_pBar; private static int _s_bar1=7; private static int[100000000] _s_bar2; public int foobar(value bar) { int local_bar=0; _pBar = malloc(10000000*sizeof(int)); … } public static staticFoobar() { … } }
  • 7. compile 모든 프로그램은 - 자료 - 흐름(의 표현) 컴파일러의 입장에서.. - 이 프로그램을 메모리에 올려야 하겠는데 -> 메모리에 빈 공간이 얼마나 필요할까? - 어떤 자료는 컴파일 타임에 크기를 앎 - 어떤 자료는 컴파일 타임에 모름 - 흐름은??
  • 8. compile class foo { private int _bar; private int *_pBar; private static int _s_bar1=7; private static int[100000000] _s_bar2; public int foobar(value bar) { int local_bar=0; _pBar = malloc(10000000*sizeof(int)); … } public static staticFoobar() { … } } sizeof(int) 는 4bytes 라 가정 compile time 에 결정!! _s_bar1 는 4bytes _s_bar2 는 4*100000000bytes compile time 에 사용할지 안할지 모름!! 프로그램 어딘가에서 x = new foo(); 수행할 때 memory에 할당
  • 9. compile 0000 0000 0000 0000 0000 0000 0000 0000 … 0000 0000 0000 0000 0000 0000 0000 0111 … … _s_bar1 4bytes 0000 00f0 … 0000 00ff … … 주소 메모리 공간(에 이렇게 쓰겠다는 약속)
  • 10. compile 0000 0000 0000 0000 0000 0000 0000 0000 … 0000 0000 0000 0000 0000 0000 0000 0111 … … ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? ???? … … ???? ???? ???? ???? ???? ???? ???? ???? ???? _s_bar1 4bytes 주소 메모리 공간(에 이렇게 쓰겠다는 약속) _s_bar2 약 100Mbytes 어떤 값이 올지도 모르는 데 미리 100Mbytes 나 잡 아두는 것이 효율적일까? 0000 00f0 … 0000 00ff … …
  • 11. compile 0000 0000 0000 0000 0000 0000 0000 0000 … 0000 0000 0000 0000 0000 0000 0000 0111 _s_bar1 4bytes 주소 메모리 공간(에 이렇게 쓰겠다는 약속) _s_bar2 실제로는 약 100Mbytes 의 공간을 _s_bar2가 사용 하겠다 라는 기록만 저장 해 둡니다. ???? ???? ???? ???? ???? ???? ???? ???? ???? 0000 00f0 … 0000 00ff … …
  • 12. compile 0000 0000 0000 0000 0000 0000 0000 0000 … 0000 0000 0000 0000 0000 0000 0000 0111 _s_bar1 4bytes 주소 메모리 공간(에 이렇게 쓰겠다는 약속) _s_bar2 ???? ???? ???? ???? ???? ???? ???? ???? ???? 0000 00f0 … 0000 00ff … … foo@foobar(value) … … foo@staticFoobar() … … class 의 생성, 또는 method call 시 무엇을 어 떻게 해야 한다는 정보가 수록된 영역
  • 13. compile data section 주소 메모리 공간(에 이렇게 쓰겠다는 약속) bss section 0000 00f0 … 0000 00ff … … code section compile 결과물 (= foo.o file )의 내용
  • 14. link 링커의 입장에서.. - 이 프로그램을 메모리의 어느 위치에 올려 놔야 실행 중에 참조 가능할까?
  • 15. link foo.o foo2.o + … + a+ = executable image (= foo.exe 또는 foo.lib 또는 foo.dll)(xx.lib 또는 xx.dll)
  • 16. link foo.o foo2.o • 나중에(프로그램 실행 시점에) offset 값만 결 정되면 프로그램의 모든 영역에 접근 가능 foo.exe 또는 foo.lib 또는 foo.dll offset (어떤 값이 될지는 모름) offset + 1 offset + 2 offset + 3 …
  • 17. static link 이 프로그램을 빌드하면 foo.exe 또는 foo.lib 의 사이즈는 약 400Mb 정도 될거임 foo.lib object file 에서는 공간을 차지하지 않던 bss(초기화 되지 않은 전역변수) 영역 프로그램 생성 시점에는 해당 영역을 실제로 할당 해 두어야 함
  • 18. static link foo.lib foo2.o + = foo2.exe foo.lib foo3.o + = foo3.exe • foo.lib 의 메모리 공간 낭비를 줄일 방법이 없을까? program size 약 400mb program size 약 400mb
  • 19. dynamic link • foo.dll은 필요할 때에만 load 됨 • 효율적이다. 하지만… • 드디어 dll 지옥의 시작 foo2.o + = foo2.exe foo.dll foo3.o + = foo3.exe foo.dll foo.dll
  • 20. runtime class foo { private int _bar; private int *_pBar; private static int _s_bar1=7; private static int[100000000] _s_bar2; public int foobar(value bar) { int local_bar=0; _pBar = malloc(10000000*sizeof(int)); … } public static staticFoobar() { … } } sizeof(int) 는 4bytes 라 가정 _pBar 는 동적 할당 변수, 약 400mb 크기의 memory를 할당할 수 있을 지 없을지는 시도해봐야 알 수 있다. local_bar 는 지역변수, foobar()안에서 잠깐 쓰고 반환
  • 21. runtime bss data code foo.exe process 실행중 stack heap stack heap new foo() , 또는 malloc(xxx) 수행 시 동적 할당 foo->foobar() method call 수행 시 동적 생성 foobar() call stack 안에 local_bar 영역 생성 foobar() 호출 종료 시,(=return) local_bar 영역 반환
  • 22.
  • 25. dll 지옥 class foo { private int _bar; private int *_pBar; private static int _s_bar1=7; private static int[777777777] _s_bar2; public int foobar(value bar) { int local_bar=0; _pBar = malloc(777777777*sizeof(int)); … } public static staticFoobar() { … } } _s_bar2 사이즈 변경 _pBar 사이즈 변경 • 변경된 foo.dll 을 v2.0 / 기존 foo.dll 을 v1.0 이라 하자
  • 26. dll 지옥 • foo.dll은 system memory에 한 번만 load 되어 공유 • 현재 memory에 load 된 foo.dll 은 v1.0 • foo.dll v2.0 을 사용하는 foo3.exe는 어떤 동작을 할지 알 수 없다!!! foo2.exe foo.dll (v1.0) foo3.exe foo.dll (v2.0) system memory foo.dll (v1.0)
  • 27. dll 지옥 • system directory 한군데에 모든 dll이 떡져있다 case1 : 윈도우 업데이트로 인한 system library 변경 case2 : 응용 프로그래머가 임의로 system library 변경 과거 MS Windows shared library 저장소 winsock.dll c:windowssystem msvcrt.dll windows.dll ….
  • 28. dll 지옥 • main 영역 / 임시 영역으로 이원화 • library 관리 책임이 사용자에게 있음 -> 사용자가 멋대로 library 업데이트 한다면? -> 윈도우와 상황이 다르지 않다. linux shared library 저장소 libc.so /usr/lib libpthread.so glib.so …. libc.so /usr/local/lib libpthread.so glib.so ….
  • 29. jar 지옥 • 내가 작성한 program 이 어느 jar 를 참조할지 모른다!! • dll 지옥과 동일한 문제 발생 !! java class path /path/A foo.jar (old) /path/B foo.jar (new)
  • 30. dependency 지옥의 원인? • PEBKAC(http://en.wikipedia.org/wiki/User_error) • 프로그램은 거짓말을 하지 않아요 • 모든 문제의 원인은 닝겐입니다
  • 31. 해결 • library metadata – 빌드 날짜 / 크기 / 유니크 키 등을 빌드 시점에 적어둠 • 버전 관리되는 build/package manager – 모든 종속성 library 의 버전을 관리하는 도구 사용 • virtual environment – 가상환경에 library를 넣어두면 설령 떡지더라도 가상환경 만 재구성하면 된다
  • 32. 해결 • 버전 관리되는 build/package manager – maven – biicode – pip / setuptools – npm – yum / apt-get
  • 33. 해결 • virtual environment – virtualenv – docker
  • 34. Q & A • 질문 ?