[OS] 프로세스와 스레드

공덕이형·2023년 12월 6일
0

CS

목록 보기
1/17

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

가장 먼저 프로그램과 프로세스 스레드에 대해서 알아보도록 하자

프로그램

가장 쉽게 이해하기 위해선 .exe 확장자를 가진 파일이라고 생각하면 된다.

그러나 이 파일은 혼자서는 아무런 역할을 할 수 없는데, 실행되기 위해서는 메모리에 올라가야 한다. 폰노이만 구조에서 프로그램이 실행된다는 것은 해당 코드가 메모리에 올라와서 작업이 진행되어야 한다는 의미이다. 즉, 메모리에 올라가기 전 정적 상태인 파일을 프로그램이라고 부른다.

프로세스

메모리에 올라가기 전 정적인 상태인 파일을 메모리에 올려놓으면 프로세스가 된다.

메모리에 올라간 프로그램은 실행되어 여러 작업을 수행할 수 있다.

프로세스를 메모리에 올려놓는 작업은 운영 체제에 의해 관리된다. 운영체제는 프로그램을 메모리에 로드할 때 PCB라는 자료구조를 추가하여 메모리에 로드한다.

프로그램과 프로세스의 관계

  • 프로그램 : 프로세스 - PCB
  • 프로세스 : 프로그램 + PCB

스레드

프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위

스레드를 쉽게 이해하기 위해서 프로세스의 작업 과정에 대해서 알아보자.
운영체제는 코드와 데이터를 메모리에 가져오고, PCB를 생성하고, 작업에 필요한 메모리 영역을 확보한 후, 준비된 프로세스를 준비 큐에 삽입한다. 프로세스가 생성되면 CPU 스케쥴러는 프로세스가 해야 할 일을 CPU에 전달하고 실제 작업은 CPU가 수행한다.

이때 스케줄러가 CPU에 전달하는 일 하나가 스레드이다. 그러므로 CPU가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드이다.

여기서 알 수 있는 것은 운영체제가 자원을 할당하는 단위를 프로세스,
CPU 입장에서의 작업 단위는 스레드가 된다는 것이다.


PCB와 TCB

PCB

프로세스를 설명하며 PCB에 대해서 알아봤다. 그렇다면 PCB는 무엇인가?

프로세스 제어 블록(PCB)은 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료구조이다. 모든 프로세스는 고유의 PCB를 가지며, PCB는 프로세스 생성 시 만들어지고 프로세스 종료 시 폐기된다. PCB는 Context Switching에서 중요한 역할을 하게 된다. 이는 다음 포스터에서 다루도록 하겠다.

PCB에 저장되는 정보는 다음과 같다.

  • 프로세스 상태 : 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등이 있다. 프로세스의 현재 상태를 나타낸다.
  • 포인터 : 준비, 대기 상태는 큐로 운영되는데 PCB간 연결에 사용한다.
  • 프로세스 구분자 : 프로세스 식별번호
  • 프로그램 카운터 : 다음에 실행할 명령어의 주소를 가리킨다.
  • 프로세스 우선순위 : 프로세스의 우선순위 (사용자 < 커널), 우선순위 별 대기 Queue
  • 레지스터 정보 : 이전에 실행할 때 사용한 레지스터의 값을 보관.
  • 메모리 관리 정보 : 프로세스의 메모리 위치 정보, 경계 레지스터 값 한계 레지스터값.
  • 할당된 자원 정보 : 입출력 자원이나 오픈 파일 등에 대한 정보.
  • 어카운팅 정보 : CPU 할당 시간, CPU 사용 시간 등

프로세스를 실행하기 위해선 PCB가 중요 역할을 한다는 것을 알았다. 그러나 앞에서 말했 듯 CPU 입장에서의 작업 단위는 스레드가 되어야 한다. 그렇다면 스레드도 PCB와 같은 역할을 하는 자료구조가 있어야 한다.

TCB

TCB는 thread 별로 존재하는 자료구조이다. PCB에서 파생되었기 때문에 PCB와 유사하게 생겼지만, 각 프로세스는 별도의 pcb,code,data,stack을 갖고 있지만 스레드는 stack과 PC register를 제외한 모든 곳을 공유하게 된다. 그렇기에 PCB의 축약형의 모습을 취한다.

게다가 모든 TCB는 PCB를 가리키는 포인터를 갖게 된다.


Multi Process, Multi Thread

지금까지 프로세스, 스레드의 차이점에 대해 알아봤다. 그렇다면 프로세스와 스레드가 구분된 이유는 뭘까?

초기의 운영체제에서는 작업의 단위가 프로세스 하나뿐으로 1개의 스레드를 가진 프로세스만 있는 셈이라 스레드와 프로세스를 구분지을 필요가 없었다.
그러나 CPU와 프로그래밍 기술의 발전으로 인해 여러개의 코어를 가진 CPU가 생겨나 멀티스레드를 지원하기 시작하면서 스레드의 개념이 중요해지게 된 것이다.

Multi Process

하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것이다.

장점

  • 프로세스별 각각의 영역을 갖기에 다른 프로세스에 영향을 주지 않음
  • 별다른 동기화 필요 없음

단점

  • context switching 비용이 커짐
  • 쓰레드보다 무겁기 때문에 생성시간이 더 길어짐
  • 서로 메모리를 공유하기 위해선 IPC 기법을 사용하여 공유해야 하는데, 다소 비효율적임

Multi Thread

하나의 프로세스가 여러개의 스레드를 갖고, 각각의 스레드가 서로 다른 작업을 수행한다

장점

  • 하나의 프로세스에서 자원을 공유하기에 비용 측면에서 효율성이 높다.
  • context switching 비용이 적다.
  • 스레드는 프로세스보다 가볍기 때문에 생성시간이 짧다.

단점

  • 하나의 스레드가 다른 스레드에 영향을 줄 수 있다.
  • 공유자원에 대해 동기화 작업이 필요하다. (설계의 어려움)

왜 Multi Thread를 더 많이 사용하는가

하나의 프로그램 안에서 여러 작업을 해결하는 것이 더 효율적이고, context switching시에 stack 영역만 초기화 해주면 되기 때문에 더 빠르다는 장점이 있다. 또한 프로세스 생성시 자원 할당하는 콜이 줄어들어 자원의 사용을 효율적으로 관리할 수 있다는 장점이 있기 때문이다.

References

https://velog.io/@klm03025/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/main/OS#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://stackoverflow.com/questions/200469/what-is-the-difference-between-a-process-and-a-thread
https://prepinsta.com/operating-systems/process-control-block/

profile
형이 먹여살릴게

0개의 댓글