읽은 책 정리/쉽게 배우는 운영체제

[정리] 03 프로세스와 스레드

포포015 2022. 8. 31. 00:24

목차

  • 1. 프로세스의 개요
  • 2. 프로세스 제어 블록과 문맥 교환
  • 3. 프로세스의 연산
  • 4. 스레드

 

1. 프로세스의 개요

1.1 프로세스의 개념

- 프로세스는 하나의 작업단위이다. > 폰노이만 구조에서 프로그램이 실행된다는것은 해당 코드가 메모리에 올라갔다는 의미.

(프로그램은 저장장치에 저장되어 있는 정적인상태, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태.)

(누군가 작성한 프로그램이 실행되면 프로세스가 되는것이다.)

 

1.2 프로그램에서 프로세스로의 전환

- 프로세스는 컴퓨터 시스템의 작업 단위로 태스크(task) 라고도 부른다.

1) 운영체제가 프로그램을 메모리의 적당한 위치로 가져온다.

2) 위의 동작과 동시에 프로세스 제어블록을 생성한다. 

3) 프로세스 제어 블록을 운영체제가 받으면, 프로그램은 > 프로세스가 된다.

 

* 프로세스 제어블록 - (프로세스를 처리하는데 필요한 다양한정보가 있다)

 

1.3 프로세스의 상태

> 생성 상태 ( create status)

- 프로그램이 메모리에 올라오고 운영체제로 부터 프로세스 제어 블록을 할당받은 상태.

 

> 준비 상태 (ready status)

- 실행 대기중인 모든 프로세스가 자기 순서를 기다리는 상태.

- 프로세스 제어 블록은 준비 큐 에서 기다리며 CPU 스케줄러에 의해 관리 된다. (dispatch)

* dispatch(PID) 명령 - CPU 스케줄러가 프로세스의 제어 블록을 선택하는 작업.

 

> 실행 상태 (running status)

- 프로세스가 CPU를 할당받아 실행되는 상태.

- 자신에게 주어진 시간, 타임 슬라이스 동안만 작업할수 있다.

 

> 대기 상태 (blocking status)

- 실행 상태에 있는 프로세스가 입출력을 요청했을떄, 입출력이 완료 될떄 까지 기다리는 상태 > wait status라고도함.

- 입출력이 완료 되면 인터럽트가 발생하고, wake up(PID)로 해당 프로세스를 준비 상태로 이동시킨다.

 

> 완료 상태 ( terminate status)

- 프로세스가 종료되는 상태

- 정상 종료는 exit()처리. 비정상적으로 종료 되는경우 메모리 상태를 저장 장치로 옮기는데, 이를 코어 덤프라 한다.

 

> 휴식 상태 ( pause status)

- 프로세스가 작업을 일시적으로 쉬고있는상태. 

- 사용하던 데이터가 메모리에 그대로 있고 프로세스 제어 블록도 유지되므로 프로세스가 멈춘 지점부터 재시작 할수 있다.

 

> 보류 상태 ( suspend status)

- 프로세스가 메모리에서 잠시 쫓겨난 상태.  (대부분의 컴퓨터 성능을 떨어 뜨리거나 실행을 미루어도 지장 없는 프로세스)

- 보류 상태에 들어간 프로세스는 메모리 밖으로 쫓겨나 스왑 영역에 보관. 

 

 

2. 프로세스 제어 블록과 문맥 교환

 

2.1 프로세스 제어 블록

- 프로세스를 실행하는데 필요한 중요한 정보를 보관하는 자료 구조로 TCB(Task COntrol Block)라고 한다.

- 모든 프로세스는 고유의 프로 세스 제어 블록을 가지며, 생성시 만들어지며 실행 종료시 폐기.

 

2.2 프로세스 제어 블록의 구성

> 포인터

- 프로세스 제어 블록을 연결하여 준비상태나 대기 상태의 큐를 구현할때, 포인터를 사용

 

> 프로세스 상태

