지난 포스팅에서는 이론적인 측면에서 어떻게 memory safety를 다루는지를 보았다. 여기서는 Java와 Rust를 통해 고급 언어들에서 실질적으로 어떻게 memory safety를 보장하는지 알아보자.

 

[1] Java의 경우 : bound check + garbage collection

bound check는 명확하다. array 등의 원소에 접근할 때 bound 내의 접근인지를 검사하는 것이다. 이전 포스팅에서 본 Softbound와 근본적으로는 유사한 방법을 사용한다. 

 

핵심은 Gabage collection(GC)이다. GC는 메모리 할당/해제의 추상 레벨을 하나 더 둠으로써 memory safety를 보장한다. 즉, 프로그래머가 직접 메모리를 할당/해제하는 것이 아니라, 요청을 하면 런타임에 GC가 알아서 이를 해제해준다. 물론 퍼포먼스 오버헤드가 발생하게 된다. 하지만 해제된 메모리들을 GC가 알아서 수집하기 때문에, 보안 관점에서 보면 이보다 깔끔한 해결책이 없다. dangling pointer나 use-after-free같은 디버깅하기 어려운 메모리 취약점들에 신경 쓸 필요가 없어지기 때문이다. 

 

Java의 이런 해결책은 memory safety를 보장하는 많은 고급 프로그래밍 언어에서 사용하는 전통적인 방식이라고 할 수 있다.

 

[2] Rust의 경우

Rust의 경우 GC를 사용하지 않는다. 모든 체크는 컴파일 타임에 이루어지며, 따라서 런타임 오버헤드가 0에 수렴한다! 이러한 장점 덕분에 Rust는 최근 가장 급격히 떠오르는 프로그래밍 언어가 되었다.

 

1)Ownership

어떤 변수에 오브젝트를 bind하게 되면, 그 변수는 해당 오브젝트에 대해 소유권(ownership)을 갖게 된다. 또한 하나의 오브젝트에 대해서는, 오직 단 하나의 변수만 소유권을 가질 수 있다. 즉, 2개의 변수가 동시에 하나의 오브젝트를 소유할 수 없다. 다음의 예제 코드를 보자.

let x = vec![1,2,3];
let x2 = x;
println!("x[0] : {}", x[0]);	//complie error!

첫 번째 줄에서, x가 벡터 [1,2,3]에 대한 소유권을 갖게 된다. 하지만 두 번째 줄에서, x2가 해당 벡터에 대한 소유권을 물려받게 되고, 동시에 2개의 변수가 동일한 오브젝트를 소유할 수 없으므로, x의 소유권은 소멸된다. 따라서 세 번째 줄에서 소멸된 오브젝트에 대해 접근을 시도하였으므로 컴파일 에러가 발생한다. 

 

Rust는 소유권 개념을 통해 여러 개의 포인터가 하나의 오브젝트를 가리킴으로써 발생하는 data race를 원천적으로 차단할 수 있다.

 

2) Copy trait

let x = 10;
let x2 = x;
x2 = 15;
println!("x : {}, x2 : {}", x, x2);	//10, 15

i32(==int32)와 같이 스택에 저장되는 타입에 소유권 개념을 도입한다면 코딩이 극도로 힘들어지고 효율적이지도 않을 것이다. 따라서 이러한 타입들은 소유권을 넘겨주는 것이 아니라 값을 복제하여 넘겨준다. 따라서 위 코드의 두 번째 줄에서, x2는 x의 소유권을 물려받는 것이 아니라, 새로운 i32를 만들어서 x의 값을 복제하게 된다. 또한 자신이 정의한 오브젝트(구조체와 같은)에 대해서도 copy trait rule을 명시한다면 위와 같이 활용 가능하다.

 

3) Borrow

fn foo(v : Vec<i32>){
	...
}

fn bar(v : &Vec<i32>){
	...
}

let x = vec![1,2,3];
let y = vec![1,2,3];

foo(x);
bar(y);

println!("x[0] : {}", x[0]);	//compile error!
println!("y[0] : {}", y[0]);	//no problem

함수의 인자로 오브젝트를 가리키는 변수를 넘겨줄 때는 어떻게 될까? 1)의 소유권 개념을 적용시켜 보면, 함수 인자로 소유권이 이전되고, 이전 변수의 소유권을 소멸될 것이라고 생각할 수 있다. 따라서 위 프로그램에서 foo(x)로 호출하게 되면 x의 소유권은 소멸되고, 함수의 매개변수 v에서 이를 물려받아 사용한다. 따라서 이후에 x에 접근하는 println 구문에서 컴파일 에러가 발생한다.

 

