[운영체제] 프로세스와 스레드

하하하하하하성진·2023년 11월 26일

운영체제

목록 보기
2/2

프로그램,프로세스,스레드 관계

프로그램프로세스스레드
어떤 작업을 하기 위해 실행할 수 있는 파일(정적)실행되어 작업중인 컴퓨터 프로그램(동적)프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위
  1. 프로그램 : 저장 장치에 존재 하지만 메모리 할당 x (정적인 상태)
  2. 프로세스 : 메모리에 있는 파일에 CPU 자원을 할당 시킨다 >> 프로그램 실행 상태(동적인 상태)
  3. 스레드 : 하나의 프로세스에서 여러가지 작업을 할 수 있는 상태
    (온라인 쇼핑을 하면서 동시에 노래도 듣고 영상도 보는 것)

    멀티 다중 스레드 : 여러개의 스레드가 존재
    (기본적으로 1개의 프로세스에는 1개의 main 스레드가 존재)
    스레드가 많을 수록 속도도 빨라지고 동시에 여러 작업이 가능해서 성능이 올라감

프로세스와 스레드

프로세스 자원구조

HEAP이랑 STACK 영역은 프로그램이 실행 즉 프로세스가 CPU를 할당 받을 때마다 동적으로 크기가 정해지기 때문에 영역 크기가 정해져 있지 않다. 그에 반해 DATA,TEXT 부분은 크기가 선언될 때 정해지기 때문에 정적인 상태로 변하지 않는다.

프로세스 생성 구조

위 그림을 보면 알겠지만 프로세스가 생길 때 마다 RAM 에 각각의 진행 주소 공간이 생성된다. 이 주소 공간은 각 프로세스가 어디에 있는 지 어떻게 구성되어 있는 지를 알 수 있다.

프로세스 내부 스레드 작동방식

위 그림은 1개의 프로세스 안에 2개의 스레드가 존재한다. 스레드는 각각 Stack을 가지고 있고 그 외 Code, Data, Heap 자원은 공유해서 사용한다.

TIP

stack은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내에서 선언하는 변수 등을 저장하는 메모리 공간이기 때문에, 독립적인 스택을 가졌다는 것은 독립적인 함수 호출이 가능하다 라는 의미이다. 그리고 독립적인 함수 호출이 가능하다는 것은 독립적인 실행 흐름이 추가된다는 말이다.즉, stack을 가짐으로써 스레드는 독립적인 실행 흐름을 가질 수 있게 되는 것이다.

다중프로세스와 다중스레드

위 내용들을 보면 프로스세들은 독립적으로 메모리 주소가 생성된다. 독립적이라는 말은 서로 상호작용이 안된다는 말인데... 프로세스끼리 상호 작용하는 방법은 없을까?

프로세스 공유 방법 3가지

  1. IPC(Inter-Process Communication) 사용
  2. LPC(Local inter-Process Communication) 사용
  3. 별도로 공유 메모리를 만들어서 정보를 주고받도록 설정

이렇게 서로 다른 프로세스끼리 자원을 공유하는 방법이 있긴하다. 하지만 자원 부담이 커지기 때문에 스레드 방식을 고수하고 있다. 물론 현대 컴퓨터 에서는 다중프로세싱과 다중스레싱은 기본으로 사용이 가능하다고 한다.

멀티태스킹 (프로세스와 스레드)

멀티태스킹이랑 프로세스와 스레드를 동시에 처리하는 걸 말한다. 그럼 CPU가 알아서 멀티태스킹을 수행하는 것인가? 좀 더 자세하게 알아보자.
멀티태스킹을 이해하려면 2가지를 알아야 한다. 병렬성과 동시성이다. 언뜻보면 비슷한 내용 같은데 실질적으로 어떤 부분이 다른지 알아보자.

코어와 스레드

위 사양은 내 노트북 사양이다. i3라고 되어 있는데 물리적 코어가 3개라는 뜻이다. 물리적 코어는 3개 논리적 코어는 6개 즉 3코어 6스레드라고 할 수 있다.