- 현재 프로세스의 상태를 나타낸다.

 

> 프로세스의 구분자

- 운영체제 내에 있는 여러 프로세스를 구별하기 위한 구분자 저장

 

> 프로그램 카운터

- 다음에 실행된 명령어의 위치를 가리키는 프로그램 카운터의 값 저장

 

> 프로세스 우선순위

- 우선순위에 따라 프로세스 제어 블록들이 여러 줄로 서있다. 

- CPU 스케줄러가 준비 상태에 있는 프로세스 중 실행 상태로 옮겨야할 프로세스를 선택할때는 우선순위를 기준으로 삼는다.

 

> 각종 레지스터 정보

- 이전에 실행할때 사용한 레지스터의 값을 보관해야 다음에 실행 할수 있기 때문에, 자신이 사용하던 레지스터의 중간값 보관

 

> 메모리 관리 정보

- 프로세스가 메모리의 어디에 있는지 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터값, 한계 레지스터 값 등 저장.

 

> 할당된 자원 정보

- 프로세스를 실행하기 위해 사용하는 입출력 자원이나, 오픈파일 등에 대한 정보

 

> 계정 정보

- 계정 번호, CPU 할당 시간, CPU 사용 시간 등 

 

> 부모 프로세스 구분자와 자식 프로세스 구분자

- 부모 프로세스 (PPID) 와 자식 프로세스 (CPID) 정보 저장

 

2.3 문맥교환

- CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업.

- 실행상태에서 나가는 프로세스 제어 블록에는 지금까지 작업 내용 저장후, 

  반대로 실행 상태로 들어오는 프로세스 제어 블록의 내용으로 CPU 가 다시 세팅. 

( 이전 작업 상태가 되어야 다음 작업을 할수 있기 때문 )

 

2.4 문맥 교환이 일어나는 시점 

<1> 프로세스가 자신에게 주어진 시간을 다 사용 했을때

<2> 인터럽트가 발생했을때

<3> 자신에게 주어진 메모리 공간을 넘어 가려 했을때 등등..

 

3. 프로세스의 연산

 

3.1 프로세스의 구조

- 프로세스는 코드 영역, 데이터 영역, 스택 영역으로 구성

 

> 코드영역

- 프로그램의 본문이 기술 된곳.

- 프로그램은 코드 영역에 탑재 되며, 읽기 전용으로 처리 됨

 

> 데이터 영역

- 코드가 실행되면서 사용되는 변수나 파일등 각종 데이터를 모아놓은곳.

- 본문에 사용되는 데이터가 저장 , 읽기와 쓰기가 가능하다

 

> 스택 영역

- 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은곳.

- 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게 보이지않음.

 

3.2 프로세스의 생성과 복사

- 프로세스는 프로그램을 실행할때 새로 생성한다.

 

[생성]

1> 프로그램 실행하면 프로그램을 메모리로 가져와 코드영역에 넣고 프로세스 제어 블록 생성

2> 메모리에 데이터 영역과 스택 영역 확보후 프로세스 실행.

 

[시스템 호출 함수]

> fock() - 실행중인 프로세스로부터 새로운 프로세스를 복사하는 함수.

                 ( 실행하던 프로세스는 부모 프로세스, 새로 생긴 프로세스는 자식 프로세스로 부모-자식 관계가 된다)

 

> 특징

프로세스를 복사하면 일부 변경된다.

1) PID 변경 - 부모의 자식과 주민번호가 다른것과 마찬가지 PK가 변경되는것.

2) 메모리 관련 정보 변경 - 각 프로세스가 저장된 메모리 위치가 다르므로 변경

3) 부모프로세스 구분자(PPID) 와 자식 프로세스 구분자(PID) 변경 - 자식프로세스의 자식프로세스가 없을수 있기에 동기화 작업

 

> 장점

1) 프로세스 생성 속도가 빠르다. - 기존 메모리에서 복사하기 때문에 빠름.

2) 추가 작업없이 자원 상속 가능 - 부모 프로세스가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속가능

