Windows(윈도우)는 Microsoft가 개발하는 운영체제 제품군이다. 이 문서는 오늘날의 Windows NT 계열을 중심으로 응용 프로그램 실행, 사용자 모드와 커널 모드, 파일 경로 및 개발 도구의 관계를 설명한다. 개별 버전의 설치 요구 사항이나 지원 종료일은 버전별 공식 문서에서 확인해야 한다. Windows는 하드웨어 자원을 관리하고 응용 프로그램이 실행될 기반을 제공한다. 파일 탐색기는 파일을 다루는 그래픽 인터
WSL(Windows Subsystem for Linux)은 Windows에서 Linux 배포판과 명령줄 도구를 실행할 수 있도록 제공되는 기능이다. Windows의 개발 도구와 Linux의 실행 환경을 함께 사용하는 데 쓰인다. WSL 자체의 버전, 각 배포판의 WSL 1·WSL 2 실행 방식, 배포판 버전은 서로 다른 정보다. WSL 2는 가상화 기술을 이용해 관리되는 경량 가상 머신 안에서 Linux 커널을 실행한다. 사
운영체제(operating system, OS)는 CPU·메모리·저장 장치 같은 자원을 관리하고 응용 프로그램이 실행될 환경을 제공하는 시스템 소프트웨어이다. 프로그램은 하드웨어를 매번 직접 제어하는 대신 운영체제가 제공하는 프로세스, 주소 공간, 파일과 같은 추상화를 이용한다. 문서 편집기와 음악 재생기가 동시에 실행된다고 가정하자. 두 프로그램이 CPU와 메모리, 파일 장치를 아무 규칙 없이 독점하면 다른 작업을 진행하기
macOS는 Apple의 Mac 컴퓨터용 운영체제이다. Finder와 Dock 같은 그래픽 환경, 응용 프로그램 프레임워크, Unix 계열의 명령줄 환경을 함께 제공한다. Mac은 컴퓨터 제품군의 이름이고 macOS는 운영체제의 이름이므로, 두 용어를 문서와 문제 보고에서 구별하는 것이 정확하다. macOS의 기반에는 Darwin 계열 구성 요소가 있으며 커널은 Mach·BSD 계통의 기술과 Apple의 구성 요소를 결합한다.
Linux(리눅스)는 좁게는 운영체제의 핵심인 커널을, 넓게는 이 커널을 사용하는 운영체제 계열을 가리킨다. 커널은 CPU 실행 시간, 메모리, 장치와 네트워크를 관리한다. 사용자가 설치하는 Ubuntu·Debian 같은 배포판은 여기에 명령줄 도구, 라이브러리, 패키지 관리 체계와 응용 프로그램을 결합한 시스템이다. Linux 커널과 배포판은 같은 범위의 이름이 아니다. 커널 버전이 같아도 배포판이 제공하는 패키지 버전과 기
문맥 교환은 현재 실행 흐름의 상태를 저장하고 다른 흐름의 상태를 복구하여 CPU 실행 대상을 바꾸는 과정이다. 운영체제는 레지스터와 실행 위치 등 재개에 필요한 정보를 관리한다. 타이머나 대기 사건 등의 계기로 실행 제어권을 얻고 스케줄링 정책에 따라 전환할 수 있다. 한 프로세스가 입출력을 기다리면 그 상태를 보관하고 준비된 다른 프로세스를 실행한다. 나중에 원래 프로세스는 중단 지점의 상태로 돌아온다. 모든 커널 진입이
세마포어는 카운터와 대기·신호 연산으로 자원 사용이나 실행 순서를 조절하는 동기화 수단이다. 허용 가능한 자원 수를 카운터로 나타내고 획득 시 감소, 반환 시 증가시키는 식으로 사용한다. 초기값과 연산 순서에 따라 의미가 달라진다. 동시에 세 개의 작업만 특정 자원을 사용하게 하려면 초기 허용 수를 3으로 설정하고 작업 종료 시 허용을 돌려줄 수 있다. 카운터를 잘못 반환하면 제한이 깨지거나 영원히 기다릴 수 있다. 뮤텍스의
조건 변수는 공유 상태가 원하는 조건을 만족할 때까지 실행 흐름이 기다리도록 돕는 동기화 수단이다. 보통 뮤텍스와 함께 사용한다. 대기 연산은 잠금을 놓고 기다린 뒤 다시 획득하며, 깨어난 흐름은 공유 상태의 조건을 재검사한다. 생산자·소비자 큐에서 소비자는 큐가 비어 있으면 기다리고 생산자가 항목을 넣으면 알림을 보낼 수 있다. 알림 자체를 데이터나 영구 저장된 사건으로 취급하지 않는다. 깨어났어도 조건이 다시 바뀌었을 수
뮤텍스는 공유 자원의 임계 구역에 한 번에 하나의 실행 흐름만 들어가도록 하는 상호 배제 동기화 수단이다. 잠금을 획득한 흐름이 보호된 작업을 수행하고 끝나면 해제한다. 공유 상태에 접근하는 모든 관련 경로가 같은 보호 규칙을 따라야 한다. 공유 카운터를 읽고 증가시켜 저장하는 여러 단계의 연산을 잠금으로 보호하면 동시 갱신의 유실을 막는 데 도움이 된다. 한 경로라도 잠금 없이 접근하면 보호가 깨질 수 있다. 예외나 조기 반
스레드는 프로세스 안에서 독립적인 실행 흐름을 표현하는 단위이다. 여러 스레드가 주소 공간을 공유하면서 각각 실행 상태를 가진다. 각 스레드는 프로그램 카운터와 레지스터, 스택 등의 상태를 유지한다. 공유 데이터에 동시에 접근할 수 있어 작업 분담과 함께 동기화 문제가 발생한다. 서버가 여러 요청을 처리하거나 계산 작업을 여러 코어에 나누는 데 활용할 수 있다. 공유 캐시를 이용해 스레드 사이에 자료를 전달할 수도 있다. 스레
TLB는 가상 주소를 물리 주소로 변환하는 정보를 빠르게 재사용하기 위한 하드웨어 캐시이다. 자주 사용하는 페이지 변환을 보관해 매 접근마다 페이지 테이블을 탐색하는 비용을 줄인다. 찾는 변환이 없으면 구현에 맞는 추가 처리가 필요하다. 같은 메모리 영역을 반복해서 읽는 프로그램은 변환 정보를 재사용할 수 있다. 반대로 많은 페이지를 넓게 건드리면 TLB 부담이 커질 수 있다. TLB miss와 page fault는 같은 사건
페이징은 가상 주소 공간과 물리 메모리를 고정 크기 단위로 나누어 대응시키는 메모리 관리 방식이다. 가상 페이지를 물리 프레임에 연결하고 페이지 테이블에 대응과 상태를 기록한다. 주소의 페이지 번호와 내부 오프셋을 나누어 변환한다. 프로세스의 연속된 가상 페이지가 물리적으로 서로 떨어진 프레임에 놓여도 프로그램은 연속된 주소로 접근할 수 있다. 고정 단위 관리가 모든 낭비를 없애지는 않는다. 내부 단편화와 페이지 테이블 공간,
가상 메모리는 프로그램이 사용하는 주소 공간을 실제 물리 메모리와 분리해 제공하는 추상화이다. 운영체제와 하드웨어가 주소 변환과 보호를 수행한다. 프로세스는 자신의 코드·힙·스택을 포함한 주소 공간을 사용하며 실제 배치는 별도로 관리된다. 서로 다른 프로세스에서 같은 숫자의 주소를 사용해도 각자의 물리 위치로 연결될 수 있다. 이를 통해 독립적인 프로그램 실행을 지원한다. 가상 주소 공간의 크기와 현재 확보된 물리 메모리 양은
CPU 스케줄링은 실행 가능한 작업 중 어느 작업에 언제 CPU를 배정할지 정하는 운영체제 정책이다. 처리량, 반환 시간, 응답 시간, 공정성 같은 목표가 서로 영향을 준다. 선점 여부와 시간 할당량 등에 따라 작업이 실행되는 순서가 달라진다. 긴 계산 작업과 대화형 작업이 함께 있을 때 짧은 시간 단위로 실행 기회를 나누면 대화형 응답을 개선할 수 있다. 모든 지표를 동시에 최적화하는 단일 정책은 없다. 작업 길이를 미리 안
프로세스는 실행 중인 프로그램을 운영체제가 관리하는 단위이다. 코드 파일 자체와 그 코드를 실행하는 상태를 구별한다. 주소 공간과 레지스터, 열린 자원 등의 실행 상태를 관리한다. 운영체제는 여러 프로세스에 실행 기회를 배분하고 준비·실행·대기 상태 등을 추적한다. 같은 프로그램을 두 번 실행하면 서로 다른 실행 상태를 가진 프로세스가 생길 수 있다. 한쪽이 입출력을 기다리는 동안 다른 쪽을 실행할 수 있다. 프로세스 분리가