프로세스와 스레드는 컴퓨터 프로그램이 실행될 때 발생하는 두 가지 중요한 개념이다.
이 두가지 개념은 다중작업(Multitasking)환경에서 프로그램들이 동시에 실행될 수 있도록 도와주는 역할을 한다.
독립성: 각각의 프로세스는 다른 프로세스와 완전히 독립되어있다. 하나의 프로세스는 다른 프로세스에게 영향을 미치지않고 실행됩니다. 프로세스는 서로 완전히 격리되어 있으며, 한 프로세스가 다른 프로세스의 자원에 직접 접근하려면 운영체제를 통해 허가받아야 합니다. 각각의 프로세스는 자신만의 주소 공간을 가지며, 이로 인해 다른 프로레스에 영향을 미치지 않고 독립적으로 실행됩니다.
자원 할당: 운영체제는 각 프로세스에게 메모리 공간, CPU 시간, 파일 디스크립터 등의 자원을 할당합니다. 이러한 자원은 해당 프로세스만 사용할 수 있으며 다른 프로세스와 공유되지 않습니다.
컨텍스트 스위칭: 여러 프로세스가 동시에 실행될 수 있으므로, 운영체제는 프로세스 간 전환을 수행하는데 이를 컨텍스트 스위칭이라고 한다. 컨텍스트 스위칭은 현재 실행 중인 프로세스의 상태를 저장하고 다음 실행할 프로세스의 상태를 복원하는 작업을 의미합니다.
통신: 프로세스 간 통신(IPC, Inter-Process Communication)을 통해 서로 다른 프로세스간에 정보를 주고 받을 수 있습니다. 이를 통해 프로세스 간 협력이 가능합니다.
실행 상태(Running): CPU에서 현재 실행중인 상태입니다.
준비 상태(Ready): 실행을 기다리는 상태로, CPU가 사용 가능한 경우 실행 상태로 전환됩니다.
대기 상태(Blocked): 프로세스가 어떤 이벤트(예: 입출력 완료)를 기다리는 상태입니다. 이벤트가 발생하면 준비 상태로 전환됩니다.
프로세스 생성: 새로운 프로세스를 생성하려면 보통 부모 프로세스가 자식 프로세스를 fork 또는 spawn하는 방법을 사용합니다. 자식 프로세스는 부모 프로세스의 복제본으로 시작하며, 이후에 필요한 작업을 수행합니다.
프로세스 종료: 프로세스가 중요한 개념으로 사용되며
✔ spawn : 프로세스나 스레드를 생성하는 동작을 일컫는 용어, 또는 비동기 프로그래밍에서 비동기 작업을 시작하고, 결과를 기다리지 않고 다른 작업을 수행을 의미하는 개발 전반적으로 사용되는 프로그래밍 용어이다.
경량성: 스레드는 프로세스 내에서 생성되므로 프로세스에 비해 경량입니다. 스레드 간의 전환과 통신이 빠르며, 메모리를 적게 사용합니다.
공유자원: 스레드는 하나의 프로세스 내에서 실행되기 때문에 프로세스의 자원(메모리, 파일, 네트워크 연결 등)을 공유합니다. 이로 인해 데이터 공유가 용이하며, 동시 접근 문제에 주의해야 합니다.
병렬 처리: 멀티코어 CPU를 활용하여 여러 스레드가 병렬로 실행될 수 있어, 다수의 작업을 동시에 처리할 수 있습니다.
멀티태스킹: 다수의 작업을 동시에 실행하고자 할 때 스레드를 사용합니다. 예를 들어, 웹 서버에서 여러 클라이언트 요청을 동시에 처리하는 데 스레드가 사용됩니다.
동시성 제어: 공유 자원에 대한 동시 접근을 관리하고 제어하기 위해 스레드를 사용합니다. 스레드 간 동기화 메커니즘을 통해 경쟁 조건과 데드락을 방지할 수 있습니다.
비동기 프로그래밍: 스레드를 사용하여 비동기 작업을 처리하고, 메인 스레드는 다른 작업을 계속할 수 있습니다.
스레드는 여러 프로그래밍 언어와 라이브러리에서 지원됩니다. 예를 들어, Java에서는 'Thread' 클래스를 사용하여 스레드를 생성하고 관리할 수 있습니다.
또한 운영체제에 따라 스레드 관리 방식이 다를 수 있으며, 몇 가지 운영체제에서는 스레드 관리를 하나의 프로세스에게 위임하기도 합니다.
스레드는 병렬 처리와 동시성을 구현하기 위한 강력한 도구로, 다수의 작업을 빠르게 처리하고 자원을 효율적으로 활용하는 데 중요한 역할을 합니다. 그러나 스레드를 사용할 때에는 동시성 문제(경쟁조건, 데드락등)와 관련된 주의사항을 숙지하고 안정적인 코드를 작성해야 합니다.
1.프로세스는 독립된 프로그램 실행 단위이다.
2. 각각이 자체 메모리와 자원을 가지고 있다.
- 하나의 프로세스 내에서 실행되는 작은 실행 단위다.
- 같은 프로세스 내에서 메모리와 자원을 공유한다.
- 스레드를 사용하면 프로세스 간 통신과 비교적 가볍게 병렬작업을 수행할 수 있다.
- 따라서 효율적인 멀티태스킹 및 멀티코어 CPU 활용이 가능하다.