어제 TIL일지를 이어서,,,
이전 자료 참고: https://mings-njob.tistory.com/19
TIL(24.03.21)
저번 TIL CPU와 메모리 정리를 이어서 . . . 출처 : https://spartacodingclub.kr/nb?utm_source=google&utm_medium=sa&utm_campaign=google_sa_general&utm_term=%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80%EC%BD%94%EB%94%A9%ED%81%B4%EB%9F%BD&gcl_keyword=%EC%8
mings-njob.tistory.com
페이지 교체 알고리즘
- 메모리 내에 저장된 페이지 중에서 어떤 페이지를 교체할지 결정하는 알고리즘
- 페이지 교체 알고리즘은 물리적인 메모리 공간이 한정되어 있을 때 페이지 부재(page fault)가 발생하는 상황에서 새로운 페이지를 적재하기 위해 기존 페이지 중 어떤 페이지를 제거할지 결정하는 역할
여러 알고리즘이 있으며, 각 알고리즘은 다양한 방식으로 페이지를 교체하며, 알고리즘에 따라 페이지 부재율(page fault rate)이나 페이지 교체 오버헤드(page replacement overhead) 등의 성능이 달라짐
오프라인 알고리즘
- 미래에 참조되는 페이지와 현재 할당하는 페이지를 바꾸는 알고리즘
- 입력 데이터가 모두 주어진 상태에서 실행되는 알고리즘이다. 입력 데이터를 모두 가지고 있기 때문에, 실행 중에 새로운 입력이 들어오지 않는다.
- 오프라인 알고리즘은 입력 데이터를 한꺼뻔에 처리할 수 있으므로, 실행 시간과 공간 사용량을 예측할 수 있다. 따라서 입력 데이터의 크기에 따라 적절한 실행 시간과 공간을 예약하여 처리할 수 있다.
- But, 미래에 사용되는 프로세스를 알 수는 없다.
- 메모리 할당에서는 사용할 수 없는 알고리즘이지만 다른 알고리즘의 성능 비교에 대한 기준을 제공
- 정렬 알고리즘은 입력 데이터를 모두 가지고 있기 때문에, 오프라인 알고리즘이라고 볼 수 있다. 입력 데이터가 모두 주어졌으므로, 한 번에 정렬 가능
시간기반 알고리즘
- FIFO(First In First Out)
- 가장 먼저 온 페이지를 교체 영역에 가장 먼저 놓는 방법
- 캐시 메모리에 새로운 데이터가 들어오면 가장 오래전에 들어온 데이터를 제거하고 새로운 데이터를 추가
- 이 방식은 구현이 간단하지만, 오래된 데이터가 최근에 사용된 데이터와 비슷한 경우에 성능이 저하될 수 있다.
- LRU(Least Recently Used)
- 참조가 가장 오래된 페이지를 교체하는 방법
- LRU 방식은 가장 최근에 사용된 데이터를 먼저 사용할 가능성이 높기 때문에 캐시 히트(hit) 율을 높일 수 있음
- But, LRU 알고리즘의 구현 방식은 데이터를 저장하는데 추가적인 비용이 들어가게 됨
오랜된 것을 파악하기 위해 각 페이지마다 계수기, 스택을 두어야 한다는 문제점 발생
- NUR(Not Used Recently)
- 일명 clock 알고리즘 최근사용여부를 0,1로 표시하여 교체하는 방법
1은 최근에 참조, 0은 참조되지 않음을 의미
- 시계방향으로 돌면서 0을 찾고 0을 찾는 순간 해당 프로세스를 교체, 해당 부분을 1로 바꾸는 알고리즘
- NUR vs LRU
- LRU : 데이터를 사용할 때마다 최근 사용 시간을 갱신
- NUR : 사용하지 않은 데이터를 주기적으로 스캔하여 최근 사용 여부를 판단
빈도기반 알고리즘
LFU(Least Frequently Used)
- 가장 참조 횟수가 적은 페이지를 교체(= 많이 사용하지 않은 것을 교체
- LFU 방식은 사용 빈도가 낮은 데이터를 제거하여 캐시 히트율을 높일 수 있음
- 그러나 LFU 알고리즘은 일부 데이터가 빈번하게 사용되는 경우에는 성능 저하가 발생할 수 있음
프로세스 생명주기와 프로세스 메모리
프로그램이 저장되어 있는 곳 = 보조 기억장치
ex) 카카오톡이 저장되어 있는 곳
프로그램이 로딩되는 곳 = 주 기억장치
- 운영체제(Window, MacOS, Android, iOS 등…)에서 켜져 있는(로딩되어 있는) 프로그램
ex) 카카오톡이 로딩되어 실행되는 곳
맥북 > 활성 상태 보기 > 메모리
프로그램을 실행해주는 주체 = 프로세스
ex) 카카오톡을 실행하는 프로세스
맥북 > 활성 상태 보기 > CPU
작업을 처리해주는 주체 = 스레드
스레드는 필요할 때마다 생성되며, 프로세스 상세의 스레드 수는 최근 평균 스레드 개수 통계값
ex) 메시지 발송을 처리하는 스레드, 메세지 수신을 확인하는 스레드 등
맥북 > 활성 상태 보기 > CPU > 프로세스 상세 > 통계
프로세스의 상태변화와 스케쥴링
스케쥴링 알고리즘에 따라 프로세스들은 상태변화가 일어나며 준비/수행 상태일 때 CPU를 사용하게 됨
- 수행 -> 대기 (Running->Waiting) : I/O요청이 발생하거나, 자식 프로세스가 종료 대기를 할 때
- 수행 -> 종료 (Running -> Terminate) : 프로세스를 종료시켰을 때
- 수행 -> 준비 (Running-> Ready) : 인터럽트가 발생했을 때
- 대기 -> 준비 (Waiting -> Ready) : I/O가 완료되었을 때
여기서 1,2은 프로세스가 스스로 CPU를 반환하기에 비선점 스케쥴링이 발생
3,4은 프로세스에서 CPU를 강제로 할당(회수) 해야 하므로 선점 스케쥴링 이 발생
프로세스 생명주기
프로세스 상태변화 = 프로세스 생명주기
프로세스 상태 (Status)
신규 (NEW) :
- 프로세스가 이제 막 메인메모리에 올라온 상태
- 아직, 실행하는 것은 불가능
- 수용 동작을 거쳐야 준비단계로 넘어감
준비 (Ready) :
- 변수 초기화 등 기초 준비작업을 모두 끝나고 실행을 할 수 있는 상태
- 스케쥴러를 통해 발송(dispatch)되어야 수행상태
- 신규 프로세스가 허용
- 대기 프로세스의 입출력/이벤트가 완료
- 수행 프로세스가 중단됨
수행(Running) :
- CPU가 실제로 프로세스를 수행하고 있는 상태
- 선점 스케쥴링에 의해 중단되면 준비상태
- 입출력/이벤트가 필요하면 대기상태
- 수행이 완료되면 종료상태
-
- 아래 케이스를 통해 수행상태가 됨
- 준비 프로세스가 스케쥴러를 통해 발송됨
- 아래 케이스를 통해 수행상태가 됨
대기 (Waiting) :
- 프로세스 도중에 I/O 작업이 필요하여 I/O 작업을 수행하는 상태
- 이때 CPU는 I/O를 기다리며, 다른 프로세스를 수행
- 대기 상태가 끝나면 프로세스는 다시 준비 상태가 되고, 잠시 후 다시 수행 상태
종료 (Terminated) :
- 최종적으로 프로세스가 종료된 상태
- 사용하던 메모리 영역이 해제
스파르타 국비지원 | 내일배움카드로 0원에 코딩 공부하기
코딩교육 1위 스파르타코딩클럽의 강의를 0원에 수강하세요! 국민내일배움카드 발급 가능 대상자라면 누구나 가능합니다.
spartacodingclub.kr
'개발 일지' 카테고리의 다른 글
TIL(24.03.29) (2) | 2024.03.29 |
---|---|
TIL(24.03.28) (1) | 2024.03.28 |
TIL(24.03.21) (1) | 2024.03.21 |
CPU와 메모리 심화 (1) | 2024.03.20 |
CPU와 메모리 (1) | 2024.03.19 |