반응형

 

1.5 캐시가 중요하다

 

일반적으로 우리가 프로그램을 실행할 때

 

하드디스크 -> 메인 메모리 -> 프로세서

                                    -> 디스플레이

 

등으로 데이터가 복사되며 실행된다. 그래서 프로그래머들은 이 프로그램들이 최대한 빠르게 실행되게 하기 위해 복사 과정들의 시간을 줄이는 것에 많은 힘을 쏟고 있다.

 

 

일반적으로 큰 저장장치들은 작은 저장장치들보다 속도가 느리다.

 

하드디스크는 메인 메모리에 비해 천만배 더 오래 걸리고, 메인 메모리는 프로세서에 비해 100배 더 느리다.

 

기술이 발전할 수록 메인 메모리와 프로세서 간의 속도 차이는 점점 벌어지기 때문에, 메인 메모리만을 이용한 프로그램은 압도적으로 느릴 수 밖에 없다. 그래서 우리는 캐시라는 것을 활용해 프로세서를 통한 복사를 더욱 더 빠르게 진행시킨다.

 

L1 캐시는 대략 수천 바이트의 데이터를 저장할 수 있고, 레지스터 파일과 속도가 비슷하다. 이보다 좀 더 큰 L2 캐시는 속도가 5배 더 느리지만 용량이 수백KB ~ 수 MB의 용량을 가지고 프로세서와 전용 버스를 통해 연결된다.

 

L1, L2 캐시는 SRAM이라는 하드웨어 기술을 이용해 구현하고, 우리는 이 캐시를 이용함으로써 프로그램 성능을 10배이상 개선할 수 있다.

 

 

 

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

 

위와 같이 프로세서와 메인 메모리 사이에 캐시를 끼워 넣어 속도를 올리는 것은 일반적인 아이디어로 판명됐다. 그렇기 때문에 컴퓨터 시스템의 저장장치들은 아래의 그림과 같은 메모리 계층구조로 구성되어 있다.

 

꼭대기에서 아래로 이동할수록 저장장치들은 더 느리고, 크고, 가격이 싸진다.

 

메모리 계층구조의 주된 아이디어는 한 레벨의 저장장치가 그 하위 레벨 저장장치의 캐시 역할을 한다는 것이다.

 

 

 

 

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

 

우리가 hello.c에서 디스플레이에 문자열을 출력해 줄 때 이 프로그램이 키보드나 디스플레이 등에 직접 엑세스 하지 않았다. 운영체제가 제공해주는 기능을 활용해 접근한 것이다.

 

운영체제는 크게 두 목적을 가지고 있는데

 

1. 제멋대로 동작하는 응용프로그램들이 하드웨어를 잘못 사용하는 것을 막는다.

2. 응용프로그램들이 단순하고 균일한 매커니즘을 ㅅ용하여 복잡하고 매우 다른 저수준 하드웨어 장치들을 조작할 수 있도록 한다.

 

운영체제는 이 두가지 목적을 위해 추상화를 이용하는데, 우리가 컴퓨터를 사용하면서 자주 만나볼 수 있는 것들이다.

 

파일 : 입출력장치의 추상화

가상메모리 : 메인 메모리와 디스크 입출력 장치의 추상화

프로세스 : 프로세서, 메인 메모리, 입출력장치 모두의 추상화

 

 

1.7.1 프로세스

 

프로세스는 우리가 hello.c와 같은 프로그램을 실행했을 때 생성되는 것이다.

 

이전에는 하나의 CPU가 하나의 프로세스만 실행할 수 있었지만, 요즘에는 여러 프로세스를 실행하는 것처럼 '착각'시키는 기술을 사용한다.

 

우리가 A라는 프로세스를 사용하고 있다가 B라는 프로세스를 이용한다면, '문맥 전환'이 일어나 자연스럽게 A -> B로 넘어가게 된다. 마치 동시에 A,B가 돌아가고 있었다는 것처럼!

 

이것을 도와주는게 운영체제다. 프로세스간의 전환이 일어날 때 운영체제는 시스템 콜을 실행해 커널에 제어를 넘겨준다. 그렇다면 커널은 요청된 작업을 수행하고 응용프로그램으로 리턴해준다.

 

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

 

1.7.2 쓰레드

 

프로세스가 마치 한 개의 제어흐름을 갖는 것 같지만, 그 안에는 쓰레드라고 하는 다수의 실행 유닛이 존재한다.

 

이 쓰레드들은 해당 프로세스의 컨텍스트에서 실행되며 동일한 코드와 전역 데이터를 공유한다.

 

쓰레드는 데이터의 공유가 더 쉬워서 다중 쓰레딩을 통해 프로그램의 실행 속도를 빠르게 하기도 한다.

 

 

 

1.7.3 가상메모리

 

가상메모리는 각 프로세스들이 메인 메모리 전체를 독점적으로 사용하고 있는 것 같은 환상을 제공하는 추상화이다.

 

각 프로세스들은 가상주소 공간이라고 하는 균일한 메모리의 모습을 갖게 되는데 이 균일한 메모리는 크게 5개의 구역으로 나눠져 있다.

 

1. 프로그램 코드와 데이터 : 코드는 모든 프로세스들이 같은 고정 주소에서 시작하고 전역 변수가 이곳에 존재한다.

 

2. 힙 : 코드와 데이터 영역은 크기가 고정되어있지만 힙은 그렇지 않고 c로 치자면 malloc 과 free를 통해 동적으로 변한다.

 

3. 공유 라이브러리 : 주소공간의 중간 부근에 공유 라이브러리의 코드와 데이터를 저장하는 융역이 있다.

 

4. 스택 : 사용자 가상메모리 공간의 맨 위에 컴파일러가 함수 호출을 구현하기 위해 사용하는 사용자 스택이 위치한다. 힙과 마찬가지로 크기는 동적으로 늘었다 줄었다 하고, 특히 함수를 호출할 때 커졌다가 다시 리턴되면 작아진다.

 

5. 커널 가상메모리 : 주소공간의 맨 윗부분은 커널을 위해 예약되어 있다. 응용프로그램들은 이 영역의 내용을 읽거나 쓰는게 금지되어 있고, 커널 코드에 정의되어있는 함수를 직접 호출할 수도 없다. 이 작업을 수행하기 위해서는 커널을 호출해야한다.

 

 

1.7.4 파일

 

파일은 그저 연속된 바이트들이다. 디스크, 키보드, 디스플레이, 네트워크까지 포함하는 모든 입출력장치는 파일로 모델링한다. 시스템의 모든 이불력은 유닉스 I/O라는 시스템 콜들을 이용하여 파일을 읽고 쓴다.

 

 

 

 

 

출처 : 컴퓨터 시스템 제 3판

반응형

'IT > 컴퓨터 시스템(3판)' 카테고리의 다른 글

cs:app : CHAPTER 1.1 ~ 1.4 hello.c 의 실행 방법  (0) 2022.04.03
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기