프로젝트/OS-Simulator

OS-Simulator: 운영 체제 시뮬레이터 기획 (1)

Sfer7 2025. 4. 9. 16:35
1. 계기

 

Spring을 사용하면서도, Spring 내부 기능을 많이 사용해볼 수 있는 프로젝트에 대해 고민을 하게 되었어요
비교적 기능 구현 위주이며, 별도의 DevOps 인프라 관리를 하지 않아도 되는 프로젝트

그러면서도 도전적인 과제가 나올 법한 프로젝트가 뭐가 있을까?

이와 같은 고민을 하다 보니, OS-Simulator는 OS에 대한 복기도 할 수 있으며 도전적인 과제가 될 수 있을 것 같았습니다

그래서 이 프로젝트를 시작하게 되었어요 😊

(그리고 학부생 때 가장 좋아했던 과목이 OS이기도 했더래요 😅)

 

2. 설계

 

전체적인 아키텍처는 Monolithic으로 구성하며, 별도의 DB를 두지 않는 Memory 기반의 프로젝트로 기획했어요 👀

목적 자체가 서비스보다는 구현 자체에 있고, Infra 설계에 많은 투자를 하고 싶지 않았어요

그 간의 프로젝트에서 DevOps 작업은 지겹도록 해왔기에 🥲

조금 더 백엔드에 투자하고 싶었답니다

 

저는 다양한 요소들이 복합적으로 작용하는, 실제 OS와 유사한 시뮬레이터를 만들고 싶었어요

때문에 각각의 기능이 별도로 존재하기보다는, 전체가 유기적으로 동작할 수 있는 구조를 만들고자 했습니다

(Scheduler Simulator, Memory Allocating Simulator 등의 작업 단위로 나누지 않도록 했어요)

 

그래도 웹 서버이고, 유저 별 세션 관리는 필요하겠죠 !

그래서 이전에 WebRTC 작업을 했던 때의 경험을 살려 ConcurrentMap을 통한 세션 관리를 하도록 했어요

각 세션 ID는 UUID로 발급되며, 해당 세션 ID에 따라 Kernel을 관리하는 식으로요

굳이 비유하자면, Redis의 Key-Value DB와 유사한 역할을 하게 되겠네요 😀

 

또한 OS의 작업 처리와 최대한 유사하게 구현하기 위해 각각의 Kernel에 Clock을 구성해 뒀습니다

이 Clock의 Tick에 따라 작업 처리를 하게 하도록 말이죠

이때 Clock은 Observer Pattern을 통해 Tick마다 처리할 로직을 추가/삭제 할 수 있도록 구성합니다

 

그리고 이 모든 OS 작업은 SSE(Server-Sent-Event)를 통해 Tick마다 Client에 전송돼요

나중에 기회가 된다면 Client도 붙여 이 부분을 시각화 해 보는 작업을 해도 좋을 것 같아요 😊

 

아직 개발 중인 단계이지만, 이와 같은 방식으로 데이터가 전송돼요 !

 

3. 기능 개발 계획

 

  • Kernel
    : Preemption/Non-Preemption, Clock Interval, Interrupt
  • Process / Thread
    : Scheduling, Context Switching, Starvation, DeadLock, IPC
  • Memory
    : Paging, Page Fault, Thrashing, TLB

이런 느낌으로 개발할 계획입니다 !
추후에 추가될 경우 여기다도 수정해 둘게요 😊

 

다음번엔 실제 개발한 내용들 위주로 글을 작성해볼게요 !

아마 Session, Process, Thread, Clock에 대한 이야기가 될 것 같아요

다음 글에서 만나요 🤗