그림을 보면 현재 프로세스가 119개로 나와 있다. 어떻게 6스레드로 119개가 되는 프로세스 작업을 할 수 있을까? 여기서 알아야할 게 병렬성동시성이다.

병렬성 (Parallelism)

병렬성은 직관적으로 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛인 여러개의 코어에 맞춰 여러개의 프로세스, 스레드를 돌려 병렬로 작업들을 동시 수행하는 것을 말한다. 

동시성 (Concurrency)

동시성은 둘 이상의 작업이 동시에 실행되는 것을 의미한다. 이 '동시' 라는 의미에서 병렬성과 동시성의 한글 의미가 헷갈릴수 있다. Parallelism가 물리적으로 정말로 동시에 실행하는 것이라고 하면, Concurrency는 동시에 실행하는 것처럼 보이게 하는 것으로 이해하면 된다.
즉, 1개의 코어가 있고 4개의 작업이 있다고 가정하다면, 아래 그림과 같이 프로세스들을 ​계속 번갈아가면서 조금씩 처리함으로써 마치 프로그램이 동시에 실행되는 것 처럼 보이는 것이다. 이때 프로세스들을 ​번갈아가면서 매우 빠르게 처리하기 때문에 컴퓨터를 모르는 사람들이 보면 마치 동시에 돌아가는 것처럼 보이게 된다.

동시성이 필요한 이유

상식적으로 생각해보면 동시성(Concurrency)은  '동시에 돌아가는 것 처럼' 보이는 거지, 정말 실제로 동시에 돌아가는 것이 아니기 때문에 최종 작업이 걸리는 시간은 거의 차이가 없을 것이다. 병렬성은 정말로 각 코어에 프로세스를 나눠 실행하는 거니까 듀얼 코어면 반 이상 줄어들텐데 말이다. 그렇다면 왜 이렇게 번거롭게 작업들을 스위칭 하며 처리하는 것일까?

첫번째는 하드웨어적 한계 때문이라고 할 수있다. CPU 발열 때문에 깡 클럭으로 성능을 올리기에는 한계에 봉착됬기 때문에 코어의 성능을 올리는 대신 코어를 여러개 탑재하여 쿼드 코어, 옥타 코어 CPU들을 출시하고 있다. 하지만 아무리 코어를 많이 넣어도 수십개의 코어를 넣은순 없으니 결국 하드웨어적 제한이 걸리게 되고 수십수백개의 프로세스를 돌리기 위해선 결국 동시성이 필요한 것이다.

두번째는 보다 논리적인 효율적인 이유에서이다. 4코어 8스레드의 CPU 환경에서 현재 총 16개의 작업이 있다고 가정을 해보자. 그중 8개는 오래 걸리는 작업이고, 나머지 8개는 짧은 시간을 필요로 하는 작업이라고 한다. 논리적인 8개의 코어이니 최대 8개까지 동시에 실행할수 있을텐데, 만일 최악의 경우 8개의 오래 걸리는 작업이 먼저 동시에 처리되기 시작했다고 하자. 이 경우 나머지 가벼운 8개의 작업은 처리하는데 짧은 시간이 걸리는 데에도 불구하고 현재 처리중인 8개의 작업이 다 끝날때 까지 기다려야 할 것이다. 따라서 이러한 비효율적인 면을 극복하기 위해 작업을 아주 잘게 나눠 번갈아 가면서 처리하는 동시성 개념을 채택한 것이다.

따라서 최대 8개의 작업에 대해서 8개의 논리적인 스레드가 병렬적으로 아주 빠르게 동시적으로 작업을 하면서, 그보다 많은 수십개의 소프트웨어적 스레드가 있다면 적절히 병렬성과 동시성을 섞어 동시에 돌리게 되게 된다.

참고

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4

profile
프로그래밍은 정신력 안되면 될 때까지!

0개의 댓글