1-1. 정보는 비트와 컨텍스트로 이루어진다.
- 대표적으로 ASCII 코드는 각 바이트 숫자에 대응하는 문자가 존재한다.
- 'i' = 105
- 1byte 는 256개의 다른 값 표현이 가능하고, ASCII CODE는 128개를 사용한다.
1-2. 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다.
왜 다른 형태로 변해야 할까?
인간이 이해할 수 있는 프로그램은 소스파일에서 하드웨어가 이해할 수 있는 기계어 가 되어야 한다. 이 과정을 컴파일 이라고 하고, 4개의 과정이 존재한다.
- 전처리 (Preprocessing):
- 소스 코드에 포함된 매크로, 헤더 파일 등을 처리하여 컴파일러가 처리하기 쉬운 형태로 만듭니다.
- 컴파일 (Compilation):
- 전처리된 코드를 분석하여 어셈블리 코드로 변환합니다. 이때 문법 오류 및 의미 분석 등을 수행합니다.
- 어셈블 (Assembly):
- 어셈블리 코드를 기계어 코드로 변환합니다.
- 링킹 (Linking):
- 여러 개의 목적 파일을 합쳐 실행 가능한 하나의 파일을 만듭니다. 이때 라이브러리 파일도 함께 연결됩니다.
1-3. 컴파일 시스템이 어떻게 동작하는지 이해하는 것은 중요하다.
프로그램 성능 최적화하기
컴파일러의 내부동작을 알 필요는 없다. 다만
c문장을 기계어로 번역하는 과정에서 어떤 일이 일어나는지에 대해선 알아야 한다.
(ex- switch, if~else 중 어느 것이 효율적일까?..)
링크 에러 이해하기
링커에 대한 에러는 실행하기 전까진 나타나지 않는다
(그 이유는 7장)
변수가 겹치면? 지역변수 전역변수의 혼동 등이 이에 해당한다.
보안약점 피하기
1-4. 프로세서는 메모리에 저장된 인스트럭션을 읽고 해선한다.
hello.c 파일은 컴파일 과정을 거쳐 실행가능한 목적파일로 디스크에 저장된다.
유닉스 시스템은 실행하기위해서 쉘 이라는 응용프로그램에 이름을 입력한다.
1-4-1. 시스템의 하드웨어 조직
- 버스
- 전기적 배선군. 워드라고 하는 고정 크기 바이트 단위로 데이터 전송
- 현재는 4바이트 또는 8바이트
- 입출력 장치
- 입출력 버스와 입출력 장치들 간에 정보를 주고받도록 해주는 장치
- 메인 메모리
- 프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장 장치다.
- 프로세서
- 메모리에 저장된 인스트럭션들을 해독하는 엔진이다.
1-4-2. hello 프로그램 실행
- 직접메모리접근으로 디스크에서 바로 메인메모리에 적재
1-5. 캐시가 중요하다.
- 시스템이 정보를 한 곳에서 다른 곳으로 옮기는데에 코스트를 많이 사용한다.
- 메모리가 레지스터처럼 빨라질 순 없다.
- 그래서 등장한 것이 캐시! L1, L2 캐시가 존재한다
- 캐시를 이용하는 것이 매우중요
캐시를 구현하는 방식SRAM이라는 하드웨어 기술을 이용
1-6. 저장장치들은 계층구조를 이룬다.

