1. 프로세스의 개요

    1.1. 프로세스의 개념

    1.2. 요리사 모형에의 비유

    1.3. 프로그램에서 프로세스로의 전환

    1.4. 프로세스의 상태

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

    2.1. 프로세스 제어 블록

    2.2. 문맥 교환

3. 프로세스의 연산

    3.1. 프로세스의 구조

    3.2. 프로세스의 생성과 복사

    3.3. 프로세스의 전환

    3.4. 프로세스의 계층 구조

4. 스레드

    4.1. 스레드의 개념

    4.2. 멀티스레드의 구조와 예

    4.3. 멀티스레드의 장단점

    4.4. 멀티스레드 모델

5. [심화학습] 동적 할당 영역과 시스템 호출

    5.1. 프로세스의 동적 할당 영역

    5.2. exit()와 wait() 시스템 호출


1. 프로세스의 개요

    1.1. 프로세스의 개념

프로그램(Program) : 기억장치에 저장되어 있는 정적인 상태

프로세스(Process) : 프로그램이 메모리에 올라와 실행되는 동적인 상태

 └ 컴퓨터 시스템의 작업 단위로 Task라고도 부른다.

 

    1.3. 프로그램에서 프로세스로의 전환

PCB(Process Control Block; 프로세스 제어 블록)

 └ 운영체제가 프로세스를 구분하기 위해 관리하는 자료 구조

 └ 구성 요소 : 프로세스 구분자, 메모리 관련 정보, 각종 중간값

     └ 프로세스 구분자(PID; Process IDentification) : 구분하기 위한 ID

     └ 메모리 관련 정보 : 프로세스가 어느 메모리 저장되어 있는지에 대한 위치 정보

     └ 각종 중간값 : 프로세스가 어느 정도 처리되었는지를 알려주는 값

 

컴퓨터에는 일반 프로세스와 커널 프로세스가 섞여서 실행된다.

 └ 일반 프로세스(User Process) : 일반 사용자가 사용하는 프로세스

 └ 커널 프로세스(Kernel Process) : OS같은 컴퓨터가 사용하는 프로세스

 

    1.4. 프로세스의 상태

생성 상태(Create Status)

프로그램이 메모리에 올라와 실행 준비를 완료한 상태. 이때 PCB가 생성되고 할당받는다.

 

준비 상태(Ready Status)

생성된 프로세스가 CPU(실행 권한)를 얻을 때까지 준비 큐(Queue)에서 기다리는 상태.

CPU 스케줄러가 프로세스를 준비 상태에서 실행 상태로 바꾸는 것을 Dispatch라고 한다.

 

실행 상태(Running Status)

준비 상태의 프로세스를 CPU가 얻어 실제 작업을 수행하는 상태(Execute Status).

CPU 스케줄링에 따라 일정 시간동안 CPU를 사용한다. 이때 작업이 남았다면 다시 준비 상태가 된다.

CPU 스케줄러가 프로세스를 다시 준비 상태로 보내는 것을 Time-Out이라고 한다.

 

대기 상태(Blocking Status)

실행 상태의 프로세스가 입출력이 필요할 때 입출력을 완료할 때까지 기다리는 상태.

입출력을 완료할 때까지 작업을 진행할 수 없기에, 프로세스를 대기 상태로 옮겨 입출력을 실행한다.

프로세스를 대기 상태로 옮기면 실행 상태인 프로세스가 없기에, 새로운 준비 상태의 프로세스를 실행 상태로 옮긴다.

 

완료 상태(Terminate Status)

실행 상태의 프로세스가 주어진 작업을 마친 상태. PCB가 사라진 상태이다.

비정상적으로 종료가 되었다면, 디버깅을 위해 강제 종료 직전의 메모리를 기억장치를 옮긴다.

​ └ 이것을 Core Dump(코어 덤프)라고 한다.

 

휴식 상태(Pause Status)

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

종료 상태가 아니라 원할 때 언제든 프로세스 작업을 다시 시작할 수 있다.

 

보류 상태(Suspend Status)

휴식 상태와는 다르게, 프로세스가 메모리에서 잠시 쫓겨난 상태.

 └ 메모리에 여유 공간이 없는 경우

 └ 프로그램에 오류가 있는 경우

 └ 바이러스라고 판단되는 경우

 └ 주기가 길어서 메모리 밖으로 놔도 상관없는 경우

 └ 입출력이 계속 지연되는 경우

 

요약하자면, 성능을 떨어드리거나 실행을 미루어도 상관이 없는 프로세스들이다.

 

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

    2.1. 프로세스 제어 블록

