일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- DFS & BFS
- BFS(Breadth First Search)
- 그리디 알고리즘(Greedy Algorithm)
- 백준 17608번
- 백준 9012번
- DFS(Depth First Search)
- 백준 2261번
- BFS
- 큐(Queue)
- 동적 프로그래밍(Dynamic Programming)
- 백준 21606번
- 이분 탐색(Binary Search)
- 위상 정렬(Topological Sort)
- 백준 10000번
- 분할 정복(Divide and Conquer)
- 위상 정렬(Topology Sort)
- 다익스트라 알고리즘(Dijkstra Algorithm)
- DFS
- 그래프(Graph)
- 백준 18352번
- 백준 2493번
- 백준 2504번
- 백준 2812번
- 백준 1707번
- 트리(Tree)
- 백준 1948번
- 이분 그래프(Bipartite Graph)
- 스택(Stack)
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 알고리즘 개념
- Today
- Total
목록카이스트 정글 - 프로젝트 (40)
Always Be Wise
제공된 파일 시스템은 외부 동기화를 요구한다. 즉, 호출자는 한 번에 하나의 스레드만 실행할 수 있는지 확인해야 한다. 외부 동기화가 필요없는 세분화된 동기화 전략을 채택해야 한다. 독립적인 항목들에 대한 작업은 독립적이어야 한다. 서로 다른 캐시 블록에 대한 작업은 독립적이어야 한다. 특히, 특정 블록에서 I/O가 요구되는 경우, I/O가 완료될 때까지 기다리지 않고, I/O가 필요하지 않은 다른 블록에서 작업을 진행해야 한다. 여러 프로세스가 한 번에 하나의 파일에 액세스할 수 있어야 한다. 한 파일을 여러 번 읽는 것은 서로 기다리지 않고 완료할 수 있어야 한다. 파일에 작성하는 것이 파일을 확장하지 않을 때, 여러 프로세스에서 한 번에 하나의 파일을 쓸 수 있어야 한다. 다른 프로세스에서 파일을 ..
파일 블록의 캐시를 유지하기 위해 파일 시스템을 수정해야 한다. 블록 읽기 또는 쓰기 요청이 발생했을 때 해당 블록이 캐시에 있는지 확인하고, 캐시에 있다면 디스크로 이동하지 않고 캐시 된 블록을 사용하고, 캐시에 없다면 디스크에서 캐시로 블록을 가져온다. 이때, 필요한 경우 캐시에 있던 이전 블록을 방출할 수 있다. 캐시 크기는 64 섹터 이하로 제한된다. 적어도 클록 알고리즘만큼 좋은 캐시 교체 알고리즘을 구현해야 한다. 디스크 접근 횟수로 측정했을 때, 액세스 된 정보, 더티 정보 및 기타 정보의 조합이 최상의 성능을 제공하는지 확인해야 한다. 제공된 inode 코드는 디스크의 섹터별 인터페이스를 시스템 콜 인터페이스의 바이트 별 인터페이스로 변환하기 위해 malloc( ) 함수로 할당된 "boun..
기본 파일 시스템에서 모든 파일은 하나의 디렉터리에 저장된다. 디렉터리 항목이 파일 또는 다른 디렉터리를 가리키도록 수정해야 한다. 다른 파일과 마찬가지로 디렉터리를 원래 크기 이상으로 확장할 수 있어야 한다. 기본 파일 시스템은 파일 이름을 14자로 제한하고 있다. 개별 파일 이름 구성에 대해 이 제한을 유지하거나 확장할 수 있다. 전체 경로 이름이14자를 넘어가는 것은 반드시 허용해야 한다. 각 프로세스에 대해 별도의 현재 디렉터리를 유지해야 한다. 시작할 때, 루트를 초기 프로세스의 현재 디렉터리로 설정한다. 한 프로세스가 포크 시스템 콜로 다른 프로세스를 시작하면, 자식 프로세스는 부모 프로세스의 현재 디렉터리를 상속한다. 그 후에는, 두 프로세스의 디렉터리는 독립적이므로, 디렉터리를 바꾸는 것..
기본 파일 시스템은 파일을 single extent로 할당하여 외부 단편화에 취약하다. 즉, n개의 블록이 사용 가능하더라도 n개의 블록을 할당할 수 없는 상황이 발생한다. on-disk inode 구조를 수정하여 이 문제를 제거해야 한다. 해당 문제를 해결하기 위해서 파일 시스템은 직접, 간접, 이중 간접 블록을 가진 인덱스 구조를 사용해야 한다. Berkeley의 UNIX FFS의 멀티 레벨 인덱싱과 같은 방법을 사용할 수 있겠으나, 이번 프로젝트에서는 주어진 스켈레톤 코드로 FAT을 구현하는 것이 훨씬 편할 것이다. 참고로 파일 시스템 파티션은 8MB보다 크지 않다고 가정할 수 있으며, 파티션에서 메타데이터를 제외한 만큼 큰 파일을 지원할 수 있어야 한다. 각 inode는 하나의 디스크 섹터에 저장..
이전까지는 파일 시스템의 구현 방식에 대해 고려하지 않고 파일 시스템을 사용해왔다. 이번 프로젝트에서는 기존 파일 시스템의 구현을 개선할 것이다. Background New Code filesys/fsutil.c 커널 커멘드 라인에서 액세스할 수 있는 파일 시스템의 간단한 유틸리티이다. include/filesys/filesys.h filesys/filesys.c 파일 시스템에 대한 최상위 인터페이스이다. include/filesys/directory.h filesys/directory.c 파일 네임을 inode로 변환한다. 디렉터리 데이터 구조는 파일로 저장된다. include/filesys/inode.h filesys/inode.c 디스크의 파일 데이터 레이아웃을 나타내는 데이터 구조를 관리한다. i..
이번 프로젝트를 통해 주요하게 학습한 내용은 메모리 가상화와 관련한 것이었다. 메모리 가상화란 프로그램이 자신의 전용 물리 메모리를 갖고 있다는 환상을 제공하는 것을 의미한다. 그런데 중요한 점은 이런 가상화가 시간과 공간 측면에서 효율적이어야 하며, 가상화를 통한 주소 공간이 서로 보호되어야 한다는 것이다. 다시 말해, 특정 프로세스가 다른 프로세스나 운영체제의 메모리 내용에 접근하거나 영향을 주어서는 안 되어야 한다. 메모리 가상화 시, 시간 측면에서의 효율을 위해 하드웨어로부터 도움을 받는다. 대표적으로 TLB(Translation Lookaside Buffer)를 학습하였다. TLB는 MMU(Memory Management Unit)의 일부로, 자주 참조되는 가상 주소-실제 주소 변환 정보를 저장..
스와핑 시 운영체제는 방출할 페이지를 선택한다. 방출을 위해 선택 가능한 페이지는 anonymous page 혹은 file-backed page이다. 각 페이지 타입에 맞추어 스와핑이 이루어져야 한다. 우선, anonymous page 타입의 스와핑을 구현해보자. Anonymous Page anonymous page의 경우, 해당 페이지에 대한 backing store가 디스크에 존재하지 않는다. 다시 말해, 디스크로 스왑 아웃되었을 때, 이 페이지를 저장할 공간이 디스크 내에 없다는 의미이다. 따라서 디스크 내에 별도의 swap_disk 공간을 만들고, 해당 공간에 스왑 아웃된 anonymous page를 저장하도록 해야 한다. 또한, swap disk의 사용 가능한 영역과 사용 불가능한 영역을 관리..
메모리 스와핑은 물리 메모리의 사용을 극대화하기 위한 메모리 회수 기술이다. 모든 메인 메모리 프레임이 할당되면 시스템은 사용자 프로그램의 메모리 할당 요청을 더 이상 처리할 수 없다. 한 가지 방법은 현재 사용되지 않는 메모리 프레임을 디스크로 스왑 아웃시키는 것이다. 이렇게 하면 메모리 자원을 해제하여 다른 응용 프로그램에서 사용할 수 있게 된다. 스와핑은 운영체제에 의해서 이루어진다. 시스템이 메모리가 부족함을 감지한 상태에서 메모리 할당 요청을 받으면 방출할 페이지를 선택한다. 이때, 메모리 프레임의 정확한 상태가 디스크로 복사된다. 방출을 위해 선택된 페이지는 anonymous page 혹은 file-backed page이다. 각 사례를 처리해야 한다. 프로세스가 스왑 아웃된 페이지에 접근하려고..
Memory Mapped File은 anonymouse page와 달리 file-backed mapping이다. 따라서, 페이지 폴트가 발생하면 물리 프레임이 즉시 할당되고 파일의 데이터가 물리 프레임에 복사된다. 우선, mmap( )부터 구현해보도록 하자. mmap( )은메모리를 페이지 단위로 할당받을 수 있는 시스템 콜이다. 인자로 받은 파일 fd의 offset에서 length만큼 내용을 읽어와 프로세스의 가상 주소 공간 addr에 매핑한다. 전체 파일은 addr에서 시작하는 연속된 가상 페이지로 매핑되며, 이는 do_mmap( ) 함수를 통해 이루어진다. /* userprog/syscall.c */ /*--------------- PROJECT3: Virtual Memory ------------..
anonymouse page와 달리, memory-mapped page는 file-backed mapping이다. 페이지의 콘텐츠는 실제 파일의 데이터를 미러링 한다. 페이지 폴트 발생 시, 물리적 프레임이 즉시 할당되고 파일로부터 메모리로 콘텐츠가 복사된다. memory-mapped page가 매핑 해제되거나 스왑 아웃되면 콘텐츠의 모든 변경 사항이 파일에 반영된다. mmap and munmap System Call memory-mapped 파일을 위한 두 가지 시스템 콜 mmap( )과 munmap( )을 구현해야 한다. VM 시스템은 mmap 영역에서 페이지를 Lazy Loading 해야 하며, mmaped 파일 자체를 매핑을 위한 backing store로 사용해야 한다. 이 두 가지 시스템 콜을..