수업 내용을 정리한 글입니다.
스레드는 프로그램 실행 흐름의 일부로, 하나의 프로세스 내에서 동작하는 작은 실행 단위입니다. 즉, 하나의 프로세스 안에서 여러 개의 스레드가 동시에 실행될 수 있습니다.
스레드를 사용하면 여러 작업을 동시에 처리할 수 있으므로, 시스템의 처리량과 성능을 향상시킬 수 있습니다. 또한, 스레드를 사용하면 병렬적으로 작업을 처리할 수 있기 때문에 다양한 문제를 해결하는 데 유용합니다. 예를 들어, 대규모 데이터 처리, 네트워크 통신, 그래픽 처리 등에서 스레드를 사용하여 처리 속도를 높일 수 있습니다.
스레드는 크게 사용자 수준 스레드와 커널 수준 스레드로 나뉩니다.
사용자 수준 스레드 (User-level Thread, ULT)
사용자 수준 스레드는 프로세스 내부에서 스레드를 관리하는 방식으로, 스레드 관리 라이브러리에서 제공됩니다. 사용자 수준 스레드의 생성, 스케줄링, 동기화 등의 작업은 모두 사용자 수준에서 이루어지기 때문에, 운영체제에서는 스레드를 인식하지 못합니다. 따라서, 사용자 수준 스레드는 운영체제로부터 독립적으로 실행될 수 있지만, I/O 처리 등의 작업이 블로킹될 경우에는 다른 스레드들도 함께 블로킹될 수 있습니다.
커널 수준 스레드 (Kernel-level Thread, KLT)
커널 수준 스레드는 운영체제에서 직접 관리하는 스레드로, 운영체제 내부의 스레드 관리자가 직접 스레드를 관리합니다. 따라서, 커널 수준 스레드는 운영체제가 스레드를 인식하고 스케줄링하는 것이 가능합니다. 또한, 커널 수준 스레드는 다중 프로세서 시스템에서 다중 코어를 활용하여 병렬 처리를 할 수 있는 장점이 있습니다. 하지만, 스레드 생성 및 컨텍스트 스위칭이 더 무거워질 수 있기 때문에, 사용자 수준 스레드에 비해 오버헤드가 크다는 단점이 있습니다.
스레드를 구현하는 방법에는 멀티 프로세스와 멀티 스레드가 있습니다. 멀티 프로세스는 여러 개의 프로세스를 생성하여 각각의 프로세스에서 작업을 처리하는 방식입니다. 각 프로세스는 독립적으로 실행되기 때문에 안정성이 높고, 하나의 프로세스가 문제가 생겨도 다른 프로세스는 정상적으로 동작할 수 있습니다. 하지만, 프로세스 간의 통신이 필요한 경우에는 추가적인 오버헤드가 발생하며, 메모리 공유가 어렵기 때문에 데이터의 복사가 필요합니다.
반면에, 멀티 스레드는 하나의 프로세스 내에서 여러 개의 스레드를 생성하여 각각의 스레드에서 작업을 처리하는 방식입니다. 각 스레드는 동일한 프로세스 내에서 동작하기 때문에, 스레드 간의 통신이 용이하며, 데이터 공유가 쉽습니다. 또한, 스레드 간의 전환 오버헤드가 작기 때문에, 멀티 프로세스보다 빠른 처리 속도를 보장할 수 있습니다. 하지만, 스레드 간의 동기화 문제와 안전성 문제가 발생할 수 있으며, 하나의 스레드에서 문제가 생길 경우 전체 프로세스가 영향을 받을 수 있습니다.
따라서, 멀티 프로세스와 멀티 스레드는 각각의 장단점이 있으며, 상황에 따라 적절한 방법을 선택하여 사용해야 합니다.
프로세스는 실행 중인 프로그램을 의미합니다. 프로그램은 디스크에 저장되어 있지만, 프로세스는 실행을 위해 메모리 상에 올라와 실행 중인 상태를 말합니다. 각 프로세스는 운영체제로부터 할당받은 메모리 공간, CPU 시간, 파일, 네트워크 등의 자원을 사용하며, 독립된 실행 환경을 가지고 있습니다.
프로세스는 프로그램 실행 중에 필요한 데이터, 코드, 스택 등의 정보를 포함하며, 각 프로세스는 고유한 프로세스 ID(Process ID, PID)를 가지고 있습니다. 또한, 프로세스는 각자의 가상 주소 공간을 가지고 있어, 프로세스 간의 메모리 충돌 등의 문제를 방지할 수 있습니다.
프로세스의 생성과 동시에, 각 프로세스는 자신만의 주소 공간과 자원을 할당받습니다. 이 때, 운영체제는 프로세스 간의 자원 공유와 보호를 위해 각각의 프로세스에게 메모리 영역을 할당하며, 이를 매핑(Mapping)합니다. 이러한 매핑 작업을 통해, 운영체제는 각 프로세스 간의 자원 충돌을 방지하고, 각각의 프로세스가 독립적으로 실행되도록 보장합니다.
프로세스는 일반적으로 다음과 같은 상태를 가지고 있습니다.
실행 상태(Running)
: CPU를 할당받아 실행 중인 상태입니다.
준비 상태(Ready)
: CPU를 할당받기 위해 대기 중인 상태입니다.
대기 상태(Blocked)
: I/O 등의 이벤트를 기다리는 상태입니다.
종료 상태(Terminated)
: 실행을 마친 상태입니다.
운영체제는 프로세스 간의 스케줄링을 통해 CPU 자원을 효율적으로 관리하며, 각 프로세스의 우선순위와 상태에 따라 CPU를 할당합니다. 또한, 운영체제는 각 프로세스가 사용한 자원을 해제하고, 다른 프로세스에게 할당하기 위해 프로세스를 종료합니다.
프로세스는 운영체제에서 제공하는 기능으로서, 프로세스의 생성, 실행, 종료 등은 운영체제에서 관리됩니다. 프로세스 관리를 위한 시스템 콜에는 fork()
, exec()
, wait()
등이 있으며, 이를 통해 프로세스를 생성, 실행, 종료할 수 있습니다.
프로세스는 하나의 프로그램을 실행하는 단위일 뿐만 아니라, 운영체제와 상호작용하는데 필요한 기본적인 단위입니다. 여러 프로세스가 동시에 실행되는 멀티태스킹 환경에서는 각각의 프로세스가 CPU 자원과 메모리 등의 자원을 공유하지 않고 독립적으로 실행됩니다.
또한, 프로세스 간의 통신(Inter-Process Communication, IPC)을 통해 데이터를 공유하거나, 서로 협력하여 작업을 수행할 수 있습니다. IPC 방식으로는 파일, 파이프, 메모리 공유 등이 있으며, 이를 통해 다양한 프로세스 간의 협업이 가능합니다.
프로세스는 운영체제에서 제공하는 기능을 이용해 생성, 실행, 종료됩니다. 프로세스 생성에는 fork() 시스템 콜을 사용하며, 생성된 프로세스는 exec() 시스템 콜을 통해 다른 프로그램으로 교체될 수 있습니다. 또한, 부모 프로세스는 wait() 시스템 콜을 사용하여 자식 프로세스의 종료를 대기할 수 있습니다.
프로세스는 운영체제에서 중요한 역할을 수행하며, 프로그램의 실행과 관련된 많은 기능들이 프로세스와 관련되어 있습니다. 따라서, 운영체제나 시스템 프로그래밍을 공부하고자 하는 경우, 프로세스와 관련된 내용을 이해하는 것이 필수적입니다.