인프런 워밍업 클럽 - CS 3주차 미션
운영체제
1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.
- 레지스터 : CPU 내부에 위치한 가장 빠른 메모리로 CPU가 명령어를 실행할 때 직접 사용합니다.
- 캐시 : CPU와 메인 메모리(RAM) 사이에 위치하고 CPU의 성능을 높이기 위해 사용되는 고속 메모리입니다.
- 메인 메모리(RAM) : 빠르지만 휘발성 메모리입니다.
- 보조 저정장치(HDD,SSD) : 영구 저장 장치로 데이터의 비휘발성 저장합니다.
2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?
- 경계 레지스터입니다.
- 경계 레지스터는 CPU내에 존재하고 메모리 관리자가 사용자 프로세스가 경계 레지스터값을 벗어나면 해당 프로세스를 종료 시킵니다.
3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?
- 가변 분할방식
장점 :
1. 메모리를 가변적으로 분할 가능
2. 코드, 데이터, 힙, 스택 영역을 모듈로 처리 가능
3. 해당 영역을 쉽게 공유 할 수 있고 메모리 접근 보호도 편리합니다.
4. 내부 단편화가 없습니다.
단점
1. 외부 단편화가 발생합니다.
-> 이를 해결하기 위해 조각모음을 사용하는데 -> 이는 모든 프로세스를 정지하고 해야하기 때문에 굉장히 오버헤드가 큰작업 입니다.
- 고정 분할 방식
장점
1. 메모리를 정해진 크기 만큼 분할 가능
2. 구현이 간단하고 오버헤드가 작습니다.
3. 외부 단편화가 없습니다.
단점
1. 내부 단편화가 발생합니다.
-> 이를 해결 할순 없지만 내부 단편화를 최소화 하는것이 제일 메모리를 효율적으로 사용 할 수 있는 방법입니다.
4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?
스레싱이라고 합니다.
CPU 사용률은 높지만 시스템 성능이 떨어지는 현상을 말합니다.
5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?
> 컴퓨터를 부팅하는데 필요한 os가 필요한데, HDD나 SSD에 해당 os가 저장되어 있다고 알고 있습니다.
> 근데 생각 해보니까 만약에 USB에 os를 두고 컴퓨터와 연결시켜서 실행 한다면 실행 할 수 있을것 같습니다!!!
> 옛날에 어릴때 컴퓨터를 처음 삿을때 window 운영체제를 설치 해야 되는데 그걸 USB를 통해서 설치 했던 기억이 있습니다. 즉, 그때도 컴퓨터를 실행할때 USB를 통해서 실행한것이지 SSD와 HDD와는 상관 없었던것 같습니다.
6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?
사용자가 파일을 삭제 했을때 파일 테이블에서 해당 파일의 헤더를 지웁니다.
사용했던 블록을 free block list에 넣습니다.
즉, 사용자는 파일이 삭제된것처럼 느끼지만 실제로는 사용 했던 블록의 데이터는 free block list에 그대로 남아 있어서 파일을 복구 할 수 있게 됩니다.
자료구조와 알고리즘
1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.
버블 정렬
- 장점 : 구현이 쉽다.
- 시간 복잡도 : O(n2)
- 단점 : 시간 복잡도가 O(n2)으로 성능이 안좋다.
선택 정렬
- 장점 : 구현이 쉽다.
- 시간복잡도 : O(n2)
- 단점 : 시간 복잡도가 O(n2)으로 성능이 안좋다.
삽입정렬
- 장점 : 구현이 쉽다.
- 시간 복잡도 : O(n2)
- 단점 : 시간 복잡도가 O(n2)으로 성능이 안좋다.
병합 정렬
- 장점 : 성능이 좋다.
- 시간 복잡도 : nlogn
- 단점 : 추가 메모리 공간이 필요하다.
퀵 정렬
- 장점 : 평균적으로 가장 빠른 정렬 중 하나이며, 메모리 사용이 효율적
- 시간 복잡도 : 평균 : nlogn, 최악 : O(n2)
- 단점 : 피벗 선택이 잘못되면 성능이 나빠진다.
2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.
메모리가 부족한 시스템에서는 저는 타뷸레이션(Tabulation)을 사용하는 것이 더 적합하다고 생각합니다.
우리는 서비스를 제공하는 입장에서 치명적인 오류나 결함을 방지하고 사용자 경험을 보호하는 것이 가장 중요하다고 저는 생각합니다.
메모이제이션은 힙메모리에 저장하기 때문에 메모리 부족 현상으로 인해 힙 메모리 부족으로 인한 오류가 발생하여 사용자에게 서비스 중단이나 예기치 못한 오류를 발생시킬 수 있습니다. 반면, 타뷸레이션은 반복문을 사용하여 스택 메모리를 절약하고, 필요 이상으로 힙 메모리를 사용하지 않아 메모리 효율적입니다. 또한 속도 측면에서 비교 해보았을때도 메모이제이션과 타뷸레이션의 성능은 거의 비슷하기 때문에 메모리가 부족한 시스템에서는 타뷸레이션을 선택하는게 바람직 하다고 생각합니다.
댓글을 작성해보세요.