11_프로세스에 대한 연산

 

대부분 시스템 내의 프로세스들은 병행 수행 될 수 있으며 반드시 동적으로 생성되고 제거되어야 한다.

 

프로세스는 실행 도중에 프로세스 생성 시스템 호출을 통해서 여러 개의 새로운 프로세스들을 생성 할 수 있다. 생성하는 프로세스를 부모 프로세스라 하며 생성된 새로운 프로세스들은 자식 프로세스라 부른다. 새로운 프로세스들은 다시 새로운 프로세스들을 생성할 수 있으며 그 결과 트리 구조의 프로세스가 형성 된다.

 

 

대부분의 운영체제들은 프로세스 식별자(PID)에 의해 프로세스를 구분하며 식별자는 정수 이다.

 

 

프로세스가 새로운 프로세스를 생성할 때 실행과 관련하여 두 가지 가능성이 있다.

  • 부모가 계속해서 자식과 병렬로 실행 된다.
  • 부모가 모든 자식 또는 일부 자식이 끝날 때까지 기다린다.

 

새로운 프로세스들의 주소 공간 측면에서 볼 때 다음과 같은 두 가지 가능성이 있다.

  • 자식 프로세스는 부모 프로세스의 복사본이다. (자식 프로세스는 부모와 똑 같은 프로그램과 자료를 가진다.)
  • 자식 프로세스가 자신에게 적재될 새로운 프로그램을 갖고 있다.

 

프로세스 종료는 프로세스가 마지막 문장의 실행을 끝내고 exit() 시스템 호출을 사용하여 운영체제에게 자신의 삭제를 요청 한다. 이 시점에서 프로세스는 부모 프로세스에게 wait() 시스템 호출을 통해 상태 값을 반환할 수 있다. 이때 물리 메모리와 가상 메모리, 열린 파일, 입/츨력 버퍼를 포함한 모든 자원이 운영체제로 반납된다.

 

 

프로세스가 종료되는 다른 경우를 살펴 보자.

  • 자식이 자신에게 할당된 자원을 초과하여 사용 할 때
  • 자식에게 할당된 태스크가 더 이상 필요 없을 때
  • 부조가 종료하는데 운영체제는 부모가 종료한 후에 자식이 수행되는 것을 허용하지 않는 경우

 

VMS를 비롯한 일부 시스템에서는 부모 프로세스가 종료된 이후 자식 프로세스가 존재할 수 없다. 그러한 시스템에서 프로세스가 종료되면 부모로부터 비롯된 모든 자식 프로세스들도 종료되어야 한다. 이것을 연속적 종료(Cascading Termination)이라 하며 운영체제가 직접 수행 한다.

 

 

'SW Engineering > OS Concept' 카테고리의 다른 글

13_클라이언트 서버 환경에서 통신  (0) 2015.07.16
12_프로세스간 통신  (0) 2015.07.16
11_프로세스에 대한 연산  (0) 2015.07.16
10_프로세스 스케줄링  (0) 2015.07.16
09_프로세스 개념  (0) 2015.07.16
08_시스템 부트  (0) 2015.07.16

10_프로세스 스케줄링

 

다중 프로그래밍의 목적은 CPU의 사용을 최대화 화기 위하여 항상 어떤 프로세스가 실행 되도록 하는데 있다.

 

시분할의 목적은 각 프로그램이 실행 되는 동안 사용자가 상호 작용할 수 있도록 프로세스들 사이에서 빈번하게 CPU를 교체하는 것이다.

 

 

 

위 두 개의 목적을 달성하기 위해 프로세스 스케줄러가 존재한다. 프로세스 스케줄러는 CPU에서 수행 가능한 여러 프로세스들 중에서 하나의 프로세스를 선택 한다. 단일 처리기 시스템에서는 실행 중인 프로세스가 한 개 이상 있을 수 없다. 만약 단일 처리기에 여러 프로세스들이 있다면 프로세스들은 CPU가 작업이 끝날 때까지 대기하여야 한다.

 

 

 

프로세스가 시스템에 들어오면 작업 큐에 놓여 진다.(메인 메모리 위치) 이 큐는 시스템 안의 모든 프로세스로 구성 된다. 준비 완료 상태에서 실행을 대기하는 프로세스를 준비 완료 큐(Ready Queue)라고 하며 리스트상에 유지 되며 연결 리스트로 저장 된다. 준비 완료 큐의 헤더는 리스트의 첫 번째와 마지막 PCB를 가리키는 포인터를 포함한다. 각 PCB는 준비 완료 큐에 있는 다음 프로세스를 가리키는 포인터 필드를 가진다.

 

