public string DevelopmentDiary(Knowledge knowledge) {
if (knowledge != null) {
return "level up"
} else {
return "level down"
}
}
1. 컴퓨터 시스템으로의 여행
1-1. 정보는 비트와 컨텍스트로 이루어진다.
소스 프로그램 : 0또는 1로 표시되는 비트들의 연속이며 바이트라는 8비트 단위로 구성된다.
1-2. 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다.
- 각 C문장들은 다른 프로그램들에 의해 저급 기계어 인스트럭션들로 번역됨
- 인스트럭션들은 실행가능 목적 프로그램이라고 하는 형태로 합쳐져서 바이너리 디스크 파일로 저장됨
- 목적 프로그램은 실행가능 목적 파일이라고 불림
hello.c -(전처리)-> hello.i -(컴파일러)-> hello.s -(어셈블러)-> hello.o -(링커)-> hello
- 전처리 단계: 전처리기는 #문자로 시작하는 디렉티브에 따라 수정
(ex. 시스템 헤더파일인 stdio.h를 프로그램 문장에 삽입하라고 직접 지시) => .i로 끝나는 새로운 C프로그램 생성
- 컴파일 단계: 컴파일러는 텍스트파일 hello.i를 텍스트파일(어셈블리어) hello.s로 번역
* 어셈블리어는 여러 상위수준 언어의 컴파일러들을 위한 공통의 출력언어 제공
- 어셈블리 단계: 어셈블러가 hello.s를 기계어 인스트럭션(바이너리 코드)으로 번역하고 목적 프로그램의 형태로 묶어서 hello.o라는 목적파일에 저장
- 링크 단계: 파일과 그 안의 함수들의 목적 파일들 (ex. hello.o, printf.o)를 결합
1-3. 컴파일 시스템이 어떻게 동작하는지 이해하자~
컴파일 시스템이 어떻게 동작하는지 이해하는 것이 중요한 이유
- 프로그램 성능 최적화 (ex. 함수 호출시 발생하는 *오버헤드, for/while 문)
- 링크 에러 이해
- 보안 약점 피하기
* 오버헤드: 어떤 명령어를 처리하는데 소비되는 간접적, 추가적인 컴퓨터 자원
* 오버헤드의 원인: 스택 프레임 생성, 매개변수 전달, 리턴 주소 저장
1-4. 프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다.
1. 시스템의 하드웨어 조직
- 버스: 시스템 내를 관통하는 전기적 배선군, 컴포넌트들 간에 바이트 정보 전송
- 입출력 장치: 입출력 버스와 컨트롤러나 어댑터를 통해 연결됨
- 컨트롤러: 디바이스 자체가 칩셋이거나 시스템의 인쇄기판에 장착됨
- 어댑터: 머더보드의 슬롯에 장착되는 카드
- 메인 메모리: 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치
- 물리적 메인 메모리: DRAM 칩들로 구성
- 논리적 메인 메모리: 연속적인 바이트들의 배열
- 프로세서(주처리장치, CPU): 메인 메모리에 저장된 인스트럭션들을 해독하는 엔진, 프로세서의 중심에는 워드 크기의 저장장치인 프로그램 카운터(PC)가 있음
- 레지스터 파일: 고유의 이름을 갖는 워드 크기의 레지스터 집합으로 구성
- ALU: 새 데이터와 주소 값을 계산
- 적재(Load): 메인 메모리에서 레지스터에 한 바이트 또는 워드를 이전 값에 덮어쓰는 방식으로 복사
- 저장(Store): 레지스터에서 메인 메모리에 한 바이트 또는 워드를 이전 값에 덮어쓰는 방식으로 복사
- 작업(Operate): 두 레지스터의 값을 ALU로 복사하고 두 개의 워드로 수식연산을 수행한 뒤 결과를 덮어쓰기 방식으로 레지스터에 저장
- 점프(Jump): 인스트럭션 자신으로부터 한 개의 워드를 추출하고 이것을 PC에 덮어쓰기 방식으로 복사
2. hello 프로그램 실행
- 쉘 프로그램이 자신의 인스트럭션을 실행하면서 사용자가 명령을 입력하기 기다림
- 사용자가 입력하면 쉘 프로그램이 각각의 문자를 레지스터에 읽어들이고 메모리에 저장
- 엔터키를 누르면 쉘은 명령 입력을 끝마쳤다는 것을 알게됨
- 쉘은 파일 내의 코드와 데이터를 복사하는 일련의 인스트럭션 실행
- 실행 파일 hello를 *디스크에서 메인 메모리로 로딩
- 프로세서는 hello 프로그램의 main루틴의 기계어 인스트럭션 실행
- 인스트럭션들은 "hello, world\n" 스트링을 메모리로부터 레지스터 파일로 복사
- 디스플레이 장치로 전송하여 화면에 글자 표시
* 직접 메모리 접근(DMA) 기법을 이용하여 데이터는 프로세서를 거치지 않고 메인 메모리로 직접 이동
(일반적으로 다음과 같은 경우에 직접 이동)
1. 대용량 데이터 전송
2. 실시간 데이터 처리
3. 임베디드 시스템