리눅스&네트워크

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

놀개_ 2022. 12. 11. 12:45

1. 프로세스

[ 공부하기 전 나 ]

프로세스? 실행중인거!

1) 프로그램과 프로세스의 차이

생명이 있냐, 없냐

프로그램은 보조기억장치(SSD,하드디스크)에 존재하는, 실행되기를 기다리는 코드와 정적인 데이터의 묶음이다.

요것이 메모리에 적재되면 생명이 있는 '프로세스'가 된다.

즉, 실행파일이 메모리에 적재될 때 프로그램은 프로세스가 된다라고 할 수 있다.

 

프로세스란 쉽게 말해 프로그램 실행 그 자체를 의미한다.

 

2) 동시 실행의 착각

컴퓨터에서 프로세스가 동시에 실행된다는 건 당연하지 않은 일.

하나의 CPU(프로세서) 는 한 순간에 하나의 프로세스만 실행할 수 있기 때문이다.

 

그러면 프로세스가 동시에 실행된다라고 말할 수 없는거 아닌가?

맞다.

물 속에서 헤엄치는 오리를 생각해보자.

 © yxelle, 출처 Unsplash

둥둥 떠있는 오리는 사실 물 속에서 엄청나게 발을 휘저으며 헤엄친다.

프로세스가 동시에 실행될 수 있는 건 운영체제가 엄청난 속도로 CPU가 실행할 프로세스를 교체하고 있기 때문이다.

눈 깜박할 사이에 이 교체가 수십번~수천번 일어나기 때문에 사람은 동시에 여러개의 프로세스가 실행되고 있다고 느끼는 것이다.

 

그럼 도대체 운영체제는 어떻게 이렇게 빨리 휘리릭 프로세스 교체를 할 수 있는 것일까?

프로세스의 구성 관리에 대해 알아보면 해답이 나올지도 모르겠다.

 

3) 프로세스 구성

프로세스에 대한 정보는 프로세스 제어블록(PCB,Process Control Block) 이라고 부르는 자료구조에 저장이 된다.

이 PCB 에는 다음과 같은 정보가 담겨있다. ( 운영체제가 프로세스를 관리하기 위해 필요한 정보를 저장함 )

PID
운영체제가 각 프로세스를 식별하기 위해 부여된 식별번호
프로세스 상태
진행중인 상태인지, 대기중인 상태인지, 종료된 상태인지
프로그램 카운터
CPU가 다음 실행할 명령어의 주소를 담고 있는 레지스터이다.
프로그램의 순차적 흐름을 위해 필요하다고 한다...
스케줄링 우선순위
운영체제가 CPU 에서 실행될 여러 개의 프로세스 순서를 정해주는 것을 스케줄링 이라고 한다.
스케줄링에서 우선순위가 높으면 먼저 실행될 수 있는데 이를 스케줄링 우선순위라고 한다.
권한
프로세스가 접근할 수 있는 자원을 결정하는 정보이다.
프로세스마다 어디까지 접근할 수 있는지에 대한 권한이다.
프로세스의 부모와 자식 프로세스
최초로 생성되는 init 프로세스를 제외하고 모든 프로세스는 부모 프로세스를 복제하여 생성되고 이 계층관계는 트리를 형성한다.
그래서 각 프로세스 자식프로세스와 부모프로세스에 대한 정보를 가지고 있다.
프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터
프로그램 대한 정보는 프로세스가 메모리에 가지는 자신만의 주소 공간에 저장된다.
프로세스는 프로그램의 실행이기 때문에 실행하기 위해서는 프로그램 주소에 대한 정보가 필요한 것이다.
실행문맥
마지막에 실행된 프로세스의 레지스터 내용을 담고 있다.
운영체제에 의해 교체되었다가 다시 자신의 차례가 되어 실행될 때 중단된 적 없고 마치 연속적으로 실행된 것처럼 보이기 위해 해당 레지스터 정보를 가지고 있다.

 

4) 프로세스 관리

- 프로세스 상태

  • New: 프로그램이 메인 메모리에 할당된다.
  • Ready: 할당된 프로그램이 초기화와 같은 작업을 통해 실행되기 위한 모든 준비를 마친다.
  • Running: CPU가 해당 프로세스를 실행한다.
  • Waiting: 프로세스가 끝나지 않은 시점에서 I/O로 인해 CPU를 사용하지 않고 다른 작업을 한다. (해당 작업이 끝나면 다시 CPU에 의해 실행되기 위해 ready 상태로 돌아가야 한다.)
  • Terminated: 프로세스가 완전히 종료된다.
위 그림은 프로세스 상태 전이도의 모습이다. new에서부터 프로세스가 어떤 작업에 의해 상태가 변하는지 나타낸다.

running에서 ready로 변할 때는 time sharing system(시분할,각 사용자들에게 컴퓨터 자원을 시간적으로 분할)에서 해당 프로세스가 CPU시간을 모두 소진하였을 때 인터럽트에 의해 강제로 ready상태로 변하고, CPU는 다른 프로세스를 실행시킨다.

5) 프로세스의 메모리 영역

  • Code 영역

실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역이다.

CPU는 코드영역에 저장된 명령어들을 하나씩 처리한다.

 

  • Data 영역

코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역이다.

프로그램이 실행되면서 할당되고 종료되면서 소멸한다.

 

  • Stack 영역

함수 안에서 선언된 지역변수, 매개변수, 리터값등이 저장된다.

함수 호출시 기록되고 종료되면 제거된다.

 

  • Heap 영역

관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 자유공간이다.

 

2. 스레드

스레드는 프로세스 내의 Data, Code, Heap 영역을 공유한다.

운영체제는 프로세스마다 독립된 메모리 영역을 Code/Data/Stack/Heap의 형식으로 할당한다.

각각 독립된 메모리 영역을 할당해주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.

(이미지 출처 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html)

 

반면에 스레드는 메모리를 서로 공유할 수 있다.

프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 별도로 할당받고,

나머지 Code/Data/Heap 형식으로 할당된 메모리 영역 공유한다.

따라서, 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.

 

* 단일 스레드와 다중 스레드의 차이

예) 웹서버가 여러 개의 클라이언트 요청을 받는 경우

  • 단일스레드 : 한 번에 하나의 클라이언트만 서비스 할 수 있어 시간이 오래 걸린다.

그러면 매번 요청할 때마다 동일한 요청을 수행하는 별도의 프로세스를 생성하면 되지 않나?

-> But, 프로세스 생성은 많은 시간과 자원이 필요하므로 비효율적이다.

 

새 프로세스 할 일이 기존 프로세스 할 일과 동일하다면 굳이 ?

그. 래. 서.

기존 프로세스 안에다가 여러 개의 스레드를 만드는 것이 더 효율적이다.

 

🟢 멀티스레드의 장점

  1. Context-Switching 할 때 공유하고 있는 메모리만큼 메모리 자원을 아낄 수 있다.
  2. 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신 부담이 적어서 응답 시간이 빠르다.

🔴 멀티스레드의 단점

  1. 스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있다.
  2. 자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수 밖에 없다. 교착상태가 발생하지 않도록 주의해야 한다.

 

출처

https://ko.wikipedia.org/wiki/%EC%8B%9C%EB%B6%84%ED%95%A0_%EC%8B%9C%EC%8A%A4%ED%85%9C

https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-5.-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC

https://bowbowbow.tistory.com/16

https://velog.io/@aeong98/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C