CSAPP 1장의 각 소단원을 읽으면서 주요 내용과 추가적으로 알아본 정보들을 기록하는 포스팅😎
1장은 컴퓨터 시스템 전반을 얕고 넓게 훑는 챕터이다.
글자색이 다른 부분은 내가 따로 추가한 생각 혹은 정보이다 (= 틀릴 수도 있다)
언어 | 분류 | 특징 |
기계어 (Machine Language) |
저급 언어 (Low-Level) | 컴퓨터 하드웨어가 직접 이해할 수 있는 이진 코드로 작성됨 |
어셈블리어 (Assembly Language) |
저급 언어 (Low-Level) | 기호적 명령어를 사용하여 프로그래밍함 |
C 언어 | 중간 수준 언어 | 저급과 고급 언어의 특징을 모두 갖춤, 하드웨어에 접근하고 시스템 프로그래밍을 할 수 있음 |
Java | 고급 언어 (High-Level) | 플랫폼 독립성과 객체 지향 프로그래밍을 지원함 |
파이썬 (Python) | 고급 언어 (High-Level) | 간결하고 읽기 쉬운 코드를 작성할 수 있으며, 다양한 라이브러리와 프레임워크를 지원함 |
위에서 아래로 갈수록 low level -> high level
각 단계에 대한 예시를 chatGPT에게 달라고 하니 다음과 같이 알려준다.
1. 전처리 (Preprocessing):
- 소스 코드 (source.c)
#include <stdio.h>
#define GREETING "Hello, World!"
int main() {
printf("%s\\n", GREETING);
return 0;
}
- 전처리기가 #include와 #define 지시어를 처리하면, 코드는 다음과 같이 변경됩니다:
// 내용은 stdio.h에서 가져옵니다...
int main() {
printf("Hello, World!\\n");
return 0;
}
2. 컴파일 (Compilation):
컴파일러는 전처리된 소스 코드를 어셈블리 코드로 변환합니다.
- 어셈블리 코드 (source.s) (간략화된 예):
.section .data
.string "Hello, World!\\n"
.section .text
.globl main
main:
movl $message, %edi
call printf
ret
3. 어셈블리 (Assembly):
어셈블러는 어셈블리 코드를 기계어로 변환하여 목적 파일을 생성합니다.
- 목적 파일 (source.o): (이진 형식으로, 일부는 ASCII로 표시됩니다)
00000000: 4865 6c6c 6f2c 2057 6f72 6c64 210a 0000 Hello, World!...
...
00000010: b800 0000 00e8 0000 0000 c3 ............
4. 링킹 (Linking):
링커는 목적 파일과 필요한 라이브러리를 결합하여 실행 가능한 프로그램을 생성합니다.
- 실행 가능한 파일 (executable): (이진 형식으로, 일부는 ASCII로 표시됩니다)
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
...
00001000: 4865 6c6c 6f2c 2057 6f72 6c64 210a Hello, World!.
이렇게 각 단계를 거쳐 C 소스 코드는 최종적으로 실행 가능한 프로그램으로 변환됩니다.
일반적으로 32 bit와 64 bit의 차이를 물어볼 때, 그 대상은 CPU 아키텍처 혹은 운영체제 아키텍처를 말한다.
각각에 있어서 위 질문의 대답은 다음과 같다.
특징 | 32bit CPU 아키텍처 | 64bit CPU 아키텍처 |
버스 너비 | 데이터 버스와 주소 버스 각각 32비트 | 데이터 버스와 주소 버스 각각 64비트 |
메모리 주소 지정 | 최대 2^32개의 고유한 메모리 주소, 최대 4GB 메모리 지원 | 최대 2^64개의 고유한 메모리 주소, 매우 큰 양의 메모리 지원 |
레지스터 크기 | 32비트 레지스터 사용 | 64비트 레지스터 사용 |
데이터 처리 능력 | 더 낮은 메모리 용량과 데이터 처리 능력 | 더 높은 메모리 용량과 데이터 처리 능력, 더 큰 데이터 세트와 더 복잡한 애플리케이션 처리 가능 |
특징 | 32bit 운영체제 | 64bit 운영체제 |
메모리 주소 지정 | 32비트 메모리 주소 사용, 최대 4GB 메모리 지원 | 64비트 메모리 주소 사용, 매우 큰 양의 메모리 지원 |
애플리케이션 실행 | 32비트 애플리케이션만 실행, 최대 2GB 메모리 할당 가능 | 64비트 및 32비트 애플리케이션 실행, 매우 큰 양의 메모리 할당 가능 |
시스템 리소스 사용 | 더 낮은 시스템 리소스 사용, 더 낮은 메모리 용량과 데이터 처리 능력 | 더 높은 시스템 리소스 사용, 더 높은 메모리 용량과 더 큰 데이터 처리 능력 |
메모리 계층구조의 각 저장장치 설명 + 어디에 위치하는지
위치 | 설명 | |
Register | CPU 코어 내부 | 레지스터는 CPU 코어 내부에 위치하며, 가장 빠른 데이터 접근을 제공. 레지스터는 연산 중에 사용되는 데이터와 주소를 임시로 저장하는 데 사용된다. |
L1 Cache | CPU 코어 내부 | L1 캐시는 CPU 코어 내부에 위치하며, 매우 빠른 데이터 접근을 제공. 자주 사용되는 데이터와 명령어를 저장하여 CPU의 성능을 향상시킨다. |
L2 Cache | CPU 코어 내부 | L2 캐시도 CPU 코어 내부에 위치하며, L1 캐시보다 약간 느리지만 여전히 빠른 데이터 접근을 제공한다. |
L3 Cache | CPU 코어 외부, CPU 칩 패키지 내부 | L3 캐시는 CPU 코어 외부에 위치하지만 칩 패키지 내부에 있으며, 모든 코어가 공유한다. L3 캐시는 L1 및 L2 캐시의 일관성을 유지하고 캐시 미스를 줄이는 데 도움이 된다. |
Main Memory (RAM) | CPU 칩 외부 | 메인 메모리는 CPU 칩과 별개의 주요 구성 요소로, 시스템의 주요 데이터 저장 영역으로 작동한다. CPU는 메인 메모리로부터 데이터를 읽고 쓰기 위해 메모리 버스를 사용한다. |
SSD | CPU 칩 외부 | SSD는 CPU 칩 외부에 위치하며, 데이터를 비휘발성으로 저장한다. 메인 메모리보다는 느리지만, 전원이 꺼져도 데이터를 유지할 수 있으며, 전통적인 하드 드라이브보다 빠른 데이터 접근을 제공한다. |
분산 파일 시스템/ 웹서버 | 네트워크를 통해 연결된 서버들 상에 위치 | 분산 파일 시스템은 여러 서버에 걸쳐 데이터를 저장하고 관리한다. 이는 데이터의 신뢰성과 가용성을 높이며, 클라우드 환경에서 효율적인 데이터 저장 및 공유를 가능하게 한다. 웹 서버는 HTTP 프로토콜을 사용하여 클라이언트의 요청을 처리하고 웹 페이지를 제공한다. 웹 서버는 네트워크에 연결된 서버 상에 위치하며, 클라우드 환경에서도 실행될 수 있다. |
<아래는 chatGPT가 제안한 해당 주제와 관련해서 추가로 고려할 점들>
- 데이터 일관성: 캐시 레벨 간에 데이터 일관성을 유지하는 것이 중요합니다. 예를 들어, 한 레벨의 캐시에서 데이터를 수정하면, 이 변경 사항이 다른 캐시 레벨과 동기화되어야 합니다.
- 캐시 정책: 어떤 데이터를 캐시에 유지할지, 언제 캐시를 새로 고칠지 결정하는 캐시 정책이 중요합니다. 이는 시스템의 성능과 리소스 사용률에 큰 영향을 미칩니다.
- 비용과 성능의 트레이드오프: 더 높은 레벨의 캐시는 일반적으로 더 높은 성능을 제공하지만 더 많은 비용이 듭니다. 이러한 트레이드오프를 이해하고 적절한 설계 결정을 내리는 것이 중요합니다.
추상화??
추상화는 복잡한 시스템을 단순화하여 이해하고 사용할 수 있게 만드는 기술적 방법입니다. 추상화를 통해, 사용자는 시스템의 내부 작동 방식에 대해 신경 쓰지 않고도 시스템을 사용할 수 있습니다.
1. 프로세스 추상화: 프로세서, 메인 메모리, 입출력 장치 등의 복잡한 상호 작용을 숨기고, 사용자에게 단순한 실행 환경을 제공합니다. 예를 들어, 프로그래머는 프로세스가 독립적으로 실행되는 것처럼 느끼지만, 실제로는 운영체제가 여러 프로세스를 관리하며 스케줄링합니다.
2. 가상 메모리 추상화: 메인 메모리와 디스크의 복잡한 관리를 숨기고, 연속적이고 큰 메모리 공간을 제공함으로써 프로그래머가 메모리 관리를 더 쉽게 할 수 있게 합니다. 예를 들어, 프로그래머는 물리적 메모리의 위치에 대해 걱정하지 않고, 단순히 가상 메모리 주소를 사용할 수 있습니다.
3. 파일 및 입출력장치 추상화: 디스크, 네트워크 카드, 프린터 등 다양한 입출력 장치의 복잡한 동작을 숨기고, 일관된 인터페이스를 제공하여 프로그래머가 더 쉽게 입출력 작업을 수행할 수 있게 합니다. 예를 들어, 프로그래머는 파일을 읽고 쓰는 단순한 명령을 사용할 수 있으며, 운영체제가 실제로 어떻게 데이터를 저장하고 전송하는지에 대해 걱정할 필요가 없습니다.
이렇게 추상화는 프로그래머와 시스템 사용자에게 더 단순하고 이해하기 쉬운 인터페이스를 제공하며, 시스템의 내부 복잡성을 숨깁니다. 즉, 위 개념들은 실제로는 더 복잡한 하드웨어를 복잡하지 않은 것처럼 조작하기 위한 장치.
메모리 heap vs 자료구조 heap // 메모리 stack vs 자료구조 stack
마침 자료구조들과 이름이 같아서, 서로 관련있는 개념인지 헷갈렸다. 그래서 알아봄
기능 | |
메모리 힙 (Heap) | 프로그램의 실행 도중 동적으로 메모리를 할당하고 해제하는 영역이다. 구조화되지 않은 메모리 풀로, 프로그래머가 필요에 따라 메모리를 할당하고 해제할 수 있다. |
메모리 스택 (Stack) | 프로그램의 실행 흐름을 관리하는 영역으로, 함수 호출과 반환, 지역 변수의 저장 등을 처리한다. LIFO (Last In First Out) 방식으로 동작하며, 구조화된 방식으로 메모리를 할당/해제한다. |
메모리 힙이 자료구조 힙으로 구현된 건 아니고, 마찬가지로 메모리 스택이 자료구조 스택으로 구현된 것도 아니다.
Amdahl의 법칙이 내게 준 인사이트는 두 가지
과거 삼성전자가 위기에 빠졌을 때, 이건희가 다음과 같이 말한 일화는 유명하다. "마누라, 자식 빼고 다 바꿔!"
그만큼 조직 전체의 효율성을 크게 개선한다는 것이, 속된 말로 전체를 뒤집어엎는 수준이 아니면 힘들다는 거다.
그래서 혁신이 중요하다.
아무리 빠르게 성장해온 조직이라고 해도, 덩치가 커지면 자연스럽게 둔해질 수밖에 없다. 타성에 젖는 순간 효율성은 극도로 저하된다.
이건 집단에도 적용되고 한 개인에게도 적용되는 문제같다.
비록 컴퓨터과학에서 나온 개념이지만, 물이 고이면 썩는다는 세상의 이치를 수식으로 증명한 듯한(?) 그런 감명을 받았다.
이상, 암달의 법칙을 본 문과의 감상 ..ㅎㅎ
CS:APP | Chapter 3 | (2) 프로그램의 기계수준 표현 (1) | 2023.11.01 |
---|---|
CS:APP | Chapter 3 | (1) 프로그램의 기계수준 표현 (0) | 2023.10.31 |
[혼공컴운] Ch4. CPU의 작동 원리 (레지스터) (0) | 2023.10.04 |
[혼공컴운] Ch4. CPU의 작동 원리 (ALU, 제어장치) (0) | 2023.10.04 |
[혼공컴운] Ch3. 명령어 주소 지정 방식 (0) | 2023.09.30 |