프로그램 공부/시스템프로그램

시.프 - Bits, Integers, Addressing, DRAM 등등....- 1-1

WINDALIKE윈덜릭 2021. 2. 24. 12:04
반응형
SMALL

시.프 - Bits, Integers, Addressing, DRAM, SRAM 등등....

2.24 시프 1주차

 

안녕하세요. 바람같은  WINDALIKE 입니다.

 

음.... 저는 현재 소프트웨어학과 2학년 재학중인 대학생입니다. 그리고 고등학교 때 프로그래밍에 엄청난 환상이 있던 학생이었고, 그래서 열심히 수능 공부하다가 왔는데 

 

뒤통수를 오지게 맞고 있는 사람입니다. 

 

예...... 오오오오오오지게 어렵더군요 ㅠㅠ

 

최근에 개강을 하였고, 오늘 전공과목중에 하나인 

"시스템프로그램" 이라는 과목을 시작했습니다. 

 

1학년 때는 그냥 프로그래밍 언어 몇개 배우는 수준이었는데, 이거는 언어라기보다는 컴퓨터 내부에서 어떤 일이 일어나는지에 대해서 더 전문적으로 배우는 것 같았습니다.....

 

그냥 너무 어려웠어요

 

그래서!!! 제가 최대한 이해한 걸 바탕으로 블로그에 글을 남겨보려 합니다. 

아직 모르는게 많고 대학교 와서 처음 배워보는 겁니다. 하지만 그만큼 더 저같은 사람들의 수준의 언어로 풀어서 설명할 테니 저같은 분들은 이 글 (시리즈)가 많이 도움이 될 것이라 생각합니다.

 

제가 틀리거나 뭔가 이상한 부분은 댓글로 말씀해주시고, 잘 아시는 분들의 피드백은 항상 너무나도 감사합니다.

 

배운 내용을 전체적으로 설명하기보다는, 제가 인상깊었던 내용위주로 설명드리겠습니다.

 

**제가 제일 하고 싶던 파트는 맨 마지막이라, 초반 내용이 재미 없으시면 아래로 가시길 바랍니당!!!^^**

-------------------------------------------------------------

 

1. 자 일단, 비트bit, 바이트byte 이런거는 아시죠? 

 

저는 몰랐습니다. 정확히는 제대로 알지 못했었죠. 

 

"단위" 라고 생각하시면 될거 같습니다.

 

"시스템프로그램"은 특히 Assembly 언어라고, 코딩해서 프로그램을 만들면, 컴퓨터에서 그 프로그램을 어떻게 실행하는지에 대해 그 내부적으로 들어가서 공부한다고 생각하시면 됩니다.

 

오늘은 첫 수업이라 매우 간단한(?) 개념에 대해서 설명해주셨는데......

 

아오 이것도 어려웠어요 ㅋㅋ ㅠㅠㅠ

 

2.

자 여기에 사과는 몇개가 있습니까.

 

3개죠? 

 

라고! 인간은 말합니다. 그리고 그렇게 이해하죠.

 

저 사진을 보면서 우리같은 인간은 "3"이라는 걸 뇌에 "인코딩"해서 그렇게 인식합니다.

 

그럼 컴퓨터는 3과 같은 "숫자", 또는 "정보" 들을 어떻게 인식할까요?

 

3. 컴퓨터는 이진법으로 정보를 읽는다.

 

사실 이거는 쉽게 안다고 생각하실거에요. 무슨 컴퓨터는 1010100010101110101 막 이런 이진법으로 대화하고, 코딩하고 어쩌고 저쩌고 

 

이렇게 아시는 분들이 많으실 거에요. 근데.....

 

이건 단편적인 지식이죠. 더 내부적으로는 저 1010101 이런 숫자들의 배열을 "어디에다" 담아서 컴퓨터의 "어디 구조"에서 "어떻게" 읽고 " 어떻게 처리할 것인가" 가 중요한겁니다.

 

