Main Memory
프로그램이 실행되려면 메모리로 올라와야 한다.
- cpu가 클럭 단위로 동작한다.
- 메모리에서 가져올때는 cpu 클락보다 크다. cpu가 멈출 수 있다.
- cpu 속도와 메인 메모리의 갭을 채우기 위해 cache를 만들었다.
항상 base, limit을 체크해야 한다.
항상 base 메모리인지 확인해야 한다.
잘못된 메모리 접근을 하면 trap을 발생시킨다. 소프트웨어 인터럽트
-> os에게 제어가 넘어가게 된다. 일반적으로는 종료시킨다.
Binding Memory
- Compile time
: 정해진 위치에 올라와야 주소가 일치한다. 특정한 경우가 아니면 안쓴다. - Load time
: 시작 위치부터 상대적인 위치를 표시, 프로그램을 load할 때 절대주소로 다 바꿔
- 코드 주소를 바꿔야 하기 때문에 시간이 오래 걸린다.
- 위치 고정 -> 잘 사용 안된다. - Execution time
: 메모리에 접근할 때 바뀐다.
- 주로 다룬다.
임베디드에서 하나의 시스템만 쓴다고 가정하면 컴파일 타임도 가능하다.
Logical vs. Physical Address Space
- logical : 이 프로그램이 관리하는 주소 (virtual address)
cpu는 local하게 움직인다.
32비트 머신은 cpu 레지스터가 32비트다.
메모리 최대 용량 = 4 기가 바이트
프로그램이 논리적으로 4기가 까지 사용할 수 있다고 생각하고 쓴다. 실제와 매핑이 필요하다.
- physical : 하드웨어
- mmu를 이용하여 logical => physical로 바꾼다.
- Memory-Management Unit (MMU)
Swapping
시스템 내에 프로세스가 많이 있다. 메모리는 한정되어 있다.
active, in-active한 애들이 있다.
in-active 애들을 디스크에 고대로 가져다 놓자.
=> 필요할 때만 메모리에 올린다.
- 디스크 연산은 시간이 오래 걸린다.
- 컴퓨터에 프로그램을 여러 개 띄우면, 본체 하드 디스크를 심하게 읽는다.(swapping 중)
- 요즘에는 메모리 사이즈가 커져서 굳이 안해도 된다.
메인 메모리를 두 파트로 나뉜다.
- 커널 프로세스
- 유저 프로세스
연속된 공간에 할당을 한다. base, limit
Multiple-partition allocation
파티션은 가변적이어야 한다.
메모리 사이에 구멍이 생기게 된다.
문제 ) 여러 개의 프로세스가 있다. 많은 프로세스가 실행-종료가 반복,
=> 많은 구멍이 생긴다. 어디에다가 할당할 것인가?
Dynamic Storage-Allocation Problem
- First-fit: Allocate the first hole that is big enough
-
Best-fit: Allocate the smallest hole that is big enough;
- must search entire list, unless ordered by size
-> 남는 공간은 너무 작아서 영영 사용 못한다.
-> external fragmentation 가장 많이 발생시킨다.
=> compaction 위치를 올려. 시간이 오래걸려 -
Worst-fit: Allocate the largest hole; must also search entire list
- 제일 큰 거에서 나와서 재사용이 가능하다.
* internal fragmentation
: 프로세스 안에서 남는 공간
- 고정된 사이즈를 사용한다면
- 데이터 베이스 : 고정 길이 캐릭터 타입
Segmentation
프로세스가 연속되어 메모리에 있지 않고 나뉠 수 있다.
그리고 매핑 테이블을 하나 둔다.
- main program
- procedure
- function
- method
- object
- local variables, global variables
- common block
- stack
- symbol table
- arrays
- Segment-table length register (STLR) indicates number of segments used by a program;
segment 장점
- 일부 세그먼트를 share할 수 있다.
- 다른 위치를 접근하면 에러를 내야 한다. => segmentation fault
- 리눅스를 사용하면 종종 이 에러가 난다.
- 메모리를 잘못접근하는 경우
- 기계어 컴파일 c, c++
- 자바는 index out of range
Paging
각 세그먼트를 들쭉날쭉, 가변길이의 단점 : external, dynamic
- 요즘 많이 사용하는 방법- 전체 메모리를 frame이라는 고정 크기를 나눈다. - 고정된 크기를 엮어서 사용한다. - internal fragmentation이 생긴다.
- page table을 따로 관리한다.(매핑 테이블)
페이지의 입장에서는 연속된 페이지가 할당되어 있다고 생각한다.
앞에서부터 순차적인 주소를 가지고 있다.
Virtual Memory
프로그램이 실행되려면 프로세스는 실행되는 상황에서 메모리 상에 있어야 한다.
cpu 는 레지스터나 메모리에 접근 가능하기 때문이다.
현재 실행되고 있는 부분만 메모리에 있으면, 프로그램 실행이 가능하다.
- 전부를 다 올려 놓을 필요가 없다.
- 아예 실행이 안 될 가능성이 있는 코드 영역 부분도 있다.
-> 프로그램 시작을 빨리 할 수 있다.
-> 하나의 프로세스가 차지하는 영역이 작기 때문에 여러 개의 프로세스를 올린다.
Virtual memory – separation of user logical memory from physical memory
- Demand paging
- 일반적으로 피지컬보다가 로지컬이 훨씬 크다.
없는 경우에 디스크에서 올린다.
- 특정한 페이지가 요청이 될 때 해당 페이지를 메모리로 올린다.
- page fault -> trap(소프트웨어 오류)
-> 해당 페이지를 디스크에서 메모리로 올린 후 실패한 인스트럭션을 다시 실행
같은 프로그램을 여러 개 실행
프로세스는 다르지만 코드는 변하지 않는다.
독립적인 address space를 가지지만, share 할 수 있다.
* Copy-on-Write
데이터의 경우에도 일단은 공유한다면 효율적일 수 있다.
- 다른 애가 업데이트 하는 순간 카피한다.
프로그래밍 언어에서 메모리를 관리할 때 이런 로직을 쓴다.
Q. 만약 메모리가 꽉 찬다면?
- 안 쓰일 것 같은 페이지 하나를 디스크로 => Page replacement
- 어떤 놈을 보낼 것인가?
--> 가장 안 쓰이는 놈 (victim frame)
-- 이 친구를 메모리에 쓰는 작업을 할 수도 있다.
- 각 페이지에 dirty bit를 표시, 변경 여부를 표시한다.
-
Frame-allocation algorithm
-
Page-replacement algorithm
- Optimal Algorithm - 9
: 접근 순서를 알기 때문에 효율적인 판단 가능
- 성능 측정을 위해 사용된다. - Least Recently Used (LRU) Algorithm - 12
: 가장 오랫동안 사용되지 않은 페이지를 교체한다.
- 시간 근접성에 기반한 알고리즘이다. (예: 최근 통화 목록)
- FIFO 보다는 낫다.
- LRU-K : 페이지가 현재부터 k번 까지 접근된 시간(빈도와 시간을 동시에 고려한다.)
- 타임 스탬프를 찍어두는 것이다. - LFU
: 가장 덜 빈번하게
- 쓰지는 않는다. 시간 근접성이 더 중요
Thrashing - a process is busy swapping pages in and out
- 컴퓨터는 cpu 사용을 최대로 하려고 동작한다.
- io하는 친구들만 많아 -> cpu 사용해야겠다.
-> 계속 io만 많아짐
-> 지금 cpu가 놀고 있으니까 프로세스를 더 올려야겠다.
-> 매번 page fault가 일어나게 된다. -> io하느라 cpu 놀고 있다.
-> 반복...
- 성능이 뚝 떨어진다.
- 모든 프로세스가 생산적인 일을 하지 않고, swapping만 한다.
- 어떤 순간에 컴퓨터가 멈춘다. 이도저도 아니다.
- locality model : 최근 동작 유지
- locality 사이즈가 메모리 보다 크다. => page fault
- prepaging : 현재 요구되는 페이지 말고, 나머지를 미리 올리면 page fault 방지
- 코딩할 때 이슈
운영체제나 하드웨어의 디테일을 알고 코딩을 하면 훨씬 효율적인 사용이 가능하다.
운영체제가 내부적으로 이런 경우의 일을 한다는 것을 이해하는 것이 중요하다.
중간 중간에 상담 일정이 있다. 그때 또 교수님을 보게 될 것 같다. 좋은 성과를 내도록 노력하자.
정신 차리고 다시 힘내보자.
'2023 활동 - 4학년 > [1월 ~ 4월] sw 아카데미 백엔드 과정' 카테고리의 다른 글
[2023.02.14 / CNU SW 아카데미] 객체지향 프로그래밍2 (0) | 2023.02.14 |
---|---|
[2023.02.13 / CNU SW 아카데미] 실리콘밸리에서 날아온 데이터베이스 Day 14 (0) | 2023.02.14 |
[2023.02.09 / CNU SW 아카데미] 27일차 회고록 (0) | 2023.02.13 |
[2023.02.08 / CNU SW 아카데미] 26일차 회고록 (0) | 2023.02.12 |
[2023.02.07 / CNU SW 아카데미] 25일차 회고록 (0) | 2023.02.12 |