전체 글 30

[CS][Study] Monitor & Conditional Variable

조건변수란? 동기화 메커니즘 중 세마포어와 뮤텍스, 락은 익숙한데 여기서 약간 더 심화한다면 나올 수 있는 게 조건변수다. 생성자-소비자 문제와 관련해 사용될 수 있다. 1. Monitor 동시성 프로그래밍에서, 모니터는 스레드가 공유 객제의 상태에 동시적으로 접근하는 것을 막고 해당 상태가 변경되어 조건이 충족될 때까지 대기할 수 있도록 하는 동기화 구조이다. 즉, 접근 가능한 스레드의 수를 제한하는 세마포어나 일반 뮤텍스와 다르게, 모니터는 특정 조건의 충족을 기준으로 공유 자원에 대한 독점적인 액세스를 제공한다. (한 번에 하나의 스레드만 접근할 수 있다.) 일반적으로 락과 하나 이상의 조건 변수로 구성된다. 2. Conditional Variable 조건 변수는 해당 조건의 충족을 대기하고 있는 ..

DevLog 📨 2024.01.11

[SWJungle] 나만의 무기 만들기 개인 회고

무엇을 했나요? 투두리스트와 펫 육성 게임이 혼합된 어플리케이션을 만들었다. 투두를 달성하면서 모은 게임머니와 경험치로 펫을 진화시키거나 아이템을 구매하여 마이룸을 꾸밀 수 있다. 또, 인증샷을 올려서 할일을 확인받고 친구의 룸에 놀러가거나 방명록을 남기는 소셜 기능도 있다. 앱 개발을 위해 크로스플랫폼 개발 프레임위크인 Flutter를 사용했다. 서버는 NestJS, DB는 PostgreSQL 사용했고 ORM은 TypeORM을 썼다. 이외로는 Socket IO, Docker, EC2 가 아키텍처에 포함되었다. 나만무 이전 주특기 기간에 Spring을 했기 때문에 초반에는 하나의 기능에 대해 백, 프론트 모두 코드를 작성했지만 후반부로 갈수록 프론트에만 집중했던 것 같다. Kakao OAuth 기반 로그..

SWJungle 👊 2023.12.17

[DB] Postgresql@14 error 256

M1 MacOS 환경 homebrew로 설치 맥에 postgresql 설치하고 psql -d postgres 로 접속하는데 오류가 났다. psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory Is the server running locally and accepting connections on that socket? brew services list 로 확인해보니 postgresql@14 error 256 에러가 뜬 것을 확인했다. 에러코드만으로 검색해보니 /opt/homebrew/var/postgresql@14/postmaster.pid를 삭제하고 재실행하면 정상으로 돌아간다는 ..

[DevLog][PintOS] 3주간의 핀토스 회고

진심 너무 힘들었다. 그래도 초반엔 재밌었는데 😇 3주간의 핀토스에서 무엇을 느끼고 배웠는지 남겨두지 않으면 나중에 '아.. 핀토스 하긴 했는데..'가 되지 않을까 싶어 정리해둔다. '프로세스는 컴퓨터를 추상화한다' 라는 관점을 얻었다. 그 전까지는 프로세스, 가상메모리, 자원.. 과 같은 용어들이 막연하게만 다가왔는데, 하나의 컴퓨터를 추상화한 개념으로서 프로세스를 이해하게 된 것 같다. 자원 resource 을 공유하고, 획득하고, 반환하는 것의 구체적인 예시를 접해볼 수 있었다. 추상화이므로, 실제 물리적 자원 (ex. CPU 점유) 을 공유하면서도 마치 혼자만 쓰는 것처럼 제공해야 한다. 이런 점에서 동기화와 관련된 문제들이 중요해지는 것 같다. Policy와 Mech..

DevLog 📨 2023.10.24

[DevLog][PintOS] PRJ3 Virtual Memory/Memory Mapped Files to Copy-on-write

