2012년 8월 23일 목요일

윈도우즈 시스템 프로그래밍 [1] - 컴퓨터 구조


윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.


1장. Computer Architecture


I. 시스템 프로그래밍의 이해와 접근


1. 시스템 프로그래밍이란?


- 시스템 프로그램 = 컴퓨터 시스템을 동작시키는 프로그램 ex) Windows, UNIX 같은 운영체제
   = 하드웨어를 사용할 수 있도록 도와주는 프로그램

- 운영체제에서 제공하는 라이브러리(운영 체제 기능을 활용할 수 있는 시스템  함수들)를 이용


2. 컴퓨터 시스템의 주요 구성 요소


CPU <-> 캐쉬 (Cache) <=> 메인 메모리 <-> 하드디스크

CPU & 캐쉬 = 컴퓨터 구조 (Computer Architecture)

메인 메모리 & 하드 디스크 = 운영체제 (Operating System)


II. 컴퓨터 하드웨어의 구성



1. CPU (Central Processing Unit)


- 중앙 처리 장치 -> 컴퓨터의 머리

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



V. 하드웨어의 재접근


1. 폰 노이만의 컴퓨터 구조 VS 오늘날의 컴퓨터 구조


- Execution의 주체 = ALU
- Decode의 주체 = Control Unit
- 명령어의 저장 위치 = 레지스터 ( 특히 레지스터 중 IR (Instruction Register) )


2. 데이터 이동의 기반이 되는 Bus 시스템


- 버스 시스템 : 데이터를 주고 받는데 있어서 사용되는 전송 경로

CPU   <=== [ 어드레스 버스, 데이터 버스, 컨트롤 버스 ] ===>   메모리


① 데이터 버스

- 데이터 ( ex. 명령어, 피연산자 ... ) 를 이동시키기 위해 필요한 버스

② 어드레스 버스

- 주소값을 이동하기 위해 필요한 버스 
   ( 메모리는 주소가 전달되면 해당 주소의 데이터가 전달되는 컨트롤러를 가짐)

③  컨트롤 버스

- CPU가 원하는 바를 메모리에 전달할 때 사용
   -> CPU와 메모리가 서로 특별한 Sign을 주고 받는 용도로 사용됨

- CPU가 데이터를 받을지 보낼지와 같이, 하고자 하는 일이 무엇인지 알려줌




참고 : 뇌를 자극하는 윈도우즈 시스템 프로그래밍. 윤성우 저

댓글 없음:

댓글 쓰기