TL; DR

컴퓨터 과학 계열에서 '수학의 정석'처럼 여겨지는 기본서인
Computer Systems: A Programmer's Perspective라는 책의
제 1장을 읽고,

앞으로 해당 책을 읽어나가면서
내가 중점적으로 학습해 나갈 것이 무엇인지
파악하였다.

# 내맘대로 제 1장 요약
컴퓨터라는 하드웨어는 결국
사람이 특정 목적을 달성하기 위해 사용하는 도구임.

우리 프로그래머는, 
사용자가 목적 달성을 위해 활용할 프로그램이
컴퓨터라는 하드웨어에서 잘 돌아가게 만들어야 함.

이를 위해
프로그래머가 학습하고 훈련해야 하는 것들을
CS:APP은
다음과 같이 제시함.

1. 프로그램 잘짜기
 - 요약: 컴퓨터 시스템에서 자원을 효율적으로 활용하면서도 안정적으로 실행되는 실행 파일 만들기
 - 키워드: 자료 표현, Instruction, Processor, Pipelining, Memory...

2. 컴퓨터 시스템 이해하기
 - 요약: 프로그램을 잘 짜려면, 시스템에서 프로그램의 작업이 어떻게 실행되고, 자원이 어떻게 사용되는지 잘 알고 있어야 함
 - 키워드: 링커, 제어, 가상 메모리

3. 구현해보기
 - 요약: 시스템에서 외부 장치로부터 데이터를 입력/출력하는 방식을 이해하고, 프로그램을 어떻게 짜야 최소자원에서 최대의 효율을 낼 수 있는, 즉, 짧은 시간 안에 최대한 많은 작업을 실행해 낼 수 있는지 알아야 함.
 - 키워드: I/O device, 네트워크, 동시성/병렬성 프로그래밍

 

컴퓨터 공학계의 수학의 정석인
Computer Systems: A Programmer's Perspective 책을
한 바탕 훑어보았다.

모르는 단어가 수십가지가 나왔다.

Program, Process, Thread, Instruction, Virtual Memory
CPU (Control Unit, Register File, Program Counter, Arithmetic Logic Unit, Cache Memory...)
Main Memory, Hard Disk, I/O Device, Bus
OS
동시성, 병렬성
Linker
Network
...

이것들을 머리속에 구조화하기위해 나는
<공유 주방>, <요식업체 본사와 프랜차이즈>, <요리>의 개념을 가져와보았다.


상황 가정 #1. 중화요리 전문 '띠엔나오성 본사'를 창립하다.

프로그램을 싹 잊고, 이런 상황을 상상해보자.

우리는 백종원이 되고 싶은 요식업계 창업 유망주이다.

우리는 백종원에게 가르침을 받아
식당을 창업할 수 있는 기술을 배웠다.

그러나 우리에게 부족한 것이 있다.
1. 요리사와 조리기구
2. 냉장고
3. 물류창고
4. 유통시스템
5. 고객과의 소통창구

그런데 감사하게도
이런 자원들을 제공해주는 공유주방이 있다고 한다.

나는 전국에 퍼져있는 공유주방에
프랜차이즈 식당을 입점시키기로 결심하고,

공유주방의 정책에 맞춰
입점에 필요한 모든 것을 준비하여,
중화요리 전문 '띠엔나오성 본사'를 창립한다.

띠엔나오성 본사의 창업 '비법 문서'에는 다음과 같은 것을 기술했다.

1. 공유주방에 입점해서 식당 운영 자원 지원 받고, 활용하는 방법
2. 각종 요리 레시피와 재료 공수 및 손질/조리 방법


컴퓨터 세계에 대입 #1. 응용 프로그램을 개발하다.

'띠엔나오성 본사' == 응용 프로그램
'창업 비법 문서' == 프로그램 실행 파일

'공유주방' == 컴퓨터 하드웨어
'요리사와 조리기구' == CPU
'냉장고' == Cache Memory
'물류 창고' == Main Memory
'유통 시스템' == Bus
'고객과의 소통창구' == I/O Device Interface
'재료' == Data


상황 가정 #2. A공유주방에 띠엔나오성 프랜차이즈 1호점을 입점하다.

나는 본사의 '창업 비법 문서'를 그대로 승계받아,
A공유주방에 띠엔나오성 프랜차이즈 1호점을 열었다.

A공유주방의 매니저
공유 주방의 요리사와 조리도구, 냉장고, 물류창고의 일부를
우리 가게가 전용으로 쓸 수 있도록 제공해주었다.

가게 운영 세팅이 마무리되자,
공유주방의 소식라인을 통해
고객으로부터 짜장면과 탕수육 주문이 들어왔다.

우리 요리사에게
짜장면과 탕수육 만들기라는 업무가 생겼다.

물류창고에 보관되었던
짜장면 레시피, 탕수육 레시피 각각이 순서대로 적힌 포스트잇 세트

각각의 요리에 필요한 재료들이 호출되어,

공유주방에서 제공하는 버스를 통해
우리 가게 전용 요리사와 조리도구가 있는 공간으로 배달 되었다.

요리사는
레시피와 재료를 조리대에 올려두고,
엄청난 속도로 짜장면과 탕수육을 완성해냈다.

완성된 요리는
공유주방에서 제공하는 버스를 통해
고객에게 전달되었다.


컴퓨터 세계에 대입 #2. 프로세스 생성과 스레드의 실행

'프렌차이즈 1호점' == 프로세스
'프렌차이즈 1호점 오픈' = 프로세스 생성
'공유주방 매니저' == OS
'가게 전용 물자&공간 제공' == CPU, 가상메모리 할당

