[백엔드 로드맵 - OS] 쓰레드와 동시성

Sierra·2022년 7월 26일
0

Backend-Roadmap

목록 보기
13/43
post-thumbnail

Intro

이번 포스팅에서는 쓰레드와 동시성에 대해 알아보겠다.

Thread

쓰레드 그 자체는 아마 JAVA든 C언어로 시스템 프로그래밍을 해 봤든 경험 해 봤을 것이다.

쓰레드라는 단어의 뜻과 비슷하게(?) 프로그램이 가지는 하나의 흐름을 쓰레드라고 부른다. 일반적으로는 하나의 프로그램은 하나의 쓰레드를 가진다. 근데 과연 지금까지 모든 프로그램이 쓰레드를 하나만 가지고 있다면 어떤 일이 벌어질까?

Multi Threads

웹 브라우저와 같은 프로그램은 멀티 쓰레드를 사용한다. 화면을 출력하고 데이터를 가져오고 다른 유틸리티를 사용하는 등 웹 브라우저 자체에서 엄청나게 많은 기능들이 실행 되고 있는 것을 알 수 있다. 과연 이 작업들을 한 단위로 묶어서 실행 시킬 수 있을까?

현대 OS는 이런 멀티쓰레드 방식을 채택하여 하나의 프로세스 안에서 여러 쓰레드를 수행한다. 그러다 다른 프로세스로 넘어가서 그 프로세스의 쓰레드를 수행한다. 다중 쓰레드를 사용한다면 정말 많은 작업들을 한번에 해치울 수 있다.

Process 내의 Thread

프로세스 내에는 코드영역과 메모리 영역이 존재하고 여러 쓰레드가 이걸 공유한다. 프로세스 그 자체가 가지고 있는 자원들은 쓰레드가 공유하지만 각 쓰레드들이 고유하게 PC(Program Counter)와 Stack Pointer, Registers, Stack등을 가지고 있다.

Concurrency VS Parallelism

동시성은 겉으로 보기에 동시에 실행 되는 것 처럼 보이는 것이다. 병렬성은 실제로 동시에 실행되는 것이다.
동시성은 논리적인 개념이고 병렬성은 물리적인 개념이다.
그리고 동시성은 싱글코어, 멀티코어에서 가능하지만, 병렬성은 멀티코어 에서만 가능하다.

실제로 병렬적으로 프로그램을 실행시키면 여러가지 프로그램을 동시에 실행 시키니 성능이 올라가긴 하겠지만 race condition(경쟁 상태), syncronization(동기화) 문제가 발생 할 수 있다.

동시성을 가지도록 프로그램을 실행시키면 빠르게 프로그램들이 서로 전환되며 동시에 실행 되는 것 처럼 보인다. 하지만 작업들이 복잡하게 엉켜있다. OS의 스케쥴링 정책에 의해 복잡하게 엉켜있지만 겉으로 보이기에는 Concurrency하게 움직인다. 마찬가지로 동기화 문제가 발생 할 수 있다.

위와 같은 한 가지 공유자원을 건드리는 문제에서 각각 Task 별로 예상되는 결과가 있지만, 동기화 문제가 생긴다면 두 작업에 다 영향을 끼칠 수 있다.

그러므로 동기화 기법들을 사용해서 이런 문제를 해결해야 한다.

Outro

쓰레드, 그리고 동시성에 대해 알아보았다. 다음 주제는 메모리 관리로 돌아오겠다.

Reference

https://spacebike.tistory.com/22
https://jins-dev.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS%EA%B0%80-%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94-%EB%8F%99%EC%8B%9C%EC%84%B1-%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC
https://seohs.tistory.com/461

profile
블로그 이전합니다 : https://swj-techblog.vercel.app/

0개의 댓글