3주차 미션
운영체제
메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.
레지스터(Register)CPU 내부에 있는 가장 빠른 메모리. 크기는 작지만 처리 속도가 빠름
캐시 메모리(Cache)CPU와 메인 메모리 사이에 위치. 자주 사용하는 데이터를 저장해서 접근 속도를 높인다.
주기억장치(Main Memory, RAM)현재 실행 중인 프로그램과 데이터를 저장. 휘발성(전원이 꺼지면 데이터가 사라짐).
보조기억장치(Secondary Storage)HDD, SSD 같은 저장장치. 비휘발성. 데이터를 영구적으로 저장한다.
가상 메모리(Virtual Memory)물리적 메모리보다 더 큰 주소 공간을 제공하기 위해 하드디스크의 일부를 메모리처럼 사용. 페이지 교체가 발생하면 성능이 저하될 수 있음.
ROM(Read Only Memory)읽기 전용 메모리로, 주로 부팅 시 필요한 기본적인 정보를 저장. 비휘발성. BIOS가 여기에 저장됨.
플래시 메모리(Flash Memory)빠른 읽기/쓰기 가능. SSD나 USB 메모리에 사용됨.
사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?
경계 레지스터(Bound Register) 또는 기저 레지스터(Base Register) 를 사용한다
Base Register는 사용자 프로세스가 접근 가능한 메모리 시작 주소를 지정
Bound Register는 접근 가능한 메모리의 끝 주소(범위)를 지정한다
메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?
고정 분할은 공간을 미리 나눠놓기 때문에 비어 있는 부분이 생겨도 다른 프로세스가 못 쓰는 경우가 많아서 비효율적.
가변 분할은 필요한 만큼만 나눠서 공간 활용은 좋은데, 빈 공간들이 흩어져서 외부 단편화 문제가 생길 수 있다
CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?
스레싱
프로세스가 너무 많아지면 메모리가 부족해서 페이지 폴트가 빈번하게 발생하고,
때문에 계속 스왑 인/아웃만 반복하게 돼서 CPU가 실질적인 작업을 거의 못 하는 상황이다
결과적으로 CPU는 일 안 하고, 하드디스크만 바쁘게 움직이는 상태가 된다
HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?
꼭 필요하진 않다. HDD나 SSD는 운영체제와 데이터를 저장하는 역할을 하지만,
ROM이나 USB 같은 외부 저장장치에서 OS를 부팅하면 HDD/SSD 없이도 동작 가능하다
하지만 HDD/SSD가 없으면 운영체제를 어디다 저장하고 부팅할지 문제 때문에 필수로 여겨진다
메모리는 휘발성이라 전원이 꺼지면 모든 데이터가 날아가서 영구 저장 장치가 필요하기 때문임
파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?
파일을 삭제해도 실제 데이터는 안 지워지고, 파일 시스템에서 그 파일에 대한 포인터(주소 정보)만 삭제되기 때문이다
삭제하면 운영체제는 "이 공간은 비어 있다" 하고 표시할 뿐 실제 데이터는 그대로 하드디스크에 남아 있게 된다
덮어쓰기가 되지 않는 한, 복구 프로그램이나 포렌식 기술로 지워진 파일을 다시 읽어올 수 있다
자료구조 알고리즘
지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.
버블 정렬
복잡도 : O(n²) / O(n²)O(1)
특징
구현이 매우 간단함
자료가 거의 정렬된 경우 최적화 가능
느린 속도
선택 정렬
복잡도 : O(n²) / O(n²)O(1)
특징
구현이 간단함
메모리 적게 사용 (제자리 정렬)
항상 O(n²)
데이터 양이 많아지면 비효율적
삽입 정렬
복잡도 : O(n²) / O(n²), (최선 O(n))O(1)
특징
거의 정렬된 데이터일 경우 빠름
구현이 간단함
데이터가 많거나 무작위일 경우 비효율적
병합 정렬
복잡도 : O(n log n) / O(n log n) O(n)
특징
안정적인 시간 복잡도
안정 정렬(같은 값 순서 보장)
큰 데이터 정렬에 강점추가 메모리 공간 필요
리스트 병합 과정이 오버헤드
퀵 정렬
복잡도 : O(n log n) / O(n²)O(log n) (호출 스택)
특징
평균적으로 매우 빠르고 효율적
추가 메모리 거의 안 씀 (제자리 정렬)
최악의 경우 느림 (피벗 선택 실패 시)
불안정 정렬 (같은 값 순서 보장 X)
메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.
타뷸레이션으로 구현합니다
우리는 항상 메모리가 부족하지까 재귀 호출을 많이 하면 스택 오버플로우 위험이 있음
메모이제이션은 재귀 호출을 기반으로 동작하기 때문에 호출 스택이 깊어지면 메모리 문제가 발생할 수 있다
반면에 타뷸레이션은 반복문 기반으로 동작하고, 스택을 사용하지 않아서 스택 오버플로우 걱정이 없다
그리고 타뷸레이션은 미리 테이블을 할당해서 사용하는 메모리 양이 예측 가능하고 고정적이다
메모이제이션은 필요할 때마다 캐시를 쌓아가지만, 그만큼 캐시 관리가 필요하고 메모리를 더 많이 사용할 수도 있음.