[WEEK 04] 컴퓨터 시스템 - 1. 컴퓨터 시스템으로의 여행

신호정 벨로그·2021년 8월 31일
0

Today I Learned

목록 보기
14/89

1. 컴퓨터 시스템으로의 여행

컴퓨터 시스템은 하드웨어와 시스템 소프트웨어로 구성되며, 이들이 함께 작동하여 응용프로그램을 실행한다.

모든 컴퓨터 시스템들은 유사한 기능을 수행하는 유사한 하드웨어와 소프트웨어 컴포넌트를 가지고 있다.

1.1 정보는 비트와 컨텍스트로 이루어진다

C는 시스템 수준 프로그래밍을 위해 선택된 언어이며, 이미 설치된 엄청난 수의 응용수준 프로그램들이 존재한다.

C는 유닉스 운영체제를 만들기 위해 설계된 간단한 언어이며, 유닉스 운영체제와 밀접하게 연결되어 있다.

1.2 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다

시스템에서 실행시키려면 각 C 문장들은 다른 프로그램들에 의해 저급 기계어 인스트럭션들로 번역되어야 한다. 이 인스트럭션들은 실행가능 목적 프로그램이라고 하는 형태로 합쳐져서 바이너리 디스크 파일로 저장된다. 컴파일러 드라이버는 유닉스 시스템에서 소스파일에서 오브젝트 파일로 번역한다. GCC 컴파일러 드라이버는 소스파일을 읽어서 실행파일로 번역한다.

이 네 단계를 실행하는 프로그램들(전처리기, 컴파일러, 어셈블러, 링커)을 합쳐서 컴파일 시스템이라고 부른다.

  1. 전처리 단계: 전처리기(cpp)는 본래의 C 프로그램을 #문자로 시작하는 디렉티브(directive)에 따라 수정한다.

  2. 컴파일 단계: 컴파일러(cc1)는 텍스트파일을 번역하며, 이 파일에는 어셈블리어 프로그램이 저장된다.

  3. 어셈블리 단계: 어셈블러(as)가 기계어 인스트럭션으로 번역하고, 이들을 재배치가능 목적프로그램의 형태로 묶어서 목적파일에 그 결과를 저장한다.

  4. 링크 단계: 링커 프로그램(ld)은 통합작업을 수행하고 실행가능 목적파일로 메모리에 적재되어 시스템에 의해 실행된다.

1.3 컴파일 시스템이 어떻게 동작하는지 이해하는 것은 중요하다

  1. 프로그램 성능 최적화하기
  2. 링크 에러 이해하기
  3. 보안 약점 피하기

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

실행파일을 유닉스 시스템에서 실행하기 위해서 쉘이라는 응용프로그램에 그 이름을 입력한다.

쉘은 커맨드라인 인터프리터로 프롬프트를 출력하고 명령어 라인을 입력 받아 그 명령을 실행한다.

1.4.1 시스템의 하드웨어 조직

  1. 버스(Buses): 시스템 내를 관통하는 전기적 배선군을 버스라고 하며, 컴포넌트들 간에 바이트 정보들을 전송한다.

  2. 입출력 장치: 입출력 장치는 시스템과 외부세계와의 연결을 담당한다.

  3. 메인 메모리: 메인 메모리는 프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치다.

  4. 프로세서: 주처리장치(CPU) 또는 간단히 프로세서는 메인 메모리에 저장된 인스트럭션들을 해독(실행)하는 엔진이다. CPU가 실행하는 단순한 작업으로는 적재(Load), 저장(Store), 작업(Operate), 점프(Jump) 등이 있다.

1.5 캐시가 중요하다

프로세서는 레지스터 파일의 데이터를 읽는 데 메모리의 경우보다 거의 100배 더 빨리 읽을 수 있다. 메인 메모리를 더 빠르게 동작하도록 만드는 것보다 프로세서를 더 빨리 동작하도록 만드는 것이 더 쉽고 비용이 적게 든다.

프로세서-메모리 간 격차에 대응하기 위해 시스템 설계자는 보다 작고 빠른 캐시 메모리라고 부르는 저장장치를 고안하여 프로세서가 단기간에 필요로 할 가능성이 높은 정보를 임시로 저장할 목적으로 사용한다.

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

