Notice
Recent Posts
Recent Comments
05-21 17:13
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Byeol Lo

3.1 Process Concept 본문

OS/OS Design

3.1 Process Concept

알 수 없는 사용자 2024. 4. 9. 17:48

실행 중인 프로그램을 프로세스라고 부른다. 프로세스는 컴퓨팅 아키텍쳐에서 작업 단위라고 볼 수 있다.

 운영체제를 논의할 때 제기되는 질문 중 하나는 모든 CPU 활동을 어떤 행위로 부를지에 대한 것이다. 초기 컴퓨터는 jobs이나 사용자 프로그램을 실행하는 batch system이었고, 이후에 time-shared system이 나왔다. 심지어 컴퓨터가 한 번에 하나의 프로그램만 실행할 수 있는 경우에도(멀티 태스킹을 지원하지 않는 임베디드 장치), 운영 체제는 메모리 관리와 같은 자체 내부 프로그램된 활동을 지원해야 할 수 있다. 이런 활동을 모두 프로세스라고 부른다.

 개인적으로 더 현대적인 용어인 process를 선호하지만, job 이라는 용어는 역사적 의미가 있다. 운영체제 이론과 용어의 많은 부분이 운영체제의 주요 활동이 작업처리였던 시기에 개발되었기 때문이다. 따라서 보통 운영체제 이론과 용어의 많은 부분이 job 이라는 용어를 사용한다. 단순히 프로세스가 작업을 대체했다는 이유만으로 작업이라는 단어(예: 작업 일정)를 포함하는 일반적으로 허용되는 용어의 사용을 피하는 것은 오해를 불러일으킬 수 있다.

 

3.1.1 The Process

 앞에서 언급했듯이 프로세스는 실행중인 프로그램이다. 프로세스의 현재 활동 상태는 프로그램 카운터의 값과 프로세서 레지스터의 내용으로 나타난다. 프로세스의 메모리 레이아웃은 일반적으로 여러 섹션으로 나뉜다.

  • Text Section - 실행 가능한 코드가 저장됨
  • Data Section - 전역 변수들이 저장됨
  • Heap Section - 프로세스가 실행되는 동안에 동적으로 할당할 수 있는 메모리 공간
  • Stack Section - 일시적인 데이터 저장소로 함수가 호출되었을때, parameters, return addr., local variables 등이 저장되는 공간

 여기서 눈여겨 봐야 할 것은 텍스트 섹션과 데이터 섹션의 크기가 고정되어 있어서 실행 중에 크기가 변경되지 않는다는 것이다. 하지만 stack, heap 섹션은 프로그램 실행 중에 동적으로 축소하거나 확장할 수 있다. 함수가 호출될 때마다 함수 매개변수, 지역 변수, 번호나 주소가 포함된 활성화 레코드(Activation Record, Frame)가 스택에 푸시되고, 함수에서 제어가 반환되면 활성화 레코드(Activation Record, Frame)가 스택에서 팝된다. 마찬가지로 메모리가 동적으로 할당되면 힙이 확장되고, 메모리가 시스템에 반환되면 힙이 축소된다. 스택과 힙 섹션은 서로 서로 확장되지만, 운영체제는 이 둘을 서로 겹치지 않도록 보장해야 한다.

 프로그램 자체는 프로세스가 아니다. 프로그램은 그냥 디스크에 저장되어 명령어 목록들을 포함하고 있는 파일과 같은 수동적인 엔티티이다(그냥 실행파일임). 반면에 프로세스는 카운터가 다음에 실행할 명령을 지정하고 관련 리소스 세트를 가진 활성 엔티티이다. 실행 파일이 메모리에 로드될 때 프로그램이 프로세스가 된다. 실행 파일을 로드하는 데 사용되는 두가지 일반적인 기술은 실행 파일을 나타내는 아이콘을 두 번 클릭하거나 명령줄에 실행 파일의 이름을 입력하는 것이다.

 두 프로세스가 동일한 프로그램과 관련될 수 있지만, 여전히 두 개의 별개의 실행 시퀀스로 간주된다. 예를 들어서 여러 사용자가 다른 사본의 메일 프로그램을 실행하거나 동일한 사용자가 웹브라우저 프로그램의 여러 사본을 호출할 수도 있다. 각각은 별도의 프로세스이며, 텍스트 섹션은 동일하지만, 데이터, 힙, 스택 섹션은 다르다. 하나의 프로세스가 실행되는 동안 여러 프로세스를 생성하는 것이 일반적일 것이다.

  • 프로세스의 state는 프로그램의 카운터와 프로세서 레지스터 내용을 토대로 나타난다.
  • 텍스트 섹션과 데이터 섹션은 크기가 고정되어 있다.
  • Stack 섹션과 Heap 섹션은 프로그램 실행 중에 동적으로 축소하거나 확장할 수 있다.
  • 활성화 레코드(Frame)는 함수 호출에 필요한 모든 정보가 들어있는 메모리 공간이다.

 여기서 프로세스가 자체의 다른 코드의 실행환경이 될 수 있는데, 자바 프로그래밍 환경이 해당되는 예시이다. 대부분의 경우에 실행 가능한 Java 프로그램은 JVM 내에서 실행이 되며, JVM은 로드된 Java 코드를 해석하고 해당 코드를 대신하여 동작을 수행하는 프로세스로 실행된다(네이티브 기계 명령을 통해). 컴파일된 자바 프로그램 Program.class를 실행하려면 'java Program'을 CLI에 입력할 것이다. 명령어 java는 JVM의 일반적인 프로세스로 실행을 하고, 이 프로세스가 가상 머신 내에서 Java 프로그램을 실행한다. 이는 시뮬레이션과 같지만, 코드는 다른 명령어 세트를 위해 작성된 것이 아니라 Java 언어로 작성된 것이다.

 C 프로그램의 메모리 레이아웃을 그린 것이다. 프로세스의 다른 섹션이 실제 C 프로그램과 어떻게 관련이 되는지 보여준다.

  • 전역 데이터 섹션은 초기화된 데이터 및 초기화되지 않은 데이터 에 대한 서로 다른 섹션으로 나뉜다.
  • main() 함수에 전달된 argc, argv 매개변수에 대해 별도의 섹션이 제공된다.

 초기화된 데이터와 초기화되지 않은 데이터를 위한 서로 다른 섹션으로 전역 데이터 섹션이 나뉘어 있다. 또한 main() 함수에 전달되는 argc 및 argv 변수에 대한 별도의 섹션이 제공된다. GNU의 size 명령은 이러한 섹션 중 일부의 크기(바이트 단위)를 결정하는데 사용될 수 있다. 위의 C 프로그램의 실행 파일 이름이 memory 인 경우에 다음 size memory 명령을 입력하여 생성된 출력이다.

