우선 프로세스, 스레드를 알아보기 전에 프로그램에 대해서 인지를 해야합니다.
프로그램이란, 어떤 작업을 위해 실행할 수 있는 파일을 말합니다.
자세하게, 프로그램은 보조기억장치에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터의 묶음이라고 할 수 있습니다.
즉, 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 말하고,
여기서, “메모리에 올라가 있지 않은” 은 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않아서 아직 실행되지 않고 가만히 있는 정적상태라는 것을 의미합니다.
프로세스
프로그램을 실행하는 순간 *.exe 해당파일은 컴퓨터 메모리에 올라가게 되는데, 이 상태를 동적인 상태라고 합니다.
이상태의 프로그램을 프로세스라고 합니다.
즉, 프로세스는 실행 중인 프로그램을 말합니다
프로그램을 하나 실행시키면 하나의 프로세스가 만들어지는데,
프로세스는 각 상황에 따른 상태(state)를 가지고 있습니다.
프로세스 상태
new, running, waiting, ready, terminated
프로세스가 만들어지는 과정의 상태가 new
프로세스가 다 수행되어서 종료할 때 잠시생기는 상태가 terminated
즉, new와 terminated 상태는 운영체제가 프로세스를 만들거나 종료시킬 때 잠시 임시적으로 있는 상태이고,
이 외의 running, waiting, ready 상태로 인해 프로세스가 수행됩니다.
1. new : 프로세스가 생성중
프로세스가 생성되었지만 아직 OS에 의해 승인받지 못한 상태
2. ready : 프로세스가 CPU에 할당되기를 기다림, running할 준비가 된상태
CPU를 제외한 다른 자원이 준비완료된 상태
보조기억장치(하드웨어) 에 있는 프로그램을 실행시켜 메모리에 로드된 상태
3. running : 명령어들이 실행중
프로세스가 CPU를 할당받아 실제로 프로세스가 수행되고 있는 상태
4. waiting : 프로세스가 어떤 사건 (event)가 일어나기를 기다림
프로세스가 실행하다가 할당받은 CPU를 반납하고, 입출력 작업이 완료되기를 기다리는것같은 특별할한 사건을 기다림
입출력을 수행하는동안 CPU를 놀리면 안되니까
5. terminated : 프로세스의 실행이 종료
프로세스의 실행이 완료되고 할당된 CPU를 반납함
예를 들어 컴퓨터로 음악을 들으면서 게임을하는 도중에 카톡 메시지가 오는 것은 요즘 허다한 일입니다.
시간이 지나면 지날 수록 프로그램이 복잡해지고 프로세스 하나만을 사용해서 프로그램을 실행하기엔 벅차기 마련입니다.
그렇다면 음악을 들으면 게임과 카톡을 할 수 있는 것은 여러 개의 프로세스가 동시에 실행되기 때문일까요?
↘️ 아닙니다. 하나의 CPU 즉 프로세스는 한 순간에 하나의 프로세스만 실행할 수 있습니다.
이러한 상황을 멀티태스킹이라고 합니다.
멀티태스킹이란, 하나의 운영체제 안에서 여러 프로세스가 실행되는 것을 의미합니다.
단지, 운영체제가 빠른 속도로 CPU가 실행할 프로세스를 교체하고 있기 때문에
동시에 여러개의 프로세스가 실행되는 것과 같은 착각이 드는 것 입니다.
동시에 여러가지일을 처리하려면 여러 프로세스를 만들어야 하는데,
프로세스를 하나 새로 만드는 것은 복잡하고 무거운 일이기에 보다 가벼운 방법을 찾다가 나온 개념이 바로 스레드 입니다.
스레드
스레드 : 프로세스 안에서 실행되는 여러 흐름 단위
즉, 하나의 프로세스 내의 다른 스레드와 동일한 메모리 공간을 공유하는 경량 프로세스를 의미합니다.
하나의 프로세스안에 다수의 스레드가 있을 때, 스레드는 프로세스처럼 모든 영역들을 다 빼고 넣고 하지않아도 됩니다.
각 스레드는 스택 부분만을 따로 가지고, 코드, 데이터, 힙 영역은 공유하기 때문에 메모리 사용이 훨씬 효율적입니다.
예를 들어, 공유 사무실을 쓰는데 모니터, 복사기, 커피 머신등이 있을 때
한 사람 즉 하나의 스레드가 나갈 때 공유 자원(모니터, 복사기, 커피 머신)들을
굳이 가지고 나가고 다시 사무실로 가져오고 할 필요 없이 공유하면 된다는 것을 의미합니다.
코드 - 스레드에 의해 실행되는 명령
데이터 - 스레드가 실행되는 동안 사용되는 데이터
힙 - 동적 데이터 구조를 저장하는 데 사용되는 메모리 영역
스택 - 스레드 실행상태를 저장하는 데 사용되는 메모리 영역
작동 방식의 차이
프로세스가 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받았을 때,
운영체제는 프로세스마다 각각 독립된 메모리 영역을, 코드, 데이터, 스택, 힙의 형식으로 할당해줍니다.
각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없습니다.
스레드는 메모리를 서로 공유할 수 있습니다.
프로세스가 할당받은 메모리 영역 내에서 스택 형식으로 할당된 메모리 영역은 따로 할당받고,
나머지 코드,데이터,힙 형식으로 할당된 메모리 영역을 공유합니다.
때문에 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 됩니다.
하지만, 코드,데이터,힙 메모리 영역의 내용을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면
같은 프로세스 내의 다른 스레드 모두가 강제 종료될 수 있습니다.
멀티태스킹이 하나의 운영 체제 안에서 여러 프로세스가 실행되는 것이라면,
멀티스레드는 하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는 것을 의미합니다.
그렇다면 멀티 프로세스와 멀티스레드 중에서는 어느 것이 주로 사용될까요?
싱글스레드 VS 멀티스레드
예를 들어 컴퓨터로 카카오톡을 실행할 때는 카카오톡이 CPU위에 올라가게되고,
크롬을 실행하면 카카오톡은 준비 상태로 CPU에서 내려가게 되고, 크롬이 CPU자리에 올라오게 됩니다.
이러한 것을 Context Switching이라고 합니다.
프로세스를 Context Swithching 하는 작업은 무겁기때문에 너무 잦으면 성능 저하가 발생하지만 그것에 비해
스레드를 생성하거나 Context Swithching 하는 것은 가볍다고 할 수 있습니다.
그렇다면 싱글 스레드와 멀티 스레드의 큰 차이는 무엇일까요?
각각의 장단점을 살펴봅시다.
싱글 스레드
- 하나의 프로세스에서 하나의 스레드 실행
- 하나의 레지스터와 스택으로 표현.
+
1. context switch 작업을 요구하지 않는다.
✅ 문맥 교환 (context switch) 은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.
2. 자원 접근에 대한 동기화를 신경쓰지 않아도 된다.
✅ 여러 개의 스레드가 프로세스의 자원을 공유할 경우,
각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근을 제어해야 한다.
쉽게 말해서, 모든 스레드가 일정 자원에 동시에 접근하거나, 똑같은 작업을 실행하려는 경우,
에러가 발생하거나 원하는 값이 나오지 않는다.
그래서, 스레드들이 동시에 같은 자원에 접근하지 못하도록 제어해줘야만 한다.
이 작업은 프로그래머에게 많은 노력을 요구하고 비용을 발생시킨다.
3. 단순히 CPU만을 사용하는 계산작업이라면, 오히려 멀티스레드보다 싱글스레드로 프로그래밍하는 것이 더 빠르고 효율적이다.
4. 프로그래밍 난이도가 쉽고, CPU, 메모리를 적게 사용한다.
-
1. 여러 개의 CPU를 활용하지 못한다.
✅ 프로세서를 최대한 활용하게 하려면 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다.
다수의 프로그램 인스턴스가 어떻게 상태를 공유할 것인가에 대한 문제다.
2. 연산량이 많은 작업을 하는 경우, 그 작업이 완료되어야 다른 작업을 수행할 수 있다.
3. 싱글 스레드 모델은 에러 처리를 못하는 경우 멈춘다.
✅ 멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복한다.
다만, 새로운 스레드 생성이나 놀고 있는 스레드 처리에 비용이 발생한다.
멀티 스레드
- 프로그램을 다수의 실행 단위로 나누어 실행.
- 프로세스 내에서 자원을 공유하여 자원 생성과 관리의 중복을 최소화
- 서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공
- 각각의 스레드가 고유의 레지스터와 스택으로 표현됨.
+
1. 새로운 프로세스를 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠르다.
2. 프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능하다.
3. 프로세스의 작업전환보다 스레드의 작업전환이 더 빠르다.
-
1. 하나의 스레드만 실행중일 때는 실행시간이 오히려 지연될 수 있다.
2. 멀티 스레딩을 위해 운영체제의 지원이 필요하다.
3. 스레드 스케쥴링을 신경써야 한다.
요약
운영체제가 프로세스에게 Code/Data/Stack/Heap 메모리 영역을 할당해 주고 최소 작업 단위로 삼는
반면, 스레드는 프로세스 내에서 Stack 메모리 영역을 제외한 다른 메모리 영역을 같은 프로세스 내 다른 스레드와 공유한다.
프로세스는 다른 프로세스와 정보를 공유하려면 IPC(프로세스 간 통신)를 사용하는 등의 번거로운 과정을 거쳐야 하지만,
스레드는 기본 구조 자체가 메모리를 공유하는 구조이기 때문에 다른 스레드와 정보 공유가 쉽다.
Reference Path
'CS' 카테고리의 다른 글
SQL 과 NoSQL (0) | 2023.01.09 |
---|---|
SQL Injection (0) | 2023.01.09 |
교착상태 (Deadlock) (0) | 2023.01.09 |
트랜잭션 (0) | 2022.12.27 |
정규화 (0) | 2022.12.27 |