이와 같은 매개변수로의 소유권 이전은 call-by-reference를 불가능하게 한다. 따라서 이를 허용하기 위해 소유권의 borrow 개념이 등장한다. 위의 bar함수와 같이, 매개변수를 레퍼런스로 선언하게 되면 소유권을 일시적으로 '빌려'오게 된다. 이 소유권은 bar의 scope내에서 유효하며, bar가 리턴되는 순간 원래 소유자인 y에게 되돌아가게 된다. 따라서 위 코드에서 println을 통해 y에 접근하는 것이 가능하다.

 

4) mutability ^ alisasing

3)의 borrow의 개념에서 가장 중요한 한 가지 설명이 남아있다.

1. 변경 가능한(mutable) 레퍼런스를 생성할 수 있지만, 오직 단 한 개의 레퍼런스만이 동시에 존재할 수 있다.
2. 여러 개의 레퍼런스를 가질 수도 있지만(aliasing), 이 레퍼런스들은 변경 불가능(immutable)하다.
3. 1,2를 둘 다 만족하는 레퍼런스를 만들 수는 없다.(XOR)

이해하기 어렵다면, read-write lock을 생각해보자. data race를 막기 위해서는 어떤 한 data에 대해서, (1)단 한 개의 write 가능한 접근. (2) 여러 개의 read만 가능한 접근. 단, (1)과 (2)가 동시에 성립될 수는 없다. Rust의 borrow 개념도 이와 마찬가지로 이해하면 된다.

 

 

참고

https://pcwalton.github.io/2013/05/20/safe-manual-memory-management.html

 

https://pcwalton.github.io/2013/05/20/safe-manual-memory-management.html

If there’s one feature of Rust that is probably the most unique among languages in industry, it’s safe manual memory management. It’s easiest to explain safe manual memory management by explaining how it differs from the memory models of other languages. T

pcwalton.github.io

https://stackoverflow.com/questions/36136201/how-does-rust-guarantee-memory-safety-and-prevent-segfaults

 

How does Rust guarantee memory safety and prevent segfaults?

I was looking for a language to learn, and I saw that Rust is getting quite popular. Two things impressed me about Rust, memory safety and preventing segfaults. How does Rust achieve this? What

stackoverflow.com

https://theburningmonk.com/2015/05/rust-memory-safety-without-gc/

 

Rust – memory safety without garbage collector | theburningmonk.com

I’ve spent time with Rust at various points in the past, and being a language in development it was no surprise that every time I looked there were breaking changes and even the documentations look very different at every turn! Fast forward to May 2015 and

theburningmonk.com

 

'Computer Science > Security' 카테고리의 다른 글

Confidential Computing이란  (0) 2020.03.24
double-free 취약점  (0) 2020.02.04
Memory Safety - 2  (0) 2019.11.12
Memory Safety - 1  (0) 2019.10.30

아이네 클라이네 나흐트 뮤지크

이사카 고타로

327쪽

19.11.10 ~ 15 (6일)

 

대략 2년 반쯤 전에 읽었던 소설이다. 다시 읽은 이유는 우선 꽤 오랜기간동안 러시아 초장편을 읽어서 좀 가벼운 소설을 읽고 싶었고, 다시 읽을만한 재미가 있는 소설이기 때문이다.

 

이 책은 6개의 단편으로 이루어진 소설집이다. 마지막 단편을 제외한 모든 단편들은 독립적인 이야기이지만, 각자 약하게 연결고리를 지니고 있다. 그러한 요소들이 마지막 단편에서 총집약되고 마무리 되는 구조이다. 

 

이 작가는 원래 미스터리/추리물을 주로 쓰던 작가라고 한다. 하지만 이 소설은 어두운 요소가 전혀 없는 밝은 로맨스 소설이지만(로맨스라기보다는 인간 관계에 관한 소설이라고 보는게 조금 더 정확하긴 하다) 거기에 반전 요소나 복선들을 적극적으로 활용하고 있다. 한 편의 호흡도 짧은 편이기 때문에 굉장히 읽기 편하다. 이야기들도 몰입감이 강력하여 순식간에 읽어내기 좋다. 

 

