컴퓨터구조론 1장
bit -> binary : 0 or 1 수를 표현
1byte = 8bit
MSB LSB 최상위비트 최하위비트
sign bit (부호 비트) : 컴퓨터 과학에서 부호 비트(Sign Bit)는 숫자의 부호(양수 또는 음수)를 나타내기 위해 사용되는 비트, 부호비트는 보통 가장 왼쪽 비트(최상위 비트)인 MSB가 되며, 값이 0인 경우 양수를 나타내고, 값이 1인 경우 음수를 나타낸다.
2의 보수 : 음수 표현방법
구하는 방법 - 주어진 이진수의 모든 자리의 숫자를 반전(0을 1로, 1을 0으로)시킨 뒤 여기에 1을 더하면 2의 보수를 얻을 수 있다.
사용하는 이유 - 사인비트만으로는 -0 같은 경우가 나타날수 있기때문에 2의보수 사용
부동소수점 (딥러닝 할때 중요, 백엔드는 간단하게 알아도 됨)
base 64 인코딩 방식 (추후 다룸)
웹상에서 http 패킷의 payload
payload부분에 Data가 적재가 된다.
이 Data를 base 64라는 방식으로 인코딩을 한다 (8진수)
16진수 - 컴퓨터는 8개의 비트가 모인 바이트 단위로 정보를 표현한다. 2개의 16진수는 1byte의 2진수로 변환되기 때문에 정보를 표현하기 매우 유용한 이유 때문에 16진수를 사용하고있다.
컴퓨터의 Address 용으로 많이 사용
1byte 당 주소(Address)가 부여 (통신하기 위해서, 발신 수신 주소 알아야함)
cpu의 Pysical Address
cpu가 정의한 address map(피지컬 어드레스) 과 os가 정의한 address map(가상, 버추얼 어드레스)은 다르다
Physical Address : 피지컬 어드레스는 실제 하드웨어 메모리(RAM)의 주소를 의미합니다. 이는 메모리 컨트롤러에 의해 직접 참조되는 주소입니다. ( 실제 메모리 위치를 가리킴 )
Virtual Address : 버추얼 어드레스는 운영 체제와 CPU에 의해 사용되는 추상화된 주소입니다. 이는 실제 물리적 메모리 주소가 아니라 프로세스가 사용할 수 있는 논리적 주소 공간입니다. ( 프로세스가 사용하는 논리적 주소, 피지컬 어드레스로 변환되어 실제 메모리에 접근함 )
프로세스 = OS가 정의한 버추얼 어드레스 스페이스
정의 : 버추얼 어드레스 스페이스는 각 프로세스가 사용할 수 있는 가상의 메모리 공간입니다. 이는 프로세스가 실행되는 동안 운영 체제에 의해 할당됩니다.
특징 :
- 독립성: 각 프로세스는 자신만의 버추얼 어드레스 스페이스를 가지며, 이는 다른 프로세스의 메모리와 겹치지 않습니다. 따라서 프로세스 간의 메모리 충돌을 방지할 수 있습니다.
- 보안: 프로세스는 다른 프로세스의 메모리에 접근할 수 없으므로, 메모리 보호가 가능합니다. 이는 시스템 보안을 강화합니다.
- 추상화: 프로세스는 물리적 메모리 주소를 직접 다루지 않고, 추상화된 버추얼 어드레스를 사용합니다. 이를 통해 프로그래머는 메모리 관리의 복잡성을 줄일 수 있습니다.
구성 요소
버추얼 어드레스 스페이스는 여러 영역으로 나뉘며, 일반적으로 다음과 같은 구조를 가집니다:
- 코드 영역 (Code Segment): 실행 코드(우리가 작성한 소스코드)가 저장되는 공간입니다. 일반적으로 읽기 전용으로 설정됩니다.
- 데이터 영역 (Data Segment): 초기화된 전역 변수와 정적 변수가 저장됩니다.
- BSS 영역 (Block Started by Symbol): 초기화되지 않은 전역 변수와 정적 변수가 저장되는 공간입니다.
- 힙 영역 (Heap Segment): 동적 메모리 할당을 위한 공간입니다. 런타임 중에 malloc 등 함수로 메모리를 할당합니다.
- 스택 영역 (Stack Segment): 함수 호출과 로컬 변수(자동변수)를 저장하기 위한 공간입니다. 함수가 호출될 때마다 스택 프레임이 생성됩니다.
메모리 관리
운영 체제는 버추얼 어드레스 스페이스를 물리적 메모리에 매핑하는 과정을 관리합니다:
- 페이지 테이블 (Page Table): 버추얼 어드레스를 피지컬 어드레스로 변환하는 매핑 정보를 저장합니다. 각 프로세스는 고유의 페이지 테이블을 가집니다.
- TLB (Translation Lookaside Buffer): 페이지 테이블의 캐시 역할을 하여 주소 변환 속도를 높입니다.
- 페이지 폴트 (Page Fault): 프로세스가 접근하려는 버추얼 어드레스가 물리적 메모리에 없는 경우, 운영 체제가 디스크에서 필요한 데이터를 불러오는 과정입니다.
요약 : 프로세스는 운영 체제가 정의한 버추얼 어드레스 스페이스 내에서 독립적으로 실행되며, 이는 메모리 보호와 관리의 효율성을 높입니다. 운영 체제는 버추얼 어드레스를 실제 물리적 메모리 주소로 변환하여 각 프로세스가 안전하고 효율적으로 실행될 수 있도록 합니다.
도커 = 프로세스 격리기술
https://sundaland.tistory.com/100
Java는 JVM 이 있기 때문에 플랫폼에 종속적이지 않고 이식성이 뛰어나다.
JVM은 어플리케이션이기 때문에 특정 CPU나 OS에 종속적
The Java Virtual Machine ( JVM )
JVM은 Java 프로그래밍 언어와 Java 플랫폼의 핵심입니다. JVM은 바이트 코드를 특정 CPU의 기계 코드로 변환합니다(다른 프로그래밍 언어에서는 오브젝트 코드라고도 합니다).
JVM은 가비지 컬렉션, 메모리 관리, 보안 등의 기능을 제공합니다. JVM은 플랫폼에 독립적이며, 가상 인터페이스를 사용하여 기능을 사용자(개발자) 정의할 수 있습니다. 이 가상 인터페이스는 특정 CPU에 종속적이지 않으며 운영 체제에도 독립적입니다.
JVM의 이러한 플랫폼 독립성은 한 기계에서 Java 프로그램을 작성하고 다른 기계에서 실행할 수 있게 해줍니다.
C++ 로 작성된 App
JAVA 문법 : C and C++ 베이스로 만들어졌다.
Java Bytecode, 자바 바이트코드
우리는 Java 소프트웨어를 개발하기 위해서 JDK를 설치하고 Java 소프트웨어를 실행시키기 위해서 JRE 를 설치한다.
또한 개발을 하면 실행 결과를 확인하기 위해서 Compile 과정을 거치게 되는데, 이 컴파일은 바로 JDK나 JRE 에 함께 포함되는 javac.exe 실행파일이 수행하는 것이다.
이는 개발자가 작성한 .java 파일을 JVM이 이해할 수 있도록 하는 Bytecode 로 변환하고 .class 파일을 만드는 것을 의미하는데, .class 파일에 존재하는 데이터가 바로 자바 바이트코드, Java Bytecode 인 것이다.
주의해야 할 점이 컴파일 결과 라고 해서 C나 C++이 컴파일하면 생성하는 기계어와 동일하게 생각하면 안된다. 기계어는 JVM이 다른 모듈을 통해서 생성하고 실행하는데, 이 과정에서 C나 C++에 비해 조금 느린 성능을 내는 것이다.
C++와 Java의 가장 큰 차이점
- C++은 컴파일만 되지만, Java는 컴파일과 인터프리터 둘 다 지원한다.
- C++은 컴파일러가 소스코드를 기계어로 변형하므로, 플랫폼에 종속적이다.
- Java는 코드를 컴파일러에 의해 바이트코드로 변형되고, 자바 인터프리터가 바이트코드를 런타임에 실행시키고 결과를 생성한다.
JIT (Just-In-Time)
- 방식 : 브라우저에서 파일들을 다운로드 한 뒤에 한번 컴파일해서 브라우저 엔진이 실행할 수 있는 저수준 언어로 바꿔준 후 화면을 렌더링 하는 방식이다. (실행 시점에 바이트 코드를 기계어로 번역)
- 특징 : 1. 실행속도가 상대적으로 느리다. (why? 소스코드가 서버에서 컴파일 되는것이 아닌 사용자의 브라우저에서 컴파일 되는 방식이라서) 2. 앱설치 속도, 설치 용량 등이 AOT에 비해 빠르고 적게 차지한다. 3. 브라우저에서 여러 에러들을 발생시키고 확인할 수 있으며 디버깅이 가능하다. 4. CPU 사용이 AOT에 비해 높다
- 사용 : Java에서 사용되는 JVM(Java Virtual Machine), C#에서 사용되는 CLR(Common Language Runtime)
AOT (Ahead-Of-Time)
- 방식 : 소스 코드를 미리 컴파일하는 방식을 의미한다. (설치 시점에 기계어로 번역)
- 특징 : 1. 미리 컴파일을 해놓기 때문에 속도가 상대적으로 빠르다. 2. 미리 컴파일을 해놓기 때문에 설치 속도나 설치 용량이 큰편이다. 3. CPU 사용이 JIT에 비해 낮다.
- 사용 : C, C++
변수(Variable) : 하나의 값을 저장할 수 있는 저장공간이고 이는 얼마든지 값을 바꿀 수 있다.
상수(Constant) : 단 한 번만 값을 저장할 수 있는 저장공간이고 값을 한 번 지정하면 절대 바꿀 수 없다.
리터럴(Literal) : 그 자체로 의미를 가지는 값을 말한다. 다시 말해, 변수에 넣는 변하지 않는 데이터를 의미, 프로그래머가 코드로 작성한 값
expression(표현식) : 적어도 하나의 값(value)를 반드시 산출(produce)하는 것 ( 값으로 평가되면 expression )
statement(명령문) : 무언가를 수행(action) ( ; 으로 끝나면 statement )
함수와 메서드의 차이
함수는 독립적으로 존재하고, 메드는 class 및 객체에 종속적
함수는 여러 문장들이 하나의 기능을 구현하도록 구성한 것이라고 할 수 있다. 그 함수 중에서 클래스 내부에 정의한 함수를 메소드라고 부르는 것이다. 또한 메소드는 객체의 속성을 다루기 위한 행위를 정의한 것이라는 의미도 포함하고 있다.
함수 파라미터(매개변수) : 함수를 정의할 때 외부로부터 받아들이는 임의의 값을 의미
함수 아규먼트(전달인자) : 함수에서 받는 값중 실제로 값을 가지고 오는 input의 값
function abc("매개변수") {
매개변수;
}
abc("인자", "인자")
브랜치 하고 돌아오려면 주소가 필요하다 - 브랜치는 프로그램의 실행 흐름을 변경하는 명령어입니다. 조건문이나 반복문, 함수 호출과 같은 제어 구조에서 사용됩니다. 예를 들어, 조건에 따라 다른 코드 블록으로 점프하거나, 반복문을 종료하고 다음 명령어로 이동하는 경우 등이 있습니다.
컴파일 + 링크 = 빌드
컴파일 : 소스 코드를 목적 코드로 변환하는 과정
링크 : 여러 목적 코드를 결합하여 실행 파일을 생성하는 과정
빌드 : 컴파일과 링크를 포함한 전체 과정으로, 소스 코드에서 실행 파일을 생성하는 과정,
Application을 만들기 위해서는 빌드되어야한다.
call 과 return 키워드를 할수있게 하는게 Linking
심볼 테이블 = 함수 테이블 : 함수명과 그 함수에 정의한 코드
심볼 테이블(Symbol Table)은 컴파일러나 링커가 소스 코드를 처리하는 동안 각 심볼(변수, 함수, 객체 등)에 대한 정보를 저장하는 데이터 구조
심볼 테이블은 소스 코드의 각 심볼에 대한 다양한 속성을 추적하고 관리하며, 프로그램의 컴파일 및 실행 중에 중요한 역할을 합니다.
심볼 테이블의 구성 요소
- 심볼 이름(Name): 변수, 함수, 클래스 등의 이름입니다.
- 데이터 타입(Type): 심볼이 나타내는 데이터의 타입(예: 정수, 실수, 문자 등)입니다.
- 범위(Scope): 심볼이 유효한 코드 블록 또는 영역입니다.
- 메모리 위치(Location): 심볼이 메모리 내에 저장된 위치(주소)입니다.
- 기타 속성(Attributes): 심볼의 초기값, 크기, 접근 제한자(public, private 등) 등 추가적인 속성입니다.
심볼 테이블의 사용 시기
- 컴파일 타임(Compile Time): 소스 코드를 컴파일하는 동안, 심볼 테이블은 소스 코드의 모든 심볼을 기록하고 관리합니다.
- 링크 타임(Link Time): 여러 개의 오브젝트 파일을 링크하여 하나의 실행 파일을 만들 때, 심볼 테이블을 사용하여 심볼 간의 참조를 해결합니다.
- 런타임(Runtime): 일부 언어에서는 심볼 테이블이 런타임 동안에도 유지되어 동적 로딩이나 디버깅에 사용될 수 있습니다.
요약
심볼 테이블은 컴파일러와 링커가 소스 코드를 처리하고 실행 파일을 생성하는 과정에서 각 심볼에 대한 정보를 저장하고 관리하는 중요한 데이터 구조입니다. 이는 프로그램의 메모리 관리, 심볼 참조 해결, 중복 검사 등을 효율적으로 수행할 수 있도록 도와줍니다.
운영체제는 각 프로세스가 사용하는 가상 주소를 실제 물리적 메모리 주소로 매핑하여 프로세스가 메모리에 접근할 수 있게 합니다.
매핑 : 가상 주소 공간(virtual address space)을 물리적 메모리 주소에 연결하는 과정을 의미
프로세스 = os가 디파인한 버추얼 어드레스 스페이스
실행파일exe = 코드영역, 데이터영역 나눠져있는이유
함수 왜만드냐~ 함수 호출하거나 호출당하려고 (그래서 주소를 만든다)
Process의 유저는 application
cpu는 os의 버추얼 어드레스를 모름, 자기가 디파인한 피지컬 어드레스 맵만 암os가 운영하는 버추얼어드레스를 피지컬어드레스로 변환시켜줘야 cpu가 안다
프로세스는 결과적으로 os가 디파인한 버추얼 어드레스스페이스다링크 = 함수호출, 연결시켜주는거호출한단말이 뭐야 브랜치하는거브랜치하고 돌아오려면 돌아올주소도 필요하고 점프할주소도필요하고
'Everyday Study' 카테고리의 다른 글
2024.07.01 (월) { 메서드와필드, 신택틱슈가, 이터레이터, ArrayList, ArrayCopy, 런타임에리어, 증감연산자, 엔트리포인트, 콜스택, 클래스로더 ... } (0) | 2024.07.01 |
---|---|
2024.06.28 (금) { 상속, 자동변수, 참조변수, 액세스연산자, 클래스 리터럴 } (0) | 2024.06.28 |
2024.06.27 (목) {포인터 변수, 조건문, 반복문, 데이터타입, JVM, new키워드 } (1) | 2024.06.27 |
2024.06.26 (수) (0) | 2024.06.26 |
2024.06.24 (월) (0) | 2024.06.24 |