Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sunjung ch09 #37

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
227 changes: 227 additions & 0 deletions sunjung/chapter07.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
---
layout: post
title: "[OS]CH07 메모리 관리 "
date: 2023-06-09 00:00:00 +0900
category: OS
---

쉽게 배우는 운영체제

# 01 메모리 관리의 개요

## 01 메모리 이해하기
메모리 구조
> - 1바이트 크기, 주소로 구분
> - CPU안에 있는 레지스터에 접근하는 속도보다 메모리에 접근하는 속도가 몇 배 이상 느림
> - 클럭: cpu 연산단위
> - <span style='color:blue'>계층적 구메모리 구조</span>: 메모리를 계층적 구조로 만들어 작업 속도를 올리고 가격을 낮추는 방법
> - 메모리 관리의 복잡성은 충분히 크지 않은 메모리에서 여러 작업을 동시에 실행하는 문제에서 비롯됨

메모리에 있는 데이터를 CPU로 가져오는 과정

## 02 메모리 관리의 이중성
> - <span style='color: blue'>메모리 관리의 이중성</span>: 프로세스 입장에서는 메모리를 독차지하려 하고, 메모리 관리자 입장에서는 관리를 효율적으로 하고 싶어함.

## 03 소스코드의 변역과 실행
- 컴파일러: c언어, 자바
- 인터프리터: 자바스크립트, 파이썬

||컴파일러|인터프리터|
|---|---|---|
|목적|-오류발견: 심볼 테이블<br>-소스코드 최적화: 실행속도가 빨라짐<br>||
|특징| - 실행 전에 소스코드를 점검하여 오류 수정<br>필요 없는 부분 정리 후 최적화된 실행 파일 만듬|한 행씩 위에서부터 아래로 실행되기 때문에 같은 일을 반복하는 경우, 필요 없는 변수를 확인할 수 없음|
|과정|- <span style='color:blue'>목적코드</span>: 실행 전 단게의 코드이며 <br>아직 처리할 단계가 남아 있기 때문<br>소스코드 -> 컴파일러 -> 목적코드 -> 링커 -> 실행<br>- 동적 라이브러리: 함수가 변경되어도 새로 컴파일할 필요 없이 새로운 라이브러리만 사용 |순차적으로 실행|

## 04 메모리 관리 작업
메모리 가져오기
> - 실행할 프로세스, 데이터 메모리로 가져오기

메모리 배치
> - 가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업
> - 배치 작업 전에 메모리를 어떤 크기로 자를 것인지가 매우 중요함
> - 같은 크기? 실행되는 프로세스의 크기에 맞게? -> 메모리의복잡성이 달라짐

배치정책: 페이징과 세그멘테이션의 장단점을 파악하여 메모리를 효율적으로 관리할 수 있도록 정책을 만드는 것
||페이징|세그먼테이션|
|---|---|---
|특징|메모리를 같은 크기로 자르는 것|프로세스의 크기에 맞게 자르는 것

매모리 재배치
> - 꽉 찬 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업
> - 자주 사용할 프로세스를 내보내면 성능 떨어짐

<br>
<br>

---
## 01 메모리 주소

## 01 32bit CPU와 64bit CPU의 차이

<span style='color:red'>비트: </span>CPU를 나타낼 때 CPU가 한번에 다룰 수 있는 데이터의 최대 크기

> - 각종 버스의 크기: 32bit
> - 메모리 주소 공간: 물리 주소 공간

## 02 논리 주소와 물리 주소
단순 메모리 구조: 일괄 처리 시스템에서 볼 수 있음
> - 사용자 영역, 운영체제 영역
> - 운영체제는 시스템을 관리하는 중요한 역할을 하기 때문에 사용자가 운영체제를 침범하지 못하도록 분리해서 관리

문제점
- 사용자 프로세스는 운영체제 영역을 피해서 메모리에 적재됨
- 운영체제의 크기에 따라서 매번 적재되는 주소가 달라짐

해결하고자 ..
> - 사용자 프로세스를 메모리의 최상위부터 사용
> - 메모리를 최상위에서 운영체제 방향으로 내려오면서 사용
> - 운영체제의 크기에 상관없이 사용자 영역의 시작점을 결정할 수 있음
> - 메모리를 거꾸로 사용하기 위해 주소를 변경하는 일이 복잡해짐

<img align='center' width="398" alt="Screenshot 2023-06-09 at 11 47 30 AM" src="https://github.com/Sunjung-Dev/sunjung-dev.github.io/assets/76513889/9beb0501-79b7-4af9-807c-d71205ac1e4a">
<br>
<br>

