이미지 출처 : Charlezz
💬 오늘 배울것은 쓰레드와 프로세스.........
어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행하며,
두 개 이상의 스레드를 가지는 프로세스를멀티스레드 프로세스
라고 한다!
멀티스레드의 장점
cpu의 사용률을 향상
자원의 효율적인 사용
사용자에 대한 응답성이 향상
작업이 분리되기때문에 코드 간결
다만, 멀티스레드 프로세스는 여러 스레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 발생할 수 있는 동기화(synchronization)
, 교착상태(deadlock)
같은 문제들을 고려해서 프로그래밍을 해야한다.
동기화
: 여러 스레드가 한 리소스를 사용하려 할 때 사용하려는 스레드 하나를
제외한 나머지 스레드들은 리소스를 사용하지 못하도록 막는 것을 말한다.
교착상태
: 운영체제 혹은 소프트웨어의 잘못된 자원 관리로 인하여 두 개 이상의 프로세스가 서로의 작업이 끝나기만을 기다리고 있어 둘 다 영원히 끝나지 않는 상황을 가리킨다.
사용자 레벨 스레드 (User-Level Thread)
커널 레벨 스레드 (Kernel-Level Thread)
1.Runnable 인터페이스를 구현하는 방법
2.Thread 클래스를 상속받는 방법
프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말하며,
스케줄링의 대상이 되는 작업(task)과 같은 의미로 쓰인다.
가상 메모리는 프로세스당 아래와 같은 구조를 가지는데, 모두 5대영역으로 나뉜다.
아래 그림과 같이 데이터를 분류하여 각 영역에 저장하는 것이다.
출처: https://zapiro.tistory.com/entry/함수와-메모리-영역 [The Catcher in the Rye:티스토리]
code
: 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로,
함수, 제어문, 상수등이 여기에 저장된다.
DATA
: 초기화된 전역변수가 저장된다.
BSS
: 초기화 안된 전역변수가 저장된다.
( DATA
영역과 BSS
영역을 묶어서 데이터영역
이라고 칭하기도 한다.)
HEAP
: malloc(), calloc() 등으로 프로그래머가 자율적으로 메모리 크기를 할당할 수 있는 영역이다. => 위의 함수들은 free()함수로 할당된 영역을 반납해줘야하므로 동적할당 영역!
STACK
: 지역변수가 할당되는 영역으로 함수가 호출되면 할당되었다 함수의 종료시 반납되는 영역이다.
여기서! HEAP
과 STACK
은 서로 같은 공간을 사용하는데,
서로의 공간을 침범하는 행위를 HEAP OVERFLOW
, STACK OVERFLOW
라고 한다.
CPU는 하나인데 동시에 실행되어야 할 프로세스가 여러개일 경우,
CPU가 고속으로 여러 프로세스를 일정한 기준으로 순서를 정해서 실행한다.
CPU 할당 순서 및 방법을 결정하는 일을 스케줄링이라고 한다!
▲ 기본상태
▲ 지연상태
▲ 상태종류
▲ 상태 전이동작
출처 : IT위키
프로세스는 운영체제로부터 자원을 할당받는 "작업"의 단위이고,
스레드는 프로세스가 할당받은 자원을 이용하는 "실행"의 단위이다.
쉽게 말하자면 코드의 집합으로 이루어진 프로그램이 실행되는 것이 프로세스
이다.
내가 컴퓨터를 켜서 이클립스를 키고, 네이버를 키는등의 행위는 프로세스
이다.
스레드
는 할당 받은 자원을 이용하는 단위이며, 프로세스 내에 여러 개가 생길 수 있다.
이클립스를 켜서 프로그램을 돌리면 스레드
가 발생하고, 코드를 수정해서 또 프로그램을 돌리면 다시 스레드
가 발생한다.
여러 개의 스레드가 생겨나는 것을 뜻하는 것이
멀티스레드
이다.
또, 프로세스가 동시에 2개가 실행되는 것이멀티 프로세스
다.
하지만 멀티프로세스는 동시에 진행되는것 처럼 보일뿐 실제로 동시 진행되는건 아니다!
쉽게 말해, 카카오톡을 실행할 때는 카카오톡이 CPU위에 올라온다.
그리고 크롬을 또 실행하면 카카오톡은 준비 상태로 CPU에서 내려가게 되고, 크롬이 CPU자리에 올라오게 된다.
이처럼 두개 이상의 프로세스가 동시에 진행되는 것 처럼 보이지만,
사실은 번갈아가면서 수행되는거다~~
이것을 Context Switching
이라고 한다.
쓰레드는 경량화된 프로세스라고 한다.
하나의 프로세스안에 다수의 쓰레드가 있을 때, 쓰레드는 프로세스처럼 모든 영역들을 다 빼고 넣고 하지않아도 된다.
각 쓰레드는 스택 부분만을 따로 가지고, 코드, 데이터, 힙 영역은 공유하기 때문이다.
이를 통해 메모리 사용이 훨씬 효율적이게 된다.