인프런 워밍업 클럽 - CS Week 3
Algorithm
Insertion Sort
영역을 2개로 나누어서 정렬을 수행하는 알고리즘
정렬된 영역
정렬되지 않은 영역
정렬되지 않은 영역에서 데이터를 하나씩 꺼내서 정렬된 영역 내의 적절한 위치에 삽입하여 정렬하는 알고리즘
시간 복잡도 : O(n^2)
장점
구현이 간단하고 이해하기 쉬움
추가적인 메모리 소비가 적다.
단점
데이터의 상태에 따라 성능 편차가 크다.
최선 : O(n)
최악 : O(n^2)
Merge Sort
재귀로 구현하는 정렬 알고리즘
시간 복잡도 : O(n log n)
Divide & Conquer
복잡한 문제를 더 작고 관리하기 쉬운 하위 문제들로 나누어 해결하는 알고리즘 설계 기법
구현 방법
분할(Divide): 정렬할 배열을 거의 같은 크기의 두 부분 배열로 나눈다.
정복(Conquer): 각 부분 배열을 재귀적으로 정렬한다.
결합(Combine): 정렬된 부분 배열들을 하나의 정렬된 배열로 병합한다.
장점
속도가 빠르다.
단점
병합 과정에서 임시 배열이 필요하여 추가적인 메모리 공간을 사용한다.
이해와 구현이 어렵다.
Quick Sort
Pivot을 사용하여 정렬하는 알고리즘
시간 복잡도
평균 케이스: O(n log n)
최악의 케이스: O(n^2)
최선의 케이스: O(n log n)
구현 방법
피벗 선택
배열에서 피벗으로 사용할 요소를 선택
일반적으로 첫 번째, 마지막, 또는 중간 요소를 선택
분할 (Partition)
피벗을 기준으로 배열을 두 부분으로 나눈다.
피벗보다 작은 요소들은 왼쪽으로, 큰 요소들은 오른쪽으로 이동
재귀 호출
분할된 두 부분 배열에 대해 Quick Sort를 재귀적으로 적용한다.
종료 조건
부분 배열의 크기가 1 이하가 될 때까지 재귀를 반복한다.
결합
정렬된 부분 배열들이 자동으로 하나의 정렬된 배열로 합친다.
장점
공간 효율성: 추가 메모리 공간을 거의 필요로 하지 않는 제자리 정렬 알고리즘
캐시 친화적: 지역성이 좋아 캐시 성능이 우수
병렬화 가능: 분할 정복 접근 방식으로 인해 병렬 처리에 적합
단점
불안정 정렬: 동일한 키 값을 가진 요소들의 상대적 순서가 보존되지 않을 수 있다.
최악의 경우 성능: 피벗 선택이 잘못되면 O(n^2)의 시간 복잡도를 가질 수 있다.
재귀적 특성: 재귀 호출로 인해 스택 오버플로우가 발생할 수 있다.
Memoization
중복되는 연산을 저장하고, 같은 계산이 필요할 때 저장된 결과를 사용한다.
재귀 호출로 구현한다.
재귀 함수에 비해 함수 호출 수가 줄어들어 성능이 비교적 우수하다.
분할 정복을 해결할 때 재귀가 더 직관적인 경우에 사용한다.
Tabulation
상향식 계산 방식
계산에 필요하지 않을 수 있는 값도 미리 계산해 테이블에 저장하는 방식
재귀가 직관적이지 않은 경우에 사용한다.
OS
가상 메모리
물리 메모리가 처리할 수 없는 용량을 프로세스들이 요구할 때 물리 메모리 내용의 일부를 하드 디스크에 있는 스왑 영역으로 옮기고 처리가 필요할 때 물리 메모리로 가져와서 처리한다.
→ 물리 메모리가 처리할 수 없는 용량의 작업들을 처리할 수 있게 한다.메모리 관리자는 가상주소와 물리 주소를 1: 1 매핑 테이블로 관리한다.
가상 메모리 시스템에서는 OS 영역을 제외한 나머지 영역을 일정한 크기로 나누어서 프로세스에게 할당한다.
Segmentation(가변 분할 방식)
세그멘테이션 테이블이라는 테이블이 존재
Base Address
Bound Address
⇒ 두 주소를 사용하여 물리 메모리 주소를 계산한다.
Address
Base Address
프로세스나 세그먼트의 물리 메모리 상 시작 주소를 나타낸다.
MMU의 base register에 저장되어 주소 변환에 사용
Bound Address (또는 Limit)
프로세스나 세그먼트의 크기를 나타낸다.
MMU의 bound/limit register에 저장되어 메모리 보호에 사용된다.
STBR(Segment Table Base Register)
OS는 컨텍스트 스위칭을 할 때마다 메모리 관리자내의 Segment Table Base Register를 해당 프로세스의 것으로 값을 바꿔줘야 한다.
→ Context Switching이 고비용 작업인 이유
장점
메모리를 가변적으로 분할할 수 있다.
코드 영역, 데이터 영역, 스택 영역, 힙 영역을 모듈로 처리할 수 있어 공유와 각 영역에 대한 메모리 접근보호가 편리하다.
단점
외부 단편화 발생
Paging(고정 분할 방식)
세그멘테이션 기법의 외부 단편화를 해결하기 위해 고안된 배치 정책
페이징은 메모리를 할당할 때 정해진 크기의 페이지로 나눈다.
→ 외부 단편화가 발생되지 않는다.Page : 일정한 크기로 균일하게 나뉘어진 논리주소공간
Frame : 일정한 크기로 균일하게 나뉘어진 물리주소공간
Page Table
가상 주소를 물리 주소로 변환하는데 사용하는 테이블
각 프로세스의 가상 페이지 번호(VPN)을 물리 프레임 번호(PFN)로 매핑한다.
각 프로세스마다 독립적인 Page Table을 갖는다.
페이지 테이블에 Invalid로 되어 있으면 스왑영역에 저장되어 있는 상태
Page Table Base Register(PTER)
각 프로세스의 PCB에 위치하며, 해당 프로세스의 Page Table의 시작 주소를 가리킨다.
OS는 컨텍스트 스위칭을 할 때마다 메모리 관리자내의 Segment Table Base Register를 해당 프로세스의 것으로 값을 바꿔줘야 한다.
장점
메모리를 효율적으로 관리할 수 있다.
단점
내부 단편화 발생
세그멘테이션의 외부 단편화와 비교하면 많은 공간을 비교하지 않는다.
Segmentation vs Paging
세그멘테이션은 논리적인 영역별로 세그먼트를 나눈다.
→ 세그먼트마다 크기를 다르게 나눌 수 있다.
→ 크도 영역, 데이터 영역, 스택 영역, 힙 영역을 나눌 수 있다.페이징은 페이지의 크기가 고정되어 있어 논리적인 영역을 나눌 수 없다.
→특정 영역만 떼어내서 공유하거나 권한을 부여하기 어렵다.
Paged Segmentation
Segmentation + Paging
Segmentation Table과 Page Table을 결합하여 사용한다.
메모리 접근 권한
메모리의 특정 번지에 부여된 권한
Read, Write, Execute
각 프로세스는 코드 영역, 데이터 영역, 힙 영역, 스택 영역이 존재한다.
→ 각 영역마다 접근 권한이 있다.코드 영역 : 프로그램 자체 ⇒ 읽기/실행 권한
데이터 영역 : 일반변수, 전역변수, 상수로 선언한 변수 저장 ⇒ 읽기/(쓰기-Optional) 권한
힙 영역 : 읽기/쓰기 권한
스택 영역 : 읽기/쓰기 권한
메모리 접근 권한 검사는 가상주소에서 물리주소로 변환될 때마다 일어난다.
권한을 위반하는 경우 에러를 발생시킨다.
DAT(Dynamic Address Translation, 동적 주소 변환)
메모리 관리자가 물리 메모리와 스왑영역을 합쳐서 프로세스가 사용하는 가상주소를 물리주소로 변환하는 과정
DAT를 거치면 프로세스는 마음대로 사용자 데이터를 물리 메모리에 배치할 수 있다.
Page Table Entry(PTE)
페이지 테이블을 이루고 있는 행
접근 비트
페이지가 메모리에 올라온 후 데이터에 접근이 있었는지 알려주는 비트
1 : 메모리에 읽기나 실행 작업을 수행한 경우
변경 비트
페이지가 메모리에 올라온 후 데이터에 변경이 있었는지 알려주는 비트
1 : 쓰기 작업을 수행한 경우
유효 비트
페이지가 물리 메모리에 있는지 알려주는 비트
1 : 페이지가 스왑영역에 위치
0 : 페이지가 물리 메모리에 위치
권한 비트
해당 메모리에 접근권한이 있는지 검사하는 비트
Page Fault
프로세스가 가상 메모리에 접근요청을 했을 때 MMU(메모리 관리자)는 페이지 테이블을 보고 물리 메모리의 프레임을 찾아낸다.
물리 메모리에 프레임이 없다면 MMU는 Page Fault라는 인터럽트를 발생시킨다.
Page Fault가 발생하면 스왑영역에 접근하고 해당 프로세스는 대기 상태가 된다.
→ 스왑 영역의 데이터가 메모리로 올라가는 작업을 수행한다.
→ 데이터가 물리 메모리로 올라가는 경우 해당 프로세스가 실행 상태로 변경된다.
스레싱
프로세스들이 실제 실행되는 시간보다 페이지를 교체하는 데에 더 많은 시간을 사용하고 있는 현상
⇒ 페이지 부재(page fault)가 과도하게 발생하여 CPU 이용률이 급격히 떨어지는 현상다중 프로그래밍의 정도가 높아져 각 프로세스에 할당된 메모리가 부족해지면서 발생
CPU 이용률 저하 → 운영체제의 다중 프로그래밍 증가 → 페이지 부재 증가의 악순환이 반복
근본적인 원인 : 물리 메모리의 크기가 부족한 것
→ 메모리의 크기를 늘려서 해결(H/W 수준)할 수 있다.
S/W 수준의 해결 방법
프로세스가 실행되면 일정량의 페이지를 할당한다.
→ Page Fault가 빈번하게 발생하는 경우 : 더 많은 용량의 페이지를 할당한다.
→ Page Fault가 거의 없는 경우 : 적은 용량의 페이지를 할당한다.
File
데이터 집합 구성에 따른 분류
순차파일구조
파일의 내용이 연속적으로 이어진 형태
ex) 카세트테이프
장점
모든 데이터가 순차적으로 기록되기 때문에 공간의 낭비가 없고, 구조가 단순하다.
단점
특정지점에 바로 이동이 어려워 데이터를 삽입하거나 삭제하려면 탐색하는데 시간이 오래 걸린다.
직접파일구조
저장하려는 데이터의 위치를 해시 함수를 통해 결정하는 구조
자료구조에서 Hash Table이라고 불린다.
ex) JSON
장점
해시 함수를 사용하기 때문에 데이터 접근이 굉장히 빠르다.
단점
해시함수의 선정이 굉장히 중요하다.
저장공간이 낭비될 수 있다.
인덱스 파일 구조
순차접근과 직접접근 방식의 장점을 취한 구조
<탐색키, 레코드 포인터> 쌍으로 구성
데이터 파일과는 별도로 저장되며, 빠른 검색을 위해 사용된다.
File Descriptor(= File Control Block)
OS가 파일을 제어하기 위한 정보를 보관하는 Block
파일마다 독립적으로 존재한다.
저장장치에 존재하다가 파일이 오픈되면 메모리로 이동한다.
OS가 관리하고 사용자가 직접 참조할 수 없다.
사용자는 File Descriptor를 사용하여 File에 접근할 수 있다.
파일의 맨 앞에 위치해서 사용자가 쓰거나 읽기를 시작하면 처음부터 진행한다.
느낀점
회사에서 프로젝트와 병행하면서 '오늘 하루는 괜찮지 않을까...?'
라는 안일한 생각을 했었지만 디스코드 커뮤니티에서 다들 열심히 일하는 모습을 보고 자극 받아 하루도 빠짐없이 완강하게 될 수 있었다.
스터디를 하는게 강제성이 부여되는 것 같아서 안일한 생각을 뿌리칠 수 있었다.
개발을 하다가 상사분들이 하는 얘기를 잘 따라가지 못했었는데 CS 강의를 듣고 나니 '아~ 이래서 그런 얘기를 하신거구나'라는 생각이 들게 되었다.
다음번에도 스터디가 있으면 적극적으로 참여해야겠다.
댓글을 작성해보세요.