안녕하세요! 운영체제의 두번째 게시글이에요ㅎㅎ :)
첫번째 게시글에서 프로세스에 대한 기본적인 개념에 대해서 설명을 드렸어요
저번시간에 언급드렸듯이 오늘은 "스레드"에 대해서 배워볼까 합니다!!
스레...드..? 뭘 쓰래..? ㅎㅎ
자! 여러분들이 Zoom 이라는 화상회의 프로그램을 실행시키고 유튜브를 켜서 유튜브 영상을 보고있다고 가정할게요!
저번 시간에 설명했던 프로세스 기억나시나요?!
그쵸! Zoom이 하나의 프로세스이고, 유튜브도 하나의 프로세스가 되겠죠?!
그렇다면 Zoom을 한번 살펴볼게요~
Zoom에서 상대가 공유한 화면만 볼 수 있나요? 아니죠!
다른 사람들의 얼굴과 자신의 얼굴이 보여지는 창도 있을거에요! 그리고 서로 소통을 할 수 있는 채팅창까지 활용할 수 있죠.
이처럼 하나의 프로세스 내에서 여러 개로 나눈 조각과 같은 것이 "스레드"랍니다.
즉, 상대 화면을 보여주는 스레드, 채팅할 수 있는 스레드, 알림 스레드 등 어떠한 기능을 담당하는 스레드가 동시에 처리되는 겁니다! ㅎㅎ 엄밀히 따지자면 CPU가 하나인 싱글코어에서는 동시에 처리되는 것처럼 보이는 거죠~
이렇게 하나의 응용 프로그램을 여러개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리 하도록 하는 것을 "멀티 스레드" 라고 부릅니다.
이것과 비슷하게 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것을 "멀티 프로세스"라고 부릅니다.
예를 들면, 크롬창을 켰을 때 새탭을 누르면 새로운 창이 뜨게 되는데 각각의 탭들은 프로세스인거죠!
그래서 크롬창에서 하나의 탭을 종료시켜도 다른 프로세스는 살아있게 되는 거죠.
왜냐하면 서로 독립관계니깐요!
그리고 각 페이지 안에서는 여러일을 할 수 있는데, 다운로드를 진행하면서 구글링을 할 수 있는것처럼요~
즉, 크롬 브라우저에서는 멀티프로세스이면서 멀티스레드를 한다고 생각하시면 됩니다!
조금 이해되시나요??!
저번 시간에 프로세스에 대한 구조를 설명 드렸어요 ㅎㅎ 코데스힙(code, data, stack, heap) 기억나시죠??
기억이 안나시면 아래 더보기를 눌러주세요!
Code 는 프로그램을 실행시키잖아요? 그러면 파일 내에 명령어들이 존재 하는데 이 명령어들을 메모리 상에 올려놔야해요. 즉, 명령어들이 존재하는 공간이 Code랍니다.
Heap 은 C의 malloc 또는 C++ new 라는 키워드를 써서 동적할당 하는 코드를 써본 경험이 있을거에요. 즉, runtime 시간에 동적할당을 위해 존재하는 공간이 Heap 입니다
Data 는 크게 data영역과 bss영역이 존재하는데 전역/정적변수, 배열, 구조체 등이 위치하는 공간으로 초기화 한 데이터는 data 영역에 속하고, 초기화 되지 않은 데이터는 bss영역에 저장된다고 보시면 됩니다!
Stack 은 함수를 호출할 때 해당 함수에서 사용되는 지역변수와 매개변수, 리턴 값 등 잠시 사용되었다가 없어지는 데이터를 저장하는 공간이 Stack 입니다~
위의 그림처럼 하나의 프로세스는 해당 메모리영역을 할당 받고, 스레드는 프로세스 내에서 각각 Stack만 따로 할당 받는거에요.
즉, 같은 프로세스 내에서 여러 스레드가 존재한다면 Code, Data, Heap 영역은 서로 공유를 하고 스레드마다 각각의 Stack을 갖고 있는거죠. 기본적으로 하나의 프로세스가 생성될 때, 최소 하나의 스레드를 같이 생성합니다.
스레드에서 저렇게 공유자원이 있다면 뭔가 가벼워진 느낌이 들지않나요?
그쵸! 독립적인 프로세스에 비해 공유하는 영역이 많기 때문에 메모리 공간과 시스템 자원 소모가 줄어들게 되는거죠!
그렇기 때문에 스레드의 Context switching(문맥교환)은 훨씬 가볍게 수행되는거죠.
스레드의 구조를 보셨으니 멀티스레드와 멀티프로세스의 장단점을 아래의 표로 잠깐 정리하고 갈게요!!
멀티프로세스 | 멀티스레드 | |
장점 |
|
|
단점 |
|
|
위의 표에서 멀티스레드의 단점으로 동기화 문제라는 말을 썼어요.
이 말이 무슨 뜻인지 알아보기 전에 예를 한번 들어볼게요!ㅎㅎ
스레드 "배씨" , 스레드 "이씨" 가 존재한다고 볼게요~ 그리고 공유 자원으로 그림 그리는 도화지가 있다고 가정할게요.
배씨 : "음.. 나는 이 도화지에 사자를 그리고 싶으니까 빨리 그려야겠다!"
(처리중...)
배씨 : "사자 얼굴은 다 그렸고 이제 머리 주변으로 긴털을 그려야...."
(그 순간에 이씨가 들어와서 사자 얼굴에 줄무늬를 여러개 그려버리고 사라짐. )
배씨 : "뭐야! 사자를 그릴려고 했는데 갑자기 호랑이로 바껴져있네????"
스레드 "배씨"가 도화지라는 공유자원에 작업하던 도중에 미묘한 시간차로 "이씨" 라는 스레드가 잠깐 와서 자기가 그리고 싶은걸로 바꾸고 나간거에요. 이후에 스레드 "배씨"가 다시 도화지를 보니까 다른 그림이 그려져 있었던거죠.
즉, 여러 개의 스레드를 이용하는 경우, 미묘한 시간차 또는 잘못된 데이터 값으로 공유함으로써 오류가 발생할 수 있어요! 스레드는 서로간에 영향을 주기 때문에 하나의 스레드가 문제가 생기면 다른 모든 스레드도 작동 불능 상태가 됩니다.
그렇기 때문에 멀티쓰레드 환경에서는 "동기화 작업"이 필요해요!
간단하게 말하자면 "배씨"가 사자를 다 그릴때까지는 다른 스레드가 들어와서 작업을 할 수 없도록 하는거에요~
다음 시간에는 이 동기화 작업이 무엇인지! 뮤텍스와 세마포어는 무엇인지! 알아볼려고 합니다! 감사합니다 :)
* 저는 전문가가 아니며, 틀린 정보에 대한 지적은 언제든지 환영합니다 :)
2022.03.17 - [* CS 질문] - [운영체제] 스레드가 무엇인가 (추가내용)
'남이 읽는 CS > 운영체제' 카테고리의 다른 글
[운영체제 6편] 유저모드 커널모드 (3) | 2022.04.03 |
---|---|
[운영체제 5편] 데드락이 무엇인가 (4) | 2022.03.22 |
[운영체제 4편] 세마포어가 무엇인가 (5) | 2022.03.15 |
[운영체제 3편] 뮤텍스가 무엇인가 (3) | 2022.03.08 |
[운영체제 1편] 프로세스란 무엇인가 (4) | 2022.03.04 |
댓글