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

bongf·2022년 4월 2일
0

CS

목록 보기
1/1

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

모든 시스템 내부의 정보는 비트들로 표시

  • hello.c라는 소스 프로그램은 0또는 1로 표시되는 비트들의 연속
  • 바이트라는 8비트 단위로 구성
  • 텍스트 문자를 아스키 표준을 사용하여 표시한다
  • hello.c 는 각 텍스트가 연속된 바이트들로 파일에 저장

다 비트인데.. 객체구분을 어떻게? 컨텍스트에 의해서

  • 동일한 일련의 바이트 각기 다른 컨텍스트에서 정수, 부동솟, 문자열 또는 기계어 명령을 의미할 수 있다

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

  • GCC 컴파일러 드라이버는 소스파일 hello.c를 읽어서 실행 파일인 hello로 번역 아래와 같은 4단계
    • 이 4단계를 실행하는 프로그램들 : 전처리기, 컴파일러, 어셈블러, 링커 -> 컴파일 시스템

  • 전처리 단계 : 전처리기(cpp)는 본래의 c프로그램을 #문자로 시작하는 디렉티브(directive)에 따라 수정
    • 예. #include<stdio.h> 시스템 헤더 파일인 stdio.h를 프로그램 문장에 직접 삽입
    • .i로 끝나는 새 C 프로그램 생성
  • 컴파일 단계 : 컴파일러(cc1)은 텍스트파일 hello.i를 텍스트 파일 hello.s로 번역, 결과로 어셈블리어 프로그램을 만든다
  • 어셈블리 단계 : 어셈블러(as)가 hello.s를 기계어 인스트럭션으로 번역하고 이들 재배치가능 목적프로그램의 형태로 묶어서 hello.o라는 목적파일에 그 결과를 저장.
  • 링크단계 :
    • 예를 들어 printf라는 함수는 printf.o라는 목적파일에 저장되어 있다. 이를 사용하려면 hello.o파일과 어떤 형태로든 결합을 맺어야 하고, 링커프로그램(ld)가 이 작업을 수행한다
    • 결과물 : hello 파일 == 실행가능 목적파일(실행파일) 메모리에 적재되어 시스템에 의해 실행된다

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

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

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

  • 위에서 hello 파일을 만들었잖아. 이것이 디스크에 저장되었을 것이고
  • 이 실행파일을 유닉스 시스템에서 실행하기 위해서는 이라는 응용프로그램에 그 이름을 입력한다
  • 쉘은 커맨드라인 인터프리터. 프롬프트를 출력하고 명령어 라인을 입력 받아 그 명령을 실행한다
  • hello 파일 실행하기 ./hello
    • 쉘은 명령어 라인이 내장 쉘 명령어가 아니라면 쉘은 실행파일의 이름으로 판단하고 그 파일을 로딩해서 실행해 준다
    • 그래서 위 명령어를 입력하면 hello 프로그램을 로딩하고 실행한 뒤 종료를 기다린다

1.4.1 시스템의 하드웨어 조직

버스 (Buses)

  • 시스템 내를 관통하는 적기적 배선군
  • 컴포넌트 들 간에 바이트 정보를 전송
  • 일반적으로 워드 word 라는 고정 크기의 바이트 단위로 데이터를 전송하도록 설계
  • 한개의 워드를 구성하는 바이트 수는 시스템마다 보유하는 기본 시스템 변수
    • 오늘날 대부분 컴퓨터 4바이트(32비트) 8바이트(64비트) 워드 크기를 갖는다

입출력 장치

  • 시스템과 외부 세계와의 연결을 담당한다
  • hello 프로그램은 디스크에 처음에 저장
  • 각 입출력 장치는 입출력 버스와 컨트롤러나 어댑터를 통해 연결
    • 입출력 장치 - (컨트롤러/어댑터) - 입출력 버스

메인메모리

  • 프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치
  • 물리적으로 메인 메모리는 DRAM Dynamic Random Access Memory 침드롤 구성되어 있다
  • 논리적으로 메모리는 연속적인 바이트들의 배열로, 각각 0부터 시작해서 고유의 주소(배열의 인덱스)를 가지고 있다.
  • 한 개의 프로그램을 구성하는 각 기계어 인스트럭션은 다양한 바이트 크기를 갖는다

프로세서

