n,k= map(int,input().split())
coin = [] #화폐 단위를 입력받을 리스트
for i in range(n):
n = int(input())
coin.append(n)
coin.reverse() #큰 단위 부터 체크하기 위해 내림차순으로 변경
cnt = 0 #필요한 동전 개수
for i in range(len(coin)):
if k >=coin[i]:
cnt += k //coin[i]
k = k%coin[i]
print(cnt)
- Equal allocation : 각 프로세스에게 동일한 개수의 frame을 할당하는 방식
- Proportional allocation : 각 프로세스의 크기에 비례하여 frame을 할당하는 방식
Priority Allocation
: 프로세스의 중요도를 기반으로 frame을 할당하는 방식
I/O 를 감소시켜 waiting 상태의 시간을 줄여 실행이 빨리 끝날 수 있다.
page fault가 발생하는 경우 낮은 우선순위 프로세스의 frame을 선택하여 교체하도록 한다.
*Global vs Local Replacement
Global Replacement : replacement frame을 전체 frame에서 선택하도록 한다. 하나의 프로세스는 다른 프로세스의 frame을 가져와 사용할 수 있다. 동적으로 관리할 수 있고 circular queue로 관리하는 경우 전체 시스템으로 하나로 관리 할 수 있다.
Local replacement : 각 프로세스는 해당 프로세스 내에서 frame을 선택할 수 있다.
Thrashing
- 프로세스가 충분한 page를 갖지 못한다면 page fault rate가 높아지고 이는 CPU utilization을 떨어트린다.
- 프로세스의 잦은 page swapping으로 CPU 성능이 떨어지는 상태
Locality
프로그램의 메모리는 임의 시간 내에 프로그램의 일부분을 집중적으로 참조하는 고도의 지역성을 갖는다.
시간 지역성 : 현재 참조된 메모리가 가까운 미래에도 참조될 가능성이 높음 (loop, subroutine, stack)
공간 지역성 : 하나의 메모리가 참조되면 주변의 메모리가 계속 참조될 가능성이 높음(Array Traversal, 명령의 순차 실행)
Locality를 어떻게 계산할 것인가?
Working-Set Model
- 현재 시점의 지역성을 확인하기 위한 목적으로 사용되는 working-set window를 사용
- working-set window가 너무 작은 경우 지역성을 반영하지 못한다.
- 각 프로세스의 working-set size의 합은 사용가능한 전체 frame의 크기보다 크면 Thrashing 상태가 된다.
이때 , 프로세스는 suspend 되도록 한다.
- 매번 working-set을 계산하는 것은 cost가 많이 필요하다.
Page-Fault Frequency Scheme
적절한 Page fault의 상한선,하한선 기준을 정해 벗어나는 경우 조치하도록 한다.
상한선 보다 높아지는 경우 frame을 더 할당해주며 하한선 보다 낮아지는 경우 frame을 회수한다.
-> Working set 방식은 page 참조 시마다 페이지 집합을 수정하고 PFF 방식은 page fault 발생 시에만 페이지 집합을 수정하여 오버헤드를 상대적으로 줄인다.
Virtual Memory 의 장점 (프로세스 생성 시)
Copy-on-Write
부모와 자식 프로세스가 처음에는 같은 page를 공유하도록 하고 write를 하는 순간 page를 복사하고 복사한 page에 write 작업을 수행
기본적으로는 page를 공유하도록 하고 write 할 때 copy 하여 수행하도록 하여 메모리 사용 효율성을 높일 수 있다.
Memory-Mapped Files
프로세스의 가상 공간 중 일부를 디스크에 있는 파일의 블록에 매핑하는 방식이다.
기존의 system call 의 오버헤드를 줄일 수 있다. (I/O를 줄일 수 있다.)
즉, 디스크 파일의 일부와 매핑하여 file system을 통한 과정을 거치지 않아 속도가 빠르고 I/O 발생으로 인한 오버헤드가 줄어든다.
Prepaging
일반적으로 페이징 기법을 사용할 때 초기에는 page fault가 반드시 발생한다.
이러한 page fault를 줄이기 위해 Prepaging으로 미리 올려둬서 page fault 를 줄일 수 있다.
Page size
- Page size가 과도하게 큰 경우 Internal fragmentation이 발생 할 수 있다.
- Page size가 작은 경우 Page table size가 커질 수 있다.
- Page size가 커지면 locality를 정확히 구분하기 어렵다.
I/O Interlock
- page가 memory에서 lock 상태가 되어야 하는 경우가 필요하다.
예를들어 디스크에서 외부저장장치로의 이동을 위해 buffer에 있는 경우 page 교체가 일어나면 정상적으로 파일이동이 불가하다.