세용용용용 2023. 10. 31. 22:45

[ "혼자 공부하는 컴퓨터구조 + 운영체제" ] 공부한 후 정리한 내용 입니다

1. 컴퓨터가 이해하는 두가지 정보

  • 데이터 : 0과1로 숫자를 표현하는 방법, 0과1로 문자를 표현하는 방법
  • 명령어 : 컴퓨터를 실질적으로 움직이는 정보, 데이터는 명령어를 위한 재료

ex) 1과 3을 더하라 >>> 더하라 = (명령어) , 1과 3 = (데이터) 


 

2. 컴퓨터의 네 가지 핵심 부품

(1) CPU

  • 메모리에 저장된 명령어를 해석하고 실행

[ CPU 핵심 내부 부품 ]

ALU → 계산기

레지스터 → CPU 내부의 작은 저장장치

제어장치 → 제어 신호를 내보내고, 명령어를 해석하는 장치

순서 ex..)
1. 메모리 읽기 신호
2. 메모리에서 명령어를 가져와 레지스터에 저장
3. 레지스터 저장된 명령어를 제어장치로 읽음
4. 명령어 수행에 필요한 데이터를 메모리에서 가져옴
5. ALU를 사용해 명령어를 계산
6. 계산후 레지스터에 결과 저장
7. 이후 필요에 따라 제어장치에서 → 메모리 쓰기 신호로 메모리에 결과 저장

 

(2) 메모리 [ ram, rom ]

  • 현재 실행되는 프로그램 → 프로세스 명령어와 데이터를 저장하는 부품
  • 메모리는 주소라는 개념을 통해 내가 필요로 하는 데이터, 명령어가 어느 위치에 있는지 확인가능

 

(3) 보조기억장치 [ 저장 장치 ] 

  • 보관할 정보를 저장
  • 보조기억장치가 필요한 이유 : 메모리는 비싸고, 전원이 꺼지면 저장 내용을 잃는다(휘발성)
  • 전원이 꺼져도 저장할수 있는 장치가 필요(비 휘발성) 이것이 보조기억장치

 

(4) 입출력장치 [ 컴퓨터와 정보를 주고 받을수 있는 장치 ]

  • 컴퓨터 외부에 연결되 컴퓨터 내부와 정보를 교환하는 장치

 

(5) 시스템 버스 : 컴퓨터의 4가지 핵심부품끼리 정보를 주고받을수 있는 통로

[ 시스템 버스 내부 구성 ]

주소 버스 → 주소를 주고받는 통로

데이터 버스 → 명령어와 데이터를 주고받는 통로

제어 버스 → 제어 신호를 주고받는 통로

 

(6) 메인보드 : 이 4가지의 핵심부품을 부착할수 있는 판


 

3. 0과 1로 숫자를 표현하는 방법

  • 비트 : 0과 1을 표현하는 가장 작은 정보 단위
  • 프로그램은 수 많은 비트로 이루어져 있음

 

[ 비트보다 더 큰 단위 ]

 

[ 워드 → CPU가 한번에 처리할 수 있는 정보 크기 단위 ]

 

[ 보수 : 0과 1로 음수 표현 ]

과정 : 모든 0과1 뒤집기 >>> 1더하기
최종적으로 CPU 내부에 flag라는 값이 있음 이것을 통해 양수인지 음수인지 확인

 

[ 십육진법 : 이진법으로 숫자 표현시 너무 길어질수 있음, 그래서 컴퓨터의 데이터를 표현시 십육진법도 많이 사용 ]


 

4. 소스코드와 명령어

  • 고급언어 : 개발자가 이해하기 쉽게 만든 언어( C, java, python )
  • 저급언어 : 컴퓨터가 이해하고 실행하는 언어( 기계어, 어셈블리어 )
  • 어셈블리어는 >>> 기계어를 읽기 편한 형태로 번역한 저급 언어

 

(1) 고급언어가 저급언어로 변환하는 방식 ( 프로그래밍언어 → 기계어 )

컴파일 언어 : 소스코드 → 컴파일( 컴파일러 ) → 목적코드( 저급언어 )

