[CS - 운영체제(OS)] 프로세스(Process)와 스레드(Thread) 관련 개념 정리 (1) - 프로그램, 프로세스, 스레드

SUN·2022년 10월 5일
0

Computer Science

목록 보기
6/11
post-thumbnail

싱글 스레드내에서 멀티 태스킹이 가능하도록 하는 기술이 무엇인가에 대한 질문을 받은 적이 있다.

싱글 스레드와 멀티 스레드와의 차이에 관한 질문도 받았다.
나는 여기서 멍청하게 멀티 스레드에서는 하나의 스레드가 죽어도 다른 스레드는 실행된다고 답했다.
면접 끝나고 궁금해서 찾아보니....ㅎㅎ.. 수치스럽다

분명 배운 거 같은데 역시 사람은 망각의 동물인가보다.
안되겠다 싶어서 관련 내용에 대해 공부를 진행했다.

프로그램(Program)

  • 어떤 작업을 위해 실행할 수 있는 파일

쉽게 말해서 그냥 아직 실행되지 않고 있는 코드 덩어리이다.

프로세스(Process)

  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
  • 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태

한마디로 운영체제로 부터 시스템 자원을 할당받아 메모리에 적재되어 실행되고 있는 프로그램이다.

특징

  • 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
  • 각 프로세스는 별도의 주소 공간에서 실행된다.
  • 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)나 LPC(Local inter-Process Communication)를 사용해야 한다.

참고로 프로세스 간 통신에는 공유 메모리 방식(a)와 메시지 전달 방식(b)가 있다.

공유 메모리 방식은 말 그대로 프로세스 간에 공유하는 메모리가 있고 이 메모리를 통해 통신하는 것이다.
속도가 빠르나 동기화가 잘 안된다는 단점이 있다.

메세지 전달 방식은 공유 메모리를 쓰지 않고 커널이 대리 전달해주는 개념이다.
동기화가 잘 되나 속도가 느리다는 단점이 있다.

여기에 같이 정리할까 했는데 내용이 은근 길어서 자세한 내용은 추후에 다른 포스팅에서 다루도록 하겠다.

스레드 (Thread)

  • 프로세스 내에서 실행되는 여러 흐름의 단위이다.

과거에는 프로그램을 실행할 때 프로세스 하나만 가지고 끝까지 진행했다고 한다.
그런데 이제는 프로그램이 여러가지 일을 해야하기 때문에 프로세스 하나만 가지고는 불가능하다.

이를 해결하기 위해서 프로세스를 여러개 둘 수도 있겠지만 아까 봤듯이
프로세스 간에는 자원 공유가 힘들기 때문에 더 작은 실행 단위가 필요했고 이게 바로 스레드이다.

특징

  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
  • 한 스레드가 프로세스 자원을 변경하면, 이웃 스레드(sibling thread)도 변경 결과를 즉시 볼 수 있다.

스레드는 어떻게 메모리를 공유할까?

일반적으로 스레드는 흐름의 단위라고 정의하는데 정확히는 CPU 입장에서의 최소 작업 단위라고 한다.
CPU는 작업을 처리할 때 스레드를 최소 단위로 삼지만 운영체제는 프로세스까지만 작업을 한다.
그래서 운영체제 입장에서는 프로세스가 최소 작업 단위이기 때문에 같은 프로세스면 메모리를 공유할 수 밖에 없다.

프로세스 VS 스레드


OS는 프로세스마다 각각 독립된 메모리 영역을 Code/Data/Stack/Heap의 형식으로 할당해 준다.
프로세스에는 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.

이와 다르게 스레드는 메모리를 서로 공유한다.
조금 더 자세하게는 Code/Data/Stack/Heap 중에 Stack만 따로 존재하기 때문에 힙 메모리는 서로 읽고 쓸 수 있다.

여기서 프로세스와 스레드의 중요한 차이이자 나의 바보같은 답변의 정답을 알 수있다.

만약 한 프로세스가 오류 때문에 강제로 종료된다면 다른 프로세스에게 영향을 줄까?
일반적으로는 공유하고 있는 자원이 없기 때문에 그렇지 않다.

그런데 스레드의 경우에는 스택을 제외한 영역은 공유하기 때문에
스레드 하나에서 오류가 발생하면 같은 프로세스에 있는 모든 스레드가 동시에 종료된다.
예를 들어서 어떤 함수에서 오류가 발생했든 전체 프로세스가 종료되는 걸 생각해보면 쉽다.

그렇다 나는 멀티 프로세스의 특징을 멀티 스레드의 특징으로 답변한 것이다. 🥲

멀티 프로세스, 멀티 스레드, 싱글 스레드 등등 이런 개념은 다음 시간에 정리하도록 하겠다.

참고 자료

profile
개발자

0개의 댓글