티스토리 뷰

728x90
매일 어렴풋이만 알고 있던 Process와 Thread를 정리해보자고!
개인적으로 공부하고 있는 부분이라
정확하지 않은 부분이 있어!!!!
그럴 시, 니말이 다 맞음~

 

Thread란?


사실 이 전 직종에서는 쓰레드는 그저 실이다 실
컴퓨터 공학 내에서 작업을 얘기하는거니까 
실이 어떤 의미로 쓰일지는 대~~~충 감은 온다
하지만 그전에 Process가 뭔지 알아야한다 ^^

 

 

Process란?

일상적으로 자주 사용하는 말이다.
이 업무는 요딴 프로세스로 진행되는거여~
그래서 컴퓨터 공학에서의 프로세스는 뭔데?

프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이다.
더 쉽게 말하자면, 지금 실행중인 프로그램!

프로그램을 실행시키려면 프로그램이 컴퓨터에서 메모리를 할당 받아야 하는데,
그걸 가리켜서 자원을 할당받는 다고 하는거지

(메모리에는 코드, 데이터, 스택, 힙 뭐 이런 것들이 있다는데
이건 다음 장에서 자세히 다뤄보자
stack은 자료 구조에서 한 번 보긴 했어 후후)

만약 프로그램 자체가 매우 복잡해서 프로세스 하나만으로는 감당이 안될 때가 있다고 가정하자.
그럼 그런 생각을 할 수 있겠지?
"아니 그럼 프로세스 여러개를 하나의 프로그램으로 만들 순 없는거임?"

있습니다 ㅠㅠㅠㅠㅠ 네네 있습니다. 그거시 멀티프로세스 입니다...ㅠㅠ
잘은 모르겠지만 IPC(Inter-Process Communication)이나 LPC(Local-Inter-Process Communication)을 사용하거나
프로세스끼리 공유 가능한 메모리를 별도로 만들어줘야 한다고 한다...ㅎㅎ
아무턴 복잡하다!!!!
또 하나의 단점이라면, 자원은 한 프로세스 들렀다가 다른 프로세스 들렀다가 하는 식으로 진행되기 때문에

공유되는 프로세스라면 서로의 상태를 공유해야한다.
상태는 Context라고 하는데, 공유를 위해 서로 계속 Context를 바꿔줘야 하므로
Swiching 하는데 드는 시간이 필요하다 
시간 = 비용..

일단은 프로세스끼리의 공유는 복잡하다!
장점이라면, 프로세스끼리 하나의 프로그램을 돌리기 때문에 하나의 프로세스가 오류나도 
프로그램 자체는 종료되지 않는다
왜냐면 애초에 프로세스는 자원을 공유하지 않크든요

 


이 쯤에서 힘차게 등장해주시는 Thread!
Thread는 프로세스 하나로는 감당이 안되는데, 멀티프로세스러 진행하긴 시간이 많이드니 
프로세스 내부를 작업 단위로 잘게 쪼갠거야
조금 학술적으로다가 얘기해보자면,
스레드는 할당 받은 자원을 이용하는 실행의 단위


자 보자고, 프로세스는 이미 자원을 할당 받은 상태니까 일단 자원이랑 코드가 뭉쳐진 덩어리 라고 가정하자
그리고 스레드는 그 덩어리 내부에 존재하는 작업단위의 흐름들이니 자원을 나눠 쓸 수 있는 코드라는 거지!
예컨데, 프로세스가 main이라면 스레드는 function 쯤으로 정의 할 수 있겠다

 

 

 

조금 더 자세하게 말하자면 아래와 같다.

출처 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

운영체제가 프로그램에 각각 CODE, DATA, STACK, HEAP을 할당해주었고, 할당 받음으로써 프로세스화 됐다!

출처 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

그리고 프로세스 내 스레드는 할당된 자원을 공유하는데, CODE/DATA/HEAP은 프로그램에 할당된 것을 공유하고,
STACK은 할당된 부분에서 스레드가 각각 떼다가 사용헌다


스레드는 한 프로세스 내부에 있고, 한 프로그램을 작동하기 위해 복잡한 작업을 나눠둔 것이다.
가끔 무슨 시스템 오류 창 뜨면서 프로그램 종료가 되는 경우가 있는데 고걸 생각하면 되겠다
물론 걔가 멀티프로세스일 가능성도 있..ㄱ겠고나...ㅎㅎ

 


"어? 근데 웃기네 왜 스레드 오류인데 프로세스가 난리..?"

운영체제 입장에서는 최소단위가 프로세스이기 때문이쥐~

 

 

스레드에는 두 종류가 있다

싱글 스레드 : 말그대로 프로세스 내 단 하나의 스레드가 존재하고 걔 혼자 다 처리! 
멀티 스레드 : 프로세스 내 여러개의 스레드가 존재하고, 나누어 처리하되, STACK을 제외한 나머지 자원 공유!

멀티스레드를 통해 프로세스를 처리하게 되면,
Context 스위칭 하는데 시간이 안드니 훨씬 경제적이지!
단점이라면, 멀티스레드 중 하나의 스레드 잘못되면 전체 프로세스 안뇽
자원을 공유중이기 때문에 하나의 스레드에서 변형된 어떤 자원을
다른 스레드에서 사용하지 못하게 될 경우도 있고 그렇다는 말썸!
이걸 보고 동기화 문제라고 하드라고 

이 동기화 문제 없이 프로세스를 처리할 수 있는 멀티스레드를 Thread Safe한 경우라고 할 수 있다네
각각의 스레드가 지역변수만을 사용한다거나 하면 문제가 없지 않을까..?
아니면 계속적으로 동기화 시켜준다거나
좀 더 공부해야혀...

 

결론

프로그램 : 저장장치에 저장된, 메모리 할당 안된, 정적 상태의 파일
프로세스 : 메모리 할당 받아 실행중인 프로세스
스레드 : 프로세스 내 자원을 공유하는 실행 단위

멀티프로세스 : 하나의 프로그램을 작동시키기 위해 여러 개의 프로세스 이용하는 것
장점 - 프로세스 하나 오류 생겨도 전체 프로그램이 종료되지는 않는다
단점 - Context Switching에 비용이 든다 (상태 전달)

멀티스레드 : 하나의 프로그램을 작동시키기 위해 하나의 프로세스 내에서 스레드라는 단위로 쪼개놓은 것
부여된 자원은 공유 가능하나 Stack만큼은 각자 할당량이 있다
장점 - Context Switching비용 음슴, 
단점 - 스레드 하나 오류시 전체 프로세스 종료, 자원 공유되므로 발생하는 동기화 문제

728x90

'(기초)그래서 뭘 배운거야? > Java' 카테고리의 다른 글

JV-95-String과 char의 차이  (0) 2022.04.01
JV-93-String / StringBuffer / StringBuilder  (0) 2022.03.28
JV-92-자료구조  (0) 2022.03.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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 31
글 보관함