04) Memory Mapped Files 시스템 콜 mmap과 munmap을 구현한다. 현재까지는 모든 페이지가 anonymous, 즉 스택 페이지였지만 mmap을 통해 파일과 매핑된 페이지는 file-backed page가 된다. 따라서 매핑이 해제될 때 변경사항을 파일에 다시 기록해주어야 한다. 디스크에 파일을 쓰는 작업은 RAM대비 속도가 매우 느리기 때문에, 변경사항이 있는 페이지만 디스크에 기록해줄 수 있도록 한다. 페이지가 변경될 경우, mmu는 알아서 pml4 테이블에 dirty bit를 세팅해준다. /* Write back a single page to file. Called when unmap. */ static bool file_write_back(struct page *page, s..

DevLog 📨 2023.10.24

[DevLog][PintOS] PRJ3 Virtual Memory/Memory Management to Stack Growth

Project3: Virtual Memory 01) Memory management struct page 요구 페이징 (Demand Paging)을 구현하고, 스왑 인/아웃을 관리하기 위한 페이지 구조체가 다음과 같이 선언되어 있다. va는 페이지의 시작 주소, 즉 유저 프로세스의 가상주소이다. frame은 페이지와 매핑된 물리 메모리 정보를 가지고 있는 구조체로, 매핑 전까지는 NULL로 유지된다. struct page { const struct page_operations *operations; void *va; /* Address in terms of user space */ struct frame *frame; /* Back reference for frame */ union { struct un..

DevLog 📨 2023.10.17

[DevLog][PintOS] PRJ2 User Program/Out of Memory Test

Memory Leak in C 핀토스의 Project2에는 OOM 테스트가 있는데, 할당 가능한 자원을 모두 소진할 때까지 프로세스를 fork하는 무시무시한 테스트이다. 프로세스를 생성하고 종료시키는 과정을 10회 반복하므로서 fork 가능한 프로세스의 수가 매번 같은지, 즉 종료 과정에서 메모리 누수가 발생하지 않는지 체크한다. 운영체제와 시스템 콜의 요구사항에 대해 알고, 구현하면 pass되었던 테스트와는 달리, 이 테스트는 실제로 코드가 안전하게 (누수 없이) 짜여져 있는지를 확인하기 때문에 무엇보다도 논리적으로.. 코드를 잘 짜는 역량이 중요했던 것 같다. 1) 메모리 할당 함수를 쓰면, 잘 해제해 주자. tid_t thread_create(...) { struct thread_child *chi..

DevLog 📨 2023.10.10

[DevLog][PintOS] PRJ1 Threads/PintOS 스레드는 어떻게 돌아갈까?

Pintos Project 1: Threads thread_init을 하면 main thread(initial_thread)가 만들어지고 실행된다. 스케줄링을 위해 thread_start를 실행하면, idle_thread를 만들고 돌린다. idle_thread는 인터럽트를 비활성화하고 자기 자신을 블락한 다음, sti; hlt; 명령어를 실행하여 인터럽트를 활성화하고, 인터럽트가 발생할 때까지 CPU를 대기 상태로 전환하는 일을 반복한다. create_thread는 스레드 이름, 우선순위를 인자로 받아 스레드를 초기화(init_thread)하고, 스레드 내부 intr_frame 구조체에 인자로 받은 실행 함수 (thread_func type)와 그 인자를 저장한 후 thread_unblock을 통해 st..

DevLog 📨 2023.10.03

[DevLog][PintOS] PRJ1 Threads/Scheduling Algorithms

Scheduling 여러 프로세스를 하나의 (또는 몇 개의) CPU가 처리해야 한다. 어떤 순서로 처리할까? 들어온 순서대로 처리할 수 있다. 처리가 빨리 되는 순서로 처리할 수도 있다. 아니면 다른 우선순위에 따라 처리할 수도 있다. 1. 스케줄링의 평가 반환 시간: 프로세스의 종료시간 - 프로세스의 도달 시간 응답 시간: 프로세스의 시작시간 - 프로세스의 도달 시간 일련의 작업들이 처리될 때, 평균적인 반환시간과 응답시간이 적을수록 좋은 스케줄링이 되겠다. 성능: n개의 작업을 얼마나 빨리 처리하느냐 공정성: 각각의 작업을 얼마나 균등하게 처리하느냐 예를 들어 만약 작업시간이 빠른 순으로 스케줄링한다면, 오래 걸리는 작업의 경우 그저 대기해야 하는 경우가 있을 수 있다. 이는 각 작업을 공정하게 처리..

DevLog 📨 2023.10.03

[DevLog][PintOS] PRJ1 Threads/Priority Scheduling

우선순위 스케줄링 Assignment Overview 우선순위를 고려해 스레드를 스케줄링해라. 크게 두 가지 step이 있다. 첫 번째는 단순히 준비 큐를 정렬하고, 즉시 CPU를 양도하면 해결된다. 두 번째는 동기화 (synchronization)와 관련된 문제로, 여러 가지 동기화 메커니즘에서도 우선순위대로 스레드가 실행될 수 있게 처리해주면 된다. 이를 위한 방법이 우선순위 기증 (priority donation)이다. 문제 1: 주어진 우선순위대로 스레드가 실행되도록 만들어라 스레드는 준비 큐에서 우선순위 순서대로 나와야 한다. 현재 스레드보다 우선순위가 높은 스레드가 준비 큐에 들어오면, 즉시 CPU를 양보해야 한다. 현재 스레드의 우선순위가 변경되면, 준비 큐의 스레드와 우선순위를 비교해서 적..

DevLog 📨 2023.09.27