인프런 워밍업 클럽 - CS 3주차 과제
운영체제
1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.
레지스터
가장 빠른 기억장소
CPU 내에 존재
휘발성 메모리
CPU를 나타내는 값에서 32bit, 64bit가 레지스터의 크기를 의미한다.
CPU는 계산을 수행할 때 메인 메모리에 있는 값을 레지스터로 가져와서 계산한다.
캐시
휘발성 메모리
레지스터와 메인 메모리 사이의 속도 간극을 메우기 위한 저장소
필요한 데이터를 미리 가져와 저장하는 저장소
성능의 이유로 여러 개가 존재한다.
ex) L1, L2, L3CPU가 값을 요청해 레지스터로 값을 옮겨야 하는 경우 빠른 캐시를 순차적으로 확인하고, 캐시에 데이터가 없으면 메인 메모리를 조회한다.
메인메모리
휘발성 메모리
OS와 다른 프로세스들이 올라가는 공간
데이터를 저장하기 보다는 실행중인 프로그램만 저장한다.
2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?
경계 레지스터
H/W적으로 OS 공간과 사용자 공간을 나누는 레지스터
CPU 내에 존재한다.
메모리 관리자가 사용자 프로세스가 경계 레지스터의 값을 벗어났다면 검사하고, 벗어났다면 해당 프로세스를 종료시킨다.
3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?
가변 분할 방식 장점
메모리를 가변적으로 분할할 수 있다.
코드 영역, 데이터 영역, 스택 영역, 힙 영역을 모듈로 처리할 수 있어 공유와 각 영역에 대한 메모리 접근보호가 편리하다.
가변 분할 방식 단점
외부 단편화가 발생한다.
고정 분할 방식 장점
메모리를 효율적으로 관리할 수 있다.
고정 분할 방식 단점
내부 단편화가 발생한다.
But. 가변 분할 방식의 단점인 외부 단편화에 비해 많은 공간을 차지하지 않는다.
4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?
쓰레싱
5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?
필요하다고 생각한다.
컴퓨터가 부팅될 때 ROM에 저장된 바이오스가 실행되고, 바이오스는 주요 하드웨어에 이상이 없는지 체크한다. 이 때 저장장치에 문제가 있다면 부팅이 정상적으로 이뤄지지 않는다.
OS는 주로 HDD나 SSD에 설치되고 저장되고, 부팅시에 주요 장치에 이상이 없다면 HDD나 SSD의 마스터 부트 레코드에 저장된 부트로더를 메모리로 가져와서 실행시킨다.
위의 2가지 이유 때문에 HDD와 SSD가 없어서는 안된다고 생각한다.
6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?
파일시스템은 효율적인 공간 관리를 위해 Free Block List라는 목록을 관리한다.
파일이 지워질 때 파일 시스템이 파일의 모든 정보를 지우는 것이 아니라 파일 테이블의 헤더를 삭제하고 Free Block List에 추가한다.
→ 실제로 파일의 데이터를 지우는 것이 아니다.이러한 특성으로 인하여 포렌식으로 파일을 복구할 수 있는 것이다.
자료구조와 알고리즘
1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.
버블 정렬
장점
이해와 구현이 간단하다.
단점
성능이 좋지 않다.
시간 복잡도
O(n^2)
선택 정렬
장점
이해와 구현이 간단하다.
단점
성능이 좋지 않다.
시간 복잡도
최악 : O(n^2) - 배열이 역순으로 정렬되어 있는 경우
삽입 정렬
장점
구현이 간단하고 이해하기 쉽다.
추가적인 메모리 소비가 적다.
단점
성능이 좋지 않다.
데이터의 상태에 따라 성능 편차가 크다.
최선 : O(n)
최악 : O(n^2)
시간 복잡도
O(n^2)
병합 정렬
장점
속도가 빠르다.
단점
병합 과정에서 임시 배열이 필요하기 때무넹 추가적인 메모리 공간을 사용한다.
이해와 구현이 복잡하다.
시간 복잡도
O(n log n)
퀵 정렬
장점
공간 효율성: 추가 메모리 공간을 거의 필요로 하지 않는 제자리 정렬 알고리즘
캐시 친화적: 지역성이 좋아 캐시 성능이 우수
병렬화 가능: 분할 정복 접근 방식으로 인해 병렬 처리에 적합
단점
불안정 정렬: 동일한 키 값을 가진 요소들의 상대적 순서가 보존되지 않을 수 있다.
최악의 경우 성능: 피벗 선택이 잘못되면 O(n^2)의 시간 복잡도를 가질 수 있다.
재귀적 특성: 재귀 호출로 인해 스택 오버플로우가 발생할 수 있다.
시간 복잡도
평균 케이스: O(n log n)
최악의 케이스: O(n^2)
최선의 케이스: O(n log n)
2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.
타뷸레이션을 사용할 것 같다.
메모이제이션의 경우 재귀호출이기 때문에 메모리를 많이 사용하기 때문에 메모리가 부족한 시스템에서 사용하는 것은 적합하지 않다.
댓글을 작성해보세요.