윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.
1장. Computer Architecture
I. 시스템 프로그래밍의 이해와 접근
1. 시스템 프로그래밍이란?
= 하드웨어를 사용할 수 있도록 도와주는 프로그램
- 운영체제에서 제공하는 라이브러리(운영 체제 기능을 활용할 수 있는 시스템 함수들)를 이용
2. 컴퓨터 시스템의 주요 구성 요소
CPU <-> 캐쉬 (Cache) <=> 메인 메모리 <-> 하드디스크
CPU & 캐쉬 = 컴퓨터 구조 (Computer Architecture)
메인 메모리 & 하드 디스크 = 운영체제 (Operating System)
- 중앙 처리 장치 -> 컴퓨터의 머리
2. 메인 메모리
- RAM이라는 저장 장치로 구성
- 컴파일이 완료된 프로그램 코드가 올라가서 실행되는 영역
- 파일은 하드 디스크에 저장되나 프로그램이 실행되면 메모리에 로드됨
3. 입, 출력 버스
- 컴퓨터를 구성하는 구성 요소 사이에서 데이터를 주고 받기 위한 경로.
- 어드레스 버스, 데이터 버스, 컨트롤 버스로 나뉨
- 버스를 통해 하드에 있는 데이터를 메인 메모리로 전송 가능
(메인 메모리와 CPU사이의 데이터 입, 출력도 가능하게 함)
III. CPU에 대한 이해
1. ALU (Arithmetic Logic Unit)
- CPU 내부에서 실제 연산을 담당하는 부분 (나머지는 연산을 도와줌)
- 덧셈과 뺄셈 같은 산술 연산 + AND와 OR 같은 논리 연산
2. 컨트롤 유닛 (Control Unit)
- ALU 연산을 위해 명령어를 해석하는 부분
- "1001101 0001101..." 와 같은 바이너리를 덧셈과 뺄셈과 같은 연산으로 바꿔줌
=> ∴ 명령어를 해석 & 그 결과를 다른 CPU 블록에 전송
3. CPU 내부에 존재하는 레지스터들 (Register Set)
- CPU 내부에서 임시적으로 데이터를 저장할 수 있는 메모리 공간
=> CPU 내부에 존재하는 이진 데이터를 저장하기 위한 저장 장치
- CPU에 따라 16비트, 32비트, 64비트 크기의 데이터를 저장
- 각각 용도가 정해져 있는것이 일반적
4. 버스 인터페이스 (Bus Interface)
- CPU 내부에서 I/O 버스 통신 방식을 이해하고 있는 장소
- I/O 버스 : 컴퓨터 내부에서 데이터를 주고 받는 매개체
- 버스가 어떻게 데이터를 전송하는지에 대한 프로토콜 (= 통신방식)을 알고 있음
- CPU는 버스 인터페이스를 통해 레지스터에 저장되어 있는 데이터 송수신을 수행
=> 컴퓨터의 다른 저장 장치도 I/O 버스와의 연결을 위해 인터페이스를 가지고 있음
5. 클럭 신호 (Clock Pulse)
- CPU는 매 클럭이 발생할 때 마다 그 클럭에 맞춰 일을 수행
=> 클럭 발생기에 의해 발생되는 Clock Pulse는 CPU 구성 요소에 제공되며 이 신호에 맞춰
CPU가 일을 처리함
- 각 데이터 처리(ex. 연산, 출력 ...) 속도가 다르므로 느린 처리 속도에 맞춰줌
IV. 프로그램의 실행 과정
1. 수학자 폰 노이만 (J. von Neumann)
[CPU ] <=> [ 메모리 ] <--로드 (Load)-- 프로그램
- 이전까지 진공관의 스위치 구성을 프로그램이라 정의 (스위치를 수동으로 변경)
- 폰 노이만은 프로그램이 컴퓨터 내부에 저장되는 구조를 제시
2. 프로그램의 실행 과정 (실행 파일의 생성 과정)
- 전처리기 -> 컴파일러 -> 어셈블러 -> 링커
① 전처리기에 의한 치환작업 (여전히 사람이 이해할 수 있는 C코드)
- #include, #define과 같이 '#'으로 시작하는 지시자의 지시에 따라 소스 코드를
적절하게 변경하는 작업
② 컴파일러에 의한 번역
- 컴파일러에 의해 어셈블리 코드로 번역
- 어셈블리 코드 : CPU에게 일을 시키기 위한 명령어로 구성된 코드
③ 어셈블러에 의한 바이너리 코드 생성
- 바이너리 코드 : 1과 0으로만 구성된 코드
- 컴퓨터는 1과 0만을 이해하기 때문에 바이너리 코드를 생성
④ 링커에 의한 연결과 결함
- 프로그램 내에서 참조하는 함수나 라이브러리르 하나로 묶는 작업
-> 이후 바이너리 코드로 구성된 실행 파일이 생성됨
- 메모리 공간에 올라간 명령어들은 순차적으로 실행됨
- 단계1 Fetch : 메모리 상의 명령어를 CPU로 가져오는 작업
- 단계2 Decode : 명령어를 CPU가 해석하는 단계 -> 무슨 일을 하라는 명령어인지 분석
- 단계3 Execution : 해석된 명령어의 명령을 CPU가 실행하는 단계
∴ 프로그램 실행 과정 : Fetch -> Decode -> Execution
- #include, #define과 같이 '#'으로 시작하는 지시자의 지시에 따라 소스 코드를
적절하게 변경하는 작업
② 컴파일러에 의한 번역
- 컴파일러에 의해 어셈블리 코드로 번역
- 어셈블리 코드 : CPU에게 일을 시키기 위한 명령어로 구성된 코드
③ 어셈블러에 의한 바이너리 코드 생성
- 바이너리 코드 : 1과 0으로만 구성된 코드
- 컴퓨터는 1과 0만을 이해하기 때문에 바이너리 코드를 생성
④ 링커에 의한 연결과 결함
- 프로그램 내에서 참조하는 함수나 라이브러리르 하나로 묶는 작업
-> 이후 바이너리 코드로 구성된 실행 파일이 생성됨
- 메모리 공간에 올라간 명령어들은 순차적으로 실행됨
- 단계1 Fetch : 메모리 상의 명령어를 CPU로 가져오는 작업
- 단계2 Decode : 명령어를 CPU가 해석하는 단계 -> 무슨 일을 하라는 명령어인지 분석
- 단계3 Execution : 해석된 명령어의 명령을 CPU가 실행하는 단계
∴ 프로그램 실행 과정 : Fetch -> Decode -> Execution
V. 하드웨어의 재접근
1. 폰 노이만의 컴퓨터 구조 VS 오늘날의 컴퓨터 구조
- Execution의 주체 = ALU
- Decode의 주체 = Control Unit
- 명령어의 저장 위치 = 레지스터 ( 특히 레지스터 중 IR (Instruction Register) )
2. 데이터 이동의 기반이 되는 Bus 시스템
- 버스 시스템 : 데이터를 주고 받는데 있어서 사용되는 전송 경로
CPU <=== [ 어드레스 버스, 데이터 버스, 컨트롤 버스 ] ===> 메모리
① 데이터 버스
- 데이터 ( ex. 명령어, 피연산자 ... ) 를 이동시키기 위해 필요한 버스
② 어드레스 버스
- 주소값을 이동하기 위해 필요한 버스
( 메모리는 주소가 전달되면 해당 주소의 데이터가 전달되는 컨트롤러를 가짐)
③ 컨트롤 버스
- CPU가 원하는 바를 메모리에 전달할 때 사용
-> CPU와 메모리가 서로 특별한 Sign을 주고 받는 용도로 사용됨
- CPU가 데이터를 받을지 보낼지와 같이, 하고자 하는 일이 무엇인지 알려줌
참고 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍. 윤성우 저
참고 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍. 윤성우 저
댓글 없음:
댓글 쓰기