Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 세마포어와 뮤텍스
- 최단 경로
- 프록시서버
- 웹 호스팅
- 싸피 면접 후기
- 다익스트라 알고리즘
- 서버 호스팅
- Dijkstra Algorithm
- SSAFY
- floyd-warshall
- Synchronization
- 호스팅이란?
- 뮤텍스란?
- 클라우드 서버
- 싸피 합격
- 다익스트라
- 세마포어
- 세마포어와 뮤텍스의 차이
- 호스팅
- 세마포어란?
- 플로이드 와샬
- Proxy Server
- 삼성 청년 SW 아카데미
- 뮤텍스
- 프록시
- 동기화
- 싸피
- Proxy
- 플로이드 워셜
Archives
- Today
- Total
어제의 나보다 성장한 오늘의 나
프로세스와 스레드의 차이 본문
먼저 프로세스와 스레드에 대해 본격적으로 설명하기 전에 프로그램에 대해서 알고 가야 한다.
프로그램(Program)이란?
- 사전적 의미 : "어떤 작업을 위해 실행할 수 있는 파일"
- 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가지 있지 않은 정적인 상태
- 메모리에 올라가 있지 않은 : 아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았다는 뜻이다. 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해줘야 실행될 수 있다.
- 정적인 상태 : 단어 그대로 움직이지 않은 상태 즉! 아직 실행되지 않고 가만히 있다는 뜻이다.
- 위 2가지 형태로 본다면 아직 실행되지 않은 파일 그 자체를 가리키는 말이다.
프로그램을 실행하는 순간 해당 파일은 컴퓨터 메모리에 올라가게 되고, 이 상태를 동적인 상태라고 하며 이 상태의 프로그램을 프로세스라고 한다. 위키피디아에서는 프로세스에 대해 정의를 내릴 때 실행되고 있는 컴퓨터 프로그램이라고도 하며, 스케줄링 단계에서의 '작업'과 같은 단어로 봐도 무방하다고 한다.
프로세스(Process)란?
- 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스 (독립적인 개체)
- 즉! 프로그램을 실행하게 되면 CPU를 차지하면서 수행하는 수행주체가 프로세스이고 프로그램은 하나지만 이 프로그램을 실행하는 인스턴스는 여러 개가 생길 수 있다.
- 운영체제로부터 자원을 할당받는 작업의 단위
- 동적인 개념으로는 실행된 프로그램을 의미
스레드(Thread)란?
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스의 특정한 수행 경로
- 프로세스가 할당받은 자원을 이용하는 실행의 단위
프로세스와 스레드의 작동 방식
- 프로세스가 메모리에 올라갈 때 운영체제로부터 시스템 자원을 할당받는다.
- 이때 운영체제는 프로세스마다 각각 독립된 메모리 영역을, Code/Data/Stack/Heap의 형식으로 할당해준다.
- 각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
- 하지만!!! 한 프로세스가 다른 프로세스의 자원을 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다. Ex) 파이프, 파일, 소켓 등을 이용한 통신 방법
- 이와 다르게 스레드는 메모리를 서로 공유할 수 있다.
- 프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다.
- 따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있다.
여기서! 프로세스와 스레드의 중요한 차이 하나
만약 한 프로세스를 실행하다가 오류가 발행해서 프로세스가 강제로 종료된다면??? 다른 프로세스에게 어떤 영향이 있을까?? -> 공유하고 있는 파일을 손상시키는 경우가 아니라면 아무런 영향을 주지 않는다.
그런데!!! 스레드의 경우는 다르다. 스레드는 Code/Data/Heap 메모리 영역의 내용을 공유한다. 따라서 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내에서 다른 스레드 모두가 강제로 종료된다.
멀티 프로세스와 멀티 스레드의 차이
멀티 프로세스
- 멀티 프로세싱
- 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것이다.
- 장점
- 여러 개의 자식 프로세스 중 하나가 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.
- 단점
- Context Switching에서 오버헤드
- Context Switching 과정에서 캐시 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생한다.
- 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 프로세스 사이의 공유하는 메모리가 없어 Context Switching이 발생하면 캐시에 있는 모든 데이터를 모두 리셋하고 캐시 정보를 불러와야 한다.
- 프로세스 사이의 어렵고 복잡한 통신 기법(IPC)
- 프로세스는 각각의 독립된 메모리 영역을 할당받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없고 통신 기법을 이용해야 된다.
- Context Switching에서 오버헤드
- 참고! Context Switching이란?
- CPU에서 여러 프로세스를 돌리면서 작업을 처리하는 과정을 말한다.
- 구체적으로 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
멀티 스레드
- 멀티 스레딩
- 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것
- 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티 스레딩을 기본으로 하고 있다.
- 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.
- 정점
- 시스템 자원 소모 감소 (자원의 효율성 증대)
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리
- 시스템 처리량 증가( 처리 비용 감소 )
- 스레드 간 데이터를 주고받는 것이 간단해지고 시스템 자원 소모가 줄어듦
- 스레드 사이의 작업량이 작아 Context Switching이 빠르다.
- 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
- 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.
- 시스템 자원 소모 감소 (자원의 효율성 증대)
- 단점
- 주의 깊은 설계 필요
- 디버깅의 까다로움
- 단일 프로세스 시스템의 경우 효과를 기대하기 어려움
- 다른 프로세스에서 스레드를 제어할 수 없음 (즉, 프로세스 밖에서 스레드를 제어할 수 없다.)
- 멀티 스레드의 경우 자원 공유 문제가 발생 (동기화 문제)
- 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받음
멀티 프로세스 대신! 멀티 스레드를 사용하는 이유
멀티스레드의 장점
- Context-Switching 할 때 공유하고 있는 메모리만큼의 메모리 자원을 아낄 수 있다.
- 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적어서 응답 시간이 빠르다.
멀티스레드의 단점
- 스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있다.
- 자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수밖에 없다.
동기화 문제
- 멀티스레드를 사용하면 각각의 스레드 실행 순서를 할 수 없다.
- A 스레드가 자원을 사용하다가 B 스레드로 제어권이 넘어간 후 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은 A 스레드가 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.
자바 스레드(Java Thread)란
- 일반 스레드와 거의 차이가 없으며, JVM가 운영체제의 역할을 한다.
- 자바에는 프로세스가 존재하지 않고 스레드만 존재
- 자바 스레드는 JVM에 의해 스케줄 되는 실행 단위 코드 블록이다.
- 자바에서 스레드 스케줄링은 전적으로 JVM에 의해 이루어진다.
- 아래와 같은 스레드와 관련된 많은 정보들도 JVM이 관리한다.
- 스레드가 몇 개 존재하는지
- 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인지
- 스레드 상태는 무엇인지
- 스레드 우선순위는 얼마인지
- 즉! 개발자는 자바 스레드로 작동할 스레드 코드를 작성하고, 스레드 코드가 생명을 가지고 실행을 시작하도록 JVM에 요청하는 일뿐이다.
출처
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 동기화 Synchronization , Race condition (0) | 2021.04.24 |
---|---|
스케줄러의 종류(장기스케줄러, 중기스케줄러, 단기스케줄러) (0) | 2021.04.24 |
교착상태(DeadLock)가 무엇인가? (0) | 2021.04.23 |
운영체제의 CPU 스케줄링 (0) | 2021.04.22 |
운영체제의 개요 (1) | 2021.04.21 |
Comments