1.1 정보는 비트와 컨텍스트로 이루어진다
모든 시스템 내부의 정보는 비트들로 표시
- hello.c라는 소스 프로그램은 0또는 1로 표시되는 비트들의 연속
- 바이트라는 8비트 단위로 구성
- 텍스트 문자를 아스키 표준을 사용하여 표시한다
- hello.c 는 각 텍스트가 연속된 바이트들로 파일에 저장
다 비트인데.. 객체구분을 어떻게? 컨텍스트에 의해서
- 동일한 일련의 바이트 각기 다른 컨텍스트에서 정수, 부동솟, 문자열 또는 기계어 명령을 의미할 수 있다
1.2 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다
- GCC 컴파일러 드라이버는 소스파일 hello.c를 읽어서 실행 파일인 hello로 번역 아래와 같은 4단계
- 이 4단계를 실행하는 프로그램들 : 전처리기, 컴파일러, 어셈블러, 링커 -> 컴파일 시스템
![](https://media.vlpt.us/images/bongf/post/ab13cfdc-8ffe-4300-9fef-6be49a3ed991/image.png)
- 전처리 단계 : 전처리기(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부터 시작해서 고유의 주소(배열의 인덱스)를 가지고 있다.
- 한 개의 프로그램을 구성하는 각 기계어 인스트럭션은 다양한 바이트 크기를 갖는다
프로세서
- 주처리장치(CPU)
- 메인 메모리에 저장된 인스트럭션을 실행하는 엔진
- 프로세스의 중심에는 워드 크기의 저장장치(또는 레지스터)인 프로그램 카운터
PC
가 있다
- 시스템 전원 들어올 때부터 끊길 때까지 CPU는 프로그램 카운터가 가리키는 곳을 실행 -> PC값이 다음 인스트럭션 가리키도록 업데이트
![](https://media.vlpt.us/images/bongf/post/07174d66-a670-4671-9139-83450d776ef9/image.png)
1.4.2 hello 프로그램 실행
- 쉘 프로그램에 ".\hello" 입력하면 쉘 프로그램은 각 문자를 레지스터에 읽어 들인 후, 그림 1.5와 같이 메모리에 저장
- 그림 1.5
![](https://media.vlpt.us/images/bongf/post/9a519f22-4f27-4a3c-af70-9f3d25573792/image.png)
- 키보드에 엔터 누리면 쉘은 명령 입력 끝났다는 것을 알고 쉘 파일 내의 코드와 데이터를 복사하는 일력읜 인스트럭션 실행헤서 hello 파일을 디스크에서 메인 메모리로 로딩(그림 1.6)
- 직접 메모리 접근(DMA 6장 설명)이용해서 데이터는 프로세서 거치치 않고 디스크에서 메인 메모리로 직접 이동("hello, world\n") 을 포함 -> 그림 1.6
- 그림 1.6
![](https://media.vlpt.us/images/bongf/post/d7a0eb49-c44c-4cee-be22-14753de15834/image.png)
- hello 목적파일의 코드, 데이터가 메모리에 적재 -> 프로세서는 hello 프로그램의 main 루틴의 기계어 인스트럭션 실행
- 이 인스터력션들은 "hello, world\n" 스트링을 메모리로부터 레지스터 파일로 복사하고 거기로부터 디스플레이 장치로 전송하여 화면에 글자 표시 -> 그림 1.7
- 그림 1.7
![](https://media.vlpt.us/images/bongf/post/adaac696-af5c-41b8-ab92-13f8427528b3/image.png)
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 시스템은 네트워크를 통해서 다른 시스템과 통신한다
- 네트워크는 단지 또 다른 입출력 장치로 볼 수 있다
![](https://media.vlpt.us/images/bongf/post/fc55f127-2d69-412f-94e3-37ff8485af60/image.png)
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가지 추상화 : 파일(입출력 추상화), 가상메모리(메인메모리, 디스크 추상화), 프로세스(프로세서, 메인메모리, 입출력 장치의 추상화)
- 네트워크 : 컴퓨시 시스템이 서로 통신할 수 있는 방법 제공
- 특정 시스템의 관점으로 볼 때 네트워크는 단지 또 하나의 입출력 장치