프로세스와 스레드
프로그램은 실행을 시킬수 있는 코드 덩어리 파일이다.
프로세스는 그 프로그램을 실행시키기 위한 것이고
스레드는 프로세스의 코드에 정의된 절차에 따라 실행되는 특정한 수행경로
프로세스
- 최소 작업 단위
- 프로세스는 각 독립된 메모리 영역을 가지고 있다.
- code/Data/stack/heap 형식으로 할당
- 각 프로세스들은 독립되어 있기때문에 다른 프로세스에 접근을 할 수 가 없다.
* 기본 개념은 이렇지만 사실 공유는 가능하다.
1. IPC를 사용하거나 LPC를 사용한다.
2. 별도로 공유 메모리를 만들어 정보를 주고받도록 설정
하지만 이 방법들은 자원 부담이 크다.
- 하나의 프로세스는 하나 이상의 스레드를 가진다.
IPC(Inter-Process Communication)란
프로세스간에 통신을 가능하게 해주는 기술들
공유메모리, 세마포어, 메시지큐, 소켓, 파일 등
LPC(Local inter-Process Communication)란
커널에서 구현된 빠른 속도의 메시지 기반 통신 메커니즘
스레드
- 스레드는 스레드 간 메모리를 공유한다.
각자 자기만의 스택 영역을 가지고 있지만
나머지 영역(코드/데이터/힙)은 공유한다.
차이
- 프로세스는 서로 독립되어 있으니 특정 프로세스가 죽는다 하더라도 다른 프로세스에 영향X
- 그에반해 스레드는 코드/데이터/힙 영역을 공유하고 있기때문에 특정 스레드가 오류가 발생하면 다른 스레드도 전부 강제 종료된다.
마치 코드짜고 컴파일할때 코드하나 오류나면 프로그램이 아예 강제종료되는 것과 같은 것...
멀티태스킹
하나의 운영체제 안에서 여러 프로세스가 실행되는 것
- 동시에 실행되는 것처럼 보이지만 실제론 그렇지 않음
멀티스레드
하나의 프로세스가 여러작업을 여러 스레드를 사용해 동시에 처리하는 것
- 멀티스레드를 사용하면 각각의 스레드 중 어떤 것이 어떤 순서로 실행될지 알 수 없음
멀티스레드의 장점
- Context-Switching할 때 공유하고 있는 메모리만큼의 메모리 자원을 아낄 수 있다.
- 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적어서 응답 시간이 빠르다.
멀티스레드의 단점
- 스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있다.
- 자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수밖에 없다.
Context-Switching 이란
현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정
동기화 문제 (Synchronization Issue)
여러 스레드가 함께 전역 변수를 사용할 경우 발생할 수 있는 충돌
예시
멀티스레드를 사용하면 각각의 스레드 중 어떤 것이 어떤 순서로 실행될 지 그 순서를 알 수 없다. 만약 A 스레드가 어떤 자원을 사용하다가 B 스레드로 제어권이 넘어간 후 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은 A 스레드가 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.
프로그래밍할 때 멀티스레드를 사용하려면 신중해야 한다
학습에 참고한 사이트