여러모로 독서 슬럼프에 빠져있거나, 독서를 막 시작하는 단계에서 추천할만한 책

'' 카테고리의 다른 글

아르테미스 - 앤디 위어  (0) 2019.12.28
숨 - 테드 창  (0) 2019.12.07
닥터 지바고 - 보리스 파스테르나크  (0) 2019.11.16
(처음읽는)러시아역사 - 에이브러햄 애셔  (0) 2019.11.15
전쟁과 평화 - 레프 톨스토이  (0) 2019.11.15

<6일차 : 3월 31일 토>

게스트하우스 야하타 -> 교토고쇼 -> 교토 부립 식물원 -> Briant -> 카모강변 -> 금각사 -> 닌나지 -> 아라시야마 -> 하나노 유 -> 복귀

 

오늘은 하루 종일 자전거로 돌아다니는 날이다. 지하철 가라스마선을 따라서 쭉 북쪽으로 간 뒤에, 시계 반대 방향으로 90도 정도 쭉 돌면서 숙소로 귀환하는 코스이다. 자전거는 게스트하우스에서 비교적 저렴하게(500엔) 대여할 수 있었다.

 

교토고쇼 공원

첫 목적지는 교토고쇼이다. 공원 부지가 상당히 넓기 때문에 자전거로 느긋하게 돌아보고 싶었는데 공원 안이 자갈밭이다... 어쩔 수 없이 서쪽 입구에 자전거를 주차해놓고 걸어서 돌아다녔다. 도보로 다 돌아보는 건 무리라서 적당히만 둘러볼 수밖에 없었다. 사람이 별로 없이 한적해서 산책하기는 딱 좋다. 

 

교토고쇼

교토고쇼는 원래 1년 중 제한된 기간에만 방문 예약을 받아서 관광하기 상당히 어려운 곳이었다. 하지만 얼마 전부터 전면 개방해서 이제는 쉽게 가볼 수 있다(무료). 이전에 왕궁으로 쓰이던 유서 깊은 건물이라고 한다. 내부의 정원도 잘 꾸며져 있어서 둘러보기 좋다.

 

교토고쇼는 교토의 다른 주요 관광지만큼 오랜 시간 동안 볼거리는 없지만, 그래도 시간이 된다면 한번쯤 둘러볼 가치는 있는 것 같다. 무엇보다 사람 미어터지는 다른 교토 관광지들에 비해 비교적 한적한 편이라는 점이 좋다.

 

카모강

점심을 먹기 위해 기타야마역 쪽으로 이동했다. 가는 길에 카모강이 있길래 이왕이면 강변을 보면서 자전거 타려고 잠깐 내려갔다. 별생각 없이 즉흥적으로 내려간 건데, 강이 크지는 않지만 벚꽃이랑 어우러져서 좋았다. 날씨도 완벽해서 산책하기 최적일 듯

 

Briant

점심은 빵집 겸 식당인 기타야마역 인근의 Briant에서 먹기로 했다. 런치에 가성비 좋은 코스 요리가 있는데 12시 전임에도 불구하고 상당히 사람이 많았다. 꽤 오래 걸릴 것 같아서 우선 이름을 적어두고, 주변 갈만한 곳을 찾아봤다.

 

교토 부립 식물원

다행히 바로 인근에 교토 부립 식물원이 있어서 시간 때우러 들어갔다. 가격도 200엔밖에 안 해서 부담 없다. 큰 기대는 안 하고 들어갔는데, 생각보다 넓고 잘 꾸며져 있어서 놀랐다. 특히 벚꽃들이 잘 조성되어있고, 내부 정원들이랑 산책로도 훌륭하게 잘되어 있다. 이것저것 다양한 식물들이 있는 거 같긴 하던데, 딱히 잘 아는 것도 아니고 시간도 많진 않아서 제대로 둘러보진 않았다. 여기는 교토고쇼보다는 사람이 많긴 했는데, 그래도 북적이는 편은 아니고 교토의 다른 관광지에 비하면 훨씬 사람이 적어서 쾌적하다. Briant에 예약 걸어놓은 것 때문에 그리 오래 보지는 못하고 대략 40분 정도 있었다.

 

Briant

다시 Briant로 가니 거의 딱 시간 맞게 도착해서 앉을 수 있었다. 여기는 본디 빵집이라, 세팅할 때 빵 세트를 가져다주고, 중간중간에 직원이 빵 더 주냐고 친절하게 물어본다. 즉, 빵이 무한리필이다! 게다가 엄청나게 맛있다.

 