경계 레지스터 : 사용자 영역이 운영체제 영역으로 침범하는 것을 막기 위함
> - 운영체제 영역, 사용자 영역 경계 지점의 주소를 가짐
> - 메모리 관리자는 사용자가 작업을 요청할 때마다 경계 레지스터의 값을 벗어낫는지 검사, 벗어나면 프로세스 종료


논리 주소와 물리 주소의 변환
> - 실행을 위해 프로세스가 메모리에 올라오면 메모리는 빈 공간에 배치됨

||논리 주소|물리 주소|
|---|---|---|
|의미|사용자 입장에서 바라본 주소|메모리 입장에서 바라본 주소<br>메모리 주소 레지스터가 사용하는 주소, 컴퓨터에 꽂힌 램 메모리의 실제 주소
|특징|논리 주소 공간, 컴퓨터가 허용하는 최대의 주소 크기를 가짐|프로그램이 실행될 때마다 매번 바뀜<br> 0번지부터 시작하지만 최대 주소 크기는 컴퓨터에 설치됀 메모리 크기에 따라 달라짐


> 메모리 관리 유닛: 논리주소 -> 물리주소 변환
> - CPU안에 존재
> - 프로세스가 논리 주소에 접근할 때마다 이를 물리 주소로 변환하는 작업을 해줌

<img width="640" alt="Screenshot 2023-06-09 at 12 01 29 PM" src="https://github.com/Sunjung-Dev/sunjung-dev.github.io/assets/76513889/c357bb5f-2b3a-4009-aec6-4ea9ec44fc1e">

## 논리주소 -> 물리주소 변환 과정
<img width="920" alt="Screenshot 2023-06-09 at 12 13 27 PM" src="https://github.com/Sunjung-Dev/sunjung-dev.github.io/assets/76513889/2c929cae-b5cc-4d5b-a8bd-9e0118de4c23">

-----
# 03 단일 프로그래밍 환경의 메모리 할당

## 01 메모리 오버레이
메모리 오버레이
> - 프로그램의 크기가 실제 메모리보다 클 때 전체 프로그램을 메모리에 가져오는 대신 적당한 크기로 잘라서 가져오는 기법
> - 프로그램을 몇 개의 모듈로 나누고 필요할 때마다 모듈을 메모리에 가져와 사용
> - 프로그램 전체를 메모리에 올려놓고 실행하는 것보다 속도가 느리지만 메모리가 프로그램보다 작을 때도 실행할 수 있음

1. 한정된 메모리에서 메모리보다 큰 프로그램 실행 가능
2. 프로그램의 전체가 아니라 일부만 올라와서 실행 가능

> 프로그램 카운터가 결정
> - 프로그램 카운터: 앞으로 실행할 명령어의 위치를 가리키는 레지스터
> - 해당 모듈이 메모리에 없으면 메모리 관리자에게 요청해서 가져오게 함


## 스왑
> 스왑: 메모리가 모자라서 쫒겨난 프로세스를 저장장치의 특별한 공간에 모아둠
> - 스왑인: 스왑 영역에서 메모리로 데이터를 가져오는 작업
> - 스왑아웃: 메모리에서 스왑 영역으로 데이터를 내보내는 작업
> - 메모리 관리자가 관리
> - 메모리 오버레이 + 스왑 함께 사용할 때
> - 스왑 이용하면 스왑 영역의 크기가 메모리의 크기로 인식

*질문*

<span style="color:pink">메모리 영역이 부족해서 프로그램 쪼개서 메모리 오버레이 사용하는데 스왑영역을 사용하면 이 자원은 어디서 나오는건지 /? -> 저장장치의 일부인가 ?</span>

---
# 04 다중 프로그래밍 환경의 메모리 할당
## 01 메모리 분할 방식
> 가변 분할 방식
> - 프로세스의 크기에 따라 메모리를 나눔
> - 연속 메모리 할당: 물리 메모리에서 하나의 프로세스에 해당하는 주소 공간이 연속적으로 이어지기 때문
> 고정 분할 방식
> - 프로세스의 크기와 상관없이 메모리를 같은 크기로 나눔
> - 비연속 메모리 할당


||가변 분할 방식|고정 분할 방식|
|----|-----|----|
|의미|프로세스의 크기에 따라 메모리를 나눔| 프로세스의 크기와 상관없이 메모리를 같은 크기로 나눔
|특징|연속 메모리 할당: 물리 메모리에서 하나의 프로세스에 해당하는 주소 공간이 연속적으로 이어지기 때문|비연속 메모리 할당
|장점|하나의 프로세스를 연송된 공간에 배치 가능|메모리 관리가 편함, 부가적인 작업 필요없음|
|단점|메모리 관리가 복잡함, 연속적인 공간을 할당하려면 메모리 통합 과정 필요함|프로세스가 여러 곳으로 나뉠 수 있음 |