시스템에는 다양한 큐들이 있다. 장치 큐(Device Queue)라고 불리는 특정 입/출력 장치를 대기하는 프로세스도 있다. 각 장치는 그 자신의 장치 큐를 가진다.

 

아래 그림을 보면 프로세스는 가장 먼저 큐에 넣어 진다. 프로세스가 새로운 서브 프로세스를 생성하고 그 프로세스 종료를 기다린다. 프로세스가 인터럽트 결과에 의해 강제로 CPU로부터 제거되고 준비 완료 큐에 다시 놓일 수 있다.

 

 

프로세스는 일생 동안(종료될 때 까지)에 다양한 상태의 스케줄링 큐로 변경 된다. 운영체제는 어떤 방식으로든지 스케줄링 목적을 위해 프로세스들을 이 큐에서 반드시 선택 해야 한다. 이때 선택 절차는 스케줄러에 의해 수행 된다.

 

시스템을 요청 작업을 수행 하는데 있어서 즉시 실행 할 수 있는 것보다 더 많은 프로세스들이 요청되기도 한다. 이때 프로세스들은 대용량 메모리(또는 디스크)에 저장되어 나중에 실행 될 때까지 대기하게 된다.

장기 스케줄러(작업 스케줄러)는 이 풀에서 프로세스들을 선택하여 실행하기 위해 메모리로 적재 한다. 단기 스케줄러(CPU 스케줄러)는 실행 준비가 완료되어 있는 프로세스들 중에서 선택하여 CPU에 할당 한다.

 

장기 스케줄러와 단기 스케줄러의 주요 차이점은 실행 빈도에 있다.

단기 스케줄러는 CPU를 위해 자주 새로운 프로세스를 선택 한다. 실행 간격이 짧기 때문에 반드시 빨라야 한다.

장기 스케줄러는 실행 빈도수가 훨씬 적다. 시스템에서 새로운 프로세스를 생성하는 간격이 수 분일 수도 있다. 장기 스케줄러는 다중 프로그래밍의 정도(메모리에 있는 프로세스들의 수)를 제어 한다. 장기 스케줄러는 실행간격이 크기 때문에 실행할 프로세스를 선택하는데 시간을 더 사용해도 된다.

 

대부분의 프로세스들은 입/출력 중심 또는 CPU 중심으로 묘사된다.

  • 입/출력 중심 프로세스는 연산보다 입/출력 수행에 더 많은 시간을 소요하는 프로세스 이다.
  • CPU 중심 프로세스는 입/출력 프로세스보다 연산에 시간을 더 소요하여 입/출력 요청을 드물게 발생시키는 프로세스이다.

 

장기 스케줄러는 입/출력 중심과 CPU 중심 프로세스들의 적절한 프로세스 혼합(mix)을 선택하는것이 중요하다.

입/출력 중심일 경우 준비 완료 큐는 항상 비게 되고 단기 스케줄러는 할 일이 없게 된다. 반면 CPU 중심으로만 이루어 진다면 입/출력 대기 큐는 항상 비어있는 상태가 되고 장치들은 사용되지 않으며 시스템 균형을 잃게 된다.

 

시분할 시스템과 같은 일부 운영체제들은 추가로 중간 수준의 스케줄링을 도입 한다. 스와핑(swapping)이라 불리는 이 방법은 메모리에서 프로세스들을 제거한 다음 차후 실행 시 다시 메모리에 프로세스를 불러와서 중단되었던 시점부터 실행을 재개 한다.

 

 

CPU를 다른 프로세스로 교환하려면 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업이 필요하다. 이 작업을 문맥 교환(Context Switch)이라 한다.

문맥 교환이 일어나면 커널은 과거 프로세스의 문맥을 PCB에 저장하고 새로운 프로세스의 저장된 문맥을 복구 한다. 문맥 교환이 일어날 동안 시스템은 아무런 일을 못하기 때문에 순수 오버헤드로 간주 된다. 또한 오버헤드는 메모리의 속도, 복사되어야 하는 레지스터의 수, 특수 명령어 등의 환경에 따라 달라진다.

 

 

 

[참고자료]

  • Operating System Concept / 홍릉과학 출판사

 

  • Multiprogrammed Batch systems :

http://www.transtutors.com/homework-help/computer-science/introduction-to-operating-system/multiprogrammed-batch-systems/

 

  • 컨텍스트 전환 :

http://publib.boulder.ibm.com/infocenter/idshelp/v115/index.jsp?topic=%2Fcom.ibm.admin.doc%2Fids_admin_0273.htm

 

 

'SW Engineering > OS Concept' 카테고리의 다른 글