1.4.2 hello 프로그램 실행

  • 쉘 프로그램에 ".\hello" 입력하면 쉘 프로그램은 각 문자를 레지스터에 읽어 들인 후, 그림 1.5와 같이 메모리에 저장
  • 그림 1.5
  • 키보드에 엔터 누리면 쉘은 명령 입력 끝났다는 것을 알고 쉘 파일 내의 코드와 데이터를 복사하는 일력읜 인스트럭션 실행헤서 hello 파일을 디스크에서 메인 메모리로 로딩(그림 1.6)
    • 직접 메모리 접근(DMA 6장 설명)이용해서 데이터는 프로세서 거치치 않고 디스크에서 메인 메모리로 직접 이동("hello, world\n") 을 포함 -> 그림 1.6
  • 그림 1.6
  • hello 목적파일의 코드, 데이터가 메모리에 적재 -> 프로세서는 hello 프로그램의 main 루틴의 기계어 인스트럭션 실행
    • 이 인스터력션들은 "hello, world\n" 스트링을 메모리로부터 레지스터 파일로 복사하고 거기로부터 디스플레이 장치로 전송하여 화면에 글자 표시 -> 그림 1.7
  • 그림 1.7

1.5 캐시가 중요하다

  • 이전의 과정을 통해 시스템이 정보를 한 곳에서 다른 곳으로 이동시키는 일에 많은 시간을 보낸다는 점을 알게 되었다.
  • 이러한 여러 복사 과정들이 프로그램의 "실제 작업"을 느리게 만들기 때문에 시스템 설계자들의 주요 목적은 이런 복사과정들을 가능한 한 빠르게 동작하도록 하는 것
  • 더 큰 저장장치들은 보다 작은 저장장치들보다 느린속도
    • 비용은 당연히 빠른 장치들 만드는데 든다
  • 기술이 발달하면서 프로세서-메모리 격차 증가
    • 프로세서는 점점 더 빨라진다
    • 메인메모리 빠르게 만드는 것보다 프로세스 빠르게 만드는 것이 더 쉽고 비용 적게 든다
  • 프로세서 - 메모리 격차에 대응하기 위해 시스템 설계자는 보다 작고 빠른 캐시메모리(캐시)라는 저장장치 고안
  • 캐시 : 프로세서가 단기간에 필요로 할 가능성이 높은 정보를 임시 저장
  • L1, L2, L3 3단계로 캐시를 구성하게도 한다
  • 캐시메모리를 이해하는 응용프로그래머는 자신의 캐시를 활용해서 자신의 프로그램 성능을 빠르게 할 수 있다

1.6 저장장치는 계층 구조를 이른다

  • 컴퓨터 시스템 저장장치들은 메모리 계층구조를 이루고 있다
  • 꼭대기 -> 바닥 : 느리고, 크고, 바이트당 가격 저렴
  • 레지스터 파일은 L0(최상위), 메인메모리 (L)
  • 계층구조의 핵심 : 한 레벨의 저장장치가 다음 하위 레벨 저장 장치의 캐시 역할을 한다

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

1.7.1 프로세스

  • 프로세스는 실행 중인 프로그램에 대한 운영체제의 추상화
  • 다수의 프로세스들은 동일 시스템 내에서 동시에 실행될 수 있다. 우리는 프로세스는 하드웨어를 배타적으로 사용하는 것처럼 느낀다.
  • 동시에 concurrently 라는 말은 한 프로세스의 인스트럭션들이 다른 프로세스들의 인스트럭션과 섞인 다는 것을 의미
  • 운영체제는 문맥 전환 context switching을 통해서 프로세스간 교추 실행
  • 지금은 단일 프로세스만 고려(멀티 프로세서 나중에)
  • 컨텍스트 : 운영체제가 추적하는 (프로세스가 실행하는 데 필요한 모든 상태정보)
  • 프로세스 간 전환은 운영체제 커널 kernel에 의해서 관리
  • 커널은 운영체제 코드의 일부분, 메모리 상주
  • 응용 프로그램이 운영체제에 의한 어떤 작업 요청 -> 그 요청에 상응하는 특정 시스템 콜을 실행에 커널에 제어를 넘겨준다(cpu가?) -> 커널은 요청된 작업 수행 -> 커널 응용프로그램 리턴
    • 커널은 별도의 프로세스가 아니다
    • 커널은 모든 프로세스 관리하기 위해 시스템이 이용하는 코드와 자료구조 집합

1.7.2 쓰레드

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

1.7.3 가상 메모리

1.7.4 파일

  • 파일은 연속된 바이트 들
  • 모든 입출력 장치는 파일로 모델링한다
  • 응용 프로그램에 시스템에 들어 있는 다양한 입출력장치들의 통일된 관점 제공 -> 파일
    • 디스크 파일 내용 조작하려는 응용 프로그래머는 특정 디스크의 기술에 대해서는 몰라도 된다

