운영체제는 저장 장치(디스크)를 관리하기 위해 두 가지 핵심 추상화 개념을 제공한다. 바로 파일(File)과 디렉터리(Directory)다. 이들은 사용자가 데이터를 쉽게 저장하고, 이름을 붙이고, 정리할 수 있게 해준다.1. 파일 (Files)1.1. 파일의 개념정의: 파일은 단순히 바이트들의 선형 배열(Linear array of bytes)이다.특징: 운영체제는 파일의 내용(텍스트인지, 이미지인지 등)을 알지 못하며, 단지 데이터를 영구적으로 저장하고 요청 시 돌려주는 역할만 수행한다.저수준 이름 (Low-level Name): 각 파일은 아이노드 번호(inode number)라는 고유한 번호를 가진다. 사용자는 보통 파일 이름(예: foo.txt)을 사용하지만, OS 내부적으로는 이 번호를 통해 ..
운영체제의 세 번째 핵심 주제인 영속성(Persistence)은 시스템 전원이 꺼지거나 충돌이 발생해도 데이터가 영구적으로 보존되도록 보장하는 개념이다. 이 영속성은 하드웨어(I/O 장치, 디스크)와 소프트웨어(파일 시스템, 디렉터리)의 유기적인 상호작용으로 완성된다.1. 시스템 아키텍처 (System Architecture)I/O 장치를 이해하려면 먼저 이들이 시스템 전체에서 어디에 위치하는지 봐야 한다. 컴퓨터 시스템은 성능 비용에 따라 계층적인 버스(Bus) 구조를 가진다.1.1. 계층적 버스 구조왜 계층적인 구조가 필요할까? 이는 물리학적 제약과 비용 때문이다.버스는 고속일수록 길이가 짧아져야 한다. (신호 무결성 문제)고속 버스는 제작 비용이 비싸기 때문에 모든 장치를 고속 버스에 연결할 수 없..
앞선 학습에서 락(Lock), 컨디션 변수(Condition Variable), 세마포어(Semaphore) 같은 도구를 배웠다. 하지만 도구를 안다고 해서 결함 없는 프로그램을 짤 수 있는 것은 아니다. 이번 포스팅에서는 실제 상용 소프트웨어에서 빈번하게 발생하는 동시성 버그의 유형과, 쓰레드(Thread)의 대안으로 제시된 이벤트(Event) 기반 동시성 모델이 가진 현실적인 어려움에 대해 OSTEP 책 내용을 바탕으로 깊이 있게 파고든다.1. 흔한 동시성 문제들 (Common Concurrency Problems)Lu 등의 연구진이 MySQL, Apache, Mozilla, OpenOffice와 같은 대형 오픈소스 소프트웨어의 버그를 분석한 결과, 동시성 버그는 크게 비교착 상태(Non-Deadlo..
운영체제에서 쓰레드를 다룰 때 우리가 해결해야 할 문제는 크게 두 가지다.상호 배제(Mutual Exclusion): 한 번에 하나의 쓰레드만 임계 영역(Critical Section)에 들어가게 하는 것. (주로 Lock으로 해결)순서 정렬(Ordering): 쓰레드 A가 작업을 마친 후에 쓰레드 B가 실행되어야 하는 것처럼, 작업의 순서를 조율하는 것.Lock만으로는 두 번째 문제인 '순서 정렬'을 효율적으로 해결하기 어렵다. 부모 쓰레드가 자식 쓰레드가 끝날 때까지 기다려야 하는 경우를 생각해보자. 공유 변수를 계속 확인하며 무한 루프를 도는 방식(Spinning)은 CPU 자원을 심각하게 낭비한다. 이때 필요한 것이 컨디션 변수와 세마포어다.1. 컨디션 변수 (Condition Variables)..
락 기반의 병행 자료 구조병행 자료 구조(Concurrent Data Structures)란 다수의 스레드가 동시에 접근할 수 있는 자료 구조를 말한다. 이러한 자료 구조는 병행성(Concurrency) 문제를 해결하기 위해 락(Lock)을 사용하여 데이터의 일관성(Consistency)을 유지한다. 락 기반의 병행 자료 구조는 스레드 간의 데이터 접근 충돌을 방지하고, 데이터의 정확성을 보장하는 데 매우 중요한 역할을 한다.병행성이란 여러 작업이 동시에 진행되는 것을 말하며, 멀티스레드 환경에서 흔히 발생한다. 이때 공유 자원에 대한 접근을 적절히 제어하지 않으면 데이터 불일치, 데이터 손상 등의 문제가 발생할 수 있다. 락은 이러한 문제를 해결하기 위해 사용되는 동기화 메커니즘으로, 한 번에 하나의 ..
락(Lock)은 코드의 특정 영역을 감싸서 한 순간에 오로지 한 스레드만 이 영역에 접근할 수 있도록 해주는 동기화 메커니즘이다. 즉, 락은 여러 스레드가 공유 자원에 동시에 접근하는 것을 제어하여 상호 배제(Mutual Exclusion)를 보장한다. 이 락이 없으면 멀티 스레드 프로그램에서 경쟁 조건(Race Condition)이 발생하여 예상치 못한 결과를 초래할 수 있다.락의 기본 개념예를 들어, 다음과 같은 공유 자원에 대한 연산이 있다고 가정해본다.balance = balance + 1;이 코드를 임계 영역(Critical Section)이라고 하며, 락을 사용하여 다음과 같이 보호할 수 있다.lock_t mutex; // 전역 변수로 선언된 락...lock(&mutex);balance = b..