쓰레드와 프로세스

이애옹·2022년 9월 29일
0
post-thumbnail

이미지 출처 : Charlezz

💬 오늘 배울것은 쓰레드와 프로세스.........

📝 쓰레드(Thread)

💡 쓰레드가 무엇일까?

어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행하며,
두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다!

멀티스레드의 장점

  • cpu의 사용률을 향상

  • 자원의 효율적인 사용

  • 사용자에 대한 응답성이 향상

  • 작업이 분리되기때문에 코드 간결

다만, 멀티스레드 프로세스는 여러 스레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 발생할 수 있는 동기화(synchronization), 교착상태(deadlock) 같은 문제들을 고려해서 프로그래밍을 해야한다.

동기화 : 여러 스레드가 한 리소스를 사용하려 할 때 사용하려는 스레드 하나를
제외한 나머지 스레드들은 리소스를 사용하지 못하도록 막는 것을 말한다.

교착상태 : 운영체제 혹은 소프트웨어의 잘못된 자원 관리로 인하여 두 개 이상의 프로세스가 서로의 작업이 끝나기만을 기다리고 있어 둘 다 영원히 끝나지 않는 상황을 가리킨다.

💡 쓰레드의 종류

사용자 레벨 스레드 (User-Level Thread)

  • 커널 영역의 상위에서 지원되며 일반적으로 사용자 레벨의 라이브러리를 통해 구현
  • 라이브러리는 스레드의 생성 및 스케줄링 등에 관한 관리 기능을 제공

커널 레벨 스레드 (Kernel-Level Thread)

  • 운영체제가 지원하는 스레드 기능으로 구현
  • 커널이 스레드의 생성 및 스케줄링 등을 관리

💡 쓰레드 구현 방법

1.Runnable 인터페이스를 구현하는 방법

2.Thread 클래스를 상속받는 방법

📝 프로세스(Process)

💡 프로세스가 무엇일까?

프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말하며,
스케줄링의 대상이 되는 작업(task)과 같은 의미로 쓰인다.

💡 프로세스의 메모리 영역

가상 메모리는 프로세스당 아래와 같은 구조를 가지는데, 모두 5대영역으로 나뉜다.
아래 그림과 같이 데이터를 분류하여 각 영역에 저장하는 것이다.

출처: https://zapiro.tistory.com/entry/함수와-메모리-영역 [The Catcher in the Rye:티스토리]

code : 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로,
함수, 제어문, 상수등이 여기에 저장된다.

DATA : 초기화된 전역변수가 저장된다.

BSS : 초기화 안된 전역변수가 저장된다.
( DATA 영역과 BSS영역을 묶어서 데이터영역이라고 칭하기도 한다.)

HEAP : malloc(), calloc() 등으로 프로그래머가 자율적으로 메모리 크기를 할당할 수 있는 영역이다. => 위의 함수들은 free()함수로 할당된 영역을 반납해줘야하므로 동적할당 영역!

STACK : 지역변수가 할당되는 영역으로 함수가 호출되면 할당되었다 함수의 종료시 반납되는 영역이다. 

여기서! HEAPSTACK은 서로 같은 공간을 사용하는데,
서로의 공간을 침범하는 행위를 HEAP OVERFLOW, STACK OVERFLOW 라고 한다.

💡 프로세스 스케줄링 (Process Scheduling)

CPU는 하나인데 동시에 실행되어야 할 프로세스가 여러개일 경우,
CPU가 고속으로 여러 프로세스를 일정한 기준으로 순서를 정해서 실행한다.
CPU 할당 순서 및 방법을 결정하는 일을 스케줄링이라고 한다!

💡 프로세스 상태변화


▲ 기본상태


▲ 지연상태


▲ 상태종류


▲ 상태 전이동작

출처 : IT위키

📝 쓰레드와 프로세스

💡 프로세스와 스레드의 차이

프로세스는 운영체제로부터 자원을 할당받는 "작업"의 단위이고,
스레드는 프로세스가 할당받은 자원을 이용하는 "실행"의 단위이다.

쉽게 말하자면 코드의 집합으로 이루어진 프로그램이 실행되는 것이 프로세스이다.
내가 컴퓨터를 켜서 이클립스를 키고, 네이버를 키는등의 행위는 프로세스이다.

스레드는 할당 받은 자원을 이용하는 단위이며, 프로세스 내에 여러 개가 생길 수 있다.
이클립스를 켜서 프로그램을 돌리면 스레드가 발생하고, 코드를 수정해서 또 프로그램을 돌리면 다시 스레드가 발생한다.

💡 멀티스레드와 멀티프로세스

여러 개의 스레드가 생겨나는 것을 뜻하는 것이 멀티스레드이다.
또, 프로세스가 동시에 2개가 실행되는 것이 멀티 프로세스다.

하지만 멀티프로세스는 동시에 진행되는것 처럼 보일뿐 실제로 동시 진행되는건 아니다!

쉽게 말해, 카카오톡을 실행할 때는 카카오톡이 CPU위에 올라온다.
그리고 크롬을 또 실행하면 카카오톡은 준비 상태로 CPU에서 내려가게 되고, 크롬이 CPU자리에 올라오게 된다.

이처럼 두개 이상의 프로세스가 동시에 진행되는 것 처럼 보이지만,
사실은 번갈아가면서 수행되는거다~~

이것을 Context Switching 이라고 한다.

💡 쓰레드 = 경량화된 프로세스

쓰레드는 경량화된 프로세스라고 한다.
하나의 프로세스안에 다수의 쓰레드가 있을 때, 쓰레드는 프로세스처럼 모든 영역들을 다 빼고 넣고 하지않아도 된다.
각 쓰레드는 스택 부분만을 따로 가지고, 코드, 데이터, 힙 영역은 공유하기 때문이다.
이를 통해 메모리 사용이 훨씬 효율적이게 된다.

👀 참고자료

profile
안녕하세요

0개의 댓글