컴퓨터 구조
- 컴퓨터 구조를 알게되면 좋은점 : 코드를 깊이있게 파악하고 오류가 어디서 났는지 파악 => 문제해결 능력 향상
- 성능, 비용 ,용량을 상황에 맞게 고려하며 개발
컴퓨터가 이해하는 정보
- 데이터 : 컴퓨터는 0과 1만 이해할 수 있음 숫자, 문자, 이미지 ,동영상은 모두 0과1로 이루어진 데이터 덩어리
- 명령어 : 컴퓨터를 작동시킴
컴퓨터의 4가지 핵심부품
cpu
- 컴퓨터의 두뇌 , 계산과 연산을담당
- 메모리에 저장된 데이터와 명령어를 해석하고 실행함
- ALU: 계산만 실행하는 계산기
- 레지스터 : CPU 내부의 임시저장 장치, 여러가지 용도의 레지스터 존재
- CU : 제어장치, 전기신호를 내보내 명령어를 해석
메모리
- 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
- 프로그램이 실행되려면 메모리에 명령어와 데이터 저장
- 메모리에 저장된 명령어와 데이터를 찾기위해 "주소"라는 개념 사용
- 데이터와 명령어는 모두 0과 1로만 표현됨
- 프로그래밍 언어를 컴퓨터가 이해할 수 있는 0과 1로 변환하는 과정을 컴파일 이라고함
입출력장치
보조기억장치
- 전원이 꺼져도 실행중인 프로그램을 저장하는 장치
- HDD, SSD, USB 등
- 메모리는 실행되는 프로그램 저장, 보조기억 장치는 보관할 프로그램 저장
메인보드
- 핵심부품 4가지를 시스템 버스라는 통로로 연결함
- 주소버스, 데이터버스 ,제어버스등 여러용도의 버스존재
0과1로 문자를 표현하는 방법
정보단위
- 0과1을 나타내는 가장 작은단위 : bit(비트)
- n비트는 2n승
- 바이트 : 8비트를 1개로 묶은 단위 1바이트 = 8비트
- 워드 : cpu가 헌번에 처리할 수 있는 데이터 크기 대부분 32bit, 64bit 단위
이진법
- 0과 1만으로 데이터를 표현하는방법
- 코드에서 이진법 표기 할떄 0b를 붙임 ex) 0b1010
이진법의 음수표현
- 2진법의 보수를 구함
- 0과 1을 뒤집고 거기에 1을 더한 값
- ex) 1010 => 0101 + 1 = 0110
- cpu내부에 플래그 레지스터가 음수와 양수를 구분함
십육진법
- 0~F 0~15까지를 표현함
- 0x를 붙혀서 십육진법임을 구분함 ex) 0x15FD15
- 십육진수를 사용하는 이유 : 십육진수 <-> 이진수 서로 간 변환이 용이함
- 십육진수 하나를 표현하기 위해 4비트가 필요
문자 집함과 인코딩
- 문자집함 : 컴퓨터가 인식하고 표현할 수 있는 문자의 모음
- 인코딩 : 문자집합을 0과 1로 변환하는 과정
- 코드 포인트 : 문자집합에서 특정 문자에 부여된 값 ex) A=65
유니코드
- 모든언어, 특수문자, 화살표, 이모티콘 등을 코드로 표현이 가능함
- 1바이트 부터 4바이트까지 인코딩 결과를 만듬
소스코드와 명령어
고급언어
- 사람을 위한 언어, 프로그래밍언어 ex) c, c++ , java, python, js 등 사람이 보고 이해할 수 있는 언어
저급언어
- 컴퓨터가 직접 이해하고 실행할 수 있는 언어, 명령어로 이루어져있음
- 기계어 : 저급언어에서 컴퓨터가 이해할 수 있도록 0과 1로만 이루어진 언어
- 어셈블리어 : 저급언어를 사람이 보고 이해할 수 있도록 변환한 형태
- 고급언어를 실행시키기 위해 저급언어로 변환하는 과정이 필요함 => 컴파일
컴파일 언어
- 고급언어가 저급언어로 변환되는 방식
- ex) c언어
- 컴파일러에 의해 고급언어에서 저급언어로 변환되어 실행
- 변환되는 과정 : 컴파일
- 컴파일러가 소스코드에서 오류를 1개라도 발견하면 컴파일에 실패함
- 컴파일러를 통해 저급언어로 변환된 코드를 목적 코드(Object Code) 라고함
인터프리터 언어
- 인터프리터 의해 소스코드가 한줄 씩 실행되는 언어 ex) python
- 소스코드 전체를 변환하는 시간을 기다릴 필요가 없음
- 오류가 있는 코드의 직전 줄까지 전부 실행함
- 인터프리터 언어가 컴파일 언어보다 느림, 마지막가지 한줄씩 실행
명령어 구조
연산코드
- 명령어가 수행할 연산값
- 명령어가 수행할 연산 더하기 , 빼기 , 곱하기 , 나누기 등
- 연산 코드 유형 : 데이터 전송, 산술 / 논리연산, 제어 흐름변경, 입출력 제어
오퍼랜드 (주소필드)
- 연산에 사용할 데이터 or 연산에 사용할 데이터의 위치 주소(메모리, 레지스터)
- 0개 or 1개이상 존재함
주소 지정방식
- 오퍼랜드 필드안에 레지스터, 메모리의 주소를 지정하는 방식
- 오퍼랜드에 직접적을 데이터를 넣지 않고 메모리 주소를 담는이유 => 명령어의 길이가 제한됨
- 오퍼랜드 필드안에 데이터가 담긴 메모리주소를 담으면 표현할 수 있는 데이터가 메모리주소에 저장 주소 공간만큼 커짐
즉시 주소 지정 방식
- 연산에 필요한 오퍼랜드 필드에 데이터를 직접 명시하는 방식
- 데이터의 크기는 작아지지만 CPU가 메모리, 레지스터에 접근하지 않아서 속도가 빠름
직접 주소 지정 방식
- 오퍼랜드 필드에 메모리 주소를 직접 명시 하는 방식
- 표현할 수 있는 유효주소에 제한이 생김
간접 주소 지정 방식
- 유효주스의 주소( 메모리, 레지스터 )를 오퍼랜드에 명시함
- 두번의 메모리 접근으로 인한 속도가 느림
간접 주소 지정 방식
- 연산에 사용할 데이터 주소를 레지스터에 있는 주소명시
- 표현할 수 있는 레지스터 크기에 제한
- 빠른접근
레지스터 간접주소 지정 방식
- 데이터를 메모리에 저장주소를 레지스터에 주소저장
- 오퍼랜드 -> 레지스터 -> 메모리
스터디 질문
컴파일언어와 인터프리터언어에 대해 설명해주세요
컴파일 언어
- 컴파일 언어 : 컴파일러에 의해 소스코드 전체가 저급언어로 변환되어 실행
- 코드에 오류가 1개라도 있으면 코드가 실행되지 않음
- 변환을 수행해주는 도구 : 컴파일러
- 컴파일러를 통해 소스코드가 저급언어로 바뀐 코드를 목적코드라고함
인터프리터 언어
- 인터프리터에 의해 소스코드가 한줄씩 실행되는 언어
- 소스코드 전체를 변환하는 시간을 기다릴 필요가 없음
- 오류가 있는 코드의 직전줄까지 실행함
- 인터프리터 언어가 컴파일언어보다 느림 -> 마지막 한줄까지 실행하기 때문
명령어가 어떤 구조로 이루어져있는지 설명하고 각각의 역할을 설명해주세요
- 연산코드 : 명령어가 수행할 연산
- 오퍼랜드 : 연산에 사용할 데이터 혹은 데이터의 주소가 담겨있음
인덱스란 무엇이고 일반적인 원리는 어떠한지 설명?
- 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높혀주는 자료구조.
- 인덱스는 테이블 내의 1개의 컬럼 혹은 여러개의 컬럼을 이용하여 생성됨
- 고속검색, 효율적인 순서매김 동작에 대한 기초를 제공함
- 인덱스는 key 필드만 갖고 있고 다른 테이블의 다른 세부항목들은 가지고 있지않음
- 관계형 DB에서 인덱스는 테이블 부분에 대한 하나의 사본, 복제본
- 색인이고 메모리 영역의 일종의 목차를 생성하는 개념입니다.
- B-tree 구조로 사용
- 검색, 탐색 속도를 높혀줌
특정데이터 조회시
- 특정데이터 조회가 필요할때 select문을 이용하여 전체테이블 full-scan
- 자식노드에 포인터가 저장되어 있어 탐색에 있어 1개의 경로만 조회하면 되기때문에 조회에 있어서 효율적인 알고리즘 b-tree
- 검색 및 조회에 큰 효율 발생
- 정해진 카테고리나 검색어에 대해 인덱스를 지정했을때 지정된 포인터를 따라서 테이블을 조회하기 때문에 속도개선
- 자주 수정 , 추가 ,삭제되는 데이터에 대해서는 인덱스에서도 마찬가지로 해당 동작들이 수행되기 때문에 오히려 성능이저하 => 포인터로 가리키고 있는 모든 데이터들에 대해 수정 추가 삭제?
인덱스 사용경우
- 규모가 큰 테이블
- 삽입(INSERT), 수정(UPDATE), 삭제(DELETE) 작업이 자주 발생하지 않는 컬럼
- WHERE나 ORDER BY, JOIN 등이 자주 사용되는 컬럼
- 데이터의 중복도가 낮은 컬럼
CREATE INDEX 생성할_인덱스이름 ON 생성할_테이블이름 (컬럼_이름);