CS/OS

[OS] 프로세스와 스레드

psy_er 2024. 4. 9. 16:23
728x90

[OS] 프로세스와 스레드

학습목표

- 프로세스가 생성된 후 어떤 상태 변화를 거치는지 알아보자

- 프로세스 제어 블록의 구성과 문맥 교환 시 동작 과정을 이해하자

- 프로세스의 생성과 복사, 전환 과정을 이해하자

- 스레드의 개념을 이해하고 멀티스레드 시스템의 장점을 알아보자

 

프로세스의 개념

프로그램이란 저장장치에 저장되어 있는 정적인 상태입니다.

프로세스란 실행을 위해 메모리에 올라온 동적인 상태, 즉 실행 중인 프로그램을 말합니다.

 

프로세스는 메모리에 적재되어 운영체제의 제어를 받습니다.

운영체제로부터 PCB라는 프로세스 제어 블록을 할당받는다는 것은 곧 프로세스가 존재한다는 의미입니다.

 

 

프로세스 제어 블록

PCB란 프로세스를 위해 관리하는 자료구조입니다.

프로세스 구분자란 PCB에서 각 프로세스 구분자로, PID를 부여해 주는 역할을 합니다.

메모리 관련 정보에는 프로세스 메모리 위치 정보 등이 있습니다.

각종 중간값에는 프로세스가 사용했던 중간값 정보가 있습니다.

 

프로세스 제어 블록은 프로그램 종료 시 폐기됩니다.

프로세스 = 프로그램 + PCB라고 볼 수 있겠죠?

 

 

프로세스의 다섯 가지 상태

생성상태(Create) :

프로세스가 메모리에 적재되어 실행 준비를 완료한 상태입니다. 이때 커널영역에 PCB 생성해요.

준비상태(Ready) :

프로세스가 CPU를 할당받을 때까지 준비 큐에서 기다리는 상태입니다. CPU 스케줄러가 프로세스를 선택해 줘요.

실행상태(Running) :

준비상태 프로세스 하나가 타임 슬라이스를 얻어 CPU를 사용해요. 이후 완료상태나 준비상태로 이동해요.

대기상태(Blocking) :

실행 상태 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다려요. 이후 준비 상태 이동해요.

완료상태(Terminate) :

실행 상태의 프로세스가 작업을 마치는 상태입니다. PCB를 삭제하고, 메모리를 삭제하고, 자원을 반납해요.

 

CPU 스케줄러 :

준비 상태의 프로세스 중 다음에 실행할 프로세스 선정해요.

디스패치(Dispatch) :

CPU 스케줄러를 활용하여 준비상태의 프로세스 중 우선순위가 높은 프로세스에 CPU를 할당해 실행 상태로 바꾸는 작업

타임아웃(Time Out) :

프로세스가 자신에게 주어진 타임 슬라이스 동안 작업을 완수하지 못해 준비상태로 되돌아가는 것을 뜻해요.

대기(Block) :

실행 중인 프로세스가 입출력 명령을 만나 대기 상태로 전환하는 것을 뜻해요.

깨움(Wake up) :

입출력 완료신호가 들어오면 대기 중인 프로세스는 준비 상태로 전환하는 것을 뜻해요.

 

휴식상태와 보류상태

휴식상태 (pause status) : 프로세스가 일시적으로 작업을 쉬고 있는 상태입니다.

보류상태 (suspend status) : 프로세스가 메모리에서 잠시 쫓겨난 상태, 일시정지 상태입니다.

 

보류상태는 메모리가 꽉 차있거나, 프로그램 오류 발생, 악의적인 프로세스 판단, 입출력이 지연 시에 사용돼요.

 

PCB 프로세스 제어 블록

PCB : 프로세서를 실행하는 데 필요한 중요한 정보를 보관하는 자료구조예요.

하나의 프로세스는 고유한 프로세스 제어 블록을 가져요.

프로세스 생성 시 PCB가 만들어지고, 프로세스 종료 시 폐기됩니다.

 

프로세스 제어 블록의 구성

포인터 : 준비 상태나 대기 상태 큐 구현시 사용해요.

프로세스 상태 : 프로세스가 어떤 상태에 있는지 나타내요.

PID (프로그램 구분자) : 운영체제 내에 여러 프로세스 구분자입니다.

PC (프로그램 카운터) : 다음 실행될 명령어의 위치를 가리키는 프로그램 카운터 값입니다.

프로세스 우선순위 : 프로세스 실행 순서 결정해요.

레지스터 정보 : 프로세스 실행 중 사용하는 레지스터 값입니다.

메모리 관리 정보 : 프로세스의 메모리 위치 정보, 메모리 보호를 위한 경계 레지스터 값, 한계 레지스터 값 등을 저장해요.

할당된 자원 정보 : 프로세스 실행을 위해 사용되는 입출력 자원 or 오픈 파일 정보입니다.

계정 정보 : 계정 번호, CPU 할당 시간, CPU 사용 시간 정보 등을 알려줘요.

 

 

문맥교환과 타임 슬라이스

 

문맥교환은 CPU가 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 것입니다. 실행상태에서 나가는 프로세스 제어 블록에는 지금까지의 작업 내용을 저장하고, 반대로 실행 상태로 들어오는 프로세스 제어 블록의 내용으로 CPU가 다시 세팅됩니다.

 

타임 슬라이스란 각 프로세스가 CPU를 사용할 수 있는 정해진 시간이다. 타임 슬라이스는 되도록 작게 설정하되, 문맥 교환에 걸리는 시간을 고려하여 적당한 크기로 설정하는 것이 중요하다. 왜냐하면 문맥 교환 시 CPU는 하는 일이 없기 때문이다.

 

 

프로세스 구조

코드영역(CS)은 프로그램의 본문이 기술된 곳이다. 프로그래머가 작성한 코드가 탑재되며 탑재된 코드는 읽기 전용으로 처리된다. 데이터영역(DS)은 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳이다. 데이터는 변하는 값이므로 이곳의 내용은 기본적으로 읽기와 쓰기가 모두 가능하다. 스택영역(SS)은 운영체제가 프로세스를 실행하기 위해 필요한 데이터를 모아놓은 곳이다. 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아올 위치를 저장한다. 운영체제가 사용자 프로세스를 작동하기 위해 유지하는 영역으로 사용자에게는 보이지 않는다. Heap region은 프로그램 실행 중 동적으로 메모리가 할당되는 데이터 영역이다. 스택영역은 아래서부터 쌓이는 반면, 힙영역은 위에서부터 메모리가 할당된다. 혹시라도 무한루프가 생성되면 Stack overflow가 날 수 있음에 유의하자.

728x90