자 그럼 하나하나 뜯어볼까요?

 

일단, 인간이 주로 쓰는 정보 중 

 

숫자 : 정수 Integer, 소수점이 있는 수 Floating number, 등등 

 

이런 정보들은 2진법으로 변환해주어서 컴퓨터에게 넣어주어야 합니다.

 

 

2진법은 0과 1로,

10진법은 0,1,2,3,4,5,6,7,8,9.

16진법은 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

를 활용해서 수를 구성하죠.

 

( 아 참고로 궁금증이 생기실 수도 있는데

??? : 아니, 근데 제가 C언어를 좀 공부해보니까 2진법,10진법, 16진법으로 프린트를 하든 계산을 하든, 컴퓨터가 잘 이해하던데요?

 

WINDALIKE : 네네, 근데 우리는 그 내부를 보자는 겁니다. 그니까 그 "이해"를 어떻게 했느냐는 거에요. 솔직히 말해서 코딩할 때 cout<< 이런거나 printf(" ") 이게 사실은 인간의 언어잖아요.  out, print 이런게 눈에 보이면 "아, 이거 그거지" 하면서 아는데, 이게 진짜 컴퓨터의 언어라고 생각하시는건가요? 아니잖아요? 

그니까 그 내부에서 COUT을 만나면 이걸 막 (지금의 저로서는 아직 배우진 않았지만 ) 0101010100111011 이렇게 구성되어서 컴퓨터가 인식한다는 건데 그걸 공부하자는 겁니당!!

)

 

4. Byte-Oriented Memory Organization

 

자, 이제 여기부터 대가리가 점점 무거워집니다. 

요기 네모네모 칸들을 "셀"이라고 편의상 부를게요

 

저 셀들은 byte입니다. 셀 마다 1바이트 만큼의 정보가 들어가고 저 주르륵 전체를 "메모리"라고 합시다 

 

C언어를 배우셨다면 "배열"로 생각하셔도 좋습니다. 

 

ex) byte형식의 배열 256칸을 만든거죠. 0부터 255까지 index가 있을거잖아요? 이게 메모리에서는 그 셀의 주소가 되는 겁니다. 그래서 프로그램을 만들었을 때, 메모리에 들어가면 그 시작부분의 "주소"를 가지고 프로그램을 시작하는 거죠.

 

자 여기서 왜 갑자기 256칸이 왜 나오냐, 이건 이제 컴퓨터에 조금 지식이 있다면 금방 눈치 채실텐데요.

1바이트는 8비트구요. 비트는 0,1으로 구성되기 때문에 2의 8제곱해서 바이트는 총 256가지가 존재하는겁니다.

 

그래서 그 256개의 바이트로 메모리를 구성할건데

 

"시스템은 각각 프로세스에 개인의 주소를 제공합니다"

 

그러니까, 우리가 컴퓨터에 카톡, 크롬, 게임을 틀어놓고 있으면, 각각의 프로세스들이 저 메모리를 차지해서 각각의 주소를 가지고 계속 실행되고 있는거죠. 

 

이정도로 알고 계시면 될거 같네요.

 

5. Addressing

 

자, 이제부터는 ㄹㅇ 제가 수업을 들으면서 너무 어려웠던 부분입니다. 그냥 완전 저의 언어로 설명드려볼게요.

 

보통 컴퓨터에 막 32비트, 64비트 이렇게 있잖아요? (저도 이건 여전히 잘 모르겠어요. 그냥 있다잖아요 ㅎㅎ)

 

근데 여기서 64비트일때 메모리는 48비트의 주소를 줄 수 있대요. 그니까 00000.....0 이게 48개의 비트로 주소를 구성할 수 있다는 겁니다. 그니까 아까 위에서 8개의 비트로 주소가 구성되는데 48개의 비트면....... 2의 48제곱만큼의 메모리가 있는겁니다. 엄청난거죠?

 

