프로세스 vs 스레드

NasK!m_311·2022년 9월 15일
0

Computer Science

목록 보기
1/6
post-thumbnail

💡 프로그램(Program)

- 어떤 작업을 위해 운영체제 위에서 실행할 수 있는 파일.
	
- 예를들어, '웹 브라우저', '워드 프로세스', '카카오톡' 등등.



💡 프로세스(Process)

- 운영체제 위에서 실행중인 프로그램.
	
- 프로그램 명령어와 데이터들이 메모리에 올라오고 실행 중 또는 실행 대기중인 상태
	
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
	
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.

- ctrl + alt + del + 작업관리자를 통해 실행중이 프로세스에 대해 확인해볼수 있다

💡 프로세스의 특성

 - 프로세스를 한번에 돌리는 작업을 간단하게 
 	프로세스 동시성, 프로세스 병렬성 또는 이 둘의 혼합으로 표현할수있다. 

💡 프로세스 동시성(Concurrency)

- 동시성 동작 방식은 싱글 코어에서 여러 작업을 동시에 실행되는 것처럼 보이기 위해 
	번갈아 가면서 작업을 수행하는데, 
  이때 다른 작업으로 바꿔서 실행할 때 
  	내부적으로 콘텍스트 스위칭(Context Switching)이라는 게 일어난다.
    
- 동시성은 프로세서(CPU)가 여러가지 작업을 돌아가면서 진행하는 것으로 
	그 속도가 매우 빨라서 '마치 동시에 작업하는 것처럼' 보이기 때문에 동시성이라고 부른다.     

💡 프로세스 병렬성(Parallelism)

- 병렬성은 프로세서 하나에 여러개의 코어가 달려 있어서 
	코어마다 하나의 작업을 도 맡아서 동시에 (병렬적으로) 진행할 수 있기 때문에 병렬성이라 부른다.
    
- CPU를 말할 때 4코어, 8코어 뜻하는게 바로 이 병렬성 성능을 좌우하는 코어를 의미한다.    

💡 프로세스 혼합(Concurrency+Parallelism)

- 동시성의 특성과 병렬성의 특성을 혼합하여 진행한다.



💡프로세서(Processor)

- 프로세스가 동작될 수 있도록 하는 하드웨어(=CPU)

- 프로세서는 한순간에 하나의 프로세스만 실행할 수 있음.

	- 프로세서 동작이란?
  		- 프로그램의 자원들이 메모리에 올라오고, 실행 되어야 할 코드의
			메모리 주소를 CPU의 레지스터로 올리는 것.

	
- 여러가지 일을 할 수 있는 이유는
	- CPU가 짧은 시간에 수십번 수천번 실행할 프로세스를 교체하고 있기 때문에 
    	동시에 여러개의 작업이 실행되고 있다고 느끼는 것이다.(context switching)


💡 Context Switching

- CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데, 
  	이 과정을 Context Switching이라고 한다.
    
- 구체적으로, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고,
  	대기하고 있던 다음 순서의 포로세스가 동작하면서 
    이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
    
- 자세하게,
    CPU(Control Processing Unit)가 어떤 프로세스(Process)를 실행하고 있는 상태에서
	운영체제(Operating System)스케줄러(Scheduler)인터럽트(Interrupt)를 진행하여 
	더 높은 우선순위를 가진 프로세스가 실행되어야 할 때,
	스케줄러가 레지스터(Register)에 저장된 기존 프로세스 정보 값이나 기존 프로세스 상태 값을 
    커널(Kernal) 내부에 존재하는 PCB(Process Control Block)에 저장하고, 
    새 프로세스의 정보 값이나 새 프로세스 상태 값을 PCB에서 다시 가져와 교체하는 작업.  
    
- 한마디로 스케줄러가 기존 실행 프로세스를 우선순위 때문에 미루고 새 프로세스로 교체해야 할 때 
	프로세스 상태 값을 교체하는 작업을 말한다.  
    
-------------------------------------------------------------------------------

※ 용어정리      
      
- CPU(Control Processing Unit)
	-> 사용자들이 입력한 명령어를 해석하고 연산한 후 그 결과를 제어하는 역할을 하는 장치를 말한다.
    
- 스케줄러(Scheduler)
	-> 어떤 프로세스에게 자원을 할당할지 순서와 방법을 결정하는 운영체제 커널의 모듈을 지칭한다.
    
