1주 차에서 다룰 내용은 다음과 같다.
1. Computer Architecture
- 컴퓨터 구조 기초
- 컴퓨터의 구성
- CPU 작동 원리
- 캐시 메모리
2. Java
- 컴파일 과정
- Java Virtual Machine
- Call By Value/Call By Reference
- Casting
- AutoBoxing/AutoUnboxing
- Thread
Computer Architecture
컴퓨터 구조
컴퓨터 시스템은 개념적으로는 하드웨어와 소프트웨어, 그리고 펌웨어의 결합으로 이루어진다.
하드웨어(Hardware)
컴퓨터 하드웨어는 컴퓨터 시스템이 작동하는 데 필요한 물리적 구성 요소이다.
하드웨어가 없다면, 컴퓨터를 유용하게 만드는 필수 소프트웨어를 실행할 방법이 없다.
시스템의 속도는 사용하는 하드웨어에 많은 영향을 받는다.
머더보드란?
머더보드는 pc를 작동하는데, 중심적인 역할을 한다. 그리고 cpu가 장착되는 곳이며, 다른 모든 하드웨어가 실행되는 허브이다.
머더보드는 필요한 곳에 전원을 할당하고, 모든 다른 구성요소와 통신하고 조정 작업을 수행하는 두뇌 역할을 한다.
중앙 처리 장치란?(CPU)
컴퓨터에서 실행되는 프로그램의 모든 정보를 처리하는 역할을 담당한다.
기억, 해석, 연산, 제어라는 매우 중요한 역할들을 도맡는, 컴퓨터의 대뇌라고 할 정도로 매우 중요한 부분이다.
프로그램의 명령어를 해석하여 데이터를 연산/처리를 하고 그렇게 돌아가도록 제어해주는 부분, 혹은 그 기능을 내장한 칩을 의미
RAM이란?
RAM의 역할은 프로그램에 의해 생성된 정보를 그때마다 일시적으로 저장하고 이 데이터에 즉시 액세스 할 수 있도록 함.(휘발성 메모리)
1초에 몇십억 번의 연산을 하는 CPU가 필요한 데이터를 찾기엔 하드디스크는 너무 느리다.
그래서 하드디스크에 저장된 자주 사용하는 데이터(프로그램)등을 램으로 옮겨 사용한다.
ROM이란?
ROM은 (Read Only Memory)로 내용을 읽을 수는 있어도 바꿀 수 없는 기억장치를 말한다.
ROM은 전원이 끊어져도 기록된 데이터들이 소멸되지 않는 비휘발성 메모리로 데이터를 한번 저장하면 지울 수 없다.
롬과 램을 비교해보자
램(RAM): 읽기 쓰기 가능, 롬(ROM): 읽기만 가능
램(RAM): 속도가 빠르다, 롬(ROM): 램에 비해 속도가 느리다.
램(RAM): 휘발성 메모리, 롬(ROM): 비 휘발성 메모리
소프트웨어(Software)
소프트웨어란 하드웨어를 효율적으로 이용하기 위한 운영체제(OS) 워드 프로세서이다.
하드웨어는 신체이고 소프트웨어는 그 신체를 움직이는 뇌라고 생각하면 된다.
시스템 소프트웨어(System Software)
컴퓨터를 동작시키는 일을 하는 운영체제(OS)와 부트로더 등 하드웨어에 접근을 하여 운영을 하기 위해 만들어진 것.
->컴파일러, 운영체제
응용 소프트웨어(Application Software)
워드프로세서, 웹브라우저 등 os위에 사용자가 사용하게 되는 프로그램이다.
->카카오톡, 워드
펌웨어(firmware)
펌웨어는 컴퓨팅과 공학 분야에서 특정 하드웨어 장치에 포함된 소프트웨어로, 소프트웨어를 읽어 실행하거나,
수정하는 것도 가능한 장치를 뜻한다. (리모컨)
CPU 작동 원리
CPU는 컴퓨터에서 가장 핵심적인 역할을 수행하는 부분이다.
크게 연산장치, 제어장치, 레지스터 3가지로 구성되어 있다.
연산 장치
산술 연산과 논리 연산을 수행(ALU)
연산에 필요한 데이터를 레지스터에서 가져오고, 연산 결과를 다시 레지스터로 보내준다.
제어 장치
명령어를 순서대로 실행할 수 있도록 제어하는 장치
주 기억장치에서 프로그램 명령어를 꺼내 해독하고, 그 결과에 따라 명령어 실행에 필요한 제어 신호를 기억장치, 연산장치,
입출력 장치로 보냄. 또한 이들 장치가 보낸 신호를 받아, 다음에 수행할 동작을 결정함.
레지스터
고속 기억장치이다. 명령어 주소, 코드, 연산에 필요한 데이터, 연산 결과 등을 임시로 저장한다.
범용 레지스터: 연산에 필요한 데이터나 연산 결과를 임시로 저장
특수목적 레지스터: 특별한 용도로 사용하는 레지스터
특수 목적 레지스터 중 중요한 것들
MAR(메모리 주소 레지스터): 읽기와 쓰기 연산을 수행할 주 기억장치 주소 저장
PC(프로그램 카운터): 다음에 수행할 명령어 주소 저장
IR(명령어 레지스터):현재 실행 중인 명령어 저장
MBR(메모리 버퍼 레지스터): 주 기억장치에서 읽어온 데이터 or 저장할 데이터 임시 저장
AC(누산기): 연산 결과 임시 저장
CPU의 동작 과정
1. 주기억장치는 입력장치에서 입력받은 데이터 또는 보조기억장치에 저장된 프로그램을 읽어온다.
2.CPU는 프로그램을 실행하기 위해 주기억장치에 저장된 프로그램 명령어와 데이터를 읽어와 처리하고 결과를 다시
주기억장치에 저장한다.
3. 주기억장치는 처리 결과를 보조기억장치에 저장하거나 출력장치로 보낸다.
4. 제어장치는 1~3 과정에서 명령어가 순서대로 실행되도록 각 장치를 제어한다.
캐시 메모리(Cache Memory)
속도가 빠른 장치와 느린 장치에서 속도 차이에 따른 병목 현상을 줄이기 위한 메모리를 말한다.
병목현상은 한 구성요소로 인해서 더 강력한 성능의 구성 요소가 최고의 성능을 발휘하지 못할 때 발생.
CPU가 주기억장치에서 저장된 데이터를 읽어올 때, 자주 사용하는 데이터를 캐시 메모리에 저장한 뒤,
다음에 이용할 때 주기억장치가 아닌 캐시 메모리에서 먼저 가져오면서 속도를 향상한다.
속도가 빠르지만, 용량이 적고, 비용이 비쌈.
캐시 메모리 작동 원리
캐시에 데이터를 저장할 때는, 이러한 참조 지역성(공간)을 최대한 활용하기 위해 해당 데이터뿐만 아니라, 옆 주소의 데이터도
같이 가져와 미래에 쓰일 것을 대비한다.
CPU가 요청한 데이터가 캐시에 있으면, 'Cache HIt' 없어서 DRAM에서 가져오면 'Cache Miss'이다.
캐시 미스의 경우
1. 해당 메모리 주소를 처음 불러서 나는 미스
2. 캐시 메모리에 A와 B데이터를 저장해야 하는데, A와 B가 같은 캐시 메모리 주소에 할당되어 있어서 나는 미스
3. 캐시 메모리의 공간이 부족해서 나는 미스
캐시 크기를 키워서 문제 해결 시 -> 캐시 접근 속도가 느려지고 파워를 많이 먹게 됨.
Java
컴파일 과정
1. 자바 소스코드(. java)를 작성한다.
2. 자바 컴파일러가 자바 소스파일을 컴파일한다. 이때 나오는 파일은 자바 바이트 코드 파일로 아직 컴퓨터는 읽을 수 없고,
JVM이 이해할 수 있는 코드이다.
3. 컴파일된 바이트 코드를 JVM의 클래스 로더에게 전달.
4. 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 JVM의 메모리에 전달.
5. 실행 엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와 실행.
클래스 로더 동작
1. 로드: 클래스 파일을 가져와서 JVM메모리에 로드
2. 검증: 자바 언어 명세 및 JVM 명세에 명시된 대로 구성되어 있는지 검사.
3. 준비: 클래스가 필요로 하는 메모리를 할당.
4. 분석: 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 디렉트 레퍼런스로 변경.
5. 초기화: 클래스 변수들을 적 잘한 값으로 초기화
자바 가상 머신(Java Virtual Machine)
JVM은 다른 프로그램을 실행시키는 것이 목적이다.
자바 프로그램이 어느 기기나 운영체제 상에서도 실행될 수 있도록 하는 것.
프로그램 메모리를 관리하고 최적화하는 것.
자바 애플리케이션을 클래스 로더를 통해 읽어 들이고, 자바 API와 함께 실행하는 역할.
JAVA와 OS 사이에서 중개자 역할을 수행하여 OS에 구애받지 않고 재사용을 가능하게 해 줌.
Call by value/Call by reference
Call by value란?
함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다. 종료 시에는 해당 공간이 사라짐.
Call by value호출 방식은 호출 시 전달되는 변수 값을 복사해서 함수 인자로 전달함.
void function(int num){
num=100;
}
void main(){
int num = 50;
function(num);
printf("%d",num);
}
//print출력은 50
Call by reference란?
함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달함. 따라서 함수 안에서 인자 값이 변경되면, 전달된 객체의 값도 변경됨.
void function(int *num){
*num=100;
}
void main(){
int num = 50;
function(&num);
printf("%d",num);
}
//print출력은 100
Casting(업 캐스팅&다운 캐스팅)
캐스팅이 필요한 이유는?
1. 다형성: 오버 라이딩된 함수를 분리해서 활용할 수 있다.
2. 상속: 캐스팅을 통해 범용적인 프로그래밍이 가능하다.
업 캐스팅
Parent p = new Childe();
형 변환을 해야 할 것 같지만, Parent를 상속받은 Child는 Parent의 속성을 포함하기 때문에, 생략 가능하다.
다운 캐스팅
Parent p = new Child();
Child c= (Child) p;
다운 캐스팅의 경우 형 변환을 적어줘야 한다.
오토 박싱&오토 언박싱
기본 타입 : int long, flaot, double , boolean...
Wrapper 클래스 : Integer, Long, Float, Double, Boolean...
Wrapper클래스를 사용하는 이유는?
1. 기본 데이터 타입을 Object로 변환할 수 있다.
2. java.util패키지의 클래스는 객체만 처리하므로 Wrapper class는 이경우에도 도움이 된다.
3. ArrayList등과 같은 Collection Framework의 데이터 구조는 기본 타입이 아닌 객체만 저장하게 되고,
Wrpper class를 사용하여 오토 방식/ 언박싱이 일어난다.
4. 멀티스레딩에서 동기화를 지원하려면 객체가 필요하다.
박싱이란?
기본 타입 데이터를 대응하는 Wrapper클래스로 만드는 동작
언박싱이란?
Wrapper 클래스에서 기본 타입으로 변환
//박싱
int a = 10;
Integer b = new Integer(a);
//오토 박싱
int i =10;
Integer num = i;
//언박싱
Integer b = new Integer(10);
int a = b.intValue();
//오토 언박싱
Integer num = new Integer(10);
int i = num;
편의성을 위해 오토 박싱과 언박싱이 제공되지만, 내부적으로 추가 연산 작업이 발생하여, 성능이 떨어지게 된다.
따라서 오토 박싱과 언박싱이 일어나지 않도록 동일한 타입 연산이 이루어지도록 구현해야 한다.
Thread
실제로 동시에 처리될 수 있는 프로세서의 개수는 CPU 코어의 개수와 동일.
이보다 많은 개수의 프로세서가 존재함으로 모두 함께 동시에 처리할 수는 없다.
멀티스레딩이란 하나의 프로세스 안에 여러 개의 스레드가 동시에 작업을 수행하는 것을 말한다.
프로세스== 공장, 스레드==일꾼이라고 생각하면 편하다.
'CS' 카테고리의 다른 글
HTTP 상태 코드 (2) | 2023.01.04 |
---|---|
5주차 CS 스터디 Operating System&Spring (1) | 2022.11.08 |
4주차CS스터디Network&Spring (0) | 2022.10.27 |
3주차CS스터디Network&Java (0) | 2022.10.14 |
2주차CS스터디Computer Architecture&Java (2) | 2022.09.28 |