Briant

런치 코스는 가장 기본적인 에피타이저-메인-디저트 순으로 나온다. 아마 메인과 디저트만 2가지 중에 선택할 수 있었던 것 같다. 맛은 뭐 그냥저냥 무난한 정도? 그래도 가성비 생각하면 나쁘지 않은 것 같다. 사실 빵이 너무 맛있었어서 메인 코스 맛이 잘 기억이 안 난다. 전체적으로 따지면 추천할만한 식당.

 

카모강

점심 전에 봤던 카모강을 그냥 지나쳐가기가 좀 아까워서 식후에 쉴 겸 들렀다. 적당히 경치 좋은 벤치에 앉아서 책을 읽었는데 날씨도 좋고 사람도 많지 않아서 최고였다. 이번 여행에 가져간 책은 김영하의 단편집 "무슨 일이 일어났는지는 아무도"라는 책이었는데, 사실 작가의 다른 책들보다 재미는 덜했는데, 단편집이라 여행지에서 중간중간 읽기에는 최고의 선택이었던 것 같다. 

 

금각사 입구

오후 첫 코스로는 교토의 대표적인 관광지인 금각사를 갔다. 카모강에서 시간을 꽤 소비했기 때문에 예정보다 늦은 3시 15분쯤에 도착하였다. 여기서부턴 사람이 상당히 많았는데, 사실 이게 교토의 일반적인 관광지의 모습이다. 입구 쪽에 사람은 많고 자전거 세울 곳은 보이지 않아서 약간 당황했는데, 다행히 길 건너 쪽에 자전거 주차장이 있었다.

 

금각사 입장권

금각사 입장권은 위처럼 뭔가 멋진 형태라서 소장하기 좋다. 근데 한자 까막눈이라서 뭐라 쓰여있는지는 잘 모르겠다... 입장권은 18년 3월 기준으로 400엔으로 그다지 비싸진 않다. 근데 사실 안에 가보면 진짜 볼게 금각사 건물 딱 하나뿐이라서... 비싸다면 비싸다고 할 수도 있겠다.

 

금각사

금각사 내부에는 사람이 더 바글바글하다. 위 사진들을 찍은 뷰포인트는 입장하자마자 거의 바로 나오는데, 아무래도 이 쪽이 사람이 가장 많다. 그래서 사진 찍으려면 약간 기다려야만 했다. 5년 만에 다시 본 금각사는 생각보다 예뻐서 만족했는데, 진짜 볼 거는 이거밖에 없어서 솔직히 10~15분이면 다 보고 나올 수 있는 수준이다... 입장권 낸 게 있으니 최대한 오래 보려고 뒤에 짧은 산책코스도 가고 했는데 20분 이상 있을 수는 없었다. 뭐 그래도 돈 낸게 아깝진 않았다. 사진도 잘 찍혔고.

 

자전거 타고 지나간 길

금각사에서 시계 반대방향으로 쭉 돌아가면 아라시야마가 나오고, 거기가 오늘의 마지막 관광 코스이다. 자전거길은 위처럼 산길처럼 되어 있는 구간이 많았는데, 다행히 경사가 심하지는 않았다. 4일 차에 오사카에서 탔던 자전거 루트에 비하면 진짜 아무것도 아닌 수준. 금각사에서 아라시야마까지는 꽤 먼 거리이고, 중간중간에 들릴만한 곳이 꽤 많다. 시간이 꽤 지체돼서 좀 고민했지만, 어차피 아라시야마 쪽엔 따로 입장시간이 있는 곳이 아니므로 한 군데에 들리기로 했다. 닌나지와 료안지 중에 고민했는데 닌나지를 들리기로 하였다. 뭔 기준으로 선택했는지는 잘 기억이 안 나는데, 아마 구글 지도에 벚꽃 뷰포인트로 찍혀있었나 그랬던 거로 기억한다.

 

닌나지

닌나지 도착하니 대략 4시 20분쯤이었다. 메인 관광지가 아니다 보니 역시나 사람은 많지 않았고, 사찰의 규모도 그리 크지는 않았다. 그래도 입구 쪽의 탑은 꽤 큰 규모라 인상적이긴 했다. 입장료는 500엔인데, 가성비는 미묘한 듯.

 