자, 이제 본격적으로 의문점이 생깁니다.

32비트로 가봅시다. 그럼 2의 32제곱만큼의 메모리가 있겠죠? 근데 중요한건 이건 1990년대에도 있었어요. 근데 그때의 RAM 은 256MB 였고, 제가 어렸을 때 집에 있는 컴퓨터는  RAM이 2GB밖에 안됐었어요. 근데..... 아니 메모리가 2의 32제곱이라매요. 아니 2의 10제곱만해도 1000이상이라 1GB인거라 2의 32제곱이면 적어도 4GB인거거든요? 

 

근데 왜 과거에는 RAM이 그렇게 작았던 걸까요? 그러면서 32비트의 컴퓨터였을까요.

 

이게 Physical로는 적은데, virtual로 했을 때는 4기가가 되는겁니다. 그니까, 컴퓨터가 처리할 수 있는게 4GB인건 맞는데, 실제 몸빵으로는  256MB, 2GB이랬던것이죠.

 

그럼 대체 어떻게 virtual로 4기가를 감당하는데?

 

이게 오늘 내용중에 가장 중요한거입니다....

 

자!! 일단 우리의 프로그램들은 하드(이하 HDD)에 들어있겠죠? 근데 이게 HDD는 드릅게 느리답니다. 용량은 큰데, 느리데요. 그래서 이걸 DRAM으로 보내줍니다. 우리가 흔히 부르는 메모리라고 해요. DRAM은 좀 작죠. 아까 옛날 컴퓨터는 2GB였던것처럼. (막 HDD이런거는 100GB가 넘잖아요) 

 

암튼, 그래서 DRAM으로 SWAP을 합니다. 그니까 실행할 프로그램 내용을 복사하는 거죠. 그래서 DRAM으로 보냅니다. 

 

RAM으로 와서는 순서를 기다립니다. 프로그램들을 여러개 실행하면, 각각의 프로그램이 차례에 맞게 계속 실행되는 겁니다. 그래서 순서가 되면 CPU에서 이를 실행하는 거죠.

 

??? : 아니, 그래서 어떻게 2GB짜리가 4GB만큼의 역할을 할 수 있는건데?

 

자, 그니까 쉽게 설명해서, 

 

10평짜리 공간의 창고가 있는데, 그 창고에서 말하는 겁니다

 "이 창고는 20평창고에 담을 수 있는 만큼의 식량을 사용하는 사람한테 제공할 수 있어"

 

라는 겁니다. 그래서 잉? 했더니 알고 보니 저어어어어기 뒤에 100평짜리 창고가 있던거죠. 그런데 그게 사람들한테 좀 먼겁니다. 그래서 거기서 뭔가를 하기에는 너무 힘든거죠. 그래서 수시로 사람들이 원하는 식량들을 챙겨서 10평짜리 창고로 옮겨오는거죠. 그러다가, 

 

사람이 다른걸 원한다? 그럼 빠르게 10평창고에 있던거 몇개는 없애고 100평짜리에서 가져오는거죠. 그렇게 제공하는 겁니다.

 

---------------

 

이런식으로 RAM에서 계속 swap하면서 프로세스를 진행하는 겁니다. 

 

 

 

우와아아아아아아 이게 설명이 잘 됐을라나 모르겠네요. 이거 말고도 설명할 게 많긴 한데, 이걸 글로 하기가 참 쉽지가 않은 것 같습니다. 그래도 이 내용이 저에게는 꽤나 신기했고, 컴퓨터의 내부과정을 튜토리얼 수준으로 알게 되어서 나름 재밌으면서 대가리가 깨져버린거 같더라구요 ㅎㅎ

 

조금이라도 도움이 됐다면 좋겠습니다......

 

항상 성장할게요. 다음에는 더 설명이 명쾌해질 것을 약속드리며 이만 글을 마치겠습니다. 끝까지 읽어주신분들 모두 감사합니다.

반응형
LIST