본문 바로가기

프로그래밍/JUNGLE

[컴퓨터시스템] 1.8 ~ 1.10

 

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

시스템을 하드웨어와 소프트웨어의 분리된 집합체로 취급했다. 최신 시스템들은 네트워크에 의해 다른 시스템과 종종 연결된다. 이런 관점에서, 네트워크는 또 다른 입출력장치로 볼 수 있다.

telnet 응용을 사용하여 hello 프로그램을 다른 컴퓨터에서 실행하는 법:
'hello'를 telnet 클라이언트에 입력 -> telnet 서버 -> 원격 쉘 프로그램 -> hello 프로그램 실행 및 출력을 telnet 서버에 전달 -> 네트워크를 거쳐 telnet 클라이언트로 출력 전달 -> 로컬 터미널에 표시

 

 

1.9 중요한 주제들

시스템이라는 것은 단지 하드웨어 그 이상의 것이다.

응용프로그램의 실행이라는 궁극의 목적을 달설하기 위해, 하드웨어와 시스템 소프트웨어가 서로 연결된 것이다.
이런 지식을 통해, 보다 빠르고 안정적이고 안전한 프로그램을 작성할 수 있는지 배울 수 있다!

 

 

1.9.1 Amdahl의 법칙

Gene Amdahl은 한 시스템의 일부 성능 개선의 효율성에 대해 관찰하였다. 

시스템의 한 부분의 성능을 개선할 때, 전체 시스템 성능은 그 부분의 중요도와 속도 개선에 따른다는 법칙

 

출처 https://ko.wikipedia.org/wiki/%EC%95%94%EB%8B%AC%EC%9D%98_%EB%B2%95%EC%B9%99 

이 법칙의 주요 통찰: 60% 시간 소모하는 시스템의 3배를 개선하면, 전체는 1.67배가 된다. (일부의 개선은 전체로는 굉장히 작다) -> 전체 시스템을 빠르기 위해서는, 시스템의 매우 큰 부분의 성능을 개선해야 한다.

 

1.9.2 동시성과 병렬성

이 두 가지가 성능개선을 주도해왔다. 더 많을 일을 해내고, 더 빨리 실행되기를 원한다.
동시성 = 다수의 동시에 벌어지는 일을 갖는 시스템에 관한 일반적인 개념
병렬성 = 동시성을 사용해서 시스템을 보다 빠르게 동작하도록 하는 것

 

  • 쓰레드 수준 동시성

곡예사가 여러 개의 공을 공중에 던지는 것처럼 컴퓨터가 실행하는 프로세스를 빠르게 전환하는 방법

-> 여러 명의 사용자가 시스템과 동시에 교신 할 수 있게 함.

+ 윈도우에 웹 브라우저, 다른 윈도우에 문서 편집기 등등 동시에 작동! 실질적인 계산은 한개의 프로세서에 의해 이루어진다. 이런 시스템 구성을 단일 프로세서 시스템

멀티프로세서 시스템은 시스템이 여러 개의 프로세서를 가지고 하나의 운영체제 커널의 제어 하에 동작하는 경우

최근엔, 멀티코어 프로세서, 하이퍼쓰레딩 기법의 출현이 일반적인 환경

 

멀티코어 프로세서는 여러 개의 CPU(코어)를 하나의 집적화된 칩에 내장함.
멀티쓰레딩(하이퍼쓰레딩)은 하나의 CPU가 여러 개의 제어 흐름을 실행할 수 있게 해주는 기술.

기존 프로세서: 쓰레드간의 전환을 하는 데 약 2만 클럭 사이클
하이퍼쓰레드 프로세서: 매 사이클마다 실행할 쓰레드를 결정 (ex 쓰레드가 데이터를 캐시에 로딩하기 위해 대기해야 하면, CPU는 다른 쓰레드를 실행할 수 있음)

이런 멀티프로세싱은 시스템 성능을 개선한다.
1. 다수의 테스크를 실행할 때: 동시성을 시뮬레이션할 필요를 줄여줌.

2. 한 개의 응용프로그램을 빠르게 실행할 수 있지만, 프로그램이 병렬로 효율적으로 실행할 수 있는 멀티쓰레드의 형태로 표현 됐을 때만 가능

 

  • 인스트럭션 수준 병렬성

최근 프로세서는 낮은 수준에서의 추상화로 여러 개의 인스트럭션을 한 번에 실행. 이런 특성이 병렬성

 

  • 싱글 인스트럭션, 다중 데이터 병렬성(SIMD)

프로세서들이 최하위 수준에서 SIMD 모드로 한 개의 인스트럭션이 병렬로 다수의 연산을 수행할 수 있는 특수 하드웨어를 가짐

일부 컴파일러들이 자동으로 C 프로그램에서 SIMD 병렬성을 추출하는 시도를 하지만!
GCC 같은 컴파일러에서 지원하는 특수 벡터 데이터 형을 사용해 프로그램을 작성하는 것이 안정적이다.

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

자바의 클래스, C의 함수 프로토타임 등 프로그래머가 내부 동작을 고려하지 않으면서 코드를 사용할 수 있도록 해준다.

프로세서 측면: 인스트럭션 집합 구조는 실제 프로세서 하드웨어의 추상화를 제공

-> 기계어 코드 프로그램은 마치 한 번에 하나의 인스트럭션을 실행하는 프로세서에서 실행되는 것처럼 작동.

( 실제하드웨어는 훨씬 정교해서, 여러 개의 인스트럭션을 병렬로 실행한다)

 

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

프로그램 메모리의 추상화: 가상메모리

실행 중인 프로그램의 추상화: 프로세스

 

 

1.10 요약

시스템은 응용프로그램 실행을 위해 하드웨어 + 시스템 소프트웨어로 구성
ASCII 문자로 시작해서 컴파일러, 링커에 의해 바이너리 실행파일들로 번역되는 방식.
프로세서는 메인 메모리에 저장된 바이너리 인스트럭션을 읽고 해석
시스템의 저장장치들은 계층구조를 형성하여 CPU 레지스터가 최상위에, 하드웨어 캐시 메모리, DRAM 메인 메모리, 디스크 저장장치 등이 순차적으로 위치.
상부 계층의 장치들은 비트당 단가가 더 비싸고 더 빠르다.
상부 장치들은 하부 장치의 캐시 역할을 수행한다.

운영체제 커널은 응용프로그램과 하드웨어 사이에서 중간자의 역할
운영체제는 3가지 추상화를 제공한다. (파일, 가상메모리, 프로세스)