- 레지스터(Register)
	-> CPU에서 외부 요청을 처리하는 데 
    	필요한 데이터를 일시적으로 저장하고 이동하는 고속도의 기억장치로 사용된다.
        
- 커널(Kernal)
	-> 운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고 
    	그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 되는데, 
        이때 메모리에 상주하는 운영체제의 부분을 커널이라 한다. 
	-> 운영체제도 소프트웨어라서 메모리에 올라가야 하나 규모가 큰 프로그램이기 때문에 
    	모두 올라간다면 한정된 메모리 공간의 낭비가 심할 것이기 때문에 커널로 분리해둔 것이다.   
        
- PCB(Process Control Block)
	-> 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영체제 커널의 자료 구조를 말한다.
		그 정보에는 프로세스 번호, 포인터, 프로세스 상태, 레지스터, 
        프로그램 카운터(코드 위치) 등이 있다.



💡 스레드(Tread)

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

- 프로세스가 할당받은 자원을 이용하는 실행의 단위.

💡 스레드의 종류

1. 싱글스레드

	- 프로세스 내의 독립적인 순차흐름 또는 제어.
    
2. 멀티스레드

	- 하나의 프로세스에서 여러 개의 스레드가 병행적으로 처리.

💡 스레드의 특징

- 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
		
- 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 
	프로세스 내의 주소 공간이나 자원들(Code, Data, Heap)을 
    같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
		
-같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 
	반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
		
-각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.



💡 멀티 프로세스(Multi-Process)

- 하나의 응용프로그램을 여러 개의 프로세스로 구성하여,
  	각 프로세스가 하나의 작업(Task)을 처리하도록 하는 것이다.
    
-------------------------------------------------------------------------------

- 장점

	- 여러개의 자식 프로세스 중 하나에 문제가 발생해도,
      	그 자식 프로세스만 죽는 것 이상으로 다른 곳으로 영향이 확산되지 않는다.
	- 구현이 비교적 간단하다.        
        
-------------------------------------------------------------------------------
          
- 단점

	-Context Switching 과정에서 캐쉬메모리(Code, Data, Heap) 초기화의 무거운 작업이 진행됨.
    
    - 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 
    	프로세스 사이에서 공유하는 메모리가 없어,
      Context Switching이 발생하면 
      	캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야한다.
        
	- 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에
    	하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다.
      따라서, 프로세스가 많으면 많아질수록더 많은 메모리 공간을 차지하게 된다.
        
	- Context Switching이 자주 일어나게 될 것이다. 
		그런데, 문제점은 Context Switching 동안(정보를 저장하고 새로운 정보를 설정하는 동안)에는 
       	 CPU는 아무런 작업도 하지 못하게 된다.
        따라서, 이러한 Context Switching이 너무 자주 일어나게 되면 
         오버헤드가 발생할 수 있고 CPU의 성능 또한 저하될 수 있다.
         
	- 작업을 진행하던 도중 Process들끼리 서로의 자원을 사용하고 싶은 경우,
      	Process 간의 통신을 하기 위해 IPC(Inter-Process Communication)를 이용하게 되는데 
        비용적으로 많은 부담이 든다고 한다.
        
-------------------------------------------------------------------------------

※ 용어정리   

- IPC(Inter-Process Communication)
	-> 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로.
        



💡 멀티 스레드(Multi-Tread)

- 하나의 응용프로그램을 여러개의 스레드로 구성하고 
	각 스레그로 하여금 하나의 작업을 처리하도록 하는 것.
    
-------------------------------------------------------------------------------

- 장점
	
	- 시스템 자원 소모 감소(자원의 효율성 증대)
		-> 프로세스를 생성하여 자원을 할당하는 시스템 (System Call)이 줄어들어
        	자원을 효율적으로 관리할 수 있다.
            
	- 시스템 처리량 증가(처리 비용 감소)
		-> 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
        -> 스레드 사이의 작업량이 작아 Context Switching이 빠르다.
        
	- 프로그램 응답 시간 단축
    	-> 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 떄문에
        	통신의 부담이 적다.
            
-------------------------------------------------------------------------------
              