12_프로세스간 통신  (0) 2015.07.16
11_프로세스에 대한 연산  (0) 2015.07.16
10_프로세스 스케줄링  (0) 2015.07.16
09_프로세스 개념  (0) 2015.07.16
08_시스템 부트  (0) 2015.07.16
07_가상 머신(Virtual Machine)  (0) 2015.07.16

09_프로세스 개념

 

초기의 컴퓨터 시스템은 한 번에 하나의 프로그램만 수행 할 수 있었다. 현대의 컴퓨터 시스템은 메모리에 다수의 프로그램들이 적재되어 병행 수행되는 것을 허용 한다. 이러한 발전은 프로그램을 보다 견고하게 제어하고 보다 구획화 할 것이 필요 했다. 이러한 필요성으로 프로세스 라는 개념이 탄생 하였으며 프로세스는 수행중인 프로그램 이란 뜻을 가지게 되었다. 현대의 컴퓨터에서 프로세스란 시분할 시스템에서 작업의 단위이기도 하다.

 

프로세스는 일괄 처리 시스템 작업이나 시분할 시스템 사용자들의 태스크를 모두 지칭 한다. 또한 프로그램 카운터의 값과 처리기 레지스터의 내용으로 대표되는 현재 활동을 포함 한다.

 

프로세스는 일반 적으로 함수의 매개변수 복귀 주소와 지역 변수와 같은 임시적인 자료를 가지는 프로세스 스택과 전역 변수들을 수록하는 데이터 섹션을 포함한다. 또한 프로세스 실행 중에 동적으로 할당되는 메모리인 힙을 포함 한다.

 

 

 

프로그램 그 자체는 프로세스가 아니다. 프로그램은 명령어 리스트를 내용으로 가진 디스크에 저장된 파일(실행 파일)과 같은 수동적인 존재인 반면 프로세스는 다음에 실행할 명령어를 지정하는 프로그램 카운터와 연관된 자원의 집합을 가진 능동적인 존재이다. 실행 파일이 메모리에 적재 될 때 프로그램은 프로세스가 된다.

 

프로그램 ≠ 프로세스

 

실행 파일이 메모리에 적재되는 일반적인 방식은 실행 파일을 나타내는 아이콘을 더블 클릭하는 방법과 명령어 라인상에서 파일이름 입력하는 방법이다. 이 때 두 프로세스들이 동일한 프로그램에 연관 될 수 있지만 이들은 두 개의 별도의 실행 순서로 간주 된다.

예를 들어 동일한 워드 파일을 각각 실행 할 경우 이들은 각각 별도의 프로세스이며 텍스트 섹션이 동등하다 할지라도 자료, 힙 및 스택 섹션은 다를 수 있다.

 

프로세스는 실행이 되면 그 상태가 변한다. 프로세스의 상태는 현재의 그 상태는 프로세스의 현재 활동을 정의한다. 다음 그림을 통해 프로세스 상태 및 정의를 알아 보자.

  • New : 프로세스가 생성
  • Running : 명령어들이 실행
  • Waiting : 프로시스가 어떤 사건(입/출력 등)이 일어나기를 기다림
  • Ready : 프로세스가 처리기에 할당되기를 기다림
  • Terminated : 프로세스의 실행이 종료

 

 

 

 

각 프로세스는 운영체제에서 프로세스 제어블록(Process Control Blcok : PCB)의 의해 표시 된다. 태스크 제어 블록이라고도 불린다.

  • Process State : 상태는 New, Ready, Running, Waiting(Halted)상태 등이다.
  • Program Counter : 프로그램 카운터는 이 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
  • Registers : CPU 레지스터는 컴퓨터 구조에 따라 다양한 개수와 유형을 가진다. 레지스터에는 누산기, 색인 레지스터, 스택 레지스터, 범용 레지스터들과 상태코드 정보가 포함 된다/ 프로그램 카운터와 함께 이 상태 정보는 나중에 프로세스가 계속 올바르게 수행되도록 하기 위해서 인터럽트 발생시 저장되어야 한다.
  • CU 스케줄링 정보 : 프로세스 우선순위, 스케줄 큐에 대한 포인터와 다른 스케줄 매개변수들을 포함
  • Memory Limits : 운영체제에 의해 사용되는 메모리 시스템에 따라 베이스 레지스터와 한계 레지스터의 값, 운영체제가 사용하는 메모리 시스템에 따라 페이지 또는 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함 한다.

 

  • Accounting : CPU가 사용된 양과 시간, 시간 제한, 계정번호, 작업 또는 프로세스 번호 등을 포함
  • 입/출력 상태 정보 : 프로세스에 할당된 입/출력 장치들과 열린 파일의 리스트 정보

