코딩쌀롱
프로세스와 스레드 비교 본문
✱ 프로그램, 프로세스
프로그램
• 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태
- 메모리에 올라가 있지 않은 : 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 뜻, 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해줘야 실행될 수 있다.
- 정적인 상태: 아직 실행되지 않고 가만히 있는 상태
• 아직 실행되지 않은 파일 그 자체, 코드 덩어리 파일.
프로세스
• 프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적인 상태라고 하며 이 상태의 프로그램을 프로세스라고 한다. 위키피디아에서는 프로세스를 '실행되고 있는 프로그램'이라고 정의를 내리고 있다.
• CPU가 처리하는 작업(Task)라고도 불린다.
• 디스크에 저장되어 있던 실행 가능한 프로그램이 메모리에 적재되어 운영체제가 관리하는 상태를 의미한다.
✱ 스레드
운영체제는 안정성을 위해서 프로세스마다 각각에 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고 있다. 프로세스는 독립적으로 메모리 영역을 다른 프로세스와 공유할 수 없다. 한 프로그램을 처리하기 위한 프로세스를 여러 개 만드는 것이 불가능하기 때문에 프로세스보다 작은 실행 단위 개념이 필요하게 되었고, 이것이 스레드다.
스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되는 것이다.
위 그림으로 프로세스와 스레드의 메모리 구조 차이점을 알 수 있다. 오른쪽의 스레드를 보면 heap, static, code를 공유하고 있고, stack은 독립적으로 할당되어 있다.
✘ Stack을 독립적으로 할당하는 이유
stack은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내 지역변수 등을 저장하기 위해 사용되는 메모리 공간이다. stack 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고, 이는 독립적인 실행 흐름이 추가되는 것이다. 결과적으로 실행 흐름의 추가를 위한 최소 조건이 독립된 stack을 제공하는 것이다.
✘ Code 공유
프로세스는 독립적인 구조이기 때문에 다른 프로세스의 Code 영역에 있는 함수를 호출할 수 없다. 스레드는 Code 영역을 공유하기 때문에 두 개 이상의 스레드가 포함된 프로세스의 Code 영역에 있는 함수를 호출할 수 있다.
✘ Data, Heap 공유
전역 변수와 동적 할당된 메모리 공간을 공유할 수 있고, 이를 통해 스레드 간 통신을 할 수 있다. 하지만 서로 다른 스레드가 동시에 메모리에 접근하기 때문에 주의해야 한다.(동기화 문제)
✱ 프로세스와 스레드 비교
프로세스
•운영체제 관점 최소 작업 단위
•운영체제는 프로세스마다 독립된 메모리 영역을 할당(Code, Data, Stack, Heap)
•독립된 메모리 영역이기 때문에 다른 프로세스의 변수, 자료 접근 불가
( 가능하게 하는 방법이 있지만 추가적인 작업을 필요로 하고 자원 부담이 큼_IPC, LPC 등)
•한 프로세스 실행 중 오류 발생으로 강제 종료된다해도 다른 프로세스에 영향 안 줌
•하나의 프로세스는 하나 이상의 스레드를 가진다. (프로세스 안에는 무조건 스레드가 하나는 있다. - 메인스레드)
•멀티 태스킹: 하나의 운영체제 안에서 여러 프로세스가 실행되는 것
스레드
•CPU 관점 최소 작업 단위
•프로세스의 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받는다.
•나머지 Code, Data, Heap 메모리 영역은 스레드끼리 공유한다.
( 스레드가 프로세스보다 context-switching이 빠른 이유는 메모리 영역을 공유하기 때문)
•각각의 스레드는 별도의 Stack을 가지고 있지만 Heap 메모리는 서로 읽고 쓸 수 있게 된다.
•스레드는 메모리 영역을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.
•멀티 스레드: 하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는 것
- Context-Switching할 때 공유하고 있는 메모리 만큼의 메모리 자원을 아낄 수 있다.
- 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적어 응답이 빠르다.
- 스레드 하나가 프로세스 내 자원을 망친다면 모든 프로세스가 종료될 수 있다.
- 자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수 밖에 없다.
프로세스 간의 *Context-Switching 시에는 많은 자원 손실이 발생하지만 스레드 간의 Context-Switching에서는 메모리를 공유하고 있는 만큼 부담을 덜 수 있다.
멀티 스레드를 사용하면 각각의 스레드 중 어떤 것이 어떤 순서로 실행될 지 순서를 알 수 없다. 여러 스레드가 같이 전역 변수를 사용할 경우 발생할 수 있는 충돌을 동기화 문제(Synchronization Issue)라고 한다. *스케줄링은 운영체제가 자동으로 해주지 않기 때문에 프로그래머가 적절한 기법을 직접 구현해야 하므로 멀티스레드를 사용하려면 신중해야 한다. 디버깅 과정도 까다로워지기 때문.
*Context-Switching : CPU가 한 개의 Task(process, thread)를 실행하고 있는 상태에서 인터럽트 요청에 의해 다른 Task로 실행이 전환되는 과정에서, 기존의 Task 상태 및 Register 값들에 대한 정보(*Context)를 저장하고 새로운 Task의 Context 정보로 교체하는 작업을 말한다.
*스케줄링 : 메모리에 올라온 프로세스들 중 어떤 프로세스를 먼저 처리할지 일들의 순서를 정하는 일.CPU는 한 번에 한 가지 작업만 실행할 수 있기 때문에 여러 프로그램이 번갈아 수행되도록 스케줄링을 사용한다. 스케줄링을 사용함으로써 다중 프로그래밍이 가능해지고 CPU 이용률을 극대화 시킬 수 있다. 즉, 시스템의 자원을 효율적으로 사용하기 위해 한 프로세스가 CPU를 언제 얼마나 차지할 것인가에 대한 순서, 방법을 결정짓는 것이라고 할 수 있다.
참고
학습 단계로 잘못된 정보가 있을 수 있습니다. 잘못된 부분에 대해 알려주시면 곧바로 정정하도록 하겠습니다🙂
'개발공부' 카테고리의 다른 글
[JS] Promise → async/await로 바꾸기 (0) | 2021.01.26 |
---|---|
[JS] Promise (0) | 2021.01.26 |
함수형 프로그래밍 키워드 정리 (0) | 2021.01.21 |
[프로그래머스_JS] 모의고사 (0) | 2021.01.20 |