오다기리 박의 알고리즘 노트

1장. 컴퓨터 구조에 대한 첫 번째 이야기 본문

운영체제

1장. 컴퓨터 구조에 대한 첫 번째 이야기

오다기리 박 2018. 8. 8. 23:14

1장. 컴퓨터 구조에 대한 첫 번째 이야기

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

  • 시스템 프로그래밍이란?

    • 시스템 프로그램 : 컴퓨터 시스템을 동작(파일 복사, 파일 이동)시키는 프로그램. (ex.Windows, UNIX)

    • 운영 체제 < 시스템 프로그램

    • 시스템 프로그래머

      • 어셈블리 언어나 C를 이용하여 HW를 직접 컨트롤하는 개발자

      • Windows 나 UNIX 같은 운영체제에서 제공하는 라이브러리를 사용하여 프로그램을 개발하는 개발자

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


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


  • CPU

    • 컴퓨터의 머리에 해당

  • 메인 메모리(램)

    • 컴파일이 완료된 프로그램 코드가 올라가서 실행되는 영역

    • ex. 하드디스크 안의 게임 실행 ->메인 메모리로 올라가서 실행됨

    • 프로그램 실행을 위해 존재하는 메모리

  • 입출력 버스

    • 컴퓨터를 구성하는 구성요소 사이에서 데이터를 주고 받기 위해 사용되는 경로

    • 주고 받는 데이터의 종류와 역할에 따라

      • 어드레스 버스

      • 데이터 버스

      • 컨트롤 버스


3. CPU에 대한 이해

  • ALU(Arithmetic Logic Unit)

    • 실제 연산 담당하는 블록

    • 기본적인 연산

      • 산술연산 (덧셈, 뺄셈)

      • 논리연산 (AND, OR)

  • 컨트롤 유닛 (Control Unit)

    • CPU의 총 사령관 역할

    • CPU 내부로 흘러 들어오는 명령어를 해석하여 그 결과에 따라 적절한 신호를 CPU의 다른 블록에 보내는 일을 함.

    • ex) 프로그래머가 프로그램 작성 -> 컴파일 -> 실행파일 생성 -> 실행파일 안에는 CPU에게 일을 시키기 위한 명령어 (10011010 ~) 저장되있음 -> CPU내부로 흘러들어감 -> ALU가 명령어 해석 -> CPU의 다른 블록으로 보냄

  • 레지스터 (Register Set)

    • 2진 데이터 저장을 위한 아주 작은 메모리

    • CPU 내부에서 임시적으로 데이터를 저장하기 위한 작은 메모리 공간

    • CPU가 연산을 하기 위해 반드시 필요

    • ex) 컨트롤 유닛이 필요로 하는 명령어(덧셈, 뺄셈) 및 ALU 가 필요로 하는 데이터(피연산자)들을 레지스터에 저장해 두고 상황이 허락될 때 직접 가져가도록 함.

  • 버스 인터페이스

    • 입출력 버스가 어떻게 데이터를 전송하는지, 그에 대한 프로토콜, 통신방식을 알고 있는 것

    • ex) CPU는 버스 인터페이스를 통해 레지스터에 저장되어 있는 데이터를 입출력 버스에 송수신

    • 입출력 버스에 연결되는 장치들은 모두 인터페이스(=컨트롤러,어댑터)가 필요.

  • 클럭 신호 (Clock Pulse)

    • 타이밍을 제공하기 위해 필요

    • ex) 클럭속도 1.6Mhz -> 클럭발생기(오실레이터)는 1초당 1,600,000번의 클럭발생 -> CPU가 1초에 1,600,000번 연산

    • 시스템 동기화를 위해

    • CPU는 인가되는 클럭 펄스에 맞춰서 일을 한다.


4. 프로그램의 실행과정

  • 폰 노이만의 컴퓨터 구조 (Stored Program Concept)

    • 프로그램이 컴퓨터 내부에 저장되어서 순차적으로 실행되는 구조

  • 프로그램의 실행과정

    • 단계 1 : 전처리기에 의한 치환작업

      • #include, #define 같은 지시자의 지시에 따라서 소스코드를 적절히 변경하는 작업

    • 단계 2 : 컴파일러에 의한 번역

      • 소스코드 -> (컴파일러) -> 어셈블리 코드

      • CPU에게 일을 시키기 위한 명령어를 조합해서 만들어진 프로그램코드

    • 단계 3 : 어셈블러에 의한 바이너리 코드 생성

      • 1과 0으로만 구성되는 코드 (<ㅡ> 텍스트 코드)

      • 어셈블리 코드 -> (어셈블러) -> 바이너리 코드

    • 단계 4 : 링커에 의한 연결과 결합

      • 링커 : 프로그램 내에서 참조하는 함수나 라이브러리들을 하나로 묶는다.

      • 링커 작업에 끝나면 실행 가능한 실행파일(바이너리 코드로 구성)이 생성됨.

      • 링커에 의해 최종적으로 만들어진 실행파일(바이너리 코드 형식의 명령어) -> 메모리 공간에 로드 -> CPU에 의해 실행되기 시작 -> CPU에 의해 순차실행 ->

      • 1. Fetch : 메모리 상의 명령어를 CPU로 가져옴 -> 레지스터에 저장

      • 2. Decode : 가져온 명령어를 CPU가 해석 -> 컨트롤 유닛 역할

      • 3. Execution : 해석된 명령대로 CPU가 실행 -> ALU 역할


5. 하드웨어 구성의 재접근

  • 폰 노이만 컴퓨터 구조 vs 오늘날 컴퓨터 구조

  • 데이터 이동의 기반이 되는 버스 시스템

    • 데이터 버스 : 데이터(명령어, 피연산자)를 이동하기 위해 필요

    • 어드레스 버스 : 주소값을 이동하기 위해 필요
      ex) CPU가 0x1024번지에 저장되어 있는 데이터 4바이트를 읽으려면 메모리 영역에 주소값 0x1024를 먼저 전달해야 함.

    • 컨트롤 버스 : CPU와 메모리가 서로 특별한 사인을 주고받는 용도

      • ex)