<목차>
들어가는 말
1.프로그램과 프로세스(Process)란?
2.프로세스의 진행 방식
3.스레드(Thread)란?
4.스레드를 사용하는 프로그래밍의 장단점과 보완 방법
아마 컴퓨터를 구매한 경험이 있다면 코어, 쓰레드와 같은 단어를 한번쯤은 들어봤을 것입니다.
여기서 말하는 '코어', '쓰레드'는 어떤 것일까요?
1.프로그램과 프로세스(Process)란?
우리 컴퓨터에서 실행할 수 있는 파일(윈도우의 경우 .exe가 붙은 파일)들을 프로그램이라고 합니다.
그리고 이 프로그램이 실행되서 돌아가고 있는 상태, 즉 컴퓨터가 어떤 일을 하고 있는 상태를 프로세스라고 합니다.
우리가 어떤 작업을 진행할때 버벅이거나 끊기지 않고 쾌적하게 컴퓨터를 사용할 수 있는 것은
운영체제가 여러개의 프로세스를 함께 돌리고 있기 때문입니다.
윈도우의 경우 ctr + alt + del를 눌러 작업관리자 창에서 현재 어떤 프로그램이 돌아가고 있는지 확인할 수 있습니다.
여러 프로세스를 함께 돌리는 작업은 동시적 / 병렬적 또는 둘의 혼합으로 이루어집니다.
2.프로세스의 진행 방식
간단하게 설명하면 동시성은 아래와 같이 프로세서 하나가 여러 작업을 돌아가면서 각각의 작업을 일부분씩 수행하는 것입니다.
이때 작업을 바꾸는 것을 'Context Switching'이라고 합니다.
이 Context Switching에도 다양한 방식과 알고리즘이 사용됩니다.
이런 과정이 매우 빠르게 이루어져서 사용자는
마치 동시에 진행되는 것처럼 느끼게 됩니다.
병렬성은 프로세서 하나에 여러개의 코어가 달려서
각각의 코어가 동시에 병렬적으로 작업을 수행하는 것을 말합니다.
처음에 사진에 나온 듀얼코어(x2), 쿼드코어(x4), 옥타코어(x8)와 같이 멀티코어 프로세서가 달린 컴퓨터에서 사용 가능한 방식입니다.
CPU의 속도가 발열등의 물리적 제약으로 인해서 예전만큼 빠르게 발전하지 못하자
그 대안으로 코어를 여러개 달아서 작업을 분담할수 있도록 만든 것입니다.
3.스레드(Thread)란?
이제 컴퓨터는 여러 프로세스를 함께 돌릴수 있습니다.
하지만 우리가 사용하는 이 창도 하나의 브라우저이고 이것은 프로세스에 해당합니다.
브라우저가 일을 하고 있을 때에도 다른 창에 가서 설명글을 읽거나, 카카오톡 채팅을 하고,
유튜브의 영상 데이터를 받아 실행할 수 있어야 합니다.
한 프로세스 내에서도 여러 갈래의 작업이 동시에 진행될 필요가 있는 것입니다.
이런 갈래를 쓰레드 라고 합니다.
4.스레드를 사용하는 프로그래밍의 장단점과 보완 방법
컴퓨터는 프로세스마다 자원을 분할해서 할당합니다.
게임을 다운로드 받는 부분, 카톡을 하는 부분, 유튜브를 실행하는 부분 등등 말이죠!
프로세서가 혼자서 돌아다니면서 동시에 진행하던지, 여러개의 프로세서로 병렬적으로 진행을 하던지,
아니면 이 두가지를 섞어서 사용하면서 이 과정을 진행하는 것입니다.
특정 부분의 스레드는 같은 메모리에서 처리됩니다.
하나의 프로세스를 처리할 때는 같은 메모리(자원)를 공유하는 것이 더 효율적일 것입니다.
프로세스는 컴퓨터의 자원을 분할해서 사용하지만,
스레드는 프로세스마다 주어진 전체 자원을 함께 사용하는 것입니다.
이런 방식이 속도와 효율면에서는 좋지만 단점도 존재합니다.
프로세스 안에서 공유되는 변수에 스레드 두 개가 동시에 접근을 할 수도 있습니다.
이런 시간 문제로 발생하는 상황들을 예상하고 방지해야 하기 때문에 스레드를 사용하는 프로그래밍은
코드를 짜기도, 디버깅으로 오류를 찾아내고 원인을 밝히기도 까다롭습니다.
다행히도 'Closure/ Lambda/ Actor/ Functional Programming' 와 같이
이런 작업을 더 쉽고 안전하게 도와주는 도구나 방식들이 존재하고 있습니다.
오늘은 프로세스와 스레드에 대해서 살펴보았습니다.
긴글 읽어주셔서 감사합니다.
질문과 지적은 댓글로 환영합니다!
오늘도 즐코하세요!! :)
참고 자료
https://www.youtube.com/watch?v=iks_Xb9DtTM
https://www.youtube.com/watch?v=_dhLLWJNhwY
https://ko.wikipedia.org/wiki/스레드_(컴퓨팅)
'CS' 카테고리의 다른 글
[CS] 프로그래밍 에러의 종류 ( 컴파일 / 런타임 / 논리 / 시스템 / 링킹 에러 ) (0) | 2022.04.07 |
---|---|
파스칼 케이스 / 카멜 케이스 / 스네이크 케이스 - 표기법 구분하기! (0) | 2022.04.06 |
바이너리 파일이란? (0) | 2022.02.24 |
JDK vs JRE (0) | 2022.01.24 |
[CS] BUILD 란? (0) | 2022.01.24 |