본문 바로가기
2023 활동 - 4학년/[1월 ~ 4월] sw 아카데미 백엔드 과정

[2023.02.13 / CNU SW 아카데미] OS 특강 4

by 은행장 노씨 2023. 2. 13.

Main Memory

프로그램이 실행되려면 메모리로 올라와야 한다. 

- cpu가 클럭 단위로 동작한다. 

- 메모리에서 가져올때는 cpu 클락보다 크다. cpu가 멈출 수 있다. 

- cpu 속도와 메인 메모리의 갭을 채우기 위해 cache를 만들었다. 

 

출처 : os 특강

항상 base, limit을 체크해야 한다. 

 

출처 : os 특강

항상 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

시스템 내에 프로세스가 많이 있다. 메모리는 한정되어 있다. 

출처 : os 특강

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 base register (STBR) points to the segment tables location in memory
- 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

- 일반적으로 피지컬보다가 로지컬이 훨씬 크다. 

출처 : os 특강

없는 경우에 디스크에서 올린다. 

- 특정한 페이지가 요청이 될 때 해당 페이지를 메모리로 올린다. 

- page fault -> trap(소프트웨어 오류)

-> 해당 페이지를 디스크에서 메모리로 올린 후 실패한 인스트럭션을 다시 실행

 

출처 : os 특강

같은 프로그램을 여러 개 실행

프로세스는 다르지만 코드는 변하지 않는다. 

독립적인 address space를 가지지만, share 할 수 있다. 

 

* Copy-on-Write

데이터의 경우에도 일단은 공유한다면 효율적일 수 있다. 

- 다른 애가 업데이트 하는 순간 카피한다.

변하는 순간 copy 하여 쓴다. 

프로그래밍 언어에서 메모리를 관리할 때 이런 로직을 쓴다. 

 

Q. 만약 메모리가 꽉 찬다면?
- 안 쓰일 것 같은 페이지 하나를 디스크로 => Page replacement

- 어떤 놈을 보낼 것인가? 
--> 가장 안 쓰이는 놈 (victim frame)
-- 이 친구를 메모리에 쓰는 작업을 할 수도 있다. 

- 각 페이지에 dirty bit를 표시, 변경 여부를 표시한다. 
  • Frame-allocation algorithm
  • Page-replacement algorithm
  1. Optimal Algorithm - 9
    : 접근 순서를 알기 때문에 효율적인 판단 가능
    - 성능 측정을 위해 사용된다. 
  2. Least Recently Used (LRU) Algorithm - 12
    : 가장 오랫동안 사용되지 않은 페이지를 교체한다. 
    - 시간 근접성에 기반한 알고리즘이다. (예: 최근 통화 목록)
    - FIFO 보다는 낫다. 
    - LRU-K : 페이지가 현재부터 k번 까지 접근된 시간(빈도와 시간을 동시에 고려한다.)
    - 타임 스탬프를 찍어두는 것이다.
  3. LFU
    : 가장 덜 빈번하게
    - 쓰지는 않는다. 시간 근접성이 더 중요

 

Thrashing - a process is busy swapping pages in and out

- 컴퓨터는 cpu 사용을 최대로 하려고 동작한다.

- io하는 친구들만 많아 -> cpu 사용해야겠다. 

-> 계속 io만 많아짐

-> 지금 cpu가 놀고 있으니까 프로세스를 더 올려야겠다. 

-> 매번 page fault가 일어나게 된다. -> io하느라 cpu 놀고 있다. 

-> 반복...

출처 : os 특강

  • 성능이 뚝 떨어진다. 
  • 모든 프로세스가 생산적인 일을 하지 않고, swapping만 한다. 
  • 어떤 순간에 컴퓨터가 멈춘다. 이도저도 아니다.
  • locality model : 최근 동작 유지
  • locality 사이즈가 메모리 보다 크다. => page fault
  • prepaging : 현재 요구되는 페이지 말고, 나머지를 미리 올리면 page fault 방지

 

- 코딩할 때 이슈

 

운영체제나 하드웨어의 디테일을 알고 코딩을 하면 훨씬 효율적인 사용이 가능하다. 

운영체제가 내부적으로 이런 경우의 일을 한다는 것을 이해하는 것이 중요하다. 

중간 중간에 상담 일정이 있다. 그때 또 교수님을 보게 될 것 같다. 좋은 성과를 내도록 노력하자. 

 

정신 차리고 다시 힘내보자.