#Background
메인 메모리, 레지스터_CPU가 직접 접근할 수O 유일한 저장장치
ㄴ프로그램이 실행되기 위해 -> 메모리로 적재
-메모리 하드웨어
ㄴ주소 + 데이터 읽기 요청/ 주소 + 데이터 쓰기 요청
-기본 하드웨어
레지스터 접근 -> 1 CPU clock 필요
/ 메인 메모리; 사이클 ↑ 필요 + 멈춤현상(stall) 발생
/ 캐시(Cache); 메인 메모리, CPU 레지스터 사이 존재
올바른 연산 보장 -> 메모리 보호 요구
*기준(Base) 및 상한(Limit) 레지스터
: 논리 주소 공간 정의
CPU_사용자 모드에서 생성 모든 메모리 주소
-> 사용자 기준, 상한 범위에 속하는 지 검사
*하드웨어 주소 보호
메모리 공간의 보호
: CPU 하드웨어가 사용자 모드에서 만들어진 모든 주소와 레지스터 비교
*주소 바인딩(Address Binding)
프로그램 실행되기 위해 메모리로 로딩
ㄴ운영체제; 사용자 프로세스가 가용한 메모리 어느 부분이라도 로드될 수O 지원
-바인딩 시점에 따른 구분
컴파일 시간(Compile time)
: 메모리 위치 미리 아는 경우 -> 절대주소(absolute code) 생성
ㄴ시작 주소 변경 -> 다시 컴파일
적재 시간(Load time)
: 미리 알 수X -> 컴파일러_재배치 가능 코드(relocatable code) 생성
재배치 가능 코드와 진짜 번지수와의 바인딩
실행 시간(Execution time)
: 프로그램이 실행 중 메모리 위치 변경할 수O/ 하드웨어 지원 필요
*사용자 프로그램의 단게별 처리 과정
source program -> compiler or assembler
ㄴcompile time
-> object module
-> linkage editor -> load module -> loader(<- system library)
ㄴload time
-> in-memory binary memory image(<-dynamicallyLoadedSystemLibrary)
ㄴexecution time(run time)
*논리 대 물리 주소 공간
-논리 주소(Logical address): CPU 의해 생성, 가상주소(virtual address)
-물리 주소(Physical address): 메모리 장치에서 인식되는 주소
-논리 주소 공간: 프로그램에 의해 생성되는 모든 논리 주소 집합
-물리 주소 공간: 논리 주소와 일치하는 모든 물리 주소 집합
*메모리 관리기(MMU)
기준 레지스터 = 재배치 레지스터(relocation register)
ㄴIntel 80x86에서 실행되는 MS-DOS_4개 재배치 레지스터 사용
사용자 프로그램; 논리주소O 실제 물리주소 알지X(논리주소 <- 물리주소 바인딩)
*동적 적재(Dynamic Loading)
: 메모리 공간 효율적 이용/ 루틴 필요한 경우 메모리 적재
/ 아주 간혹 발생하면서 코드 양 ↑ 경우 유용/ 프로그램 개발자 몫
프로세스 실행 -> 그 프로세스 전체 미리 메모리에 로딩
(프로세스 크기 < 메모리 크기)
*동적 링킹(Dynamic Linking)
-정적 링킹(Static linking)
: 로더 -> 시스템 라이브러리 + 프로세스 코드 -> 이진 프로그램 이미지 생성
-동적 링킹(동적 적재 개념과 유사)
: 실행 시간까지 링킹 연기/ 시스템 라이브러리(shared libraies) 유용
-스텁(stub)
: 그 라이브러리를 어떻게 찾을 것인가 알려주는 작은 코드
/ 라이브러리 호출하는 곳마다 생김
프로세스 각자 공간에서만 접근 가능O
-> 동적 링킹 운영체제 도움 필요O
#Swapping(스와핑)
메인 메모리와 저장장치 사이에서 프로세스 이동시킴
ㄴ프로세스 전체 물리 공간 > 물리 메모리 경우도 실행 가능O
/ 다중 프로그래밍 정도 ↑
CPU가 다음 프로세스 고르기 위해 디스패처 호출
-메모리에 O -> OK
-메모리에 X -> 메모리 공간O -> OK/ 메모리 공간X -> swap out and in
*스와핑 포함 문맥 교환 시간
-계산
표준 스와핑 현대 운영체제 사용X but, 변형된 버전 사용O
(가용 메모리 극도로 적을 경우 스와핑 발생)
*모바일 시스템에서의 스와핑
하드디스크보다 플래시 메모리 기반(보통 지원X)
ㄴ적은 공간/ 쓰기 사이클 횟수 제한
다른 방법 -> 메모리 확보
iOS; 앱이 자발적 메모리 반환할 것 요구
Android; 가용 메모리 ↓ -> 앱 종료
(빠르게 재시작 가능 -> 앱 상태 메모리 기록)
iOS/ Android 페이징 지원
*재배치와 상한 레지스터를 위한 하드웨어 지원
-메모리 보호 방법
프로세스_자신이 소유X 메모리 공간 접근X
재배치(relocation) 레지스터: 가장 작은 물리 주소 값
상한(limit) 레지스터: 논리 주소의 범위(프로세스 크기)
#Contiguous Allocation(연속 할당)
: 초기 메모리 할당 방법
메인 메모리; 운영체제, 사용자 프로세스 수용(제한된 자원 -> 효율적으로 할당)
*메인 메모리 2가지 분할(partitions)
-상주하는 운영체제: 보통 인터럽트 벡터와 함께 메모리 앞 위치
-사용자 프로세스: 각 프로세스 하난의 연속된 메모리 영역 저장
프로세스들에게 메모리 얼마만큼 어떻게 할당?
*메모리 할당
-고정 분할
: 모든 프로세스 동일한 크기 메모리 할당
/ 분할 개수 -> 다중 프로그래밍 정도 제한
-가변 분할(variable-partition)
: 프로세스마다 요청 -> 메모리 할당
운영체제_메모리 상태 파악 가능한 테이블 유지(할당된 분할과 가용 공간)
*동적 메모리 할당 문제
크기 n인 요청을 만족시키는 hole을 어떻게 찾을 것? (Hole: 가용 메모리 블록)
-최초 적합(First-fit): 충분히 큰 최초의 hole 할당
-최적 적합(Best-fit): 충분히 큰 가장 작은 hole 할당
(크기 순 정렬X -> 리스트 전체 탐색)
-최악 적합(Worst-fit): 가장 큰 hole 할당
(크기 순 정렬X -> 리스트 전체 탐색)
=> 모의 실험 결과
: 최초 적합, 최적 적합 > 최악 적합 속도, 공간 이용률
*단편화(Fragmentation)
-외부 단편화(External): 가용 공간의 크기 합 -> 요청 만족O but, 연속X
-내부 단편화(Internal): 일반적으로 메모리 -> 작은 공간으로 분할
/ 프로세스 요청 -> 분할된 크기의 정수 배로 할당
ㄴ할당된 메모리 > 요청된 크기 내부적 공간O but, 사용X 상황
-외부 단편화 해결법
밀집(compaction): 메모리 내용을 이동, 모든 가용 메모리 -> 하나 커다란 블록 but, 항상 사용X, 비용
=> 해결: 세그먼테이션, 페이징 기법
#Segmentation(세그먼테이션)
: 사용자 관점의 메모리 관리 기법
프로그램 = 세그먼트 모음
-세그먼트 논리적 구성 단위
: main program/ procedure or function/ object-method/ local variables, global variables/ common block/ stack/ symbol table/ arrays
*세그먼트 구조
-논리 주소 = 2-tuple = segment-number + offset
segement-number: 세그먼트 이름, 시스템_구분 쉽게 번호 표기
offset: 세그먼트 내 변위(0 < d < limit)
-세그먼트 테이블 <- 2차원 물리 주소 맵핑
테이블 항목 정보
ㄴ기준(base): 세그먼트 위치 메모리 시작 물리 주소/ 한계(limit): 세그먼트 길이
#Paging(페이징)
프로세스의 물리 주소 공간 연속적이지 않을 수O
프레임(frame): 물리 메모리의 고정 크기 블록
페이지(page): 논리 메모리의 같은 크기 블록
N개의 페이지 구성 프로그램 실행 -> N개 가용 프레임 찾아 적재
ㄴ모든 가용 프레임 추적해야 함
페이지 테이블(page table): 논리 주소 -> 물리 주소 변환 테이블
내부 단편화 여전히 발생
*주소 변환 기법
CPU -> 주소 생성
Page number (p): 물리 메모리 페이지 시작주소/ 페이지 테이블 인덱스로 사용
Page offset (d): 기준 주소와 결합 -> 메모리 장치 보내지는 물리 주소
논리 주소 공간 크기 2m, 페이지 크기 2n 경우
: page number range: 0~2m-n-1/ page offset range: 0~2n-1
-내부 단편화 계산
페이지 크기 = 2,048bytes/ 프로세스 크기 = 72,766bytes
/ 35pages + 1,086bytes/ 내부 단편화 2,048 – 1,086 = 962bytes
최악의 경우 단편화
평균적으로 프로세스 당 반 프레임의 내부 단편화 발생
-> 작은 크기의 프레임 바람직?
-> (X) 각 페이지 테이블 항목 개수 ↑ -> 메모리 차지 ↑
페이지 크기↑ <- 프로세스, 자료, RAM ↑
(Solaris; 2개 크기 페이지 지원_8KB and 4MB)
'Computer Science > 컴퓨터구조 | 운영체제' 카테고리의 다른 글
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 02 데이터 (0) | 2024.01.05 |
---|---|
[혼자 공부하는 컴퓨터구조+운영체제] Chapter 01 컴퓨터 구조 시작하기 (0) | 2024.01.05 |
CH6. CPU Scheduling (0) | 2022.05.19 |
CH5. Process Synchronization (0) | 2022.05.19 |
CH4. Threads (0) | 2022.05.19 |