컴퓨터 사이언스 부트캠프 with 파이썬 완독 후 2독째
한번 읽고나니 다시 읽을때는 전체 흐름이 보이기도하고 더 매끄럽게 읽혀서 뿌듯하다.
여러가지 내용들이 있지만 2가지 정도만 정리해보면 아래와 같다.
32비트의 컴퓨터가 4GB 의 메모리까지만 사용 가능한 이유
부제: 정확히는 4GB 이상이어도 4GB까지의 효과만 기대할 수 있다.
이를 이해하기 위해서는 cpu와 메모리를 따로 생각하고, 한번에 정리해야 한다.
1. 32비트 컴퓨터
컴퓨터의 연산 처리는 cpu 가 담당한다. 그리고 32비트는 2^32 개의 메모리 주소값을 가지고 있다.
2^32 = 4,294,967,296(약 42억)
42억개는 1개 1개마다 cpu 의 레지스터가 처리할 수 있는 주소값의 범위인데, 주소공간 하나당 1Byte 를 차지한다.
즉, 42억개(또는 42억 byte) 의 연산처리만 가능하다는 뜻.
2. 4GB 메모리
메모리는 데이터를 저장하는 공간이다. 0과 1로 이루어진 비트가 8개 모여 Byte 가 되며, 이 1Byte 가 하나의 메모리 주소값을 가지고 있다.
8비트 = 1바이트
1024Byte = 1KB
1024KB = 1MB
1024MB = 1GB
1GB 를 Byte 로 몇 byte가 되는거지?
1024 x 1024 x 1024 = 1,073,741,824(약 10억)
3. 32비트가 4GB 메모리 까지만 처리할 수 있는 이유(결론)
32비트 컴퓨터는 한꺼번에 42억 Byte 의 연산 처리만 가능하다. 그 말은 저장되어진 데이터(메모리)는 42억 Byte 까지만 한번에 처리할 수 있다는 말이다.
다시 한 번 짚고 넘어가자.
32비트 컴퓨터 = 2^32 = 4,294,967,296 4GB 메모리 = 1024 x 1024 x 1024 x 4 = 4,294,967,296 |
* 결론은 주어진 4GB 메모리 공간에 32비트 컴퓨터(cpu) 가 접근하여 42억개를 한꺼번에 연산처리할 수 있다는 것이다.
1차: cpu 가 메모리에서 불러온 42억개의 데이터를 처리했습니다.
2차: cpu 가 메모리에서 불러온 42억개의 데이터를 처리했습니다.
....
가장 많이 비유하는게 도로와 자동차인데,
42억개의 도로(cpu)에 42억개의 자동차(메모리)만 지나갈 수 있다. 그 이상의 자동차는 다음 차례에 지나갈 수 있다.
인자 전달 방식에 따른 분류
- 지역 변수는 스택 프레임에 쌓이게 된다. 그리고 지역 변수는 함수가 종료되면 메모리 공간에서 사라진다.
- 레퍼런스 카운트는 몇개의 객체가 해당 메모리 주소(변수 등)의 값을 참조하고 있는지 카운팅하는 방법이다.
값에 의한 전달(call by value)
지역 변수의 함수에 값을 복사한다. 그래서 지역변수가 메모리 공간에서 사라져도 main 함수에서는 그 값을 그대로 가지고 있다.
지역변수의 값을 main 함수로 복사한 이후에는 각자가 메모리에서 독립적인 공간을 소유.
참조에 의한 전달(call by reference)
지역 변수가 main 함수의 변수에 참조를 인자로 전달(메모리 주소값을 전달)한다.
main 함수의 변수가 메모리 주소값을 가지고 있기 때문에 지역 변수가 종료되어도 참조된 그 값을 그대로 가지고 있다.
객체 참조에 의한 전달(call by object reference)
위의 2개와는 개념 자체가 다르다. 아예 위의 2개의 개념을 잊고 새롭게 접근하는 것도 좋은 방법이 될 것 같다.
파이썬은 메모리에 값을 할당하는 것이 아니라 객체(또는 변수 등)가 메모리의 주소값을 참조한다.
즉, 지역 변수와 main 함수의 변수는 서로 다른 메모리 주소를 참조하고 있다.
그래서 지역 변수가 종료되던 되지 않던 각자 가리키는 곳이 다르기 때문에 영향이 없다.
그러나 지역 변수가 main 함수의 변수 객체 자체에 접근하여 변경을 한다면 2개의 변수는 가리키는 곳이 같기 때문에 변경이 된다.
■ 지역 변수가 객체 자체에 접근하여 변경할 수 있는 방법
def func(li): li[0] = 'it changed' if __name__=="__main__": li = [1, 2, 3, 4] func(li) print(li) >> ['it changed', 2, 3, 4] |
지역 변수가 main 함수의 변수에 참조될 때는 레퍼런스 카운트가 2가 되고, 지역 변수가 종료되면 자연히 레퍼런스 카운트는 1이 된다.
물론 이 내용은 책을 읽고 구글링을하며 도달한 결론이므로 사실과는 다를 수 있겠다.
'TIL' 카테고리의 다른 글
2019-01-01 (0) | 2019.01.01 |
---|---|
2018-12-25-TUE (0) | 2018.12.25 |
TIL-2018-12-12-WED (0) | 2018.12.12 |
TIL-2018-12-11-TUE (0) | 2018.12.11 |
TIL-2018-12-09-SUN (0) | 2018.12.09 |