[인프런 워밍업클럽 CS 2기] 3주차 미션📒
운영체제
메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.
1. 레지스터
레지스터는 CPU 내에 존재하는 가장 빠른 기억 장로, 계산 중간에 필요한 값들을 일시적으로 저장하기 위해 사용합니다.
2. 캐시(Cache)
레지스터는 굉장히 빠르고, 메인메모리는 너무 느리기 때문에 메인 메모리에 있는 값을 레지스터로 옮기려면 한참 걸리므로 필요할 것 같은 데이터를 미리 가져와서 캐시에 저장합니다. 성능 상의 이유로 여러개를 둡니다.
3. 메인메모리(RAM)
메인메모리는 실제 운영체제와 다른 프로세스들이 올라가는 공간입니다. 휘발성 메모리로, 전원이 공급되지 않으면 데이터가 지워집니다. 하드디스크나 SSD보다 속도는 빠르지만, 가격이 비싸므로 데이터를 저장하기 보다는 실행 중인 프로그램만 올립니다.
4. 보조 저장 장치(HDD, SDD)
사무용 프로그램, 게임, 작업한 파일 등을 저장할 필요가 있는데, 비싸고, 휘발성인 메모리에 저장할 순 없어서, 가격이 저렴하고 전원이 공급되지 않아도 데이터가 지워지지 않는 비휘발성 메모리인 HDD, SDD를 사용합니다.
사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?
경계 레지스터입니다. 경계 레지스터는 프로세스가 사용할 수 있는 메모리의 범위를 저장하는 레지스터로, 사용자 프로세스가 경계 레지스터의 범위를 벗어났는지 검사하여 벗어났다면 해당 프로세스를 종료시키는 등의 조치로 메모리를 보호합니다.
메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?
가변 분할 방식은 프로세스의 크기에 맞게 메모리를 동적으로 할당하는 방식입니다. 따라서 프로세스의 크기에 딱 맞게 메모리를 할당하므로 내부 단편화 문제가 적고, 메모리를 효율적으로 사용할 수 있다는 장점이 있습니다. 하지만 프로세스가 종료되면서 중간중간 작은 빈 공간이 생기면 새로운 프로세스를 적절히 배치하기 어려운 외부 단편화 문제가 발생할 수 있다는 단점이 있습니다.
고정 분할 방식은 메모리를 미리 여러 개의 고정 크기 블록으로 나누어 각 프로세스에 할당하는 방식입니다. 따라서 구현이 간단하고, 오버헤드가 적으며 외부 단편화 문제가 없다는 장점이 있습니다. 하지만 작은 프로세스도 큰 영역에 할당될 수 있어 공간이 낭비되는 내부 단편화 문제가 발생할 수 있는 단점이 있습니다.
고정 분할 방식은
CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?
스레싱입니다. 스래싱은 프로세스에 적절한 페이지 수를 할당하는 것으로 해결 할 수 있습니다. 이를 위해 자주 사용될 확률이 높은 현재 사용중 페이지를 통째로 메모리에 올리는 워킹셋 기법을 사용할 수 있습니다.
HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?
HDD나 SSD는 컴퓨터를 실행시키는데 반드시 필요하진 않다고 생각합니다. 그 이유는 HDD, SDD가 없다고 가정했을 때, 일반적으로 HDD,SDD에 저장되는 것들이 다른 곳에 저장될 수 있다고 생각했기 때문입니다. HDD, SDD는 비휘발성 메모리로, 여기에 운영체제와 사용자 데이터 등을 저장합니다. HDD, SDD가 없다면 USB 같은 다른 비휘발성 메모리에 운영 체제, 데이터 파일 등을 저장할 수 있을 것입니다.
다만, USB와 같은 저장 장치를 사용할 경우 속도나 기능적 측면에서 HDD, SDD에 비해 제약이 따를 것이기 때문에, 속도와 성능을 고려하여 장기적으로 사용할 것이라면 HDD, SDD를 사용하는 것이 좋다고 생각합니다.
파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?
삭제된 파일은 파일 테이블에서 헤더 정보가 지워지거나 비워지면서, 그 파일이 사용한 블록을 free block list로 추가합니다. 즉, 파일의 물리적인 데이터는 여전히 디스크에 남아 있지만, 운영체제는 이 블록들을 빈 공간으로 처리해 새로운 파일이 해당 블록을 사용할 수 있도록 표시합니다. 파일이 삭제되었을 때, 사용된 블록(파일이 저장된 물리적 위치)은 사실상 지워지지 않고 그대로 디스크에 남아 있는 상태입니다.
포렌식은 디스크에서 삭제된 파일이 사용한 블록을 찾아내어 헤더 정보가 없는 데이터를 복구합니다. 삭제된 파일이 사용한 블록이 새로운 데이터로 덮어쓰여지지 않았으면, 이 데이터를 복구할 수 있습니다.
자료구조와 알고리즘
지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.
1. 버블 정렬
- 시간 복잡도 : 평균 O(n^2)
- 장점 : 구현이 매우 간단합니다.
- 단점 : 시간 복잡도가 O(n^2)으로 성능이 낮습니다. 비교 및 교환을 많이 해야 하기 때문에, 큰 데이터셋에서 비효율적입니다.
2. 선택 정렬
- 시간 복잡도 : 평균 O(n^2)
- 장점 : 구현이 간단합니다.
- 단점 : 시간 복잡도가 O(n^2)으로 성능이 낮습니다. 비교 및 교환을 많이 해야 하기 때문에, 큰 데이터셋에서 비효율적입니다.
3. 삽입 정렬
- 시간 복잡도 : 평균 O(n^2)
- 장점 : 구현이 간단합니다.
- 단점 : 시간 복잡도가 O(n^2)으로 성능이 낮습니다. 비교 및 교환을 많이 해야 하기 때문에, 큰 데이터셋에서 비효율적입니다.
4. 병합 정렬
- 시간 복잡도 : 평균 O(nlogn)
- 장점 : O(nlogn) 시간복잡도로 매우 빠릅니다.
- 단점 : 추가적인 메모리 공간이 O(n)만큼 필요합니다.
5. 퀵 정렬
- 시간 복잡도 : 평균 O(n log n) / 최악 O(n^2)
- 장점 : 평균적으로 매우 빠르고, 메모리 사용이 O(log n)로 적습니다.
- 단점 : 피벗을 잘못 선택한다면, 최악의 경우 O(n^2)으로 좋지 못한 성능을 보입니다.
메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.
저라면 타뷸레이션을 사용할 것 같습니다. 메모이제이션은 동적으로 필요한 값만 캐시하고 계산을 추후에 하기 때문에, 재귀와 더 잘 맞물린다고 생각하지만, 재귀가 깊어지면 스택 오버플로우가 발생할 수 있다는 문제점이 있습니다. 또한, 메모이제이션은 메모리의 불필요한 사용이 있을 수 있기 때문에 메모리가 부족한 상황에서는 안정적인 메모리 사용이 가능한 타뷸레이션이 더 합리적인 선택이라고 생각합니다.
댓글을 작성해보세요.