'짜장면 만들기 업무' == 스레드A
'탕수육 만들기 업무' == 스레드B

'레시피' == Instruction
'요리사' == Control Unit
'조리대' == Register File

'요리' == 연산


상황 가정 #3. 요리 과정을 관찰하다.

요리사는
조리대의 레시피 보드판에 붙어있는 짜장면 만들기 레시피의 첫번째 포스트잇을 보고,
요리법을 해석하더니,
조리대로 재료를 옮기고,
만능조리기의 버튼을 눌러 재료를 손질시켰다.

손질 완료된 모습을 본 공유주방의 또다른 매니저가
우리 요리사에게
탕수육 만들기 업무를 얘기하더니

조리대에 있던 짜장면 만들기에 쓰던 레시피와 재료를 챙겨갔다.

보조 요리사는
미리 냉장고에 넣어 두었던
탕수육 레시피와 재료를 꺼내 조리대로 옮겼고,

우리 요리사는
이번엔 탕수육 만들기 레시피의 포스트잇을 보고 요리법을 해석하더니,
조리대로 재료를 옮기고,
만능조리기의 조리 버튼을 눌러 조리를 실행하였다.

조리가 완료된 모습을 본 공유주방 매니저가
우리 요리사에게
다시 짜장면 만들기 업무를 얘기하며,
이전에 진행되었던 시점까지의
재료와 레시피 순서를 전달해주었다.

풀어쓰다보니 아주 길어졌지만,
짜장면을 만들다가 탕수육을 만드는 과정은
동시라고 느껴질 만큼 빠르게 이루어졌다.

내가 다른 요리사가 있는 주방을 살펴보니,
그곳에서는 파스타와 피자가 동시에 만들어지고 있었다.


컴퓨터 세계에 대입 #3. CPU의 연산과정, 캐쉬메모리, 동시성, 병렬성

'요리사가 하는 일'
- 레시피 순서 확인
- 레시피 해석
- 조리대에 재료 옮기기
- 만능조리기계에 조리 시키기

==

Control Unit이 하는일
- 인스트럭션 스트림 확인
- 인스트럭션 해석
- 레지스터에 데이터 저장
- ALU에 연산 지시

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

'조리대의 구성'
- 레시피 순서를 붙여놓는 보드판
- 재료 올려 놓는 공간
- 조리가 완료된 재료를 올려 놓는 공간

==

Register File의 종류
- Program Counter
- 일반 레지스터
- 상태/플래그 레지스터

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

'공유주방 또다른 매니저의 업무 지시'
- 주문 받았던 다른 업무관련 일을 하라고 알려줌
- 이미 만들고 있던 요리의 레시피와 재료를 잠시 보관해줌
- 다른 업무 관련 일로 다시 돌아갈때, 원래 하던 업무의 정보를 알려줌

==

Thread Switching
- 운영체제의 Scheduler가 CPU로 하여금 다른 쓰레드의 실행을 지시함
- CPU Register에 있던 자원을 운영체제의 Kernel로 가져가서 일시적으로 저장함
- 또다시 쓰레드 스위칭이 일어날 때, Kernel에서 보관하던 Thread의 Context 정보를 제공함

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

'짜장면을 만들다가 탕수육을 만드는 것이 동시에 되는 것으로 느껴졌다'

==

쓰레드 수준의 동시성
- 여러 쓰레드가 실행될 때, 마치 동시에 실행되는 것 같이 느껴지는 상황적 특성

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

'다른 주방에서도 파스타와 피자를 만들고 있었다.

==

프로세스 수준의 병렬성
- 여러 프로세스 각각이 서로 다른 CPU에서 병렬적으로 같이 실행되고 있는 상황적 특성


상황 가정 #4. 공유 주방의 특성

이 공유주방에는 많은 고객들이 찾아와
"좀더 빨리 만들어 주세요"
"좀더 다양한 음식들을 제공해주세요"
라고 요청한다.

공유주방은
조리공간도 4군데 뿐이고,
물류창고도 그렇게 크지 않은 상황에서

이러한 고객의 요구를 수용하기 위해
공유주방의 자원을 최대한 효율적으로 활용하기 위한 정책들을 수립한다.

이 공유주방에 입점하여
많은 고객들에게 사랑받는 식당이 되기 위해서는
이 공유 주방의 최적화 정책을 최대한 잘 따라야 한다.

이 정책에는
요리사가 빠르게 업무를 할 수 있게 하는 레시피,
물류창고와 냉장고를 효과적으로 사용할 수 있는 재료 관리법 등과 관련한 것이 포함되어있다.


컴퓨터 세계에 대입 #4. 프로그램 성능 최적화

'공유주방 자원의 제한적 상황'

==

컴퓨터 하드웨어의 물리적 한계
- CPU core 개수 대비 너무 많은 프로그램
- 각종 Memory의 속도와 크기의 한계

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

'공유 주방 정책에 맞는 식당 만들기'

==

컴퓨터 시스템과 OS가 제공하는 기능을 최적으로 활용하는
효율적 프로그램을 작성해야함!


이제 다시 현실로 돌아와서..

그래서 어쩌라고?

이 책은 제 1장에서
프로그램과 하드웨어, 운영체제의 모습을 개괄적으로 소개하면서,

우리가 프로그래머로서
프로그램이 실행될 환경인 컴퓨터 하드웨어와 운영체제를 잘 이해하여
좋은 프로그램을 만들기 위해 노력해야 한다고 말한다.

그 구체적인 방법은
이어지는 2장부터 시작된다.

제1장 리뷰 끗~

+ Recent posts