메모리 계층의 중요한점은
한 레벨의 저장장치가 다른 하위레벨의 캐시 역할을 한다는 것.
1-7. 운영체제는 하드웨어를 관리한다.
- 운영체제는 제멋대로 동작하는 응용프로그램들이 하드웨어를 잘못 사용하는 것 을 막기위해
- 응용프로그램들이 단순하고 균일한 매커니즘을 사용항 복잡하고 매우다른 저수준 하드웨어장치들을 조작할 수 있도록 하기위해1-7-1. 프로세스프로세스는 실행중인 프로그램에 대한 운영체제의 추상화다.
cpu의 _context switch_가 다수의 프로세스를 동시에 실행하는 것처럼 보이게 한다.
두개의 프로세스
쉘과 hello 목적파일이 있다고 했을 때,
- 쉘은 실행명령을 받으면 시스템 콜이라는 특수함수를 호출해
운영체제로 제어권을 넘긴다. - 이 때 운영체제는 쉘의 컨텍스트를 저장하고, hello의 새 프로세스와 컨텍스트를 생성한 후 제어권을 넘긴다.
- 프로세스가 끝이나면 쉘 프로세스 컨텍스트를 복구시킨다.
프로세스간 전환은 운영체제의 커널이 담당한다
커널은 메모리에 항시 상주한다.
1-7-2. 쓰레드
쓰레드는 한 프로세스 안에서 실행되는 다수의 실행 유닛이다.
쓰레드 간 데이터 공유가 프로세스보다 쉽다.
1-7-3. 가상메모리
가상 메모리는 프로세스가 메인메모리를 독점하는 것처럼 보이게 하는 추상화이다.
Why..?
메모리 보호와 격리
메모리 효율성 실제 물리 메모리보다 더 큰 프로그램도 실행할 수 있어요. 필요한 부분만 실제 메모리에 올리고, 나머지는 디스크에 저장해두다가 필요할 때 불러오는 방식이죠. 여러 프로세스가 동시에 돌아도 각각 필요한 부분만 메모리에 올려서 효율적으로 사용할 수 있어요.
프로그래밍 편의성 프로그래머가 물리적인 메모리 주소를 신경 쓸 필요가 없어져요. 항상 0번지부터 시작하는 일관된 주소 공간을 사용할 수 있고, 다른 프로그램이 메모리를 어떻게 사용하는지 몰라도 되죠.
동적 메모리 할당 프로그램이 실행 중에 필요에 따라 메모리를 할당받거나 해제할 수 있어요. 가상 메모리가 이런 작업을 투명하게 관리해주죠.
=> 안정적이고 효율적인 메모리관리!
1-8. 시스템은 네트워크를 통해 다른 시스템과 통신한다.
개별 시스템이라는 관점에서 볼 때, 네트워크는 메모리로부터 네트워크 어댑터로
정보를 복사시키는 (전송) 점에서 또 다른 입출력 장치로 볼 수 있다.
현대의 통신 기술은 네트워크 어댑터를 통한 정보의 복사다
1-9. 중요한 주제들
1-9-1. 암달의 법칙
암달의 법칙 요약:
- 병렬화의 한계:
아무리 병렬 처리를 해도 순차적으로 처리해야 하는 부분이 있으면 성능 향상에는 한계가 있습니다. - 성능 향상의 제한 요인:x
프로그램의 순차적인 부분, 즉 병렬화할 수 없는 부분은 병렬 처리 속도 향상을 제한하는 주요 요인입니다. - 최대 성능 향상:
병렬화 비율이 높을수록 성능 향상 효과는 커지지만, 순차적인 부분 때문에 특정 지점 이상으로는 성능 향상이 어려워집니다
1-9-2. 동시성과 병렬성
- 동시성: 동시에 벌어지는 다수의 일을 갖는 시스템
- 병렬성: 동시성을 사용해서 시스템을 보다 빠르게 동작하도록 하는 것
쓰레드 수준의 동시성
CPU에서 멀티코어와 멀티쓰레드를 구현해 병렬성을 구현
인스트럭션 수준의 병렬성
이전: 1개의 인스트럭션 3.1개의 사이클 필요
현재: 1개의 사이클에 2.4개의 인스터럭션 사용가능
파이프라인 설계로 구현함.
싱글 인스트럭션, 다중데이터 병렬성(SIMD)
cpu 수준. 하나의 인스트럭션이 많은 데이터를 처리한다.
부동소수점, 영상,소리,동영상데이터 처리를 위한 응용프로그래의 성능을 높이기 위해 사용한다.
1-9-3. 컴퓨터시스템에서 추상화의 중요성
인스트럭션 집합 구조는 실제 프로세서 하드웨어의 추상화를 제공한다.
기계어 프로그램은 마치 한번에 하나의 인스트럭션을 실행하는 프로세서에서 실행되는 것처럼 보인다.