[컴퓨터 공학]기초
🔆 컴퓨터 구조
컴퓨터의 기본 구조
컴퓨터🖥
: 하드웨어와 소프트웨어가 합쳐진 형태
- 하드웨어
: 전자 회로 및 기계 장치로 되어 있는, 컴퓨터 시스템이 작동하는 데 필요한 물리적 구성 요소
- 입출력 장치, 중앙처리장치(CPU), 기억장치 등으로 구성
- 소프트웨어
: 하드웨어를 제어하며 작업을 수행하는 프로그램
컴퓨터의 기본 구성 요소
- 입력 장치
: 컴퓨터가 처리할 수 있는 형태로 데이터와 명령을 받아들이는 물리적 장치
- 출력 장치
: 처리된 데이터를 사람이 이해할 수 있는 형태로 내보내는 물리적 장치
- 중앙처리장치
- 산술/논리 연산 장치(ALU)
: 산술연산과 논리연산을 계산하는 디지털 회로로 연산을 수행하여 데이터를 처리하는 장치
- 제어 장치
: 프로그램에 따라 명령과 제어 신호를 생성하여 각종 장치의 동작을 제어하는 장치
- 레지스터
: CPU 내부에 있는 저장공간으로 CPU에서 사용하는 데이터를 일시적으로 저장하는 장소
- 저장 장치
- 주기억장치(메모리)
: 데이터나 프로그램을 보관하기 위한 기억 장치
- 종류: RAM(휘발성 메모리), ROM(비휘발성 메모리)
- 보조 기억 장치
: 주 기억 장치를 보조하기 위한 기억 장치로 처리 속도는 느리지만 대용량의 기억 가능
CPU와 Memory
💡CPU
: 각종 연산을 수행하고 기억장치에 기억되어 있는 명령어들을 수행하는 컴퓨터 시스템을 이루는 핵심 부품
- 폰노이만 구조
: CPU, 메모리, 입출력 장치의 3단계 구조로 이루어진 프로그램 내장형 컴퓨터 구조
CPU의 구조
-
산술/논리 연산 장치(Arithmetic Logic Unit, ALU)
: 산술연산과 논리연산을 담당하는 장치로 레지스터에 저장된 데이터를 이용하여 연산을 수행
- 구성: 가산기, 보수기, 누산기, 기억 레지스터, 데이터 레지스터 등
-
레지스터(Register)
: 중앙처리장치 내부의 기억장치로 산술 연산 논리장치에 의해 사용되는 범용 레지스터(General-Purpose Register)와 PC 등 특수 목적에 사용되는 전용 레지스터(Dedicated-Purpose Register)로 구분
- 레지스터의 종류
- IR(Instruction Register)
: 현재 수행 중인 명령어 부호를 저장하고 있는 레지스터
- PC(Program Counter)
: 명령이 저장된 메모리의 주소를 가리키는 레지스터
- AC(Accumulator)
: 산술 및 논리 연산 결과를 임시로 기억하는 레지스터
-
제어장치(Control Unit, CU)
: CPU가 자신 및 주변 기기들을 제어하는 장치
-
제어장치의 구성
- 계수기(program counter)
: 프로그램의 수행 순서를 제어
- 명령 레지스터(instruction register)
: 현재 수행중인 명령어의 내용을 임시 기억
- 명령 해독기(instruction decoder)
: 명령 레지스터에 수록된 명령을 해독하여 수행될 장치에 제어신호를 전송
-
제어장치 구현 방식
Hardwired | Micro Program |
---|
논리 회로를 사용하여 프로세서에 필요한 제어 신호 생성하는 HardWare 방식 (하드웨어의 도움으로 제어 신호 생성) | 발생 가능한 신호들의 조합을 미리 구성하여 ROM에 저장했다가 필요 시 신호를 발생시키는 SoftWare 방식 |
고속 처리, 고가 | 하드웨어 방식에 비해 속도↓, 가격↓ |
RISC 시스템에 적용 | CISC 시스템에 적용 |
CPU의 기능
CPU의 기능은 명령어와 데이터에 관련된다
- 모든 명령어들에 대하여 공통적으로 기억 장치로부터 명령어 인출 및 해독 수행
- 데이터 인출 및 처리, 쓰기는 명령어에 따라 필요 시 수행
- 명령어
: 시스템이 특정 동작을 수행시키는 작은 단위로 코드로 구성
- 동작코드(Op-code: Operational Code)
: 각 명령어의 실행 동작을 구분하여 표현
- 오퍼랜드(Operand)
: 명령어의 실행에 필요한 자료나 자료의 저장 위치를 의미하는 코드로 실제 연산의 대상이 되는 피연산자
- 명령어 수행 과정
- 읽기(Fetch Instruction, FI)
: 메모리에서 명령 인출
- 해석(Decode Instruction, DI)
: 명령 해독
- 실행(Execute Instruction, EI)
: 명령 수행
- 기록(Write Back, WB)
: 수행한 결과 기록
- 명령어 처리 방식
- RISC(Reduced Instruction Set Computer)
: 컴퓨터 내부적으로 사용하는 명령어 세트를 단순화 시켜서 처리하는 형태의 구조로 단순한 명령을 조합하여 하나의 기능 수행
- 하나의 사이클로 명령어 처리
- 메모리 Load/Store 명령만 처리하는 방식
- 파이프라이닝, 슈퍼스칼라 사용 가능
- 복잡한 컴파일러 구조
- CISC(Complex Instruction Set Computer)
: 하나의 기능에 해당하는 하나의 명령이 있는 처리 방식
- 여러 사이클로 명령어 처리
- 많은 명령어가 메모리를 참조하는 처리 방식
- 파이프라이닝 사용 여려움
- 복잡한 마이크로 프로그램 구조
💡Memory
: 기억소자(반도체)
- 반도체는 특성상 전류를 흐르게도 하고 흐르지 않게도 하는 특징
→ 이를 이용하여 임시적인 내용들을 기억하게 만드는 것
메모리 분류별 특성