- 단점

	- 주의 깊은 설계가 필요하다
    
    - 디버깅이 까다롭다.
    	-> 디버깅 : 프로그램 개발 단계 중에 발생하는 
        	시스템의 논리적인 오류나 비정상적 연산을 찾아내고 그 원인을 밝히고 수정하는 작업 과정.
            
	- 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향으 받는다.
    
    - 자원 공유의 문제가 발생한다.(동기화 문제)
    	-> 스레드 간의 자원 공유는 전역 변수를 이용하므로 함께 사용할 때 충돌이 발생할 수 있다.
        
-------------------------------------------------------------------------------
          
※ 용어정리

- 'System Call'
	-> 운영 체제의 커널이 제공하는 서비스에 대해, 
      	응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.    



💡 멀티프로세스 대신 멀티스레드를 사용하는 이유

1. 자원의 효율성 증대

	- 멀티프로세스로 실행되는 작업을 멀티스레드로 실행할 경우,
      	프로세스를 생성하여 자원을 할당하는 시스템 (System Call)이 줄어들어
        자원을 효율적으로 관리할 수 있다.
        
	- 프로세스 간의 Context Switching시 단순히 CPU레지스터 교체 뿐만 아니라
    	RAMCPU사이의 캐쉬 메모리에 대한 데이터까지 초기화 된다.
      하지만, 스레드는 프로세스 내의 메모리(Code, Data, Heap)를 공유하기 때문에
      	독립적인 프로세스와 달리 스레드끼리 데이터를 주고 받는 것이 간단해지고 
        시스템 자원 소모가 줄어든다.
        
        
2. 처리비용 감소 및 응답시간 단축

	- 프로세스간의 통신(IPC)보다 스레드 간의 통신의 비용이 적으므로 
    	작업들 간의 통신의 부담이 줄어든다
        -> 스레드는 Stack 영역을 제외한 모든 메모리를 공유하기 떄문.
        
	- 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.
    	-> Context Switching시 스레드는 Stack영역만 처리하기 때문.


💡 프로세스 vs 스레드 (결론)

1. 프로세스는 하나의 프로그램을 여러개의 프로세스로 구성하여 
	각 프로세스가 하나의 작업(task)를 처리하는 것이다.
    
    - 장점 : 하나의 프로세스가 잘못 되어도 프로그램은 동작 함.
    
    - 단점 : context switching 비용 발생.

-------------------------------------------------------------------------------
      
2. 스레드는 프로그램을 여러개의 쓰레드로 구성하고 
	각 쓰레드가 작업(task)를 처리하는 것이다.
    
	- 장점 : 시스템 자원 소모 감소, 처리 비용 감소(실행 속도 향상), 
      		스레드간 자원 공유(stack을 제외한 영역).
            
	- 단점 : 디버깅 어려움, 동기화 이슈 발생, 하나의 쓰레드의 오류로 전체 프로세스에 문제 발생.

-------------------------------------------------------------------------------
      
3. 프로세스와 스레드의 차이점

	- 프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이다.
    
    - 스레드는 할당 받은 자원을 이용하는 실행의 단위이고 프로세스 내에 여러개 생길수 있다.
    
    - 어플리케이션을 예로 들면 하나의 어플리케이션이 프로세스가 되고, 
      그 안에서 분기 처리를 하는게 스레드가 되는 셈이다.



💡 메모리 영역

 -> 메모리 영역은 Code, Data, Stack, Heap으로 구분할 수 있다

1. 코드 영역(code area) - 실행할 프로그램의 코드

	-> 프로그래머가 작성한 프로그램이 코드 영역에 작성이 되고
		프로세스가 종료될 때까지 유지되는 영역.
        
        
2. 데이터 영역(data area) - 변수와 파일의 데이터

	-> 코드가 실행되면서 사용한 변수(전역변수, 정적 변수), 배열, 구조체 등 
    	파일들의 각종 데이터들을 저장한 공간이며 이 영역 또한 프로세스의 종료까지 유지된다.
        
        
3.영역(heap area) - 동적으로 할당된 변수가 할당되는 영역	 

	-> 사용자가 직접 관리하는 영역.
    -> 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
    -> 런타임 시에 크기가 결정.

    
4. 스택(stack) 영역

	-> 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역.
    -> 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸.
    -> 스택 영역의 크기는 컴파일 시에 결정.
profile
메리아빠, 먹다가 죽어도 되는 개발자.(살뺴자....)

0개의 댓글