1.8 시스템은 네트워크를 통해서 다른 시스템과 통신한다

  • 네트워크는 단지 또 다른 입출력 장치로 볼 수 있다

1.9 중요한 주제들

1.9.1 Amdahi의 법칙

우리가 시스템의 한 부분의 성능을 개선할 때 전체 시스템 성능에 대한 효과는 그 부분이 얼마나 중요한가와 이 부분이 얼마나 빨라졌는가에 관계된다는 것이다. ... 식은 이해 안가지만 어쨌든 중요한 통찰은 전체 시스템을 상당히 빠르게 하기 위해서는 전체 시스템의 매우 큰 부분의 성능을 개선해야 한다.

1.9.2 동시성과 병렬성

  • 동시성 : 다수의 동시에 벌어지는 일을 갖는 시스템에 관한 일반적인 개념
  • 병렬성 : 동시성을 사용해서 시스템을 보다 빠르게 동작하도록 하는 것을 말할 때

쓰레드 수준 동시성

  • 쓰레드를 이용하면 한 개의 프로세스 내에서 실행되는 다수의 제어 흐름을 가질 수 있다
  • 엄청 빨리 교환해서 마치 한 개의 프로세스를 독자적으로 사용하는 것 같은 효과
  • 여러 개의 프로세서 가지고 하나의 운영체제 커널의 제어 하에 동작하는 경우를 멀티프로세서 시스템 이라고 한다.
    • 멀티코어 프로세서, 하이퍼 쓰레딩
  • 멀티코어 프로세서 : 여러개의 CPU를 하나의 집적화된 칩에 내장
    • ex. i7 프로세서 구성 : 메인 메모리 L3까진 공유 그 위 L2, L1은 코어당 갖고 있는
  • 하이퍼 쓰레딩 : 하나의 cpu가 여러 개의 제어 흐름을 실행 할 수 있게 해주는

인스트럭션 수준 병렬성

  • 여러 개의 인스트럭션 한 번에 실행
  • 사이클당 한 개 이상의 인스트럭션 실행할 수 있는 프로세서 : 슈퍼 스케일러

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

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

  • 컴퓨터 시스템이 제공하는 일부 추상화 개념
  • 프로세서 측면에서, 인스트럭션 집합 구조는 실제 프로세서 하드웨어의 추상화를 제공
  • 운영체제 측면에서, 3가지 추상화
    • 파일 : 입출력 장치의 추상화
    • 가상메모리: 프로그램 메모리의 추상화
    • 프로세스 : 실행중인 프로그램의 추상화
    • 가상머신 : 운영체제, 프로세서, 프로그램 모두를 포함하는 컴퓨터 전체의 추상화

1.10 요약

  • 컴퓨터 시스템은 응용프로그램을 실행하기 위해 함께 동작하는, 하드웨어와 + 시스템 소프트웨어로 구성
  • 컴퓨터 내의 정보는 상황에 따라 다르게 해석되는 비트들의 그룹으로 표시
  • 프로그램은 아스키 문자로 시작해서 -> 컴파일러, 링커에 의해 바이너리 실행파일들로 번역되는 방식, 다른 프로그램들에 의해 다른 형태로 번역
  • 프로세서는 메인 메모리에 저장된 바이너리 인스트럭션 읽고 해석
  • 컴퓨터가 대부분의 시간을 메모리, 입출력장치, CPU 레지스터 간에 데이터를 복사하는데 쓰고 있으므로 시스템의 저장장치들은 계층 구조를 형성하여 CPU 레지스터가 최상위, 하드웨어 캐시메모리, DRAM 메인 메모리, 디스크 저장장치 등이 순차적으로 위치한다.
    • 계층 구조 상부로 갈 수록 비트당 단가가 더 비싸고, 더 빠르다
    • 계층 구조 상부의 저장장치는 하부 저장장치의 캐시 역할 수행
      • 프로그래머는 이를 이용해 자신의 프로그램 최적화 시킬 수 있다
  • 운영체제 커널은 응용프로그램과 하드웨어 간의 중간자 역할
    • 운영체제는 3가지 추상화 : 파일(입출력 추상화), 가상메모리(메인메모리, 디스크 추상화), 프로세스(프로세서, 메인메모리, 입출력 장치의 추상화)
  • 네트워크 : 컴퓨시 시스템이 서로 통신할 수 있는 방법 제공
    • 특정 시스템의 관점으로 볼 때 네트워크는 단지 또 하나의 입출력 장치
profile
spring, java학습

0개의 댓글

관련 채용 정보