인터프리트 언어

  • 인터프리터에 의해 한 줄씩 실행된다
  • 소스 코드 전체가 저급 언어로 변환될떄까지 기다릴 필요없음 ( 한줄씩 실행 )

 

[ 컴파일 언어 인터프리트 언어 차이 ]

  • 컴파일은 전체 코드가 한번에 변환, 인터프리트는 한줄씩 실행
  • 즉, 소스 코드 컴파일 중 오류 발생 시 소스코드 전체가 실행되지 않음 하지만 인터프리트중 오류 발생 시 오류 발생 전까지의 코드는 실행

 

(2) 명령어의 구조

  • 명령어는 연산코드와 오퍼랜드로 구성됨

연산코드 : 수행할 연산 →  CPU가 무엇을 할지

오퍼랜드 : 연산에 사용될 "데이터" 혹은 "연산에 사용될 데이터가 저장된 위치"

 

[ 연산코드 ]

- 데이터 전송 : 데이터 옮겨라, 메모리에 저장하라, 메모리에서 cpu로 데이터 가져와라

* 스택 : LIFO(마지막 들어간 데이터가 가장 처음 나옴), 한쪽이 막혀있는 자료구조

* 큐 : FIFO(처음 들어간 데이터가 가장 처음 나옴), 양쪽이 뚫려있는 자료구조

- 산술/논리연산 : 사칙연산, 논리연산, 비교연산

- 제어 흐름 변경 : 특정 주소로 실행 순서를 옮겨라

- 입출력 제어 : 읽어라, 써라, 시작, 확인

 

[ 명령어 주소 지정 방식 ] - 연산에 사용할 데이터가 저장된 '위치'를 찾는 방법!!

  • 즉시 주소 지정 방식 : 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시( 크기가 제한 될수 있음), 빠르다
  • 직접 주소 지정 방식 : 오퍼랜드 필드에 유효 주소 직접적 으로 명시
  • 간접 주소 지정 방식 : 오퍼랜드 필드에 유효주소의 주소를 명시, 느릴수 있다

레지스터 주소 지정 방식 : 연산에 사용할 데이터가 저장된 레지스터 명시, 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름

레지스터 간접 주소 지정 방식 : 연산에 사용할 데이터를 메모리에 저장, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시


 

5. C언어 컴파일 과정

  • 전처리과정 → 컴파일 → 어셈블러 → 링커
1) 전처리 과정
→ 주석 제거, 헤더파일 내용 복사

2) 컴파일
→ 코드를 어셈블리 코드로 변환
→ 문법 오류 검사

3) 어셈블러
→ 어셈블리 코드를 기계어(오브젝트 파일)로 변환

4) 링커
→ 여러 오브젝트 파일과 라이브러리를 하나로 연결
→ 실행파일 생성

→ 이러한 과정을 거쳐 실행파일이 된다.


 

6. 컴퓨터 문자

  • 인코딩 : 문자를 → 0과 1로 이루어진 문자 코드로 변환하는 과정
  • 디코딩 : 코드를 해석하는 과정, 인코딩 표현된 문자 코드를 → 문자로 변환하는 과정

 

[ 아스키 코드 ]

- 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어문자

- 7비트로 하나의 문자 표현 + (1비트는 오류 검출을 위해 사용되는 패리티 비트)

- 간단한 인코딩, 그러나 한글을 포함한 다른 언어 문자, 다양한 특수 문자 표현 불가

- 7비트로 하나의 문자를 표현하기에 128개보다 많은 문자를 표현할 수 없음.....

 

[ EUC-KR ]

- 완성형 인코딩

- 글자 하나하나에 2바이트 크기의 코드 부여(16비트)

- 4자리 십육진수로 표현

- 2300여개 한글 표현 가능, 그러나 여전히 모든 한글을 표현하기에 부족한 수

 

[ 유니코드 ]

- 통일된 문자 집합

- 한글, 영어, 화살표와 같은 특수문자, 이모티콘

인코딩 방식

- utf-8, utf-16, utf-32

 

utf-8 인코딩

- 가변 길이 인코딩 : 1~4바이트