[ 살펴보기 ] Operating System - 프로세스와 스레드
![[ 살펴보기 ] Operating System - 프로세스와 스레드](https://cdn.hashnode.com/res/hashnode/image/upload/v1720940165112/5146f674-7327-4f63-b341-65fa1d02b3bc.jpeg)
우리가 컴퓨터나 폰으로 실행하는 application은 모두 실행을 위해 시스템 자원을 필요로 한다. CPU나 메모리 또는 입출력 장치 등이 모두 시스템 자원에 속한다. Operating System은 우리가 실행하는 application에 적절한 자원을 할당하며 실행시켜주는 역할을 한다.
Operating System은 메모리의 커널 영역과 사용자 영역 중 커널 메모리 영역에 적재되어 실행되며 여러 프로세스를 관리하고 CPU 스케줄링을 통해 각 프로세스에 CPU 자원을 할당하고 새로운 프로세스를 메모리에 적재하고 관리하며 인터럽트 서비스 루틴을 통해 마우스, 키보드 같은 입출력 장치 작업을 수행한다.
위와 같이 Operating System의 핵심 기능을 담당하는 부분을 Kernel이라고 한다.
프로세스
우리가 컴퓨터에 설치한 프로그램은 사용자에 의해 실행되어 메모리에 적재되면 프로세스가 된다. 즉 현재 실행 중인 프로그램을 프로세스라고 할 수 있다.
컴퓨터 시스템이 부팅되면 사용자가 직접 실행한 프로세스 외에도 많은 프로세스가 실행되는데 이런 프로세스는 사용자와 직접 상호작용이 없어도 background에서 실행되기에 background process라고 하며 Linux OS에서는 이러한 process를 daemon이라고 하고 Windows OS에서는 service라고 부른다.
프로세스가 실행되기 위해 CPU 자원을 사용해야 하지만 모든 프로세스가 CPU를 동시에 사용할 수는 없기에 프로세스는 서로 돌아가며 CPU 자원을 사용한다 그리고 운영체제는 프로세스가 생성될 때 Process Control Block ( PCB )라는 정보를 생성해 프로세스 ID, 레지스터 값, CPU 스케줄링 정보 등 해당 프로세스와 관련된 정보를 관리한다. ( PCB도 메모리의 커널영역에 생성된다 )
그리고 앞서 언급했듯이 여러 프로세스는 한정된 CPU 자원을 서로 돌아가며 사용하기에 특정 프로세스가 다른 프로세스에게 CPU 자원을 양보해야 할 때 기존 프로세스가 추후에 다시 작업을 이어가기 위해 기억해야 할 정보들을 Process Control Block에 백업하고 실행되는 다른 프로세스의 정보를 해당 프로세스의 Process Control Block으로 가져와서 프로세스를 실행하는데 이를 context switching이라고 한다.
사용자 메모리 영역
사용자 메모리 영역에 적제되어 실행되는 프로세스는 메모리의 여러 영역에 나뉘어 저장된다. 그리고 사용자 메모리 영역은 코드영역, 데이터 영역, 힙 영역, 스택 영역, 힙 영역, 스택 영역으로 나뉜다.
코드영역 : 프로그램의 명령어가 저장되고 읽기 전용 공간이다.
데이터 영역 : 프로그램의 전역변수와 같이 특정 프로그램이 실행되는 동안 유지되어야 하는 데이터가 저장된다.
힙 영역 : 프로그램을 만드는 개발자에 의해 직접 메모리 할당 및 반환이 가능한 동적 할당 영역이다.
스택 영역 : 지역 변수나 함수의 parameter와 같이 함수의 실행이 끝나면 함께 사라지는 일시적인 데이터를 저장하는 영역이다. Last-In-First-Out 방식으로 동작한다.
프로세스의 계층 구조
운영체제에서 실행되는 모든 프로세스는 계층구조를 가진다. 컴퓨터 시스템을 부팅하면 최초의 프로세스가 실행되고 해당 프로세스가 다른 프로세스를 생성하며 계층구조를 이루는 것이다. 이때 다른 프로세스를 생성한 프로세스를 부모 프로세스라고 하면 다른 프로세스로부터 생성된 프로세스를 자식 프로세스라고 한다.
다른 프로세스에 의해 생성되었어도 자식 프로세스와 부모 프로세스는 서로 다른 프로세스이며 다른 PID와 메모리 위치를 가진다. 자식 프로세스가 생성되는 과정은 다음과 같다.
부모 프로세스가 fork 시스템 호출을 통해 자신을 복제하여 자식 프로세스를 생성한다. 그리고 자식 프로세스는 exec 시스템 호출을 통해 자신의 코드 영역과 데이터 영역을 실행할 프로그램의 내용으로 변경하고 나머지 영역은 초기화 되어 다른 프로그램을 실행하는 프로세스가 된다.
스레드
스레드란 프로세스의 실행 단위를 말한다. 프로세스 하나에 여러개의 스레드가 존재할 수 있으며 프로세스는 여러개의 스레드를 통해 여러가지 작업을 동시에 처리할 수 있다.
프로세스 안에 여러 스레드가 존재할 때 스레드는 서로 다른 ID를 가지고 각각 자기만의 스택, 프로그램 카운터, 레지스터를 가지기에 서로 다른 코드를 실행할 수 있다. 하지만 같은 프로세스 안에 존재하는 여러 스레드는 해당 프로세스의 데이터, 힙 영역과 같은 자원을 공유한다.
프로그램 카운터 : 다음에 실행할 명령어를 가리키는 레지스터.
스택 : 함수 호출 정보나 지역 변수와 같은 데이터를 저장한다.
레지스터 : 각 스레드는 명령을 실행하기 위해 필요한 정보의 저장이나 Context Switch가 발생할 때 스레드의 상태를 저장하는 등의 작업을 위해 GPRs, PC, SP와 같은 여러 레지스터를 이용한다.
예를 들어 Word와 같은 편집 프로그램을 실행하면 사용자가 글을 작성하면 Word 편집기가 spelling check나 작성한 내용을 자동으로 저장해주는 기능을 제공하는데 이러한 각각의 작업들이 Word 편집기를 실행하는 프로세스에 소속된 여러개의 thread로 처리된다.
![[ 살펴보기 ] RDB - Relationships](https://cdn.hashnode.com/res/hashnode/image/upload/v1739711556668/48dc9e84-a621-42aa-9c9f-5fc5c436f0ec.jpeg)
![[ 살펴보기 ] MySQL - Data types](https://cdn.hashnode.com/res/hashnode/image/upload/v1739593589113/530f8704-4d27-42c9-a451-bb5c63150b99.jpeg)
![[ 살펴보기 ] TypeORM - Transactions, Migration](https://cdn.hashnode.com/res/hashnode/image/upload/v1739106042581/980b8133-61d4-406a-a026-65be9c28eace.jpeg)
![[ 살펴보기 ] TypeORM - Relations](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666874402/b688bd0b-b6bb-4f43-87d8-c1b46b59f1b7.jpeg)
![[ 살펴보기 ] TypeORM - Basics](https://cdn.hashnode.com/res/hashnode/image/upload/v1738666803591/bef5df17-7dc7-4123-ae55-004d5042df39.jpeg)