## 02 가변 분할 방식의 메모리 관리
> - 가변 분할 방식: 프로세스의 크기에 맞춰 메모리를 할당하는 방법 (=세그먼테이션 메모리 관리 기법)
> - 단편화: 프로세스 사이에 발생한느 작은 빈 공간
> - <span style='color:blue'>외부 단편화</span>: 조각이 프로세스의 바깥쪽에 위치
> - <span style='color:pink'>메모리 배치 방식</span>: 작은 조각이 발생하지 않도록 프로세스를 배치
> - 선처리
> - <span style='color:pink'>조각 모음 </span>: 조각이 발생했을 때 작은 조각들을 모아서 하나의 큰 덩어리로 만드는 작업
> - 후처리

### 메모리 배치 방식
> - 최초 배치, 최적 배치, 최악 배치 + 버디 시스템<br>
> - 최초 배치: 빈 공간을 찾아다닐 필요 없음
> - 최적 배치 : 빈 공간 모두 확인해야 하는 부가적인 방법, 단편화가 안일어날 수 있는 가능성이 있음
> - 취악 배치 방식: 프로세스를 배치하고 남은 공간이 크기 때문에 이 공간이 쓸모가 있음
> - 빈 공간의 크기가 클 때는 효과적

<img width="736" alt="Screenshot 2023-06-09 at 3 01 27 PM" src="https://github.com/Sunjung-Dev/sunjung-dev.github.io/assets/76513889/c8577f9d-46e8-4885-93ba-794b029a5fc8">

### 조각 모음
> - 조각 모음: 단편화가 발생하면 이미 배치된 프로세스를 옆으로 옮겨 빈 공간들을 하나의 큰 덩어리로 만들어야 함
> - 여러 개의 빈 고오간을 합치는 작업, 메모리 통합
> - 진행방식: 프로세스 멈춤 -> 이동 -> 주소 변경 -> 다시 시작: 시간 많이 걸림 ,,
----
## 03 고정 분할 방식의 메모리 관리

고정 분학 방식
> - 페이징: 물리 메모리를 나누는 방식
> - 프로세스의 크기에 상관없이 메모리를 같은 크기로 나눔
> - 낭비되는 공간이 생김
> - 내부 단편화: 각 메모리 조각에 프로세스를 배치하고 공간이 남는 것
----
## 04 버디 시스템
가변 분할 방식의 단점인 외부 단편화를 완화하는 방법
> - 가변 분할 방식과 고정 분할 방식의 중간 구조

1. 프로세스의 크기에 맞게 메모리 1/2로 자르고 프로세스를 메모리에 배치
2. 나뉜 메모리의 각 구역에는 프로세스가 1개만 만들어짐
3. 프로세스가 종료되면 주변의 빈 조각과 합쳐서 하나의 큰 덩어리를 만듬
> - 프로세스가 종료될 때마다 빈 구역을 하나로 합침
특징
> - 메모리가 프로세스 크기대로 나뉘고, 하나의 구역에 다른 프로세스가 들어갈 수 없고 메모리의 한 구역 내부에 조각이 생겨 내부 단편화가 발생
> - 비슷한 크기의 덩어리가 모여 있음 -> 통합 쉬움
> - 조각 모음을 하지 않아도 간단히 큰 덩어리를 만들 수 있음

----
## 05 분할 컴파일과 메모리 관리
## 01 분할 컴파일
다중 소스 코드: 여러 개의 소스코드 파일을 사용하여 하나의 실행 파일을 만드는 것
분할 컴파일: 여러 개의 소스코드를 각각 컴파일하여 하나의 실행 파일로 만드는 것

## 02 변수와 메모리 할당
> - 범위: 변수를 사용할 수 있는 영역
> - 컴파일러: 변수를 사용할 때마다 사용 범위를 넘는지 점검
> - 변수의 종류마다 크기 정해져있음 -> 시작 주소만 명시
> - 변수 == 메모리 주소


*질문*<br>
그냥 궁굼한거 <br>
메모리 영역이 부족해서 프로그램 쪼개서 메모리 오버레이 사용하는데 스왑영역을 사용하면 이 자원은 어디서 나오는건지? -> 메모리 공간을 미리 쪼개놓은 일부 공간인가?

의논 질문<br>
1. 메모리 오버레이에 대해 설명하고 이에 대한 한계점을 처리하기 위한 방법을 설명하시오
2. 가변분할방식과 고정분할방식의 차이점을 설명하시오









Empty file added sunjung/chapter09.md
Empty file.