일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- attribute
- Generator
- 프로그래머스
- kaggle
- 밴픽
- Python Implementation
- 715. Range Module
- 운영체제
- Convert Sorted List to Binary Search Tree
- Decorator
- Python Code
- 시바견
- Regular Expression
- 43. Multiply Strings
- Class
- iterator
- 파이썬
- 315. Count of Smaller Numbers After Self
- 30. Substring with Concatenation of All Words
- Protocol
- 109. Convert Sorted List to Binary Search Tree
- 컴퓨터의 구조
- concurrency
- shiba
- data science
- Substring with Concatenation of All Words
- Python
- DWG
- t1
- LeetCode
- Today
- Total
Scribbling
컴퓨터의 구조 - 3 본문
1. 컴퓨터 아키텍처: 컴퓨터의 여러 구성 요소를 배치하는 방법
- 프로세서 코어 (CPU): CPU = ALU + 레지스터 + 실행 장치
- 마이크로프로세서: 메모리와 I/O가 프로세서 코어와 같은 패키지에 들어 있지 않은 프로세서
- 마이크로컴퓨터: 메모리 및 I/O가 프로세서 코어와 같은 패키지에 들어 있는 프로세서 (e.g. 식기세척기의 컴퓨터)
- 단일 칩 시스템(SOC): 다소 복잡한 마이크로컴퓨터 (e.g. WIFI SOC)
2. 함수(프로시저) 호출 흐름
함수를 호출하는 부분에서 함수를 실행한 후, 원래의 자리로 돌아올 필요가 있다. 이 때, 원래의 자리를 기억해야 한다.
3. 스택
재귀 함수가 제대로 동작하기 위해서는 반환 주소를 여럿 저장할 수 있어야 한다. 또한 함수에서 호출 지점으로 돌아갈 때, 어떤 주소로 돌아갈지 결정해야 한다. 이를 위해 스택이 사용된다. 이를 통해 각각의 함수 호출이 서로 독립적이게 된다. 이렇게 함수가 호출될 때마다 스택에 저장되는 데이터를 스택 프레임이라고 한다.
4. 인터럽트
인터럽트는 실행중인 프로그램을 잠깐 중단시켜야 하는 방법이다. 이는 소프트웨어적으로 구현이 불가능하여, 하드웨어로 구현한다. 작동 방식은 아래와 같다.
(1) 주변 장치가 인터럽트 요청 (Interrupt Request)를 생성
(2) 프로세서가 현재 명령어를 끝까지 실행
(3) 프로세서가 현재 실행 중인 프로그램을 잠시 중단하고, 인터럽트 핸들러 (Interrupt Handler) 프로그램을 실행
(4) 인터럽트 핸들러의 작업 후 원래 실행 중이던 프로그램을 중단된 위치부터 다시 실행
- 인터럽트에는 응답 시간이 존재한다. 즉, 인터럽트 처리는 일정 시간 안에 끝내야 한다.
- 인터럽트 후 다시 원래 상태로 돌아오기 위해, 현재 상태를 저장해야 한다.
- 인터럽트 시스템은 서비스 후 돌아올 프로그램 위치를 스택에 저장하며, 인터럽트 핸들러는 자신이 사용할 레지스터의 현재 값들을 모두 저장해야 한다.
- 인터럽트 핸들러 주소가 저장된 메모리 주소가 정해져 있다. 이 주소에는 인터럽트 벡터가 들어있으며, 이는 각 인터럽트에 대한 인터럽트 핸들러 주소가 저장되어 있다.
- 인터럽트 간에는 우선순위가 존재한다.
- 인터럽트 마스크를 통해 인터럽트를 끄거나 켤 수 있다.
5. 프로그램의 종류
운영체제 / 운영체제 커널 (Kernel): 각 프로그램을 서로 전환시켜 주는 일종의 관리자 프로그램
시스템 프로그램: OS 및 OS가 관리하는 프로그램
유저 프로그램: 일반적인 프로그램
6. 메모리 관리 장치 (MMU; Memory Management Unit)
프로그램은 가상 주소를 사용하여 작성하고, MMU는 이 가상 주소를 물리 주소로 변환한다.
메모리의 연속 할당 (Continuous Allocation)은 외부 단편화 문제를 일으킨다. 간단히 말해, 메모리를 연속적으로 할당하게 되면 큰 비효율성에 직면한다.
이를 해결하기 위해 페이징 (Paging) 기법이 활용된다. 이는 논리 주소 및 물리 주소를 일정 크기의 페이지 (Page)로 잘라서 사용하는 방식이다 (물리 주소에서는 Frame이라고 부름). 그리고 이 둘 사이의 맵핑을 위한 페이징 테이블 (Paging Table)이 존재한다.
이러한 방식의 장점으로는 프로그램이 어떠한 물리적 메모리에도 연결되지 않은 논리적 주소에 접근하더라도 페이지 폴트 (Page Fault) 예외로 다룰 수 있다는 점이다. 이 경우, OS는 프로그램을 중단시킬 필요 없이 MMU가 추가 메모리를 할당하게 하는 방식으로 스택 공간을 늘릴 수 있다.
MMU는 오직 시스템 프로그램만이 제어할 수 있다. CPU에는 컴퓨터가 시스템 모드 (System Mode)에 있는지 혹은 사용자 모드 (User Mode)에 있는지 결정하는 비트 (레지스터)가 있다. MMU나 I/O를 처리하는 일부 명령어는 특권 (Privileged) 명령어로, 오직 시스템 프로그램만이 실행할 수 있다. 사용자 프로그램은 시스템 콜 (System Call)을 통해 특권 명령어에 대한 사용 요청을 보낼 수 있다.
7. 가상 메모리
OS는 MMU를 통해 가상 메모리 (Virtual Memory) 를 제공한다.
프로그램이 요청한 메모리가 사용 가능한 물리적 메모리의 크기보다 크다면 어떻게 될까? OS는 현재 필요하지 않은 메모리 페이지를 느리지만 용량이 큰 대용량 저장장치로 옮긴다. 이를 스왑 아웃 (Swap Out)이라고 한다. 이런 스왑 아웃한 페이지에 프로그램이 접근하면, OS는 다시 이 페이지를 메모리로 불러드리며, 이를 스왑 인 (Swap In)이라고 한다. 이러한 메커니즘을 Demanding Paging이라고 한다.
8. 메모리 계층
가상 메모리와 스와핑은 메모리 계층 (Memory Hierarchy)의 개념을 소개한다. 프로그램 관점에서 메모리는 모두 동일해 보이지만, 실상은 메모리에 어떻게 접근하냐에 따라 프로그램의 실행 시간이 크게 영향을 받는다.
프로세서에 들어 있는 레지스터라는 메모리는 매우 접근이 빠르지만, RAM으로 이루어진 주 메모리 (Main Memory)는 이에 비해 약 10배 느리다. 물론 이보다 큰 용량의 저장장치는 더욱 접근이 느리다.
현대 컴퓨터는 캐시 (Cache)라는 메모리를 CPU에 추가한다. 이는 레지스터보다는 느리지만, 주 메모리보다는 빠른 메모리라고 생각하면 된다. CPU는 메모리 컨트롤러를 통해 특정 메모리에 있는 데이터를 한꺼번에 가져와서 Cache에 저장해두고 사용한다.
9. 직접 메모리 접근
프로그램이 실행되기 위해서는 메모리 스왑 과정이 필연적으로 많이 발생한다. 이를 CPU가 모두 담당하는 것은 불필요하다. 주 메모리 및 디스크 사이에 단순한 데이터 복사만을 담당하는 직접 메모리 접근 (DMA; Direct Memory Access) 장치가 CPU를 대신하여 이 역할을 수행한다. DMA 장치는 데이터를 복사하여 저장한 뒤에, 인터럽트 메커니즘을 통해 CPU에게 알려준다.
10. 프로그램의 데이터 배치
- 정적 데이터 (Static Data): 변수 등 크기가 정해져 있는 데이터를 담는 메모리
- 스택 (Stack): 프로그램의 실행을 위한 스택 메모리
- 동적 데이터 (Dynamic Data): 프로그램 실행 전에는 크기를 알 수 없는 데이터로, 힙 (Heap) 영역에 저장된다.
11. 프로그램의 실행과 라이브러리
라이브러리를 이용하면 코드를 재활용하는 것이 매우 유용하다. 과거에는 라이브러리를 프로그램과 직접 연결하여 실행 파일을 만드는 정적 링크 (Static Linking) 방식을 사용하였다. 그러나 이는 하나의 라이브러리가 여러 프로그램과 연결되는 경우, 메모리의 낭비를 유도하였다. 이를 해결하기 위해 등장한 것이 공유 라이브러리를 사용하는 동적 링크 (Dynamic Linking)이다. 이는 런타임 라이브러리 (Runtime Library)로도 불리운다. '.DLL' 파일이 이에 해당된다.
'Computer Science > Computer Knowledge' 카테고리의 다른 글
컴퓨터의 구조 - 6 (0) | 2021.09.05 |
---|---|
컴퓨터의 구조 - 5 (0) | 2021.09.01 |
컴퓨터의 구조 - 4 (0) | 2021.08.26 |
컴퓨터의 구조 - 2 (0) | 2021.08.24 |
컴퓨터의 구조 - 1 (0) | 2021.08.20 |