[인프런 워밍업클럽 2기] CS전공지식_Mission03
운영체제
1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.
CPU와 메인 메모리 간의 속도차를 해결하기 위해 CPU에는 데이터를 임시로 저장하고 계산처리하는 곳을 만들어두었다.
CPU
레지스터 : 가장 빠른 저장소로 CPU내에 존재하며, 컴퓨터 전원이 꺼지면 데이터가 사라지는 휘발성을 뛴 메모리이다. 보통 32bit와 64bit 형태로 존재하며 이것은 CPU레지스터의 크기를 알려준다.
레지스터는 CPU가 계산할 때 메인 메모리의 값을 레지스터로 가져와서 계산하고 그 결과를 다시 메인메모리에 저장한다.
캐시 : 데이터를 미리 복사해 놓는 임시 장소 같은 곳
캐시는 메인메모리와 레지스터 간의 데이터를 불러올 것을 예측해서 복사해놓고 임시로 저장해두면 거의 접근시간 없이 더 빠른 속도로 데이터에 접근할 수 있다.
메인메모리(RAM)
메인 메모리는 주기억장치라고도 불리며 CPU가 처리중인 데이터나 명령만을 일시적으로 저장하는 휘발성을 가진 장치이다.
내부에는 일종의 주소 공간을 가졌으며, 각 실행파일등이 운영체제에 의해 올라가 처리되는 곳이기도하다.
저장장치에 있는 것등을 불러와 주는 CPU와 중개역할을 해주기도 한다.
2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?
레지스터에는 (Base, Fence, Boundary) 이렇게 3가지 레지스터가 존재한다.
리눅스에서도 보면 0~999번까지 시스템사용자가 접근하지 못하도록 지정한 리눅스의 중요한 정보를 담고 있는 위치인 것 마냥 접근을 못하게 막는데
운영체제가 돌아가기 위한 영역인 부분에 접근하지 못하도록 하는 것이 경계 레지스터(Boundary register) 라고 불린다.
경계 레지스터 ( Boundary Register ) : 주기억 장치(RAM)내에 존재하는 프로그램은 크게 운영체제와 사용자 영역으로 나뉘는데,
사용자가 영역에 존재하는 OS영역에 침범하지 못하도록 한다.
3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?
가변분할방식(동적)
프로그램 크기에 따라 주기억 장치의 분할 크기및 개수를 다르게(동적) 분할하는 방식 그래서
필요할 때 마다 분할한다. (편리)
메모리의 연속된 공간에 할당 되어서 낭비되는 공간인 내부 단편화를 보완했다.
메모리 공간이 충분하지 않을 경우 외부 단편화가 발생할 수 있다.
고정분할방식(정적)
프로세스 크기와 상관없이 메모리를 할당한다. (물리적 메모리를 정해진 개수만큼 영구적인 분할로 나누어 각 분할에 하나의 프로세스를 적재)
한 프로세스가 메모리에 분산되어 할당 - 비연속 메모리 할당이라고도 불림
동시에 메모리에 올릴 수 있다는 간단하면서 구현이 간단하고 오버헤드 발생이 적다
작은 프로세스도 큰 영역에 할당되어 공간이 낭비되는 내부 단편화 발생이 크다. 또 맞는 메모리 공간이 없어서 외부 단편화 까지도 발생할 확률이 크다.
4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?
스레싱(Thrashing) 😀 메모리 영역에 접근하게 될 때 메모리에 페이지 부재(page fault)율이 높은 것
성능저하초래
과도한 페이징 작업을 의미
5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? (이유를 함께 적어주세요.)
기본적으로 하드나 플래쉬 메모리 같은 경우 프로그램이나 파일 운영체제의 데이터를 저장하고 중요한 보안적인 처리를 위해서 필요하기도 하다.
우리가 메인보드의 각 시스템을 사용하기 위해서는 일종의 처리방식이 필요하고 중계해주는 역할이 필요하다.
그래서 이것들을 저장하고 전원이 켜질때 마다 불러올 곳이 필요한데 그 위치가 저장장치이다.
어찌 되었든 메모리도 CPU도 저장하는 능력을 가졌지만. 가격이 비싸고, 휘발성이기에 데이터를 저장하기에는 별로 효율적이지 못하다.
그래서 이 데이터를 저장하고 장기기억을 위해서 보조기억장치인HDD와 SSD를 사용한다.
우리가 운영체제를 설치할 때 일부 공간을 저장장치에 저장하게 된다.
그 공간을 우리가 접근하여 지울수도 있지만. 보통 일반 사용자가 잘 알수는 없다.
그곳에 운영체제에 대한 보안적인 부분이나. 시스템 처리 등 각종 프로그램들이 들어가 있다.
가격이 저렴하다.
장기기억이 가능하다
전원이 꺼져도 남아있다.
6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?
파일 시스템을 효율적인 관리를 위해서 빈 공간에 모아둔 free block List라는 것을 가지고 있다. 우리가 특정 파일을 삭제하면 파일 시스템은 파일 테이블의 헤더를 삭제하고 free block list를 추가하게 되는데.
이렇게 삭제된 위치는 사용자로 하여금 삭제 된 것처럼 보여진다.
ps : 참고로 핸드폰 또한 내부 기억장치에 삭제된 것 처럼 보여도 데이터 복구가 일부가능하다. 완전한 복구는 아니지만.
비슷하게 포렌식 복구가 가능하다 (그래서 초기화 공장초기화 여러번 하라는 이유가 그때문일 것이다)
물론 포렌식 복구가 불가능한 경우도 있다.
보안
FBE(파일기반암호화)기술 로 인해서 암호화키가 통째로 날아가 기존 데이터를 사용할 수 없게 만드는 기술
점차 나날히 발전하는 현대의 기술들이 이런 개선을 통해 파일의 보안성을 강조하고 있는 상태이다.
이렇게 복구가 가능하다면. 산업스파이나, 어떤 문제로 인해 발생할 것에 대해 취약해질 수 있기에. 이런 것들을 소프트웨어적으로 개선하게 될 것으로 보인다.
자료구조와 알고리즘
1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.
| 버블정렬 | 선택정렬 | 삽입정렬 | 병합정렬 | 퀵정렬 |
| O(n²) | O(n²) | O(n²) | O(n log n) | O(n log n) |
전체 정리
O(1): Operation push and pop on Stack
O(log n): Binary Tree
O(n): for loop
O(n log n): Quick Sort, Merge Sort, Heap Sort
O(n²): Double for loop, Insert Sort, Bubble Sort, Selection Sort
O(2n): Fibonacci Sequence
| Better | <= O(1) < O(log n) < O(n) < O(n×log n) < O(n2) < O(2n) < O(n!) => | Worse |
상수 함수 < 로그 함수 < 선형 함수 < 다항 함수 < 지수 함수 < 재귀 함수
2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.
메모이 제이션
저장 : 결과를 특정 자료 구조에 저장
확인 : 호출하기 전에 해당 입력에 대한 결과가 이미 저장되었는지 확인
활용 : 저장된 결과가 있다면 다시 계산하지 않고 저장된 값을 반환
하향식 설계
함수를 결국 여러번 호출해야 하고 함수 하나를 호출하는 것보다 오버헤드가 더 크다.
타뷸레이션
문제를 분할해서 작은 문제부터 차례대로 결과를 테이블에 저장하는 방식
저장된 테이블을 기반으로 큰 문제의 해결을 단계적으로 구축
상향식 계산 방식 미리 계산해 값도 미리 테이블에 저장한다. 저장 된 것을 불러와 사용한다.
둘다 장단점이 있다.
메모이제이션을 활용해서 계산 결과를 저장하는 방식인 직관적인 상태라면 메모이제이션이 유리
직관적이지 않으면 타뷸레이션을 사용해서 메모리도 절약하고 속도도 빠르게 할 수 있다.
위 질문대로라면 재귀로 쉽게 구현할 수 있다고 말하고 있다. 그렇다면 메모이제이션을 사용하는편이 좋을 것 같다.
댓글을 작성해보세요.