[CS 기초 갈고 닦기] 1. 프로세스 vs 스레드 - 정리!

khyojun·2022년 12월 9일
1

CS 기초 갈고 닦기

목록 보기
4/10
post-thumbnail

📌 시작하기 전 간단한 예시

이해를 잘 하기 위해 한 가지 예시를 들어보는데 바로 이사할 때의 상황이다.

프로세스: 큰 pp 박스, 스레드: 작은 박스
이사를 할려고 한다.
khyojun은 짐이 그닥 많지 않아서 작은 박스 단 5개로만 이사를 갈 수 있는 상황인데 작은 박스가 없어서 물건을 분리하기 위해 큰 pp박스 2개로 움직여야 하는 일이 생겨버렸다. 그런데 큰 pp 박스 1개는 자체의 무게가 너무 무거워서 사람의 손으로 움직일 수 가 없어서 수레같은 도구를 사거나, 빌려야 한다.

위 예시를 계속 생각해서 읽어보시면 좋을 거 같습니다.

📌 결론은 프로세스 vs 스레드 구도

앞에서 얘기를 했었지만 프로세스와 스레드라는 것은 결론적으로 이름만 다르지 솔직히 말하면 가족과 같은 존재이다. 그래서 부모님과 자식간의 성격 차이가 가족이라고 없는 것이 아닌듯 실제로 프로세스와 스레드는 차이점이 존재한다. 이 질문에 대해서 오늘 정리할 주제는 가족같은 이 두 가지의 개념에 대한 차이점에 대해서 알아보고자 한다.

📌 프로세스 vs 스레드

보통 위 키워드로 검색하면 위와 같은 표와 함께 영어로 되어있는 표들이 나와있을 것이라고 생각이 든다. 해석해보자면 다음 표와 같다.

질문프로세스스레드
정의프로그램이 실행 중프로세스의 일부분
가볍나?무겁다가볍다
종료 시간느리다빠르다
생성 시간느리다빠르다
통신오래 걸림짧음
Context Switching시간이 많이 걸림적게 걸림
자원많이 소모한다조금 소모한다
OS의 대우다른 프로세스당 별도로 본다단일 작업으로 해석
메모리격리서로 공유한다
공유데이터를 공유하지 않음데이터를 공유한다.

🔍 간단히?

스레드가 프로세스에 비해서 되게 가볍고 빠르고 더 개방적인 친구라는 부분이다. 첨가하면 OS한테서도 다른 프로세스들 끼리는 분리되어있지만 스레드들은 단일 작업으로 해석이 되는 부분이다.

🔍 Context Switching?

  1. CPU내에 존재하는 레지스터들은 현재 실행중인 프로세스 관련 데이터들로 채워진다.
  2. 실행중인 프로세스가 변경이 되면, CPU내 레지스터들의 값이 변경되어야 하는데, 변경되기 전에 이전 프로세스가 지니고 있던 데이터들을 어딘가에 저장해 주어어야 한다.( 이어서 실행하기 위해).
  3. 그리고 새로 실행되는 프로세스가 아니라면 이전에 실행될 때 레지스터들이 지니고 있던 데이터들을 불러와서 이어서 실행해야 한다.
    이 과정이 컨텍스트 스위칭이다.

프로세스 스레드에서의 Context Switching

프로세스 컨텍스트 스위칭이 일어났을 경우, 공유하는 데이터가 없으므로 캐쉬가 지금껏 쌓아놓은 데이터들이 무너지고 새로 캐쉬정보를 쌓아야 한다. 이것이 프로세스 컨텍스트 스위칭에 부담이 되는 요소이다.
반면, 쓰레드라면 저장된 캐쉬 데이터는 쓰레드가 바뀌어도 공유하는 데이터가 있으므로 의미있다. 그러므로 컨텍스트 스위칭이 빠른 것이다.

즉, Context Switching은 실행중인 프로세스를 변경하는데 스레드에서의 Context Switching이 일어나게 되면 서로 고립되어있지 않고 공유하는 자원이 있기에 빠르다는 것이다.

📌 질문의 의도