TCB(Task Control Block)이라고도 한다.

모든 프로세스는 고유의 PCB를 가진다.

 

2.1.1. 프로세스 제어블록의 구성

포인터(Pointer)

준비 상태와 대기 상태의 Queue를 구현할 때 사용한다.

 

프로세스 상태

현재 프로세스가 위에서 언급한 상태 중 어느 상태인지 나타낸다.

 

프로그램 카운터

다음에 실행할 명령어의 위치를 가리키는 주소값이다.

 

프로세스 우선순위

프로세스가 몇 번째로 실행되어야 하는지 적혀있는 우선순위가 들어있다.

 

각종 레지스터 정보

프로세스를 실행하는 중에 사용하는 레지스터 중간값이다.

 

메모리 관리 정보

해당 프로세스가 메모리 어디에 있는지에 대한 위치 정보가 들어있다.

메모리를 가리켜야 하기에 경계 레지스터와 한계 레지스터 값도 들어있다.

 

할당된 자원 정보

프로세스를 실행하기 위해 사용되는 입출력 자원이나 다른 파일에 대한 정보가 들어있다.

 

계정 정보

계정 번호, CPU 할당 시간, CPU 사용 시간 등의 정보가 들어있다.

MultiUser를 지원하기 때문에(사용자 계정이 다른 경우), 계정 번호가 필요하다.

 

PPID와 CPID

PPID는 Parent PID의 준말로, 자신의 부모 프로세스를 가리킨다.

CPID는 Child PID의 준말로, 자신의 자식 프로세스를 가리킨다.

 

2.1.2. 포인터의 역할

대기 상태의 프로세스들

대기 상태의 경우 같은 입출력끼리 묶어 입출력의 효율을 향상한다.

그럴 때, 같은 요구 사항의 프로세스끼리 포인터를 사용해 연결한다.

 

    2.2. 문맥 교환

 

두 개의 프로세스가 문맥 교환을 하는 예시

CPU를 차지하던 프로세스가 나가고, 새로운 프로세스를 받는 작업을 말한다.

프로세스는 CPU 스케줄링을 따라 일정 시간동안만 작업할 수 있어, 이런 과정이 필요하다.

 

3. 프로세스의 연산

    3.1. 프로세스의 구조

코드 영역

프로그램의 본문으로, 프로그래머가 작성한 코드가 탑재되는 공간이다.

텍스트 영역이라고도 하며, 프로그램이 시작할 때부터 종료될 때까지 메모리에 남아있는다.

 

데이터 영역

코드가 실행되면서 사용하는 변수나 파일들을 모아놓는 공간이다.

데이터는 변하는 값이기에 읽기와 쓰기가 가능하다.

 

스택 영역

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

데이터 영역은 전역 변수, 정적 변수들을 저장하는 공간이고, 스택 영역은 지역 변수, 매개 변수들을 저장하는 공간이다.

프로세스 내에서 함수를 호출하면 되돌아오기 위한 위치를 저장한다.

 

    3.2. 프로세스의 생성과 복사

fork()의 개념

실행 중인 프로세스와 똑같은 프로세스를 하나 더 만드는(복사하는 함수)

이때 기존 프로세스는 부모 프로세스라고 부르고. 신규 프로세스는 자식 프로세스라고 부른다.

 

0

fork()의 과정

fork()를 호출하면, PCB를 포함한 모든 영역을 복사하면 똑같은 프로세스가 생성된다.

 └ 이때 PCB 중 PID, 메모리 관련 정보, PPID, CPID와 같은 특정한 부분은 변경된다.

 

fork()의 장점

ㆍ 프로세스의 생성 속도가 빠르다.

ㆍ 추가 작업 없이 자원을 상속할 수 있다.

ㆍ 시스템 관리를 효율적으로 할 수 있다.

 

    3.3. 프로세스의 전환

 

exec()의 개념

기존의 프로세스를 새로운 프로세스로 재사용하는 함수

fork()와의 차이점은 새로 생기는 프로세스가 없다는 점이다.

 

exec()의 과정

exec()를 호출하면, 프로세스의 모든 내용이 리셋된다.

 └ 이때 PCB 중 PID, PPID, CPID, 메모리 관련 사항과 같은 특정한 부분은 유지된다.

 

    3.4. 프로세스의 계층 구조

Unix 프로세스의 계층 구조 예시

위의 그림처럼 트리 구조이다. Unix(유닉스)의 모든 프로세스는 init의 자식이다.

 

장점

