csapp 까지 쓰려니까 너무 길어서 자름
L1, L2 캐시는 SRAM(Static Random Access Memory)이라는 하드웨어 기술로 구현
idea : 지역성(locality)을 활용하여 시스템이 매우 크고 빠른 메모리 효과를 얻음.
-- 지역성 : 프로그램이 지엽적인 영역의 코드와 데이터를 액세스하는 경향

주요 idea : 한 레벨의 저장장치가 다음 하위 레벨 저장 장치의 캐시 역할을 한다
ex ) L1, L2의 캐시 -> L2, L3 의 캐시, L3의 캐시 -> 메인 메모리의 캐시
hello.c 처럼 프로그램이 키보드, 디스플레이 같은 하드웨어를 제어하지 않음 -> 운영체제(Operation Systemp)가 제공하는 서비스 활용
운영체제 : soft ware와 hard ware 사이에 위치한 소프트웨어 계층

운영체제의 목적
1. 제 멋대로 동작하는 응용프로그램들이 하드웨어를 잘못 사용하지 못하게 함.
2. 응용프로그램들이 단순하고 균일한 매커니즘을 사용하여 복잡하고 매우 다른 저수준 하드웨어 장치들을 조작할 수 있도록 함.
프로세스 : 실행 중인 프로그램에 대한 운영체제의 추상화
다수의 프로세스들을 동일한 시스템에서 동시에(Concurrent) 실행가능
-- 한 프로세스의 인스트럭션들이 다른 프로세스의 인스트럭션들과 섞임.
-- 멀티코어 프로세서 : 여러 개의 프로그램을 동시에 실행 가능( -> 프로세서가 프로세스들을 바꿔주는 방식)
운영체제의 문맥전환(Context switching)
-- 프로세서의 교차 실행을 수행
: 운영체제는 프로세스 실행에 필요한 모든 상태 정보(Context)의 변화를 추적.
단일 프로세서 시스템은 한 개의 프로세스의 코드만을 실행할 수 있다.
운영체제는 현재 프로세스에서 다른 새로운 프로세스로 제어를 옮기려할 때
현재 프로세스의 컨텍스트를 저장하고 새 프로세스의 컨텍스트를 복원 시키는
문맥전환을 실행하여 제어권을 새 프로세스로 넘겨준다.
새 프로세스는 이 전에 중단했던 바로 그 위치부터 다시 실행.

-> 두 개의 동시성(concument)프로세스 존재
쉘 프로세스가 명령받음
쉘이 시스템 콜(특수함수)을 호출하여 운영체제로 제어권 넘김
운여체제는 쉘의 컨텍스트 저장 후 새로운 프로세스와 컨텍스트 생성 후 제어권을 새 프로세스에 넘겨줌.
이 때 프로세스의 전환을 운영체제 커널(Kernel)에 의해 관리

-- 리눅스에서 주소 공간의 최상위 영역은 모든 프로세스들이 공통으로 사용하는 운영체제의 코드와 데이터를 위한 공간.
-- 위쪽으로 올라갈 수록 주소가 증가.
프로그램 코드와 데이터
코드는 모든 프로세스들이 같은 고정 주소에서 시작 -> 이 후 C 전역 변수에 대응되는 데이터 위치들이 따라옴. 실행 가능 목적 파일인 hello로부터 직접 초기화.
힙 Heap
이후 런타임 힙이 따라옴. 프로세스가 실행되며 C 표준함수인 malloc이나 free를 호출하여 런타임에 동적으로 크기가 변한다.
공유 라이브러리
주소 공간 중간 부근에 C 표준 라이브러리나 수학 라이브러리와 같은 공유 라이브러리의 코드와 데이터를 저장하는 영역
스택 Stack
사용자 가상 메모리 공간의 맨위에 컴파일러가 함수 호출을 구현하기 위해 사용하는 사용자 스택이 위치.
힙과 마찬가지로 동적으로 크기가 변함. 함수 호출 시엔 커지고 리턴시에 작아진다.
커널 가상 메모리
주소 공간의 맨 윗부분. 응용프로그램들은 이 영역의 내용을 읽거나 쓰는 것이 금지된다.
커널 코드 내에 정의된 함수를 직접 호출하는 것도 금지됨.
대신 이러한 작업 수행을 위해선 커널을 직접 호출해야한다.
연속된바이트들. 디스크, 키보드, 디스플레이, 네트워크까지 포함하는 모든 입출력 장치를 파일로 모델링.
시스템의 모든 입출력을 유닉스 I/O라는 시스템 콜들을 이용해 파일은 읽고 쓰는 형태로 이뤄짐
응용 프로그램에 시스템에 들어 있는 여러 입출력 장치들에 통일된 관점 제공
디스크 타일 내용 조작에 사용하고 있는 특정 디스크 기술에 대해서 몰라도 됨.