OS - 프로그램, 프로세스, 스레드

📅 TIL #126




🎯 Achievement Goals

  1. 프로그램(Program)에 대해서 간략하게 이해한다.
  2. 프로세스(Process)에 대해서 이해한다.
  3. 스레드(Thread)에 대해서 이해한다.
  4. 프로세스(Process)와 스레드(Thread)의 작동방식에 대해서 이해한다.
  5. 멀티 프로세스(Multi-process)와 멀티 스레드(Multi-thread)에 대해서 이해한다.







프로그램(Program) ?


우리는 컴퓨터를 하면서 총 2가지의 파일을 만날 수 있다.


실행이 가능한 파일(명령어가 들어가있는 파일 - exe파일, dmg파일 등등)과 문자열의 나열로만 되어있는 파일(명령어가 들어가있지 않은 파일 - txt파일, html파일, 오디오,이미지,영상 파일 등등)이 있다.


그러면 내가 여기서 오늘 알아봐야 할 것은 바로 실행이 가능한 파일이다. 프로그램은 실행이 가능한 파일이며, 실행이 가능한 것이지 실행이 된 파일은 아니다. 나는 그냥 실행 가능한 코드 집합체 파일이라고 이해를 했다.







프로세스(Process) ?


우리는 이 파일(프로그램)을 실행시키기 위해 더블 클릭을 하게 된다. 그러면 컴퓨터는 명령에 대한 동작을 하기위해 메모리를 할당받는다.(프로그램이 할당받은 메모리 영역을 프로세스 주소 공간이라고 한다.) 그러면 우리는 이제 원하는 행동을 할 수 있다. 보통 코딩을 하기 위해 vscode 등 프로그램을 실행시키게 되는데 이 상태를 프로세스(Process)라고 한다.


process


즉, 프로세스(Process)란 실행 중에 있는 프로그램을 의미한다. 위의 사진과 같이 메모리 공간에 코드가 올라가게 되면 이때 부터는 프로세스(Process)라고 부른다.







스레드(Thread) ?


한 프로세스(Process)가 실행되기 위해서 CPU를 점유하고 있으면 다른 프로세스는 실행될 수 없다.(정확히는 자원 소모가 심해서 그렇다고 한다.) 그렇기 때문에 다수의 프로세스를 동시에 실행하기 위해 시분할로 짧은 텀으로 반복 전환하면서 실행을 시킨다.


결국 프로세스는 하나만 실행이 된다는 뜻인데, 여기서 프로세스와는 다른 더 작은 실행 단위, 더 경량화된 개념이 바로 스레드(Thread)이다. 구조는 한 프로세스안에 최소 한개 이상의 스레드가 있다고 생각하면 될 것 같다.


thread


스레드(Thread)가 프로세스(Process)와 다른 점은 자원이 공유된다는 것이다. 즉, 스레드 간 메모리를 공유할 수 있으며, 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것이다.



지금 까지의 내용을 간략히 요약해 보자면

  • 프로그램(Program): 실행 가능한 코드 집합체 파일 (exe, dmg 등)
  • 프로세스(Process): 프로그램이 실행 된 상태
  • 스레드(Thread): 프로세스안에서 실행 흐름의 일부







프로세스(Process)와 스레드(Thread)의 작동방식


프로그램이 실행되면서 프로세스가 메모리 상으로 올라갈 때 운영체제(OS)로 부터 시스템 자원을 할당받는다. 그러면 프로세스마다 각각 독립된 메모리 영역을 Code/Data/Heap/Stack 형식으로 할당받는 것을 그림으로 표현했었다.


프로세스와는 다르게 스레드는 서로 자원을 공유할 수 있다고 말했는데, 그러면 이 말은 구체적으로 무슨 뜻일까?


프로세스가 할당받은 메모리 영역( Code/Data/Heap/Stack ) 내에서 Stack 영역만 따로 할당받고, 나머지 자원을 공유하게 된다.


thread2


여기서 한 가지 알 수 있는 사실은, 그동안 배워왔던 프로세스는 독립된 메모리 영역을 가지고 있기 때문에, 하나의 프로세스가 문제가 발생해도 다른 프로세스에 영향을 주지 않는다.


하지만 스레드의 경우, 메모리 영역의 내용을 공유하기 때문에 하나의 스레드에서 오류가 발생한다면 다른 스레드 모두가 강제로 종료될 것 이다.


error1


이러한 경우는 컴퓨터를 사용하면서 정말 많이 봐 왔는데 스레드와 관련된 문제라는 것은 오늘 처음 알게 되었다.







멀티 프로세스(Multi-process)와 멀티 스레드(Multi-thread)


먼저 멀티 프로세스(Multi-process)와 멀티 스레드(Multi-thread)는 하나의 어플리케이션에 대한 처리 방식의 일종이라는 것이다.


그러면 여기서 멀티 프로세스(Multi-process)란 하나의 운영체제 안에서 여러 프로세스가 실행되는 것을 의미한다. 위에서도 설명을 했지만 하나의 프로세스가 실행될때는 다른 프로세스가 실행될 수 없다고 설명했다. 하지만 나는 코딩을 하기 위해 vscode를 실행시키면서 구글링을 위해 크롬을 실행시킨다.


여기서 여러 프로세스가 동시에 실행되는 것처럼 보이지만 원리는 그렇지않다.


여러 개의 프로세스들이 내가 느낄 수 없을 정도로 빠르게 돌아가면서 실행되기 때문에 나는 동시에 실행된다고 느끼는 것이다. 즉, 내가 코딩을 할 때는 vscode만 실행이 되는 상태이며 자료를 찾기 위해 구글링을 할 때는 vscode는 대기 중 상태로 되며 크롬이 실행된다. 이때 나오는 용어가 바로 컨택스트 스위칭(Context Switching)이다.


컨택스트 스위칭


컨택스트 스위칭(Context Switching)

멀티 프로세스 환경에서 CPU가 하나의 프로세스를 실행하고 있는 상태에서 다음 우선 순위의 프로세스가 실행되어야 할 때, 기존의 프로세스 상태 또는 레지스터 값(Context)은 저장하고 다음 프로세스의 상태 또는 레지스터 값(Context)을 교체하는 작업이다.




멀티 스레드(Multi-thread)는 하나의 프로세스 안에서 여러 스레드로 나누어지면서 실행 단위가 나누어질 때 멀티 스레드라고 한다. 하나의 프로세스인 vscode를 실행할 때로 예를 들면, 내가 코드를 치고 있을 때 해당 코드의 추천 연관 코드도 뜰 것이다. 이처럼 한 어플리케이션에 대한 작업이 나누어질 때를 실행 단위가 나누어진다 라고 표현 한다.



멀티 프로세스(Multi-process)의 특징


  1. 각 프로세스들은 독립적이다.
  2. IPC(Inter-Process-Communication)을 사용한다.
  3. 독립적이기 때문에 자원 소모와 개별 메모리 차지가 크다.
  4. 하지만 동기화 작업이 필요로 하지 않는다.
  5. 컨택스트 스위칭(Context Switching) 비용이 부담된다.



멀티 스레드(Multi-thread)의 특징


  1. 스레드끼리 연결되어 있다.
  2. 자원이 공유되어 있어 통신 비용이 절감되며 메모리 차지가 효율적이다.
  3. 하지만 공유된 자원을 관리해야 하며 동기화 문제가 생긴다.
  4. 컨택스트 스위칭(Context Switching) 비용이 적다.





참고 자료

프로세스와 스레드의 차이
프로세스 생성과 소멸