프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위
스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
프로그램이란, 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태
즉, 아직 실행되지 않은 상태
프로그램은 실행되지 않은 파일.
프로세스는 실행된 파일
운영체제는 안정성을 위해 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근할 수 있도록 제약을 두고있고, 이를 벗어나는 정보에 접근하려면(다른 프로세스에 접근하려면) 오류가 발생하기 때문에, 더 작은 실행단위 개념이 필요하게 되었고, 이 개념이 바로 스레드
프로세스가 메모리에 올라갈 때 운영체제로부터 자원을 할당받는데,
각각 독립된 메모리 영역을
의 형식으로 할당해 준다. 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
위와 같이 각각 다른 메모리 영역을 가지고 있다.
스레드는 메모리를 서로 공유할 수 있다.
프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고,
나머지 Code, Data, Heap 형식으로 할당된 메모리 영역을 공유한다.
따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.
Stack을 각각 할당 받고 나머지 프로세스의 Code, Data, Heap 메모리 영역을 공유한다.
프로세스와 스레드의 중요한 차이 중 하나.
멀티테스킹: 하나의 운영체제 안에서 여러 프로세스가 실행되는 것.
멀티스레드 하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는 것.
Context-Switching을 할때 공유하고있는 메모리만큼 메모리 절약 가능(Context Switching이란 현재 진행하고있는 Task의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정)
스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신 부담이 적어 응답 시간이 빠르다.
시스템의 처리율이 향상된다.
스레드 하나가 프로세스 내의 자원을 망쳐버리면 모든 프로세스가 종료될 수 있다.
자원을 공유하기 때문에 필연적으로 동기화 문제가 발생한다.
프로세스 간 Context-Switching 시 자원 손실이 발생하지만 스레드 간 Context-Switching 에서는 메모리를 공유하고 있는 만큼 부담을 덜 수 있다.
동기화 문제는 머리스레드에서 꼭 짚고 넘어가야 할 점인데,
멀티스레드를 사용하면 각각의 스레드 중 어떤 것을 어떤 순서로 실행할 지 순서를 알 수 없다.
1번 스레드가 자원을 사용하다가 2번 스레드로 제어권이 넘어간 후 2번 스레드가 해당 자원을 수정했을 때 다시 제어권을 받은 1번 스레드가 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.
이처럼 여러 스레드가 함께 전역 변수를 사용할 경우 발생할 수 있는 충돌을 동기화 문제라고 한다.