CS/computer science

[기술면접] CS | 프로그램, 프로세스, 스레드

째깍단 2023. 8. 18. 12:16

💡 프로그램이란?

파일이 저장장치에만 저장되어 있고, 메모리에는 올라가 있지 않은 정적인 상태

= 아직 실행되지 않은 파일 (코드의 덩어리)

 

프로그램은 운영체제가 해당 프로그램을 위한 메모리 공간과 자원을 할당해줘야 실행할 수 있다

 

 

💡 프로세스란?

운영체제로부터 자원을 할당 받은 작업의 단위 = 프로그램이 실행된 상태

프로그램을 실행하면, 실행된 파일은 운영체제가 할당한 메모리에 올라가고 운영체제로부터 시스템 자원을 할당받게 된다.

운영체제는 각 프로세스의 독립된 메모리 영역을 Code, Data, Stack, Heap의 형식으로 할당한다

프로세스는 기본적으로 1개의 스레드를 가진다.

각 프로세스는 별도의 주소 공간을 가지며 다른 프로세스의 변수나 자료구조에 접근할 수 없다 (접근할 수 있게도 할 수는 있다)

 

--------- operation system ----------

| [ process(code, data, stack, heap) ] |

| [ process(code, data, stack, heap) ] |

--------------------------------------

  • Code : 코드 자체를 구성하는 메모리 영역
  • Data : 전역 변수, 정적 변수, 배열 등
  • Stack : 지역 변수, 매개 변수, 리턴 값
  • Heap : 동적 할당 시 사용 (new(), malloc() 등)

 

💡 스레드란?

하나의 프로세스 안에서 다양한 작업을 담당하는 최소 실행 단위

ex.                  크롬 브라우저(프로세스)

[ 벨로그 작성하기(스레드1) + 유튜브로 음악 듣기(스레드2) ]

 

각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 고유한 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택을 가진다.

 

한 프로세스 내에서 동작되는 여러 실행 흐름으로 프로세스 내의 Heap, Data, Code 영역을 공유한다.

( 멀티 스레드의 경우, 이 프로세스의 영역들을 공유함)

 

멀티 스레딩의 경우, 스레드 간의 자원을 공유, 자원 생성, 관리의 중복성을 최소화하여 수행 능력을 향상시킨다.

 

 

 


 

💡 멀티프로세스를 설명하시오

다수의 프로세서cpu가 협력적으로 하나 이상의 작업task을 동시에 처리하는 것(병렬 처리)

각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용한다.

 

👍 장점

  • 독립된 구조로 안전성이 높은 장점이 있다.
  • 프로세스 중 하나에 문제가 생겨도 다른 프로세스에 영향을 주지 않아, 작업속도가 느려지는 손해정도는 생기지만 정지되거나 하는 문제는 발생하지 않는다.

👎 단점 : 오버헤드

  • 독립된 메모리 영역이기 때문에 작업량이 많을수록(context switching이 자주 일어나서 주소 공간의 공유가 잦을 경우) 오버헤드가 발생하여 성능저하가 발생 할 수 있다.
  • 컨텍스트 스위칭 시 캐시 메모리 초기화 등 무거운 작업이 진행되고 시간이 소모되는 등 오버헤드가 발생한다.

[참고] https://wooono.tistory.com/522

 

 

 

💡 싱글 스레드와 멀티 스레드를 설명하시오

 

싱글 스레드 : 하나의 프로세스에 오직 하나의 스레드만 있는 것

멀티 스레드 : 하나의 프로세스에 여러 개의 스레드가 있어 병렬 처리가 가능한 것

 

싱글스레드 언어 : python javascript

멀티스레드 언어 : c++ node.js 등

 

 

+++

싱글스레드

👍 장점

  1. 작업 전환(context switching)을 요구하지 않는다.
    context switching은 여러 개의 스레드가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용이 든다

  2. 자원 접근에 대한 동기화를 신경쓰지 않아도 된다.
    여러 개의 스레드가 프로세스의 자원을 공유할 경우, 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근을 제어해야 한다 이 작업은 프로그래머에게 많은 노력을 요구하고 비용을 발생시킨다

  3. 단순히 CPU만을 사용하는 연산작업이라면, 오히려 멀티스레드보다 싱글스레드로 프로그래밍하는 것이 더 효율적이다
    스레드 간의 작업전환(context switching)에 시간이 걸리기 때문
  4. 프로그래밍 난이도가 쉽고, CPU, 메모리를 적게 사용한다. = 적은 코스트
    반면에, 멀티 스레드 모델은 프로그래밍 난이도가 높고 스레드 수만큼 자원을 많이 사용한다

 

👎 단점

  1. 여러 개의 CPU를 활용하지 못한다.
    프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다. 이때, 다수의 프로그램 인스턴스가 어떻게 상태를 공유할 것인가에 대한 문제를 고려해야한다. ( = 멀티 스레드 환경의 서버 프로그램의 확장성도 마찬가지)

  2. 연산량이 많은 작업을 하는 경우, 그 작업이 완료되어야 다른 작업을 수행할 수 있다.
    스레드가 연산하는 일정 시간은 어쩔 수 없다 치더라도, 연산하는 동안 사용자에게 UI 클릭같은 다른 작업은 진행할 수 있도록 지원해주어야 원활한 서비스를 제공할 수 있다. 이럴 때 멀티 스레드가 필요!

  3. 싱글 스레드 모델은 에러 처리를 못하는 경우 멈춘다.

 

 

멀티스레드

👍 장점

  1. 응답성
     프로그램의 일부분(스레드 중 하나)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가한다. 멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복한다. 다만, 새로운 스레드 생성이나 놀고 있는 스레드 처리에 비용이 발생한다. get 안정성 more cost

  2. 경제성
     프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원 소모가 줄어든다.
    스레드 간 통신이 필요한 경우에도 쉽게 데이터를 주고 받을 수 있으며, 프로세스의 context switching과 달리 스레드 간의 context switching은 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다.

  3. 멀티프로세서의 활용
     다중 CPU 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있으므로 병렬성이 증가한다.

 

👎 단점

  1. context switching, 동기화 등의 이유 때문에
    싱글 코어 멀티 스레딩의 경우 스레드 생성 시간 오버헤드로 작용해 단일 스레드보다 느리다.

  2. 공유하는 자원에 동시에 접근하는 경우 오류가 발생할 수 있어 동기화가 필요하다 = more cost
    공유 자원에 동시 접근 시, 프로세스와는 달리 스레드는 데이터와 힙 영역을 공유하기 때문에 이미 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다

  3. 멀티 스레딩을 위해서는 운영체제의 지원이 필요하다.

  4. 멀티 스레드 모델은 프로그래밍 난이도가 높다. 또한 스레드 수만큼 자원을 많이 사용한다

 

 


 

정리하자면,

하나의 프로그램은 여러 개의 프로세스로 구성되고

프로세스는 기본 1개로 싱글 스레드를 가지거나 여러 개의 스레드를 가지며

멀티스레드인 경우 context switching을 통해 병렬 작업을 한다.

 

멀티 프로세스보다 멀티 스레드가 선호되는 경향이 있는데,

멀티프로세스는 context switching 시 무거운 작업이 많아 성능저하가 많이 일어나기때문에 멀티 스레드가 선호되는 듯