운영체제(OS, Operating System)는 컴퓨터 하드웨어와 소프트웨어 간의 중재자 역할을 하는 시스템 소프트웨어이다. 사용자가 컴퓨터를 쉽게 사용할 수 있도록 하드웨어 자원을 관리하고, 다양한 애플리케이션이 효율적으로 동작할 수 있도록 지원한다. 운영체제는 기본적으로 프로세스 관리, 메모리 관리, 파일 시스템 관리, 입출력 장치 관리, 보안 및 접근 제어와 같은 기능을 수행한다.
1. 프로세스와 스레드
프로세스 (Process)
프로세스는 실행 중인 프로그램의 인스턴스이다. 프로그램이 실행되면, 운영체제는 프로그램을 메모리에 로드하고, 이를 프로세스로 관리한다. 프로세스는 **프로세스 제어 블록(PCB)**라는 구조체에 의해 관리되며, 이는 프로세스의 상태, 프로세스 ID, 레지스터 상태, 메모리 관리 정보 등을 포함한다.
- 프로세스의 상태: 프로세스는 생성(Create), 준비(Ready), 실행(Running), 대기(Waiting), 종료(Terminated) 등의 상태를 가진다. 예를 들어, CPU에서 실행되고 있는 프로세스는 실행 상태에 있고, CPU가 할당되기를 기다리는 프로세스는 준비 상태에 있다.
- 프로세스 주소 공간: 각 프로세스는 자신만의 독립적인 주소 공간을 가지고 있으며, 이를 통해 메모리 보호와 안정성이 보장된다. 주소 공간은 코드, 데이터, 힙, 스택으로 나뉜다.
스레드 (Thread)
스레드는 프로세스 내에서 실행되는 흐름의 단위이다. 하나의 프로세스 내에 여러 스레드가 존재할 수 있으며, 이들은 메모리 공간을 공유하지만 독립적으로 실행된다.
- 멀티스레딩: 하나의 프로세스에서 여러 스레드를 실행함으로써, 작업을 병렬로 처리하거나 응답성을 높일 수 있다. 예를 들어, 웹 브라우저는 사용자 입력을 처리하는 스레드, 웹 페이지를 렌더링하는 스레드, 네트워크 통신을 처리하는 스레드 등을 동시에 실행할 수 있다.
- 스레드의 공유 자원: 스레드는 프로세스의 코드, 데이터, 힙을 공유하지만, 각 스레드는 자신만의 레지스터와 스택을 가지고 있다. 이를 통해 스레드 간의 독립성이 보장된다.
2. 콘텍스트 스위칭 (Context Switching)
콘텍스트 스위칭은 CPU가 현재 실행 중인 프로세스 또는 스레드의 상태를 저장하고, 다른 프로세스 또는 스레드로 전환하는 과정이다. 운영체제는 다중 프로세스 환경에서 CPU 시간을 효율적으로 사용하기 위해 콘텍스트 스위칭을 수행한다.
- 콘텍스트: 프로세스나 스레드의 콘텍스트는 해당 프로세스의 현재 상태를 나타내는 정보이다. 여기에는 CPU 레지스터 값, 프로그램 카운터, 메모리 관리 정보 등이 포함된다.
- 콘텍스트 스위칭 과정:
- 현재 실행 중인 프로세스의 상태를 PCB에 저장한다.
- 다음 실행할 프로세스를 선택하고, 해당 프로세스의 상태를 PCB에서 복원한다.
- CPU는 복원된 상태에서 해당 프로세스의 실행을 재개한다.
- 오버헤드: 콘텍스트 스위칭은 CPU 시간을 소모하기 때문에 일정한 오버헤드가 발생한다. 스위칭이 잦아질수록 시스템 성능에 부정적인 영향을 미칠 수 있다.
3. 공유 자원과 동기화 문제
공유 자원 (Shared Resources)
공유 자원은 여러 프로세스나 스레드가 동시에 접근할 수 있는 자원을 의미한다. 대표적인 예로 메모리, 파일, 프린터, 데이터베이스 등이 있다. 여러 프로세스가 동시에 공유 자원에 접근할 때, 자원에 대한 무결성과 일관성을 유지하는 것이 중요하다.
동기화 문제 (Synchronization Issues)
동기화 문제는 여러 프로세스나 스레드가 공유 자원에 동시에 접근할 때 발생하는 문제이다. 동기화 문제의 대표적인 예로 경쟁 상태(Race Condition), 데드락(Deadlock), 기아 상태(Starvation) 등이 있다.
- 경쟁 상태 (Race Condition): 두 개 이상의 프로세스가 공유 자원에 동시에 접근하여 결과가 비결정적이거나 잘못된 상태가 되는 상황을 말한다. 예를 들어, 두 개의 스레드가 동일한 변수에 동시에 값을 쓰는 경우, 어떤 값이 최종적으로 저장될지 예측할 수 없다.
- 데드락 (Deadlock): 두 개 이상의 프로세스가 서로 상대방이 점유하고 있는 자원을 기다리며 영원히 대기하는 상태를 말한다. 예를 들어, 프로세스 A가 자원 X를 점유하고 자원 Y를 기다리고 있고, 프로세스 B가 자원 Y를 점유하고 자원 X를 기다리는 상황이 발생하면 데드락이 발생한다.
- 기아 상태 (Starvation): 특정 프로세스가 다른 프로세스에 의해 자원을 얻지 못하고 계속 대기하는 상태를 말한다. 우선순위가 낮은 프로세스가 계속해서 자원을 할당받지 못하는 경우 발생할 수 있다.
동기화 기법
동기화 문제를 해결하기 위해 운영체제와 프로그래머는 여러 동기화 기법을 사용한다.
- 뮤텍스(Mutex): 상호 배제를 통해 하나의 프로세스나 스레드만이 자원에 접근할 수 있도록 하는 메커니즘이다. 자원에 접근하기 전에 뮤텍스를 잠그고, 사용이 끝나면 뮤텍스를 해제한다.
- 세마포어(Semaphore): 제한된 개수의 자원을 관리하는 동기화 도구이다. 뮤텍스와 달리 여러 프로세스가 동시에 자원을 사용할 수 있게 관리할 수 있다. 세마포어는 카운팅 세마포어와 이진 세마포어로 나뉜다.
- 모니터(Monitor): 프로그래밍 언어 차원에서 제공하는 동기화 도구로, 자원에 대한 접근을 자동으로 동기화한다. 자바의 synchronized 블록이 모니터의 예이다.
4. 프로세스 간 통신 (IPC, Inter-Process Communication)
프로세스 간 통신은 서로 다른 프로세스가 데이터를 주고받을 수 있게 해주는 메커니즘이다. IPC는 프로세스들이 협력하여 작업을 수행할 수 있도록 도와준다.
- 파이프 (Pipe): 한 프로세스의 출력이 다른 프로세스의 입력으로 전달되도록 하는 통신 메커니즘이다. 단방향 또는 양방향으로 데이터를 주고받을 수 있다.
- 메시지 큐 (Message Queue): 프로세스 간에 메시지를 주고받기 위한 큐를 제공하는 방식이다. 큐에 메시지를 삽입하고, 다른 프로세스가 이를 꺼내어 처리할 수 있다.
- 공유 메모리 (Shared Memory): 여러 프로세스가 메모리 공간을 공유하여 데이터를 주고받는 방식이다. 이 방법은 매우 빠르지만 동기화 문제를 잘 처리해야 한다.
- 소켓 (Socket): 네트워크를 통해 프로세스 간 통신을 가능하게 하는 방식으로, 원격 프로세스 간의 통신에도 사용된다.
운영체제는 컴퓨터 시스템에서 중요한 역할을 담당하며, 프로세스와 스레드 관리, 자원 관리, 동기화 문제 해결, 프로세스 간 통신 등을 통해 시스템의 안정성과 효율성을 보장한다. 프로세스와 스레드의 개념을 이해하고, 콘텍스트 스위칭과 동기화 문제에 대한 이해는 시스템 프로그래밍이나 멀티스레딩 애플리케이션을 작성하는 데 필수적이다.
'Backend study > Backend theory' 카테고리의 다른 글
클라우드 컴퓨팅 (6) | 2024.09.02 |
---|---|
API (Application Programming Interface) (1) | 2024.09.02 |
데이터베이스 (1) | 2024.09.01 |
네트워크 (3) | 2024.08.31 |
웹 개발의 구조 (0) | 2024.08.31 |