메모리 성능
: 메모리가 CPU와 데이터를 주고받는 시간으로 액세스라고 함
- 리프레시 시간
: 메모리에서 한 번 읽고 난 후 다시 읽을 수 있는 사이 시간
- 메모리 액세스 시간
: 명령을 받고 데이터를 읽기 시작하기까지의 시간
- 사이클 시간(리프레시 + 메모리 액세스)
: 메모리 작업이 완료와 동시에 대기 신호를 내놓은 후 다음 신호를 받을 준비가 되었다는 신호를 주기까지의 시간
메모리 종류
- 주기억장치
- RAM(Random Access Memory)
: 프로그램 수행 속도에 영향을 주는 휘발성 저장 장치로 CPU에서 직접 접근 가능한 유일한 저장 장치
- SRAM: 리프레쉬 필요x, 전력 소모 적음, 가격 높음
- DRAM: 리프레쉬 필요, 저가, 주로 사용
- ROM(Random Only Memory)
: 읽기 전용의 비휘발성 저장 장치
- 보조기억장치
- 자기 디스크
- 원판 표면의 철 입자의 방향으로 0과 1을 표현
- 디스크 드라이브: 자기 디스크로부터 데이터를 읽는 주변 장치
- 플로피 디스크(FDD)와 하드 디스크(HDD) 존재
- 광 디스크
- 빛의 반사를 이용하여 자료를 읽어내는 저장 매체
- CD(1세대), DVD(2세대), 블루레이 디스크(3세대), 테라 디스크, HVD(차세대) 존재
- 플래시 메모리
- 전자적으로 데이터를 지우고 쓸 수 있는 비휘발성 메모리
- 충격에 강하여 휴대용 기기에 주로 쓰임
- USB, SSD(특징: 저전력, 저소음, 저중량) 존재
캐시 메모리(Cache Memory)
: CPU 내 또는 외에 존재하는 메모리
- 메인 메모리와 CPU 간의 데이터 속도 향상을 위한 중간 버퍼 역할 수행
🔆 운영체제
🏷 운영체제
: 하드웨어에게 일을 시키는(시스템 자원을 관리하는) 주체
운영체제의 목적 및 기능
- 운영체제의 목적
- 처리능력 향상
- 사용 가능도 향상
- 신뢰도 향상
- 반환 시간 단축
- 운영체제의 기능
- 프로세서, 기억장치, 입출력장치, 파일 및 정보 등의 자원 관리
- 자원의 효율적 관리를 위한 스케줄링 기능 제공
- 사용자-시스템 간 편리한 인터페이스 제공
- 시스템의 각종 하드웨어와 네트워크 관리 및 제어
운영체제의 시스템 자원 관리
- 프로세스 관리(CPU)
- 메모리 관리
- I/O(입출력) 관리(디스크, 네트워크 등)
- 응용 프로그램 관리
- 응용 프로그램은 운영체제를 통해 컴퓨터에게 일을 시키는 것
- 응용 프로그램 실행 시 시스템 자원을 사용할 수 있도록 권한과 사용자 관리
- API
: 응용 프로그램이 운영체제와 소통하기 위해 운영체제가 제공하는 인터페이스
- System Call
: 응용 프로그램이 시스템 자원을 사용할 수 있도록 다양한 함수를 제공하는 것
💡프로세스
: 실행 중인 하나의 애플리케이션
- 프로그램이 특정 메모리 공간에 적재되고 CPU가 해당 명령어를 수행하고 있는 상태
프로세스 구성 요소
- 유저 메모리 영역 관리(Virtual Address Descriptors)
- 유저 메모리 공간
: 프로세스 별 독립된 영역을 가지게 되는 곳
- VAD: 유저 메모리 영역을 관리하기 위한 테이블
- 커널 메모리 공간
: 모든 프로세스가 공유하여 사용
- 핸들 테이블(Handle Table)
- 프로세스에서 사용하는 모든 핸들에 대한 커널 객체 포인터 정보를 배열 형태로 가지고 있는 공간
- 독립적인 메모리 공간
- 페이징 기법을 이용하여 프로세스마다 별도의 고유한 메모리 사용 가능
프로세스 특징
- 자원 소유의 단위
- 각각의 프로세스는 자신의 실행 이미지 로드와 실행에 필요한 추가적인 메모리 공간을 가지고 있어야 함 이것은 각 프로세스마다 구별되어야 하며 해당 프로세스가 접근하고자 하는 파일, I/O 장치들에 대해서 또한 프로세서 단위로 할당 받아 관리되어야 함
- 디스패칭의 단위
- 프로세스는 하나의 프로그램이 운영체제로부터 CPU 의 자원을 일정 기간 동안 할당 받아 명령어를 실행하는 것이며, 운영체제는 여러 개의 프로세스가 병렬적으로 실행되게 하기 위해서 CPU 의 사용 시간을 각각의 프로세스에 골고루 나누어 주어야 함 하나의 프로세스에서 여러 개의 디스패칭 단위가 실행될 수 있도록 하고 있으며, 이러한 디스패칭 단위를 스레드라 함
프로세스 상태
- 실행(Run)
: 프로세스가 프로세서를 차지하여 서비스를 받고 있는 상태
- 준비(Ready)
: 실행될 수 있도록 준비되는 상태
- 대기(Waiting)
: CPU의 사용이 아니라 입출력의 사건을 기다리는 상태
프로세서 vs 프로세스
- 프로세서(Processor)
- 하드웨어적인 측면
: 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛으로 중앙처리장치(CPU) 의미
- 소프트웨어적인 측면
: 데이터 포맷을 변환하는 역할을 수행하는 데이터 처리 시스템
- 프로세스(Process)
- 특정 목적을 수행하기 위해 나열된 작업 목록
- 메모리에 적재 되어 프로세서에 의해 실행 중인 프로그램
💡스레드
: 명령어가 CPU를 통해서 수행되는 객체의 단위로 프로세스 내에 존재하는 CPU 작업 단위
- 하나의 프로세스 내에 반드시 1개 이상의 스레드 존재
- 스레드는 같은 프로세스에 있는 자원과 상태 공유
- 같은 주소 공간에 존재
- 동일한 데이터에 접근 가능
- 프로세스 종료 시 스레드도 함께 종료
- 스레드의 필요성
- 여러 개의 작업 단위로 구성된 프로그램에서 요청을 동시에 처리하기 위해 존재
- 스레드의 구성요소
- 가상 CPU
: 인터프리터, 컴파일러에 의해 내부적으로 처리되는 가상 코드
- 수행 코드
: Thread Class에 구현되어 있는 run()
Method 코드
- 처리 데이터
: Thread에서 처리하는 데이터
- 스레드의 특징
- 프로세스 내에서 실행되는 흐름의 단위로 하나의 스레드는 한 번에 하나의 명령 수행
- 각 스레드마다 call stack이 존재하며 Code, Data, Heap 영역은 스레드끼리 공유
- 프로세스는 다른 프로세스의 메모리에 직접 접근 불가
- 스레드는 다른 스레드와 독립적으로 동작하여 두 개 이상의 스레드의 실행 및 종료 순서는 예측 불가
싱글 스레드와 멀티 스레드
- 싱글 스레드(Single-Thread)
: 프로세스가 단일 스레드로 동작하는 방식으로 일련의 처리를 단일 스레드만으로 직렬 처리하는 프로그래밍 방법
- 하나의 레지스터, 스택으로 표현
- 자바스크립트가 대표적인 싱글 스레드 언어
- 싱글 스레드의 장점
- 자원 접근에 대한 동기화를 신경 쓸 필요 없음
- 문맥 교환 작업을 요구하지 않음
- 프로그래밍 난이도가 쉽고, CPU 메모리 적게 사용
- 싱글 스레드의 단점
- 여러 개의 CPU를 활용하지 목함
- 싱글 스레드는 하나의 물리적 코어만 사용
- 멀리 코어 머신에서 CPU 사용 최적화 어려움
- 연산량이 많은 작업을 수행하는 경우, 작업 완료 시 다른 작업 수행 가능
- 에러 처리를 못하는 경우 멈춤
- 멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복 가능
- 멀티 스레드(Multi-Thread)
: 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것
- 멀티 프로세스(multi process)
: 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것
- 시스템 자원의 활용 극대화 및 처리량 증대 가능 -> 단일 프로세스 시스템의 효율성을 높일 수 있음
- 멀티 스레딩의 장점
- 작업을 분리하여 수행하므로 실시간으로 사용자에게 응답 가능
- 한 프로세스를 여러 프로세서에서 수행 가능
- 멀티 스레딩의 문제점
- 디버깅의 까다로움
- 단일 프로세스 시스템의 경우, 효과를 기대하기 어렵고 다른 프로세스에서 스레드 제어 불가
- 자원 공유의 문제 발생
- 문맥 교환 작업 요구
- 문맥 교환(Context Switching): CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 과정으로 다른 테스크(프로세스, 스레드)가 시작할 수 있도록 이미 실행 중인 테스크를 멈추는 것
동시성과 병렬성
- 시분할 방식
:운영체제가 각 스레드를 시간에 따라 분할하여 여러 스레드가 일정 시간마다 돌아가면서 실행되도록 하는 방식
- 동시에 돌릴 수 있는 스레드 수는 컴퓨터에 있는 코어 개수로 제한
- Concurrency(동시성, 병행성)
: 싱글 코어 환경에서 여러 개의 스레드가 시분할 방식으로 동시에 수행되는 것처럼 보이는 것
- Parallelism(병렬성)
: 멀티 코어 환경에서 여러 개의 스레드가 실제로 동시에 수행되는 것
🔆 문자열과 그래픽
문자열🔠
문자열이 차지하는 바이트❓
- 프로그래밍 언어마다 문자열을 저장하는 자료형이 다르기 때문에 이 자료형이 차지하는 바이트를 알아야 문자열이 차지하는 바이트를 계산할 수 있음
유니코드
: 유니코드 협회가 제정하는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 사업 표준
- 유니코드의 목적: 현존하는 문자 인코딩 방법을 모두 유니코드로 교체하는 것
- 인코딩: 어떤 문자나 기호를 컴퓨터가 이용할 수 있는 신호로 만드는 것
ASCII문자
: 영문 알파벳을 사용하는 대표적인 문자 인코딩
- 7비트로 모든 영어 알파벳 표현 가능
- 52개의 영문 알파벳 대소문자, 10개의 숫자, 32개의 특수 문자, 하나의 공백 문자를 포함
UTF-8과 UTF-16의 차이
: 인코딩 방식의 차이
- UTF-8
- 가변 길이 인코딩
: 유니코드 한 문자를 나타내기 위해 1byte에서 4bytes까지 사용
- 네트워크를 통해 전송되는 텍스트에 주로 사용
- ASCII 코드의 경우 1byte, 영어외 글자는 2-3byte, 보조 글자는 4byte 차지
- 바이트 순서가 고정
- UTF-16
- 코드 그대로 바이트로 표현 가능
- 바이트 순서가 다양
그래픽🌄
비트맵
: 웹 상에서 디지털 이미지를 저장하는 데 가장 많이 쓰이는 이미지 파일 포맷 형식으로 래스터 그래픽(점 방식)이라고 함
- 이미지의 각 점들을 격자형의 픽셀 단위로 구성
- 한 지역을 차지하는 셀은 위치에 따라 다른 값을 가짐
- 특징
- 사각의 픽셀 형태로 모여 있으므로 확대 시 계단현상(깨짐 현상) 발생
- 경계가 뚜렷하지 않음
- 컴퓨터에 부담이 덜함
- 픽셀 당 색상 값을 가지기 때문에 이미지 사이즈가 커질수록 용량도 커짐
벡터
: 이미지를 수학적인 공식으로 표현하는 이미지 파일 포맷 형식
- 특징
- 점과 점을 연결해 선, 선과 선을 연결해 면을 표현하는 수학적 원리
→ 계단현상(깨짐 현상) 발생x
- 비트맵에 비해 컴퓨터에 부담을 가함
- 사이즈를 키워도 용량에는 변화 없음
비트맵(래스터)과 벡터 이미지의 차이점
| 비트맵(래스터) | 벡터 |
---|
기반 기술 | 픽셀 기반 | 수학적으로 계산된 Shape 기반 |
특징 | 사진과 같이 색상의 조합이 다향한 이미지에 적합 | 로고, 일러스트와 같이 제품에 적용되는 이미지에 적합 |
확대 | 확대에 적합하지 않음 | 품질 저하 없이 모든 크기로 확대 가능, 해상도의 영향을 받지 않음 |
크기에 따른 파일 용량 | 큰 크기의 이미지는 큰 파일 사이즈를 가짐 | 큰 크기의 벡터 크래픽은 작은 파일 사이즈 유지 가능 |
상호 변환 | 이미지의 복잡도에 따라 벡터로 변환하는 것에 오랜 시간이 소요 | 쉽게 래스터 이미지로 변환 가능 |
대표적인 파일 포맷 | jpg, gif, png, bmp, psd | svg, ai |
웹에서의 사용성 | jpg, gif, png 등이 널리 쓰임 | svg 포맷은 현대의 브라우저에서 대부분 지원 |
🔆 가비지 컬렉션
가비지 컬렉션🗑
: 프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 정리하는 것
- 자바, C#, 자바스크립트
: 객체 생성시 자동으로 메모리를 할당하고 불필요 시 자동으로 해제하는 가비지 컬렉션이 내장
- C언어와 같은 저수준 언어
: 메모리 관리를 위해 malloc()
과 free()
를 사용해 개발자가 스스로 메모리를 할당하고 해제
- 고수준 언어와 저수준 언어
- 저수준 언어: 기계 친화적인 언어
- 하드웨어(레지스터 및 메모리)와 직접 상호 작용 가능
→빠르게 실행되는 응용 프로그램을 빌드하는 데 사용
- 고수준 언어: 인간 친화적인 언어
- 하드웨어와 직접 상호 작용x
- 컴파일러나 인터프리터 필요
메모리 생존 주기
- 필요 시 개발자가 할당
- 할당된 메모리 사용(Read and Write)
- 메모리가 더이상 필요하지 않을 경우 해제
- 1, 3의 경우 저수준 언어에서는 명시적, 고수준 언어에서는 암묵적으로 작동
대표적인 가비지 컬렉션 방법
- 가비지 컬렉션 알고리즘이 의존하고 잇는 공통 개념
: 참조(reference)
- 메모리 관리 관점에서 어떤 객체가 다른 객체에 접근할 수 있다면 다른 객체를 ‘참조’한다고 말한다
- 객체 참조에 대한 광의적 개념으로 일반적인 JavaScript 객체 뿐만 아니라 함수 스코프나 글로벌 렉시컬 스코프까지 포함
- 렉시컬 스코핑(lexical scoping): 변수 이름이 중첩된 함수에서 해석되는 방식을 정의하는 것
- 레퍼런스 카운팅(참조 횟수 계산)
: 한 객체를 참조하는 변수의 수를 추적하는 방법으로 가장 단순한 형태의 가비지 컬렉션 알고리즘
- 레퍼런스 카운트가 0이 될 경우 가비지 컬렉션의 대상이 됨
- 순환 참조의 경우 객체가 서로 한 번씩 참조한 것으로 간주되어 스코프를 벗어나 쓸모가 없게 되더라도 가비지 컬렉션 대상에서 제외되는 문제가 발생할 수 있음
- 트레이싱
: 한 객체에 flag를 두고, 가비지 컬렉션 사이클마다 flag에 표시 후 삭제하는 mark and sweep 방법
- 객체 필요 여부를 결정하기 위해 닿을 수 있는(reachable) 객체인지 판단
- 루트(Roots)
: 코드에서 참조되는 전역 변수로 가비지 컬렉터는 모든 루트의 목록을 생성
- 모든 루트와 자식을 검사하여 활성화 여부 표시
- 가비지 컬렉터는 활성으로 표시되지 않은 모든 메모리를 OS에 반환
메모리 누수
메모리 누수의 주요 원인: 예상치 못한 참조
- JavaScript에서의 예상치 못한 참조: 더이상 사용되지 않지만 코드 상 어딘가에 유지되어 해제되지 못한 변수들
- 메모리 누수의 3가지 형태
- 우발적으로 생성된 전역변수
- DOM 외부에서의 참조
- 클로저의 잘못된 사용