컴퓨터 시스템 -(1)

황수정·2020년 12월 16일
0

컴퓨터 시스템

목록 보기
1/6

[강의] https://www.youtube.com/watch?v=GVX-m3RF-K0&list=PLVsNizTWUw7E2KrfnsyEjTqo-6uKiQoxc [뇌를 자극하는 윈도우즈 시스템 프로그래밍]

시스템?

: 하드웨어(:컴퓨터 구조. [CPU, 캐쉬]) + 운영체제[메인메모리, 하드디스크(:I/O)]

시스템 프로그래밍은 Windows 운영체제 자체의 기능을 십분 활용하는 프로그래밍.

정보는 비트와 컨텍스트로 이루어진다

텍스트 파일이 아닌 다른 모든 파일은 바이너리 파일이다

c프로그램의 기원

컴파일 시스템: 프로그램은 다른 프로그램에 의해 다른 형태로 번역된다

main 안에서 printf를 호출하는 hello.c를 컴파일하는 단계

  • 전처리기[pre-processor:cpp]
    ex) 코드 앞에 헤더파일 import.
    hello.c(txt) -> hello.i(txt)

  • 컴파일러[compiler:cc1]
    어셈블리어 프로그램을 저장
    hello.i(txt) -> hello.s(txt)

  • 어셈블러[assembler:as]
    기계어 인스트럭션으로 번역 후 재배치가능 목적프로그램의 형태로 묶어서 목적파일로 저장. main 함수의 인스트럭션들을 인코딩하기 위한 17바이트를 포함한다. 텍스트 편집기로 열어보면 쓰레기처럼 보임(바이너리 파일이라서??)
    hello.s(txt) -> hello.o(binary)

  • 링커[linker:ld]
    hello 프로그램은 c컴파일러에서 제공하는 표준 c 라이브러리에 들어있는 printf함수를 호출한다. printf 함수는 이미 printf 목적파일에 들어있고, 링커 프로그램이 hello.o파일과 printf.o파일을 통합한다. 그 결과인 hello파일은 실행가능 목적파일(=실행 파일)이 되고 메모리에 적재되어 시스템에 의해 실행된다.

GNU 프로젝트

컴파일 시스템이 어떻게 동작하는지 알아야하는 이유 :3가지

  • 프로그램 성능 최적화하기
    -- switch문과 if-else문
    -- while문 과 for문
    -- 포인터와 배열인덱스
    ...
    효율적인 프로그램을 작성하려면 기본적인 기계어 수준 코드를 이해해야 하며, 컴파일러가 어떻게 C 문장들을 기계어 코드로 번역하는지 알 필요가 있다. ( => 3장: x86-64 기계어)

  • 링크 에러 이해하기
    -- 정적변수와 전역변수의 차이
    -- 서로 다른 파일에 같은 이름의 전역변수를 정의했을 때?
    -- 정적 라이브러리와 동적 라이브러리의 차이
    -- 링커가 어떤 참조를 풀어낼 수 없다고 할 때??

  • 보안 약점[security hole] 피하기
    버퍼 오버플로우 취약성: 신뢰할 수 없는 곳에서 획득한 데이터의 양과 형태를 제한하지 않아서 생겨난다.
    프로그램 스택에 데이터와 제어 정보가 저장되는 방식 때문에 생겨나는 영향을 이해해야 안전한 프로그래밍을 배울 수 있다.

인스트럭션(instruction)은 컴퓨터에게 일을 시키는 단위로서, 컴퓨터가 알아들을 수 있는 기계어로 이루어져 있는 명령이다. 지시 또는 명령이라고 한다.

프로세서는 메모리에 저장된 인스트럭션을 읽고 이해한다

컴파일 과정을 통해 저장된 실행파일을 실행
쉘에 실행파일의 이름을 입력하면 프로그램이 실행된다
(내장 쉘 명령어가 아닐경우 실행파일의 이름으로 판단한다)

시스템의 하드웨어 조직

  • 버스(Buses): 시스템 내의 전기적 배선군
    컴포넌트들 간에 워드[word]라는 고정된 크기의 바이트 단위로 데이터를 전송한다. 한 개의 워드를 구성하는 바이트 수는 기본 시스템 변수다. 대부분의 컴퓨터는 4바이트(32비트)또는 8바이트(64비트)의 워드 크기를 갖는다.
  • 입출력 장치: 시스템과 외부세계의 연결
    ex) 키보드, 마우스, 모니터, 디스크 드라이브(데이터와 프로그램의 장기저장용)

컨트롤러나 어댑터를 통해 입출력 버스와 연결

입출력 장치 <-----> 컨트롤러 or 어댑터 <-----> 입출력 버스

컨트롤러: 디바이스 자체가 칩셋, 또는 머더보드(인쇄기판)에 장착
어댑터: 머더보드의 슬롯에 장착

  • 메인 메모리: 임시 저장장치
    프로세서가 프로그램을 실행하는 동안의 데이터와 프로그램을 저장한다.
    메인메모리는 [DRAM: Dynamic Random Access Memory] 칩들로 구성되어 있다. 메모리는 연속적인 바이트들의 배열로, 0부터 시작해 고유 주소(배열의 인덱스)를 가지고 있다.

  • 프로세서 [CPU: 주처리장치] : 메인 메모리에 저장된 인스트럭션 실행

  • ALU

  • 컨트롤 유닛

  • 레지스터

  • 버스 인터페이스
    프로세서의 중심에는 워드 크기의 저장장치(or 레지스터)인 프로그램 카운터(PC)가 있다. 어느 한 순간에 PC는 메인 메모리의 기계어 인스트럭션을 가리킨다.

  • 점프(Jump)

hello프로그램의 실행

캐시가 중요하다

저장장치들은 계층구조를 이룬다

profile
알고리즘 , 웹 공부 중인 개발자 지망생

0개의 댓글

관련 채용 정보