ㆍ 여러 작업을 동시에 처리할 수 있다.

ㆍ 프로세스의 재사용이 쉽다.

ㆍ 자원 회수가 쉽다.

 

고아 프로세스(Orphan Process)

좀비 프로세스(zombie Process)라고도 부른다.

비정상적인 프로세스 종료로, 부모 프로세스는 죽었는데 자식 프로세스가 남아있는 경우를 말한다.

자식 프로세스에 접근할 수 있는 부모가 없기 때문에 심한 오류가 발생한다.

C언어에서는 이를 방지하기 위해 exit()이나 return()을 작성한다.

 

4. 스레드

    4.1. 스레드의 개념

스레드(Thread)

프로세스에서 처리하는 실행 단위, 이 스레드를 전달받아 CPU의 작업을 처리한다.

그래서 CPU의 작업 단위이다.

 

멀티태스크(MultiTask) : 여러 개의 프로세스로 구성된 것

멀티스레드(MultiThread) : 하나의 프로세스에 여러 개의 스레드로 구성하여, 작업 부담을 줄이는 프로세스 운영 기법

 

(왼쪽부터 차례대로) 멀티스레드, 멀티태스킹, 멀티프로세싱, CPU 멀티스레드

멀티태스킹(MultiTasking) : 운영 체제가 CPU에 작업을 줄 때, 시간을 잘게 나누어 배분하는 기법, 시분할 시스템이다.

멀티프로세싱(MultiProcessing) : 여러 개의 CPU로 여러 개의 스레드를 동시에 처리하는 환경

CPU 멀티스레드 : 스레드를 파이프라인 기법을 이용해 동시에 처리하는 방법

 └ 멀티스레드는 소프트웨어에서 처리하는 방법, CPU 멀티스레드는 하드웨어에서 처리하는 방법이다.

 

    4.2. 멀티스레드의 구조와 예

멀티스레드(왼쪽), 멀티태스킹(오른쪽)

멀티스레드는 코드와 파일같은 자원을 공유해 자원의 낭비를 막는다.

 

    4.3. 멀티스레드의 장단점

단일 스레드(왼쪽), 멀티스레드(오른쪽)

장점 : 응답성 향상, 자원 공유, 효율 향상, 다중 CPU 지원

단점 : 자원 공유로 인해 에러 공유

 

    4.4. 멀티스레드 모델

커널 스레드(Kernel Thread) : 커널이 직접 생성하고 관리하는 스레드

사용자 스레드(User Thread) : 사용자 라이브러리에 의해서 구현되는 보통의 스레드

 

One-to-One Model(좌상단), Many-to-One Model(우상단), Many-to-Many Model(좌하단), Two-level Model(우하단)

커널 스레드와 사용자 스레드 간의 대응되는 구조로 이러한 방법이 있다만 알고 넘어가면 될 듯하다.

 

5. [심화학습] 동적 할당 영역과 시스템 호출

    5.1. 프로세스의 동적 할당 영역

위에서 언급한 프로세스의 구조에서 자세하게 들어간 설명이다.

데이터 영역이 일반 데이터 영역과 힙 영역 두 가지로 나뉜다.

 

힙 영역과 스택 영역

프로세스가 실행되는 동안 만들어지는 동적 할당 영역이다.

 

힙(Heap) 영역

프로그램이 실행되는 동안 할당되는 영역

프로그래머가 직접 공간을 할당, 해제하는 공간이다.

malloc()과 new로 할당하고, free()와 delete로 해제한다.

 

스택(Stack) 영역

스레드가 작동하는 동안 할당되는 영역

프로그램이 자동으로 사용하는 임시 메모리 영역이다.

 

힙(Heap)은 FIFO 구조이다. 그림에서처럼 메모리의 낮은 주소부터 높은 주소 방향으로 할당되기 때문이다.

스택(Stack)은 LIFO 구조이다. push하면 높은 주소에 메모리가 할당돼, pop할 때 나중에 꺼내지기 때문이다.

 

    5.2. exit()와 wait() 시스템 호출

exit()

작업의 종료를 알려주는 시스템 호출

이를 선언함으로써 부모 프로세스는 자식 프로세스의 확실한 종료를 알고 빠르게 자원을 회수할 수 있다.

exit()의 인자가 0이면 정상 종료고, exit(-1)이면 비정상 종료라고 판단한다.

 

wait()

자식 프로세스의 종료를 기다린 후, 종료된 이후에 실행하는 시스템 호출

부모 프로세스와 자식 프로세스 간 동기화에도 사용한다.

+ Recent posts