text data bss dec hex filename
1158 284 8 1450 5aa memory

 data 필드초기화되지 않은 데이터를 참조하며, bss 초기화된 데이터를 참조한다(bss, block started by symbol). dec 및 hex 값은 각각 10진수, 16진수로 표시된 세 섹션의 합계이다.

 

3.1.2 Process State

프로세스가 실행되면, 기본적으로 state를 가지고 있는데, 프로세스의 상태는 현재 프로세스의 행위에 따라 정의될 수 있다.

  • New: 프로세스가 생성 중이다
  • Running: 명령이 실행 중이다
  • Waiting: 프로세스가 어떤 이벤트가 발생하기를 기다리고 있다
  • Ready: 프로세스가 프로세서에 할당되기를 기다리고 있다
  • Terminated: 프로세스의 실행이 완료되었다

 이러한 이름들은 임의로 지정된 것이고 운영체제에 따라 다양하다. 하지만 이런 상태는 모든 시스템에서 찾을 수 있고, 특정 운영 체제는 프로세스 상태를 더 세부적으로 구분하기도 한다. 하나의 프로세서 코어에서는 어느 한 시점에 하나의 프로세스만 실행될 수 있다는 점을 인식하는 것이 중요하다. 하지만 많은 프로세스가 준비 상태에 있고 대기 중인 경우도 있다.

 

3.1.3 Process Control Block

 PCB라고도 불리며, 위와 같은 구조로 표현된다. 특정 프로세스와 관련된 많은 정보들을 포함한다. :

  • Process State: New, Ready, Running, Waiting, Terminated와 같은 상태
  • Program Counter: 이 프로세스에 대해서 다음에 실행될 명령의 주소를 나타냄
  • CPU Register: 컴퓨터 아키텍처에 따라 수와 유형이 다양한데, accumulators, index registers, stack pointers, and general-purpose registers, any condition-code information 등이 포함될 수 있다. 이 상태 정보는 프로세스가 실행되는 동안에 계속 업데이트 되며, 인터럽트가 발생할 때 저장되어야 한다(다시 해당 위치로 돌아오도록 하기 위해). 따라서 CPU 레지스터는 프로세스의 실행 상태를 유지하고 관리하는데 중요한 역할을 함
  • CPU Scheduling Information: process priority, scheduling queue에 대한 pointer, 기타 scheduling parameters를 포함
  • Memory-Management Information: 운영 체제에서 사용하는 메모리 시스템에 따라 base registers 또는 limit registers의 값, page tables, segment table과 같은 항목이 포함됨.
  • Accounting Information: CPU 양과 실제 사용 시간, 시간 제한, 계정 정보, (작업 또는) 프로세스 번호
  • I/O Status Information: 프로세스에 할당된 I/O 장치 목록, 열린 파일 목록 등

 즉, PCB는 일부 회계 데이터와 함께 프로세스를 시작하거나 다시 시작하는 데 필요한 모든 데이터의 저장소 역할을 하고, 운영체제가 프로세스를 관리하는데 사용되어지는 data structure라고 보면 된다.

 

3.1.4 Threads

 프로세스 모델은 프로세스가 단일 실행 스레드를 수행하는 프로그램이라는 것에 가정하고 있는데, 이때 thread라는 개념이 생소할 수 있다. 단일 스레드는 프로세스가 한 번에 한 가지 작업만 수행할 수 있도록 하는 것이다. 그럼 다중 스레드는 프로세스가 한 번에 여러 개의 작업을 수행할 수 있는 것이다.

 지금은 운영체제가 프로세스에게 여러 실행 스레드를 가질 수 있도록 프로세스 개념을 확장하여 한 번에 여러 작업을 수행할 수 있도록 했다. 이 기능은 특히 다중 코어 시스템에서 여러 스레드가 병렬로 실행될 수 있는 경우에 유용하다. 다중 스레드 워드 프로세서는 사용자가 입력을 관리하는 하나의 스레드를 할당하고 다른 스레드가 스펠링을 체크를 동시에 할 수 있도록 한다. 스레드를 지원하는 시스템에서는 PCB가 각 스레드에 대한 정보를 포함하도록 확장된다. 또한 스레드를 지원하기 위해 시스템 전반에 걸쳐 다른 변경 사항이 필요하다.

'OS > OS Design' 카테고리의 다른 글

3.3 Operations on Processes  (1) 2024.04.12
3.2 Process Scheduling  (0) 2024.04.10
2.8 Operating-System Structure  (0) 2024.04.09
2.7 Operating-System Design and Implementation  (0) 2024.04.09
2.6 Why Applications are Operating-System Specific  (0) 2024.04.09
Comments