저는 컴공의 유사한 학과이긴 하지만 엄연히 다른 과를 다니고 있습니다.
개발을 하며 컴공이 아니기에 불편한 점은 몇가지 없었지만 딱 2가지 있었습니다.
이번년도 3학년에 올라가기에 슬슬 CS를 공부하며 기반을 다져야한다고 생각했기에 근 1달간 '혼자 공부하는 컴퓨터 구조 + 운영체제' 를 통해 운영체제를 공부했습니다.
공부를 더욱 효율적으로 하기 위해 이번 글부터 CS Interview에 답해보며 공부를 하려고 합니다.
첫 질문은 '프로세스와 스레드의 차이' 입니다.
프로세스를 간단하게 표현하면 '실행 중인 프로그램'이라고 할 수 있다.
프로세스의 정의
프로세스는 실행 중인 프로그램으로, 해당 프로그램의 코드와 그 프로그램이 실행되는 데 필요한 리소스(메모리, 파일 핸들 등)를 포함한다. 따라서 단순히 "실행 중인 프로그램"이라고만 정의하는 것은 다소 제한적일 수 있다.
프로그램은 실행되기 전까지는 그저 보조기억장치에 있는 데이터 덩어리일 뿐이지만, 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 된다.
모든 프로세스는 실행을 위해 CPU를 필요로 하지만, CPU 자원은 한정되어 있다. 즉 모든 프로세스가 CPU를 동시에 사용할 수는 없다. 그렇기에 프로세스들은 차례대로 돌아가며 한정된 시간만큼만 CPU를 이용한다.
자신의 차례가 되면 정해진 시간만큼 CPU를 이용하고, 시간이 끝났음을 알리는 인터럽트(타이머 인터럽트)가 발생하면 자신의 차례를 양보하고 다음 차례가 올 때까지 기다린다.
타이머 인터럽트
타이머 인터럽트는 프로세스가 할당된 시간 동안 실행된 후 발생하여, 운영체제가 현재 실행 중인 프로세스를 중단시키고 다른 프로세스를 실행할 수 있도록 한다.
그렇다면 운영체제는 어떻게 빠르게 번걸아 수행되는 프로세스의 실행 순서는 어떻게 관리하고, 프로세스에 CPU를 비롯한 자원을 배분할까?
이를 위해 운영체제는 PCB(Process Control Block, 프로세스 제어 블록)을 이용한다.
추가 정보
프로세스 상태: 프로세스는 실행 중일 때뿐만 아니라 대기, 준비 상태 등 다양한 상태를 가질 수 있다. 인터럽트가 발생하면 프로세스는 대기 상태로 전환될 수 있다.CPU 자원 관리: CPU 자원은 한정되어 있다는 점은 맞지만, 프로세스가 차례대로 돌아가는 방식은 스케줄링 알고리즘에 따라 다르다. 예를 들어, 선점형 스케줄링에서는 특정 시간 동안 실행된 후 인터럽트가 발생하여 다른 프로세스에게 CPU를 양보하게 된다. 이 외에도 여러 스케줄링 기법이 존재한다.
스레드는 실행의 단위이다.
정확하게 표현하면, 스레드란 프로세스를 구성하는 실행의 흐름 단위이다. 하나의 프로세스는 여러 개의 스레드(멀티스레드)를 가질 수 있다. 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.
스레드의 정의
스레드는 프로세스를 구성하는 실행의 흐름 단위이다. 하지만 이를 좀 더 명확히 하면, 스레드는 프로세스 내에서 실행되는 경량 프로세스라고도 할 수 있습니다. 즉, 스레드는 자신만의 실행 흐름을 가지면서도 프로세스의 자원을 공유한다.
전통적인 관점에서 하나의 프로세스는 한번에 하나의 일만을 처리했다. '실행의 흐름 단위가 하나'라는 점에서 이렇게 실행되는 프로세스들은 단일 스레드 프로세스(Single Thread Process)라고 볼 수 있다.
하지만 스레드(Thread)라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 되었다.
즉, 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있게 된 것이다.
이런 점에서 볼 때 스레드는 '프로세스를 구성하는 실행 단위'라고 볼 수 있다.
스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다. 각자 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 가지고 있기에 스레드마다 각기 다른 코드를 실행할 수 있다.
스레드의 구성 요소
스레드가 각기 다른 스레드 ID, 프로그램 카운터, 레지스터 값, 스택을 가진다는 점은 중요하다. 이로 인해 각 스레드는 독립적으로 실행될 수 있다. 이와 더불어 스레드 간에 공유되는 자원(예: 힙 메모리, 파일 디스크립터 등)도 존재한다.
여기서 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행된다는 것이다. 프로세스의 자원을 공유한다는 것이 스레드의 핵심이다.
정리하면, 프로세스가 실행되는 프로그램이라면 스레드는 프로세스를 구성하는 실행의 흐름 단위이다.
프로세스 자원의 공유
프로세스의 자원을 공유한다는 것이 스레드의 핵심이라는 점은 매우 중요하다. 스레드가 같은 프로세스 내에서 자원을 공유함으로써, 메모리 사용의 효율성과 성능을 높일 수 있다. 그러나 이로 인해 동기화 문제나 경쟁 조건이 발생할 수 있다.
프로세스의 정의: 프로세스는 메모리에서 실행 중인 프로그램으로, 실행에 필요한 모든 자원(코드, 데이터, 힙, 스택 등)을 포함한다. 각 프로세스는 독립된 메모리 공간을 가지며, 프로세스 간에는 기본적으로 메모리를 공유하지 않는다.
스레드의 정의: 스레드는 프로세스 내에서 실행되는 흐름 단위로, 하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 각 스레드는 독립적으로 실행되지만, 같은 프로세스의 스레드들은 코드, 데이터, 힙 메모리를 공유하게 된다. 이로 인해 메모리 사용의 효율성을 높일 수 있다.
자원 할당: 스레드는 스택을 독립적으로 할당받고, 각 스레드는 자신만의 프로그램 카운터와 레지스터를 가진다. 하지만 코드 영역과 데이터 영역은 프로세스의 모든 스레드가 공유하기 때문에, 스레드 간의 데이터 공유가 용이하지만 동기화 문제가 발생할 수 있다.
요약:
프로세스마다 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당받는다. (code, data, heap, stack)
스레드는 이중에 stack만 따로 할당받고 나머지 영역은 스레드끼리 서로 공유한다.
[요약]