[인프런 워밍업클럽 2기] CS전공지식_Mission03

[인프런 워밍업클럽 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를 사용한다.

 

우리가 운영체제를 설치할 때 일부 공간을 저장장치에 저장하게 된다.
그 공간을 우리가 접근하여 지울수도 있지만. 보통 일반 사용자가 잘 알수는 없다.

그곳에 운영체제에 대한 보안적인 부분이나. 시스템 처리 등 각종 프로그램들이 들어가 있다.

 

  1. 가격이 저렴하다.

  2. 장기기억이 가능하다

  3. 전원이 꺼져도 남아있다.

 

6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?

  • 파일 시스템을 효율적인 관리를 위해서 빈 공간에 모아둔 free block List라는 것을 가지고 있다. 우리가 특정 파일을 삭제하면 파일 시스템은 파일 테이블의 헤더를 삭제하고 free block list를 추가하게 되는데.

  • 이렇게 삭제된 위치는 사용자로 하여금 삭제 된 것처럼 보여진다.

 

ps : 참고로 핸드폰 또한 내부 기억장치에 삭제된 것 처럼 보여도 데이터 복구가 일부가능하다. 완전한 복구는 아니지만.

비슷하게 포렌식 복구가 가능하다 (그래서 초기화 공장초기화 여러번 하라는 이유가 그때문일 것이다)

 

물론 포렌식 복구가 불가능한 경우도 있다.

  1. 보안

  2. FBE(파일기반암호화)기술 로 인해서 암호화키가 통째로 날아가 기존 데이터를 사용할 수 없게 만드는 기술

     

  3. 점차 나날히 발전하는 현대의 기술들이 이런 개선을 통해 파일의 보안성을 강조하고 있는 상태이다.

  4. 이렇게 복구가 가능하다면. 산업스파이나, 어떤 문제로 인해 발생할 것에 대해 취약해질 수 있기에. 이런 것들을 소프트웨어적으로 개선하게 될 것으로 보인다.

 

자료구조와 알고리즘

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. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.

 

 

메모이 제이션

  • 저장 : 결과를 특정 자료 구조에 저장

  • 확인 : 호출하기 전에 해당 입력에 대한 결과가 이미 저장되었는지 확인

  • 활용 : 저장된 결과가 있다면 다시 계산하지 않고 저장된 값을 반환

  • 하향식 설계

  • 함수를 결국 여러번 호출해야 하고 함수 하나를 호출하는 것보다 오버헤드가 더 크다.

     

     

     

     

타뷸레이션

  • 문제를 분할해서 작은 문제부터 차례대로 결과를 테이블에 저장하는 방식

  • 저장된 테이블을 기반으로 큰 문제의 해결을 단계적으로 구축

  • 상향식 계산 방식 미리 계산해 값도 미리 테이블에 저장한다. 저장 된 것을 불러와 사용한다.

 

 

둘다 장단점이 있다.

메모이제이션을 활용해서 계산 결과를 저장하는 방식인 직관적인 상태라면 메모이제이션이 유리

직관적이지 않으면 타뷸레이션을 사용해서 메모리도 절약하고 속도도 빠르게 할 수 있다.

 

위 질문대로라면 재귀로 쉽게 구현할 수 있다고 말하고 있다. 그렇다면 메모이제이션을 사용하는편이 좋을 것 같다.

 

 

 

댓글을 작성해보세요.

채널톡 아이콘