본문 바로가기

개발 공부/컴퓨터시스템 (CSAPP)

1. 컴퓨터 시스템으로의 여행 [1.4~1.7]

1.4   프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다 .

 

목적파일로 번환된 소스 프로그램은 유닉스 시스템에서 실행하기 위해 쉘 (터미널) 에서 명령어를 입력한다.

linux> ./hello
hello, world
linux>

 

명령어 라인이 내장 쉘 명령어가 아니면 쉘은 실행파일의 이름으로 판단하고 그 파일을 실행한다.


 

1.4.1 시스템의 하드웨어 조직

 

버스 (Buses)

: 시스템 내를 관통하는 전기적 배선군

컴포넌트들 간에 바이트 정보들을 전송한다. 버스들이 사람들 옮겨주듯이 데이터를 실어나르는 운송수단인 것.

버스는 일반적으로 워드 word 라는 고정 크기의 바이트 단위로 데이터를 전송한다.

한 개의 워드를 구성하는 바이트 수는 시스템마다 다른데 32비트 (4바이트) / 64비트 (8바이트)가 있다.

 

입출력장치 

: 시스템과 외부 세계와의 연결

키보드, 마우스 등..

 

메인 메모리

: 프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 곳

물리적으로 메인 메모리는 DRAM 칩으로 구성

 

프로세서 = 주처리 장치 (CPU)

: 메인 메모리에 저장된 인스트럭션들을 해독하는 엔진

프로세서의 중심에는 워드크기의 저장장치인 프로그램 카운터 (PC)

 

 

 

1.4.2 hello 프로그램의 실행

 

처음 쉘은 명령을 기다린다.

사용자가 :\hello 를 입력하면 각 문자를 레지스터에 읽어 들인 후 메모리에 저장한다.

키보드에서 엔터를 치면 쉘이 명령이 끝난 걸로 인식한다.

그러면 파일 내의 코드와 데이터를 복사하는 인스트럭션을 실행하여 실행파일 hello 를 디스크에서 메인 메모리로 로딩한다.

일단 hello 목적파일의 코드와 데이터가 메모리에 적재되면

프로세서는 main 루틴의 기계어 인스트럭션을 실행한다.

이 인스트럭션은 "hello, world\n" 스트링을 메모리 ➔ 레지스터 파일로 복사 ➔ 디스플레이 장치로 전송하여 출력

 


1.5   캐시가 중요하다.  

위 1.4.2 를 보면 시스템이 데이터를 이동시키는 일에 많은 시간을 쓴다는 것이다.

hello 프로그램 저장 ➔ 하드 디스크 (보조기억장치)

hello 프로그램 로딩 ➔ 메인 메모리로 복사 (주기억장치)

hello 프로그램를 프로세서(CPU) 가 실행 ➔ 인스트럭션이 프로세서로 복사 (CPU)

프로그래머의 관점에서 보면 이 복사하는 과정들이 실제 작업을 느리게 하는 오버헤드다.

 

  • 저장 용량

레지스터 파일은 수백 바이트 저장 << 메인 메모리는 십억 개의 바이트 저장

  • 읽는 속도

프로세서 (거의 100배 빠름) >> 메인 메모리

 

- 메인 메모리를 빠르게 만드는 것보다 프로세서를 빨리 만드는게 더 쉽고 싸다.

- 프로세서 - 메모리 간 격차에 대응하려고 캐시 메모리가 등장한다. CPU 안에 있다. (처음 알았는데 신기하다.)

- 캐시 메모리를 이해하는 프로그래머는 캐시를 통해 프로그램 성능을 10배 이상 개선할 수 있다. ( !! )

 

 

 


1.6   저장장치들은 계층구조를 이룬다.  

 

메모리 계층구조 (출처 : 나무위키)

- 작을 수록 비싸고 빠르고 클수록 싸고 느리다. 레지스터는 마치 스포츠카 같은.. 디스크는 화물차 같은 개념이다.

- 캐시는 자주 사용하는 데이터를 더 빠른 저장장치에 임시 저장하여 접근 속도는 높이는 방식이다.

- 캐시 캐싱 거려서 헷갈리는데

[Cache 캐시] :  레지스터 하위 단계에 위치하는 저장장치

[Caching 캐싱] :  동작,역할을 의미 / 자주 사용되는 데이터를 기준 저장공간보다 더 빠른 저장장치에 임시저장하여 접근 속도를 높임

- 예를 들어, 메인 메모리는 디스크 에서 자주 사용하는 데이터를 캐싱하여 속도를 높인다는 뜻.

 

 


1.7  운영체제는 하드웨어를 관리한다.  

 

(1) 응용프로그램이 하드웨어를 잘못 사용하는 것을 막음

(2) 응용프로그램들이 단순,균일한 매커니즘을 사용하여 복잡한 저수준 하드웨어 장치들을 조작하게 함.

 

1.7.1  프로세스 

 

하나의 프로세스에서 다른 프로세스의 전환은 운영체제 커널(kernel)이 관리한다.

커널은 운영체제 코드의 일부분으로 메모리에 상주한다.

응용프로그램이 운영체제에 어떤 작업을 요청하면, 컴퓨터는 특정 시스템 콜을 실행해서 커널에 제어를 넘겨준다.

커널은 요청을 수행하고 응용프로그램으로 리턴한다.

커널은 별도 프로세스가 아니고, 모든 프로세스를 관리하기 위해 시스템이 이용하는 코드와 자료구조의 집합이다.

 


1.7.2  쓰레드(Thread) 

 

프로세스는 쓰레드 라는 다수의 실행 유닛으로 구성되어 있다. 쓰레드 오류 자주 본적이 있다!쓰레드 중요성이 더욱 커지고 있는데, 프로세스들에서보다 데이터 공유가 더 쉽고 더 효율적이기 때문.

 


1.7.3  가상메모리  

 

> 프로그램 코드와 데이터 : 고정 주소, 고정 크기

>  힙 Heap : 런타임에 동적 크기

> 공유 라이브러리 

> 스택 Stack : 컴파일러가 함수 호출을 구현하기 위해 사용하는 사용자 스택이 위치. 동적 크기. 함수 호출하면 크기 커짐.

> 커널 가상메모리 : 맨 윗부분은 커널을 위한 곳. 

 


1.7.4  파일  

 

- 연속된 바이트들임. 

- 모든 입출력장치는 파일로 모델링. 매우 강력.

 

 

 

 

컴퓨터 시스템

저자 : Randal E. Bryan , David R. O'Hallaron 저자(글) · 김형신 번역