아라시야마 치쿠린

대략 5시 20분쯤에 아라시야마 치쿠린(=대나무숲)에 도착했다. 뭐 말 그대로 대나무들이 즐비한 숲이다. 아라시야마 인근은 5년 전에 온 곳은 아니지만, 나름 유명한 관광지라 사람이 꽤 많았다. 대나무숲은 뭐... 솔직히 별 거 없다.

 

아라시야마

치쿠린을 나오면 전통적인 느낌의 거리가 나온다. 양쪽으로 전통 가게나 카페, 음식점 등이 상당히 많다. 또한 인근에 신사나 정원 등도 있으므로 방문하면 좋지만... 나는 시간이 좀 늦어서 어두워진 상태이고 배도 좀 고파서 구경하진 않았다. 이 부분이 약간 아쉬운데 중간에 굳이 닌나지를 들려버려서 이리 돼버렸다. 나중에 교토를 다시 가게 된다면 아라시야마 인근도 좀 더 제대로 구경을 하고 싶다. 

 

도게츠교

저녁은 도게츠교가 잘 보이는 곳에 자리 잡아서 편의점 도시락을 먹기로 이전부터 결정하였다. 도시락 사 오고, 자리 잡는데 은근히 시간이 걸리고 말았는데, 다행히 6시 반에 자리잡기를 마칠 수 있었다. 도시락은 언제나 그렇듯 가성비가 끝내주고 맛도 괜찮았다. 아직 해가 완전히 저물기 전이라, 도게츠교를 바라보는 풍경도 좋았다. 다만 7시가 넘어가니 슬슬 어두워져서 이후에는 다리가 거의 안보였다.

 

이 날 6시 반에 굳이 도시락으로 식사를 하려고 했던 이유가 있는데, 이 날이 무한도전 마지막 방송날이었기 때문이다. 안 보게 된 지 한참 되었지만 예전에 엄청 즐겨보던 예능이라 마지막 방송을 챙겨보고 싶었다. 점점 어두워지는 도게츠교를 바라보며 막방을 보면 뭔가 감성 충만할 거 같았는데... 생각보다 별 건 없고 추웠다. 뭐 그래도 상당히 기억에 남는 저녁 식사였다. 

 

자전거 타고 돌아가는 길

다음 목적지는 목욕탕인 하나노 유이다. 아라시야마에서 거리는 8km정도로 엄청 멀지는 않지만, 이미 해가 완전히 진 상황이라 생각보다 오래 걸렸다. 1시간 좀 안돼서 도착했는데, 이 날 주행 중에 가장 오래 걸린 구간이다.

 

하나노 유

이전에 일본 왔을 때는 대중탕을 잘 들리지 않았었다. 그런데 오사카에서 간 두 곳이 모두 너무 만족해서, 교토에서도 들리기로 하였다. 하나노 유는 주말 800엔인데, 아마 평일은 700엔인가 그렇다. 난 수건을 까먹어서 렌탈했는데 수건은 100엔이다. 골목 구석에 있어서 찾아가기 쉬운 편은 아니지만, 구글 지도를 믿고 그대로 가면 나온다. 참고로 노천탕도 존재한다! 가격이 썩 저렴한 편은 아니지만 시설이 꽤나 좋은 편이라 만족했다. 

 

하나노 유 식당

편의점 도시락은 맛도 괜찮고 가격도 저렴하지만, 은근히 양이 부족하다. 그래서 편의점 도시락을 저녁으로 먹었을 땐 반드시 야식을 먹어야함. 원래 온천을 하고 나선 커피우유를 마시는 것이 국룰이지만, 이번엔 약간 변형을 꽤 하여 자루우동을 먹었다. 가격도 480엔으로 괜찮은 편이다. 맛은 물론 우동 전문점에 비할 바는 결코 아니지만, 이 정도면 충분히 훌륭하다.

 

숙소 도착하니 10시 반쯤 되었다. 적당히 놋북으로 다음 날 일정 점검 좀 하고 쉬다가 적당히 잤다. 이 게스트하우스는 사람은 꽤 많은데 다들 일찍 자는 편인듯하여 조용히 잘 수 있었다.

 

이 날 거의 자전거로 돌아다녀서 3만 보 넘게 걸었을 리가 없다. 아무래도 만보기가 오작동하는 것 같아서 이 날 저녁에 민감도를 조정함. 

+ Recent posts