[프로세스 제어 블록(PCB)]

 

 

[CPU 사이의 프로세스 Switch]

 

 

 

'SW Engineering > OS Concept' 카테고리의 다른 글

11_프로세스에 대한 연산  (0) 2015.07.16
10_프로세스 스케줄링  (0) 2015.07.16
09_프로세스 개념  (0) 2015.07.16
08_시스템 부트  (0) 2015.07.16
07_가상 머신(Virtual Machine)  (0) 2015.07.16
06_운영체제 구조  (0) 2015.07.16

08_시스템 부트

 

하드웨어를 사용하려면 운영체제를 설치해야 한다. 하지만 운영체제가 설치 되었다고만 해서 하드웨어는 커널이 어디에 있는지, 어떻게 적재하고 사용 할까?

 

대부분의 컴퓨터 시스템에서는 부트스트랩 프로그램, 또는 부트스트랩 적재기로 알려져 있는 작은 크기의 코드가 커널을 찾고 그것을 메인 메모리에 적재하고 수행을 시작한다. 컴퓨터가 전원을 켜거나 재부팅 등의 명령을 받으면 명령 레지스터는 미리 지정된 메모리 위치를 가리키게 되고 그 곳에서부터 실행을 시작 한다. 그 위치에는 최초의 부트스트랩(bootstrap)이 존재한다. RAM은 시스템 시작 시에 알 수 없는 상태가 되기 때문에 이 프로그램은 ROM(Read only Memory) 안에 저장 된다.(흔히 BIOS라 불리는 영역) ROM은 초기화 할 필요가 없고 바이러스 등의 걱정도 없기 때문에 편리하다.

 

 

 

부트 프로그램은 다양한 작업을 수행하지만 가장 기본적인 작업으로는 시스템의 상태(기계적인 상태)를 진단하는 것이다. 진단 작업이 통과되면 프로그램은 부팅 절차를 계속 한다. CPU 레지스터, 장치 제어기, 주 메모리드의 내용 등 시스템 전반에 걸쳐 초기화 한다. 그리고 운영체제를 시작 시킨다.

 

[Mac OS X 시스템 상태 진단]

 

휴대 전화, PDA, 콘솔 게임기 등의 시스템은 운영체제 전체를 ROM에 저장 한다. 운영체제를 ROM에 저장하는 것은 운영체제의 크기가 작거나 간단한 하드웨어를 지원하거나 열악한 환경에서 사용되는 시스템에 적합하다. 하지만 이 방식의 단점은 부스트랩코드가 변경되면 ROM을 교체 해야 하는 이슈가 발생한다. 일부 시스템에서는 EPROM(Erasable Programmable Read Only Memory)을 사용하여 해결하기도 한다.

 

 

이처럼 ROM 성격을 가진 모든 형태를 펌웨어(Firmware)라 부른다. 펌웨어의 단점은 용량이 크지 않고 가격이 비싸다는 것이다. 또한 메모리보다 속도가 느리다. 따라서 메모리에서 실행 할 때 보다 성능이 떨어진다. ROM의 성능 문제를 개선하기 위하여 일부 시스템은 운영체제를 실행 할 때 RAM으로 복사하여 실행 한다.

 

Windows, Mac OS, Linux 같은 일반적인 운영체제를 포함하여 대용량의 운영체제 또는 자주 변경되는 시스템은 부스트랩 적재기는 펌웨어에 있고 운영체제는 디스크에 존재 한다. 이 경우 부트스트랩은 진단 절차를 수행하고 고정된 위치의 디스크 블록 하나를 읽어 메모리에 적재하고 그 위치로부터 실행 시킬 수 있는 코드를 가진다. 이 블록을 부트 블록이라 한다. 부트 파티션을 가지고 있는 디스크는 부트 디스크 또는 시스템 디스크라 한다.

 

[부트 블록]

 

[부트 파티션]

 

 

모든 부트 프로그램이 적재되면 파일 시스템을 탐색하여 운영체제 커널을 찾아내고 메모리로 적재한 후 실행을 시작한다. 시스템 실행 중 상태는 이 시점부터 이다.

 

[Windows 7 Boot Process]

'SW Engineering > OS Concept' 카테고리의 다른 글

10_프로세스 스케줄링  (0) 2015.07.16
09_프로세스 개념  (0) 2015.07.16
08_시스템 부트  (0) 2015.07.16
07_가상 머신(Virtual Machine)  (0) 2015.07.16
06_운영체제 구조  (0) 2015.07.16
05_운영체제 구조_설계 및 구현  (0) 2015.07.16

+ Recent posts