CS
[Design Pattern] 상태 패턴(State Pattern)
State 패턴 하나의 객체가 다양한 상태를 가질 때가 있습니다. 또한, 상태가 변화함에 따라 행위가 달라질 수 있습니다. 만약 어떤 상태에 대한 `행위를 클래스별로 구현`해주어야 한다면 상당한 `보일러플레이트 코드`가 발생할 것입니다. 이는 곧 프로젝트의 유지보수성을 떨어뜨리는 것과 동일합니다. 이러한 상황을 쉽게 관리하기 위해 State 패턴을 사용할 수 있습니다. State 패턴은 `상태에 따른 비즈니스 로직`, `상태 전이`를 상태 클래스 내에서 관리합니다. 이러한 상태를 가지고 있는 객체를 `Context`라고 부릅니다. State 패턴을 적용하면 Context는 각 상태에 따라 어떤 기능을 수행할지 고려하지 않아도 됩니다. State 패턴을 적용하지 않은 사례 // 자동차는 아래와 같은 상태를..
[Programming] 원시값과 컬렉션을 포장해야 하는 이유 - 래퍼 클래스, 일급 컬렉션(Wrapper class, First-class Collection)
해당 포스팅은 Kotlin 언어를 기반으로 작성하였습니다. 모든 원시값과 문자열을 포장하자 우선, 모든 원시값과 문자열을 포장하자는 이야기에 대해 살펴보겠습니다. Lotto와 관련된 프로그램을 작성한다면, 원시값을 아래와 같은 코드로 검증해 줄 수 있습니다. val lottoNumber: Int = 45 class Lotto(lottoNumbers: List) : List by lottoNumbers { init { lottoNumbers.forEach { validateLottoNumber(it) } validateLottoSize(lottoNumbers) } fun validateLottoNumber(lottoNumber: Int) { require(lottoNumber in MIN_LOTTO_NUM..
[운영체제] Page table의 3가지 구조 - Hierarchical, Hashed, Inverted Page table
목차 🐤 계층적 페이지 테이블 (Hierarchical page table) 🐦 해시 페이지 테이블 (Hashed page table) 🐧 역페이지 테이블 (Inverted page table) 페이징(Paging)이란? [운영체제] 비연속할당(Noncontiguous allocation) - 페이징(Paging) 목차 🤔 페이징(Paging)이란? 🙉 페이지 테이블(Page table)과 주소 변환 🙈 페이징의 문제점 내부 단편화(Internal fragmentation) 페이지 테이블의 크기 🤔 페이징(Paging)이란? 기존 Segmentation과 Contiguous al itstory1592.tistory.com 페이징(Paging)은 외부 단편화를 해결하고 메모리를 효율적으로 사용할 수 있는 ..
[운영체제] 비연속할당(Noncontiguous allocation) - 페이징(Paging)
목차 🤔 페이징(Paging)이란? 🙉 페이지 테이블(Page table)과 주소 변환 🙈 페이징의 문제점 내부 단편화(Internal fragmentation) 페이지 테이블의 크기 🤔 페이징(Paging)이란? 기존 Segmentation과 Contiguous allocation의 경우, 남은 메모리 총량이 충분해도 작은 Hole들을 활용하지 못하는 외부 단편화 문제가 있었습니다. 특히, First-fit의 경우 50% rule에 의해 메모리의 1/3이 낭비되는 문제가 발생하기도 하였습니다. 이러한 문제들의 공통적인 특징은 가변 분할이었습니다. 프로세스마다, 세그먼트마다 크기가 각기 다르다보니 메모리에는 각기 다른 Hole들이 발생하였고, 이러한 Hole들은 대부분 낭비된다는 문제였습니다. 그래서 등..
[운영체제] 비연속할당(Noncontiguous allocation) - 세그먼테이션(Segmentation)
목차 🤔 비연속할당(Noncontiguous allocation)이란? 🧩 세그먼테이션(Segmentation)이란? 🙉 세그먼트 테이블(Segment table) 🙊 세그먼테이션(Segmentation) 주소 변환 🙈 Segmentation의 문제점 🤔 비연속 할당(Noncontiguous allocation)이란? 기존에는 연속 할당(contiguous allocation) 기법을 사용하여 프로세스를 통째로 메모리에 적재하였습니다. 연속 할당 기법은 base address에 상대 주소인 logical address를 더해줌으로써 물리 주소를 간단하게 translation 할 수 있다는 장점이 있었습니다. 따라서 MMU를 단순화할 수 있었지만, 외부 단편화가 발생하여 메모리 공간을 효율적으로 사용하지 ..
[운영체제] Contiguous Allocation의 문제점 - External Fragmentation(외부단편화)
목차 💥 Contiguous allocation의 문제점 🤔 External Fragmentation이란? 👀 Compaction(압축)을 활용한 외부 단편화 해결 💥 Contiguous allocation의 문제점 이전 포스팅에서 Contiguous allocation은 프로세스를 메모리에 분할해서 적재하지 않고 한 번에 통째로 적재하는 방법론이라고 설명했습니다. Contiguous allocation은 CPU의 MMU(Memory Management Unit)가 논리 주소를 물리 주소로 translation 함에 있어 단순함을 제공해준다는 장점이 있었습니다. 그러나, 단지 단순함때문에 값비싼 HW자원 중 하나인 Memory를 낭비하는 문제가 발생했습니다. 🤔 External Fragmentation이..
[운영체제] Contiguous Allocation과 MMU(Memory Management Unit)
목차 🤔 MMU(Memory Management Unit)란? 💙 연속 할당(Contiguous allocation) 💜 Memory protection fault 🤔 MMU(Memory Management Unit)란? MMU(Memory Management Unit)는 CPU 내부에 탑재되어 논리 주소(Logical Address)를 실제 메모리의 물리 주소(Physical Address)로 변환해주는 하드웨어입니다. 이전 포스팅에 공부했듯이, Execution time binding은 실제로 명령어를 실행하는 시점에 주소 변환을 하는 Address binding 기법입니다. 위 그림에서는 0x198000번지에 저장되어 있는 data에 10을 저장하기 위해 store #98000, 10 명령어를 사용..
[운영체제] Address Binding - Compile, Load, Execution time binding
목차 🤔 Address binding이란? 🧡 Compile time binding 💛 Load time binding 💚 Execution time binding 🤔 Address binding이란? 우리가 프로그램을 실행시키면 프로세스가 되어 Main Memory라고 불리는 RAM에 올라갑니다. 이때 메모리 주소는 우리가 프로그래밍을 할 때 사용하던 주소 그대로일 수도 있고, 그렇지 않을 수도 있습니다. 그 이유는 CPU가 만들어내는 가상의 주소인 Logical address(논리 주소)와 실제 메모리 상의 특정 번지를 나타내는 Physical address(물리 주소)를 어떻게 관련지을 것인지에 대한 다양한 방법이 있기 때문입니다. 즉, 프로세스를 메모리에 할당시킬 때, 물리 주소를 언제(When)..
[운영체제] 식사하는 철학자들 문제 (Dining philosophers problem) - Deadlock, Starvation
목차 🤔 식사하는 철학자들 문제(Dining philosophers problem)란? 💡 문제 해결 방법 🤔 식사하는 철학자들 문제(Dining philosophers problem)란? 식사하는 철학자들 문제(Dining philosopher problem)는 Deadlock과 Starvation을 비유하여 설명하는 좋은 예제입니다. 5명의 철학자가 원탁에 앉아서 식사를 합니다. 애처롭게도, 철학자 사이사이에 젓가락은 하나씩만 주어집니다. 그렇기 때문에 아래와 같은 과정을 통해 식사를 해야 합니다. 1. 철학자들은 일정 시간 동안 생각을 한다. 2. 왼쪽 젓가락이 사용 가능할 때까지 기다린다. 만약 사용 가능하다면 집어든다. 3. 오른쪽 젓가락이 사용 가능할 때까지 기다린다. 만약 사용 가능하다면 집..
[운영체제] CPU 스케쥴러 (Short-Term, Long-Term, Midium-Term 스케쥴러)
목차 🤔 CPU 스케쥴러(Scheduler)란? 🖥 스케쥴러의 종류 🕛 단기 스케쥴러 (Short-Term Scheduler) 🕑 장기 스케쥴러 (Long-Term Scheduler) 🕗 중기 스케쥴러 (Midium-Term Scheduler) ⭐ 최신 OS의 스케쥴러 🤔 CPU 스케쥴러(Scheduler)란? CPU는 한 번에 하나의 프로세스만 실행할 수 있습니다. 멀티 프로세서라는 개념이 도입되기도 하였지만, 우리가 실행하고자 하는 프로그램의 개수에 비하면 턱없이 부족한 숫자입니다. 그렇기 때문에 운영체제는 Time Sharing을 통해 하나의 CPU에 대해 여러 프로세스를 비동기적(Concurrent)으로 실행시킵니다. 또한, CPU를 어떻게 하면 가장 효율적으로 사용할 수 있을지 매 순간 고민합니..