이메일을 적으시면 보안관련 소식을 받을수 있습니다.
이메일:













작성자: WhiteHT
편집자:엔시스(sis@sis.pe.kr)



안녕하세요^^

WhiteHT 입니다. 오늘은 지난 시간에 이어서 프로세스에 대해서 알아보도록 하겠습니다.

 

먼저 프로세스가 뭐하는 녀석인가, 프로세스의 개념에 대해서 알아보겠습니다.


 

프로세스란? : 실행중인 프로그램의 Instance

프로세스의 구성은? : * Text Section : Program Code

                            * Program Counter

                            * Stack : 일시적인 데이터를 저장하는 곳(파라미터, 복귀주소, 지역변수등)

                            * Data Section : 광역 변수를 저장하는 곳


 

이렇게 간략하게 정리해볼 수 있을 것 같습니다. Programming을 하다보면 스택이니 뭐 그런 얘기들 많이 나오잖아요?^^ 그 부분이 저기가 되겠네요. 다시 정리하면 프로그램 자체가 프로세스가 아니며, 프로그램은 수동적인 것이고 프로세스는 능동적인 개체가 된다고 생각하시면 되겠습니다.

 

<그림 1. 메모리에 로딩된 프로세스 구조>

 

위에 그림을 보면 프로세스가 어찌 구성되었는지 대략적으로 아시겠지요?^^ 버퍼오버플로우(Buffer Overflow)에 대해서 공부하시려면 한번 쯤은 보셔야 하는 부분이라고 생각합니다.

 

다음은 프로세스 상태에 대해서 살펴보겠습니다.

 

<그림 2. Process 상태도>

 

위 그림을 보면서 한번 보겠습니다.

new 단계에서는 프로세스가 생성되는 단계입니다. 즉 프로그램을 실행시켰을 때 첫 번째 상태가 될 것입니다. 다음은 ready 단계로 프로세스가 프로세서에 할당되기를 기다리고 있는 상태가 되겠습니다. running 상태는 프로세스가 실행중인상태가 될 것이고요.  waiting은 프로세스가 어떤 사건(event)을 기다리고 있는 상태가 됩니다. terminated는 프로세스의 실행이 종료된 상태인 것입니다. 딱 영어 단어 말 그대로이지요??

, 하나 알아두고 넘어가셔야 할 것이 단일 프로세스 시스템에서는 현재 실행 상태에 있을 수 있는 프로세스가 오직 하나 뿐이라는 것이지요. 하지만 많은 프로세스가 waiting or ready 상태에 있을 수 있다는 것입니다. waiting 중인 process event가 발생하기 전까지는 프로세서가 놀고 있더라도 실행되지 않습니다^^

이렇게 실행중인 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 CPU에 적재하는 과정을 Context switch라고 칭합니다. context PCB에 유지되고 Context switch에 소요되는 시간을 오버헤드라고 합니다. 이런 문제를 해결하기 위해 특수 명령어를 사용하거나 레지스터 집합, 스레드를 사용하는 것입니다. 자세한 오버헤드 등의 문제는 다음 포스팅때 또 다루도록 하겠습니다.


<그림 3. Unix 시스템의 프로세스 상태도>

 

예로 Unix 시스템에서는 프로세스가 exit System call을 수행하면 프로세스는 종료가 되며, 리소스는 반환되게 됩니다. 하지만 시스템에서 완전히 제거된 것이 아니고, 그 프로세스를 생성한 프로세스가 그 프로세스를 생성한 그 프로세스의 종료 상태등을 얻을 수 있도록 일시적으로 Zombie 상태에 놓이게 됩니다. 크게는 위 <그림 2> 처럼 프로세스의 상태를 정의할 수 있겠습니다.

 

그럼 다음으로 PCB에 대해서 알아보겠습니다

PCB(Process Control Block)는 운영체제가 프로세스 마다 아래와 같은 정보들을 유지하고 있습니다.


<그림 4. PCB(Process Control Block)>

 

PCB에는 프로세스의 상태(new, ready, waiting, running, terminated), 프로그램 카운터(다음에 실행할 명령어의 주소), CPU 레지스터(running 상태에서 waiting 또는, ready 상태로 변경될때 값),CPU 스케줄링 정보(우선순위와 같은 스케줄링 정보), Accounting(CPU 사용 시간과 같은 통계 정보), 입출력 상태 정보(프로세스에 할당된 입출력 장치 등)등의 내용이 담겨 있습니다.

 

프로세스 스케줄러에 대해서 그럼 잠깐 살펴볼까 합니다.


멀티프로그래밍의 목적은 항상 실행할 프로세스가 있도록 하는 것입니다. 이 것을 통해 CPU의 사용 효율을 높이는 것이지요. 시분할 시스템 같은 경우는 프로세스를 빈번하게 바꾸어 가면서 실행하여 사용자들이 프로그램과 상호작용이 가능하도록 하는 것입니다. 그럼 프로세스의 스케줄링을 위해서 OS는 뭘 지원하고 있을까요?


바로 큐(Queue)를 사용하는 것입니다. 일반적으로 큐는 Linked list로 구현 되어 있습니다.

큐의 헤더에는 리스트에 존재하는 첫 번째와 마지막 PCB를 가리키는 포인터를 가지고 있고, PCB는 다음 PCB를 가리키는 포인터를 Field로 가지고 있습니다.


큐에는 job queue, ready queue, device queue, waiting queue가 있습니다. 말 그대로 job queue는 프로세스가 시스템에 처음 들어와서 대기하는 큐이고 ready queue는 주기억 장치에서 적재되어 실행을 기다리는 프로세스를 유지하는 큐이며 device queue는 장치를 사용하기 위해 기다리는 큐입니다. 마지막으로 waiting queue는 특정한 event마다 대기하는 프로세스를 유지시켜주는 큐입니다.

 

본격적으로 스케줄러는 각 큐마다 다음 차례의 프로세스를 결정하여 줍니다.

스케줄러에도 종류가 있는데요.


Long-term scheduler, short-term scheduler, medium-term scheduler
가 있습니다.

정리하여 보면 아래와 같습니다.

 

1. long-term scheduler : -멀티 프로그래밍의 정도를 결정, 시스템의 성능 저하 방지.

                      - 입출력 중심과 CPU중심의 프로세스를 적정하게 선택해야함

                      - Unix와 같은 시스템은 이를 사용하지 않음.

                      - Job scheduler라고도 함

2. short-term scheduler : - ready queue에서 다음에 CPU에 할당할 프로세스를 결정

                       - CPU scheduler라고도 함.

3. medium-term scheduler : - 멀티프로그래밍 정도를 컨트롤 하는 역할


 

위와 같이 정리할 수 있습니다.

 

후아.. 내용을 정리하다 보니까.. 쉽지가 않네요^^; 역시 OS내부구조 쉽지 않은 것 같습니다.

오늘은 Process에 대한 기본적인 이론에 대해서 알아보았는데요.. 부족한 부분도 많이 있지만, 기본적으로 알아야 하는 부분이라 판단하여 포스팅하게 되었습니다^^

 

다음 회차에는 Process 생성부분을 조금 다루어 보고 Thread 스레드에 대해서 정리하겠습니다^^

 


 

****************************************************************************************************

본 포스팅의 저작권은 보안인닷컴과 작성자에 있으며 상업적 이용을 배제하며 콘텐츠 이용시에는 반드시 출처와 링크를 이용해 주시기 바랍니다. 무단도용은 저작권법에 저촉을 받습니다..

****************************************************************************************************

Posted by 알 수 없는 사용자
,