3) 시스템 관리를 효율적으로 가능 - 부모-자식으로 연결되있으므로 메모리 정리시 효율적으로 찾을수 있다.

 

 

> exec() - 프로세스는 그대로 둔채 내용만 바꾸는 시스템 호출. 현재의 프로세스가 완전히 다른 프로세스로 전환

 

> 특징

프로세스의 구조체를 재활용 하기 위함

 

> 장점

1) 이미 만들어진 프로세스 제어블록, 메모리영역, 부모-자식 관계를 그대로 사용할수 있어 편리하다.

2) fock() 함수와는 다르게, 운영체제 내부적으로 동작과정이 간단하다. 

 

3.3 프로세스 계층 구조의 장점

- 동시에 여러 작업을 처리하고 종료된 프로세스의 자원을 회수하는데 유용 하다.

- 프로세스 간의 책임관계가 분명해져 시스템을 관리하기 수월 하다.

 

* 고아 프로세스 - 프로세스가 종료된후에 비정상적으로 남아있는 프로세스 

4. 스레드

4.1 스레드의 개념

- 프로세스의 코드에 정의된 절차에 따라 CPU에 작업을 요청하는 실행단위 ..... 너무 백과사전같다

(프로세스는 요리 작업 전체와 같고, 스레드는 요리를 완성하기 위해 수행하는 각각의 조리에 해당 )

 

4.2 프로세스와 스레드의 차이

- 프로세스 끼리는 약하게 연결되어 있지만, 스레드 끼리는 강하게 연결되어 있다.

 

프로세스 - 프로세스는 사실 하나의 결과물이기 때문에 각각의 프로세스 끼리 강하게 의존하지 않는다.

스레드 - 한 프로세스 안에 여러개의 스레드가 있을때는 스레드는 프로세스 내부에서 서로 강하게 연결되어 있다. 

멀티스레드 - 한 프로세스 내에서, 스레드들이 동시에 작업을 하는것

멀티태스크 - 서로 독립적인 프로세스 끼리 각자 작업을 하기에 한곳이 문제 생겨도 문제가 안생긴쪽은 영향이없다.

 

4.3 스레드 관련 용어

멀티 스레드 - 프로세스 내 작업을 여러개의 스레드로 분할함으로써 작업의 부담을 줄임

멀티 태스킹 - 운영체제가 CPU에 작업을 줄떄 시간을 잘게 나누어 배분하는 기법 ( 시분할 시스템 ) 

멀티 프로세싱 - CPU를 여러개 사용하여 여러개의 스레드를 동시에 처리하는 작업환경

CPU 멀티 스레드 - 한번에 하나씩 처리해야하는 스레드를 파이프 라인 기법을 이용해 동시에 여러 스레드를 처리하도록 만든 병렬 처리

 

 

4.4 멀티 스레드의 구조

- fock()함수로 프로세스를 복사하면 코드영역과 데이터 영역이 메모리에 중복되어 메모리 낭비가 발생한다. 

- 스레드는 이런 멀티 태스킹 낭비 요소를 제거하기 위해 사용.

- 비슷한 일을 하는 2개의 프로세스를 만드는 대신 코드,데이터 등을 공유하며 여러개의 일을 하나의 프로세스 내에서 하는것

 

4.5 멀티 스레드의 장단점

[장점]

- 자원 공유 > 자원의 중복 사용을 피함으로서 메모리 낭비 방지

- 응답성 향상 > 여러 스레드가 작업을 하고있기에 사용자의 작업 요구에 빨리 응답 가능

- 효율성 향상 > 프로세스를 여러개 생성하는것과 달리 스레드는 불필요한 자원 중복을 막음으로써 시스템 효율이 향상

- 다중 CPU 지원 > CPU를 여러개가 있다면 다중 멀티 스레드를 처리해 속도가 빨라진다.

 

[단점]

- 자원공유 > 모든 스레드가 같은 자원을 공유하기에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다.