Development Book - Computer structure and operating system for self-study
참고)
https://github.com/mingseok/os-computer-architecture-reading-study
https://github.com/Dev-Books-Master-Study/computer-architecture-and-operating-system
1-1강 : 컴퓨터 구조를 알아야 하는 이유
- 문제 해결을 위하여
- 같은 Code 고, 내 PC에서는 되는데, 다른 사람 PC에서는 안되는 경우가 있음.
- 프로그래밍 언어의 문법.. 즉 코딩만으로 해결 할 수 없는 문제가 있음.
- 그럴 때, 손을 놓는게 아니라, 그 PC를 분석의 대상으로 바라보고, 분석하여 문제를 해결하는 능력을 키우기 위함.
- 즉, 컴퓨터를 관조할 수 있는 능력을 키우기 위해 알아야 함.
- 성능, 용량, 비용을 위하여
- 성능, 용량, 비용은 너무 중요한 내용임. 특히 큰 기업으로 갈수록 너무 중요함.
- 서버를 고를 때 용량, 성능, 가격이 천차만별인데, 무조건 좋은걸 사거나, 무조건 싼 걸 살 수는 없음. 내가 지금 개발하려는 서비스와 고객층을 분석하고, 가장 알맞는 용량 성능 가격의 서버를 구입하고 사용할 것인지를 판단할 줄 알아야 함.
- 그래서 개발을 할 때 모니터링을 잘 할 줄 알아야하고, 직접 서버PC를 구매하든, 클라우드를 구매하든, 모니터링한 결과를 토대로 필요한 용량 성능 가격을 잘 판단하여 구매할 수 있어야 함.
- 컴퓨터 구조는 결국 PC의 성능, 용량, 비용에 대한 이야기임.
1-2강. 컴퓨터 구조의 큰 그림
- 컴퓨터가 이해하는 두 가지 정보
- 데이터
- 숫자, 문자, 이미지 등 정적인 정보
- 컴퓨터와 주고 받는 내부에 저장된 정보
- 0, 1로 숫자를 표현하는 방법
- 0, 1로 문자를 표현하는 방법
- 명령어
- 컴퓨터는 결국 명령어를 처리하는 기계
- 컴퓨터를 실질적으로 움직이는 정보
- 데이터는 명령어를 위한 재료 - Ex) 1과 2를 더하라
- 1, 2는 데이터
- 더하라는 명령어
- 데이터
- 컴퓨터의 네 가지 핵심 부품
- CPU
- 메모리에 저장된 명령어를 읽고 해석하고 실행한다
- CPU의 핵심 내부 구성 부품
- ALU ( 산술논리연산장치 )
- 계산기
- 계산을 위한 회로 모음
- 제어장치
- 제어 신호를 보내고, 명령어를 해석하는 장치.
- 제어 신호는 컴퓨터의 부품들을 관리하고 작동시키기 위한 전기 신호를 의미.
- Ex) 메모리로부터 저장된 값을 읽고 싶을땐 메모리 읽기 라는 제어 신호를, 메모리에 어떤 값을 저장하고 싶을땐 메모리 저장이라는 제어 신호를 보낸다.
- 레지스터
- CPU 내부에 있는 내부 저장장치
- CPU Cache 와는 다르다.
- ALU ( 산술논리연산장치 )
- Cpu Cache vs 레지스터 ?
- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=limitsinx&logNo=222126219627&proxyReferer=
- https://m.blog.naver.com/sjc02183/221998493348
- Ex 흐름)
- cpu의 제어장치가 메모리 속 “1번지”라는 주소에 메모리읽기 라는 제어신호를 보냄.
- cpu의 레지스터로 메모리 “1번지” 라는 주소에 담겨있던 데이터, 명령어를 가져와서 저장함. ( 시스템 버스를 통해 받음 )
- 그렇게 불러들인 데이터, 명령어를 cpu 속 제어장치에서 해석함
- 3번지, 4번지의 데이터가 필요하다는걸 알아내고, 제어장치가 메모리로부터 해당 데이터를 가져옴 ( 시스템 버스를 통해 받음 )
- ALU 로 해석된 데이터, 명령어를 넘겨서 계산을 시킴
- 그 결과값을 cpu 레지스터에 저장 시킴
- 주기억장치 ( RAM or ROM / 메모리 )
- 프로그램이 실행되려면 메모리에 저장되어 있어야 한다.
- 현재 실행되고 있는 프로세스의 데이터와 명령어를 저장하는 부품
- 주소
- 메모리에 저장 된 데이터나 명령어가 많을텐데, 이 중 원하는걸 특정 해서 꺼낼 수 있게, 그 위치를 알 수 있게 해주는 것.
- 데이터나 명령어는 각 고유한 주소에 저장된다
- 보조기억장치
- 주기억 장치는 보조기억장치보다 비싸고, 휘발성임. 전원이 꺼져도 저장될 기억장치가 필요하였고, 그걸 보조기억장치가 해결해줌
- 즉, 메모리는 실행할 정보를 저장하고, 보조기억장치는 보관할 정보를 저장함.
- Disk, SSD, USB 등이 있음.
- 입출력장치
- 키보드, 모니터, 마우스 등 컴퓨터 외부에서 컴퓨터와 연결하여 정보를 주고 받는 장치
- USB는 보조기억장치인가? 입출력장치인가?
- 둘 다 맞다. 주변 장치, 특별한 입출력 장치라 할 수 있다.
- CPU
- 핵심 부품 4가지가 모이는 곳을 “메인보드” 라고 한다. ( 4가지 핵심 부품을 연결해주는 판. 꼽는 곳 )
- 버스
- 4가지 핵심 부품이 정보를 주고받을 수 있게 하는 회로, 통로, 길 ( 척추와 같음 )
- 여러 버스가 있지만, 가장 중요한게 컴퓨터 내부의 정보를 주고 받을 수 있게하는 시스템 버스임.
- 시스템 버스 회로 안에는 주소버스, 데이터버스, 제어버스가 함께 존재함
- 주소 버스는 주소가 이동하는 통로
- 데이터 버스는 데이터, 명령어가 이동하는 통로
- 제어 버스는 제어 신호가 이동하는 통로
2-1강. 0과 1로 숫자를 표현하는 방법
- 컴퓨터는 전기신호를 통하여 0과 1만 이해하지 못한다.
- 비트 : 0과 1을 표현하는 가장 작은 정보 단위
- 1비트로는 0 또는 1이라는 2가지 정보를 표현할 수 있고
- 2비트로는 00 01 10 11 이렇게 4가지 정보를 표현할 수 있다.
- 3비트는 8가지…
- 이렇게 n비트는 2의 n승만큼의 정보를 표현할 수 있다.
- 다만 평소에 비트 단위로 뭔가를 표현하지 않는다.
- 비트, 바이트, 킬로바이트, 메가바이트, 기가바이트, 테라바이트
- 1바이트 = 8비트
- 1킬로바이트 = 1000바이트
- 1메가바이트 = 1000킬로바이트
- 중요)
- 1KB = 1000byte
- 1kiB = 1024byte
- 1MB = 1000KB
- 1miB = 1024kiB
- 이렇게 중간에 i가 들어간 단위가 따로있다. 요즘 혼용해서 쓰기도하지만 이게 맞다.
- 워드
- CPU가 한 번어 처리할 수 있는 정보의 크기 단위
- 하프 워드 : 워드의 절반 크기
- 풀 워드 : 워드의 크기
- 더블 워드 : 워드의 두 배 크기
- Ex ) 해당 CPU가 한 번에 처리 가능한 정보의 크기가 32비트면, 해당 cpu의 워드는 32비트인 것이다.
- 이진법
- 0과 1로 수를 표현하는 방법
- 숫자가 1을 넘어가는 시점에 자리 올림
- 우리가 일상적으로 쓰는 숫자는 십진법임.
- 이진법으로 나타낸 수를 이진수라고 함.
- 표기 방법
- 1000(2)
- 0b1000
- 이진수로 음수를 표현하는 방법
- 2의보수법
- 어떤 수를 그보다 큰 2^n에서 뺀 값
- 쉽게 말하면, 모든 0과 1을 뒤집고 1을 더한 값이다.
- Ex) 11의 음수는 00 + 1 이므로 01 이다.
- Ex) 1011의 음수는 0100 + 1이므로 0101 이다.
- 음수를 양수로 뒤집어도 동일하다.
- 0101 을 양수로 돌리면 1010 + 1 이므로 1011 이된다.
- 어떻게 이거만보고 음수인지 양수인지를 구분할 수 있을까?
- Cpu 내부 레지스터에 flag 레지스터가 있는데, 거기에 현재값이 양수인지 음수인지가 표기가 된다.
- 그럼 왜 2의보수를 쓰나? 그냥 그 수에 플래그만하면 되는데?
- 덧셈 한번으로 하드웨어상 뺄셈을 구현할 수 있음
- 2의보수법
- 십육진법
- 이진법으로는 숫자의 길이가 너무 길어짐
- 이진법과의 양방향 변환이 쉬움.
- 수가 15를 넘어가는 시점에 자리 올림
- 0 1 2 3 … 9 A B C D E F 10 11 …
- 이진수 → 십육진수
- 4비트가 필요
- 0001 ( 이게 4비트 )
- 11010101 을 십육진수로 만들려면 4비트씩 끊어서 변환하면된다.
- 1101 은 D
- 0101 은 5 이므로
- D5이다.
- 십육진수 → 이진수
- 4비트가 필요 ( 4비트가 16개의 수를 표현할 수 있기때문 )
- 1A2B 라는 수가 있다면.
- 1 A 2 B 를 따로따로 이진수로 만들면 된다.
- 0001 1010 0010 1011
- 참고로 이건 4비트x4여서 16비트짤임
2-2강. 0과 1로 문자를 표현하는 방법
- 문자 집합
- 컴퓨터가 이해할 수 있는 문자의 모음
- 예를들어 A라는 PC의 문자 집합에는 a b c 밖에 없음. 그러면 d e f 는 이해 할 수 없음.
- Ex) 아스키 코드
- 초창기 문자 집합 중 하나
- 알파벳, 숫자, 일부 특수문자 및 제어문자 집합
- 7비트로 하나의 문자 표현
- 원래는 총 8비트인데, 1비트는 오류검출을 위한 페리티 비트로 사용 됨
- 총 2^7 인 128개의 문자를 표현 할 수 있음
- Ex) A는 65, a는 97 로 인코딩
- 저 65와 97을 이진수로 표현하면 컴퓨터가 이해하는 A와 a가 된다.
- 여기서 저 65, 97 같은걸 코드 포인트라고 부른다. (문자에 부여된 값.)
- 장점) 간단한 인코딩
- 단점) 아스키 코드에는 없는 한국어나 다른 언어, 특수 문자등을 표현 할 수 없음. ( 7비트라서 128가지 뿐 )
- 그래서 등장한게 언어별 다양한 인코딩 방식임
- 단, 이러면 다국어 지원 프로그램을 만들려면.. 모든 인코딩 방식을 이해해야 함.
- 그래서 모든 언어, 특수문자까지 전부 통일된 문자집합인 유니코드와 그 유니코드의 인코딩 방식인 UTF가 등장 함.
- 단, 이러면 다국어 지원 프로그램을 만들려면.. 모든 인코딩 방식을 이해해야 함.
- 그리고 8비트 확장 ASCII 가 나오긴 했지만 그래도 여전히 부족
- 그래서 등장한게 언어별 다양한 인코딩 방식임
- 인코딩
- 코드화 하는 과정
- 문자를 0,1로 이루어진 문자코드로 변환하는 과정
- 한글 인코딩의 특징
- 한글의 특징을 이해해야 됨.
- 한글은 초성 중성 종성이 있기에 알파벳과 다름.
- 그래서 완성형 인코딩, 조합형 인코딩 이렇게 2가지 방식이 존재
- 완성형 인코딩 방식
- 초,중,종성으로 완성된 글자 그 자체에 코드를 부여함
- Ex) 강 : 10101010 11100010 0110100
- 저 이진수는 예시임. 실제론 저거 아님
- 조합형 인코딩 방식
- 초, 중, 종성에 해당하는 자음 모음에 코드를 부여해서 합치는 방식
- Ex) ㄱ : 1010 ㅏ: 0101 ㅇ:1110
- 저 이진수는 예시임. 실제론 저거 아님
- EUC-KR
- KS X 1001 KS X 1003 문자 집합 기반의 한글 인코딩 방식
- 완성형 인코딩 방식임
- 글자 하나 하나에 2바이트 크기의 코드 부여
- 2바이트 == 16비트 == 4자리짜리 16진수로 표현
- 가 : b0a0
- 2바이트 == 16비트 == 4자리짜리 16진수로 표현
- 2300 여개의 한글 표현 가능
- 여전히 모든 한글을 표현 하기에는 부족
- 뷃 쉙 휉 등.. 이런 단어가 인코딩이 되지않는 문제가 바로 해당 문자집합에 없기 때문임
- 유니코드
- 통일된 문자 집합
- 한글, 영어, 화살표와 같은 특수 문자, 심지어 이모티콘까지 있음.
- 현대 컴퓨팅에서 가장 중요한 문자 집합
- 유니코드의 인코딩 방식
- utf-8, utf-16, utf-32 …
- utf-8 에 대하여
- 가변 길이 인코딩 : 인코딩 결과가 1~4바이트
- 인코딩 결과가 몇 바이트가 될지는 유니코드에 부여된 값에 따라 다름
- 0 ~ 007F(16) : 1바이트
- 0080(16) ~ 07FF(16) : 2바이트
- 0800(16) ~ FFFF(16) : 3바이트
- 10000(16) ~ 10FFFF(16) : 4바이트
- 완성형 인코딩 방식
- 디코딩
- 코드를 해석하는 과정
- 0,1로 이루어진 문자코드를 문자로 변환하는 과정