CSAPP 공식 강의자료를 참고한 서강대학교의 강의자료를 참고하였습니다.
- 이 문서에서는 우리가 왜 Computer System에 대해 자세히 배워야 하며, 그것을 배움으로써 어떻게 발전할 수 있는지, 또 앞으로 어떤 Computer Science 내용과 연관이 있는지 간략하게 소개한다.
Abstraction
-
Abstraction은 어떠한 기능에 대해, 그 기능이 어떻게 구현되어 있는지 알지 못한 채로 그 기능을 사용하는 것을 의미한다.
-
예를 들어, 위 사진에서 "gcc 명령어가 어떻게 구현되어 있길래" C언어 코드를 컴파일할 수 있는지, "hello 프로그램은 어떻게 구현되어 있는 것인지"에는 전혀 관심이 없다. Abstraction의 관점에서 gcc 명령어는 "C언어 코드를 컴파일하여 실행 가능한 binary 파일을 만드는 기능을 갖는다", "hello는 Hello world!라는 문장을 출력하는 프로그램이다"라는 기능 그 자체에만 관심이 있는 것이다.
-
물론 우리가 배우는 Computer Science에서 Abstraction은 정말 중요하고 흔한 개념이다. 그런데, 이번에 공부할 Computer System에서는 Abstraction의 관점에서 내용을 바라보지만은 않을 것이다.
Goal of Studying Computer Systems
-
Computer System을 학습하면 위의 'hello'라는 program이 어떻게 구현되어 있고, 그것을 컴퓨터가 low level에서 어떻게 실행하여 동작하게 하는지 알게 될 것이다.
-
여기서 의문점이 들 수 있다. Abstraction이 아주 잘 되어 있으면 굳이 그 내부에서 무슨 일이 일어나는지 몰라도 되지 않느냐? 라는 질문을 던질 수 있다.
Reasons for Learning Computer Systems
-
Computer System에 대한 이해가 있으면 더 정확하고, 더 효율적인 code를 작성할 수 있다. 그 말은 곧, 더 좋은 프로그래머가 된다는 뜻이다.
-
만약 프로그램에 bug가 존재하면 Abstraction만으로는 해결하기 어려운 것 등 Abstration에는 여러 가지 한계점이 존재한다.
-
Computer System, 즉 Compute의 low-level의 동작에 대한 자세한 이해가 바탕이 되면, 이러한 bug가 왜 발생했고, 어떻게 제거할 수 있는지 판단할 수 있게 되고, program을 개량하여 더 좋은 성능을 낼 수 있는 방법을 이해할 수 있게 된다.
Computer Systems Teaser
Computer Systems에서 앞으로 배울 내용 중 몇 가지 구체적인 예시를 들어보자.
#1: Int
is not a true interger
- 이게 무슨 말일까? 한 가지 예시를 들어보자.모든 정수 x에 대해 이 명제는 수학에서는 참이다. 하지만, C언어의 경우, 이 명제가 거짓인 경우가 있다.
- C언어의 int 자료형은 -2147483648 ~ 2147483647까지 표현할 수 있다. 만약 이 범위를 벗어난다면, 오류가 생길 수 있다.
- 예를 들어,
40,000 * 40,000 = 1,600,000,000
으로 정상적으로 계산되지만, 50,000 * 50,000 = 2,500,000,000
이어야 하는데, C언어에서는 -1,794,967,296
로 잘못된 결과가 도출된다.
- 이에 대한 이해를 위해서, Computer System이 내부적으로 어떻게 데이터를 표현하는지 공부해야 하는 것이다.
#2: Assembly Code
- 넓은 의미에서, Assembly Code는 CPU가 이해할 수 있는 언어라고 생각해도 무방하다. 대부분의 경우에는 이 Assembly Code로 직접 프로그래밍을 하는 일은 없을 것이다.
- C언어 program을 컴파일할 때, 먼저 Assembly Code로 변환된 뒤 실제 프로그램으로 변환된다.
- 하지만 Assembly Code의 동작과 작동 원리를 이해하는 것은 Computer Science의 몇몇 분야에서는 중요한 기반 지식에 해당한다.

#3: Memory Management
- Computer System에서 memory는 아주 신중하고 조심히 다뤄야한다. 만약 memory를 다루는 것에 문제가 있다면, 여러 가지 bug를 야기하여 program이 원하는 대로 동작하지 않을 수 있다.
- 아래 사진처럼 Segementation Fault를 경험한 적이 자주 있었을 것이다.
- Computer System을 공부하면 왜 이런 오류가 발생하고, 어떻게 대처하는지에 대한 이해를 할 수 있다.


- Memory를 이해하는 것은 여러 가지 program bug의 방지를 위해 필요하지만, 성능을 높이는 관점에서도 아주 중요하다.
- 예를 들어 다음 유사한 두 프로그램의 성능을 비교해보자.
- 똑같이 2048 * 2048의 2차원 array에 데이터를 채워넣는 코드이다. 그런데 성능이 약 20배 가까이 차이가 난다.
- Computer System을 공부하면 왜 이러한 차이가 나며, 두 코드의 차이점이 무엇인지 상세하게 이해할 수 있다.

Relation with Other Computer Science
- Computer Science에는 System과 관련된 여러 분야가 존재한다.
- Computer Architecture에서는 CPU와 Memory에 대해 더 심도하게 배우고, CPU를 design하는 방법을 간략하게 학습한다.
- Operating System에서는 OS가 실제로 어떻게 동작하는지 배우고, 매우 작은 OS를 직접 설계한다.
- Compiler에서는 우리가 작성한 program을 어떻게 번역하여 실행 파일로 변환하는지 배우고, simplified language에 대해 직접 compiler를 구현해본다.
- 이번에 배우는 Computer System은 이러한 분야의 gentle introduction이라고 생각하면 된다.
Wrap-UP
- 이번 Computer System은 Programmer의 관점에서 공부한다.
- CPU, OS 등과 같은 Computer System에 대한 지식을 어떻게 현명하게 잘 사용하여 프로그래밍에 적용할 것인지 배운다.
- Computer System 내용은 이 과목 이후에 공부할 Computer Science 내용들의 전반적인 introduction 내용에 해당한다.