모든 컴퓨터 시스템의 저장장치들은 메모리 계층구조로 구성되어 있다.

계층의 꼭대기에서부터 맨 밑바닥까지 이동할수록 저장장치들은 더 느리고, 더 크고, 바이트 당 가격이 싸진다.

레지스터 파일은 계층구조의 최상위인 레벨 0, 즉 L0을 차지한다. L1에서 L3까지, 레벨 1에서 3까지 캐시를 사용하는 구조를 가진다. 메인 메모리는 레벨 4에 위치한다.

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

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

운영체제는 두 가지 주요 목적을 가지고 있다.

  1. 제멋대로 동작하는 응용프로그램들이 하드웨어를 잘못 사용하는 것을 막기 위해
  2. 응용프로그램들이 단순하고 균일한 메커니즘을 사용하여 복잡하고 매우 다른 저수준 하드웨어 장치들을 조작할 수 있도록 하기 위해

1.7.1 프로세스

프로세스는 실행 중인 프로그램에 대한 운영체제의 추상화다. 다수의 프로세스들은 동일한 시스템에서 동시에 실행될 수 있으며, 한 프로세스의 인스트럭션들이 다른 프로세스의 인스트럭션들과 섞인다는 것을 의미한다.

1.7.2 쓰레드

프로세스는 쓰레드라고 하는 다수의 실행 유닛으로 구성되어 있다. 각각의 쓰레드는 해당 프로세스의 컨텍스트에서 실행되며 동일한 코드와 전역 데이터를 공유한다.

1.7.3 가상메모리

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

1.7.4 파일

파일은 응용 프로그램에 시스템에 들어 있는 다양한 입출력장치들의 통일된 관점을 제공한다.

1.8 시스템은 네트워크를 사용하여 다른 시스템과 통신한다

1.9 중요한 주제들

1.9.1 Amdahl의 법칙

어떤 시스템의 한 부분의 성능을 개선할 때, 전체 시스템 성능에 대한 효과는 그 부분이 얼마나 중요한가와 이 부분이 얼마나 빨라졌는가에 관계된다는 것이다.

1.9.2 동시성과 병렬성

동시성(Concurrency)은 다수의 동시에 벌어지는 일을 갖는 시스템에 관한 일반적인 개념이고, 병렬성(Parallelism)은 동시성을 사용해서 시스템을 보다 빠르게 동작하도록 하는 것이다.

시스템 계층 구조의 높은 계층에서 낮은 계층으로 이동하면서 세 개의 수준을 강조한다.

  1. 쓰레드 수준 동시성: 프로세스 추상화 개념을 이용하면 다수의 프로그램이 동시에 실행되는 시스템을 생각해 볼 수 있다.
  2. 인스트럭션 수준 병렬성: 최근의 프로세서들은 훨씬 낮은 수준에서의 추상화로 여러 개의 인스트럭션을 한 번에 실행할 수 있다.
  3. 싱글 인스트럭션, 다중 데이터 병렬성(SIMD): 한 개의 인스트럭션이 병렬로 다수의 연산을 수행할 수 있는 특수 하드웨어

1.9.3 컴퓨터 시스템에서 추상화의 중요성

추상화의 사용은 전산학에서 가장 중요한 개념이다. 프로세서 측면에서, 인스트럭션 집합 구조는 실제 프로세서 하드웨어의 추상화를 제공한다. 추상화로 인해 기계어 코드 프로그램은 마치 한 번에 하나의 인스트럭션을 실행하는 프로세서에서 실행되는 것처럼 동작한다.

1.10 요약

컴퓨터 시스템은 응용프로그램을 실행하기 위해 함께 동작하는 하드웨어와 시스템 소프트웨어로 구성된다.

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

계층구조 상부의 저장장치들은 하부의 장치들을 위한 캐시 역할을 수행한다.

운영체제 커널은 응용프로그램과 하드웨어 사이에서 중간자의 역할을 수행한다.

운영체제는 세 가지 근본적인 추상화를 제공한다.

  1. 파일은 입출력장치의 추상화다.
  2. 가상메모리는 메인 메모리와 디스크의 추상화다.
  3. 프로세스는 프로세서, 메인 메모리, 입출력 장치의 추상화다.

네트워크는 컴퓨터 시스템이 서로 통신할 수 있는 방법을 제공한다.

0개의 댓글