위 스레드와 프로세스의 차이점에 대해서 물어보시는 이유가 무엇이었을까? 단순히 개념때문이었을까?

🔍 멀티 스레드 vs 멀티 프로세스

여러 글에서 거의 비슷한 말씀들을 많이 하셔서 정리를 해보자면 결국 멀티 프로세스로 할 수 있는 작업들을 굳이 하나의 프로세스에서 스레드를 나눌 필요가 있나? 에 대한 질문이었을 가능성이 크다는 것이었다.

위 제목처럼 멀티 프로세스로 할 수 있는 일을 왜? 멀티 스레드로 작업을 하냐? 가 핵심이다.

그러면 우리는 이때까지 스레드, 프로세스의 차이점에 대해서 위 표에서 간단히 정리했었는데 결론은 운영체제가 시스템 자원을 효율적으로 관리 -> 프로세스 보다 스레드가 훨씬 가볍기 때문이다.(자원, 부담, 비용 등등 측면에서)

멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜(?)이 줄어들어 자원을 효율적으로 관리할 수 있습니다. 뿐만 아니라 프로세스 간의 통신보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어들게 됩니다.

🔍 알고가자! 시스템 콜

OS는 기본적으로 사용자 모드(User Mode), 커널 모드(Kernel Mode)이렇게 2가지로 나뉜다고 한다. 그런데 우리가 알고 있는 컴퓨터에서의 작업들 (프로세스의 실행, 종료나 I/O 작업 등의 사용자가 함부로 사용하면 문제가 될 만한 명령들)커널 모드에서 진행이 된다고 한다.
그래서 이런 기능들을 우리가 사용할려면! System Call을 활용하여서 사용자 모드에서 할 수 없는 일들을 커널 모드로 넘어가서 진행을 하게 된다.

System Call의 종류

  • 프로세스 제어 : exec() : 다른 프로그램의 실행, fork() : 새 프로세스의 생성, wait() : 자식 프로세스가 끝날 때 까지 대기
  • 파일 조작 : open(), read(), write() 등
  • 장치 관리 : 장치의 부착, 분리 등
  • 정보 유지 : 시간, 날짜의 설정 등
  • 통신 : 공유 메모리에서 다른 프로세스 소유 메모리 접근 시

🔍 System Call이 줄어든다?

간단히 알아본 System Call 이라는 개념을 통해 이 과정이 줄어든다? 라는 것은 결국 스레드를 사용하게 되면 프로세스를 건드려서 커널 모드 <-> 사용자 모드 사이 왔다갔다 할 작업들이 줄어들게 되니 결국 엄청 효율적으로 진행을 할 수 있다는 말로 해석할 수 있었다.

멀티 스레드는 아무런 단점이 없는가?

얘기하는거만 보면 단점이 없는 거 같다. 근데 사실 스레드끼리 공유하는 자원이 많다고 얘기가 되있는데 그러면 생각해야 될 것이 동기화라는 문제이다. 잘못하면 큰 문제가 있어버릴 수 있기 때문에 잘 처리할 수 있도록 해야 한다. (생각보다 되게 아주 큰 문제이다!)


😁 결론

자료들을 계속 찾아보며 프로세스와 스레드를 공부하며 머릿속에서 생각난 예제를 작성해 놨었다. 근데 저런 식으로 이해하니 뭔가 더 이해가 잘 되는 느낌이었다. 결론은 pp박스를 사용하면 수레라는 자원도 들고 빌려야 하는데 돈도 써야 될 수도 있고 하는 요소들이 있기에 굳이 pp박스 사용하지 말고 작은 박스 여러개로 움직여서 가져다 주면 훨씬 이득 그걸 확장하면 멀티 스레드 vs 멀티 프로세스까지 갈 수 있었던 질문이었다고 생각이 든다. 질문을 중심으로 공부하다보니 어디에서 활용이 되어지는 부분까지 더 지식을 쌓을 수 있었던 느낌이 많이 들었다. 앞으로도 다른 주제에 대해서 이런 방향으로 공부하면 되게 좋을 거 같다는 느낌을 받으며 프로세스 vs 스레드에 대한 글을 마무리한다.

출처

profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글