본문 바로가기
OS/운영체제: 아주 쉬운 세 가지 이야기

가상화

by lacuca9 2024. 9. 25.

프로세스 : 실행 중인 프로그램

프로그램 자체는 생명이 없는 존재. 프로그램은 디스크 상에 존재하면 실행을 위한 명령어와 데이터의 묶음

여기에 생명을 불어 넣는 것이 운영체제이다.

CPU가 여러개 존재한다는 환상을 어떻게 제공하는가?

운영체제는 CPU를 가상화하여 이러한 환상을 만들어 낸다.

시분할(time sharing)이라 불리는 이 기법은 원하는 수 만큼의 프로세스를 동시에 실행할 수 있게 한다.

CPU를 공유하기 때문에, 각 프로세스의 성능은 낮아진다.

저수준의 도구와 고차원적인 "지능"이 필요하다.

저수준 도구를 메커니즘(mechanism)이라 한다. - 필요한 기능을 구현하는 방법이나 규칙

문맥 교환(context switch) - CPU에서 프로그램 실행을 잠시 중단하고 다른 프로그램을 실핸하는 것

 

운영체제의 지능은 정책(policy)의 형태로 표현된다.

정책 - 운영체제 내에서 어떤 결정을 내리기 위한 알고리즘.

운영체제의 스케줄링 정책(scheduling policy)이 이러한 결정을 내린다.

스케줄링 정책은 결정을 내리기 위해 과거 정보( 어떤 프로그램이 자주? ),

워크로드에 관한 지식 ( 어떤 유형의 프로그램이 실행? ),

성능 측정 결과 ( 시스템이 대화성능 혹은 처리량을 높이려 하는지 ) 를 이용

 

프로세스의 개념

프로세스의 구성 요소를 이해하기 위해서 하드웨어 상태(machine state)를 이해해야 한다.

프로그램이 실행되는 동안 하드웨어 상태를 읽거나 갱신할 수 있다.

하드웨어 상태 중 가장 중요한 구성 요소는 메모리 이다.

프로세스가 접근할 수 있는 메모리 (주소 공간(address space)이라 불림)는 프로세스를 구성하는 요소.

 

레지스터도 프로세스의 하드웨어 상태를 구성하는 요소 중 하나.

많은 명령어들이 레지스터를직접 읽거나 갱신.

하드웨어 상태를 구성하는 레지스터 중에 특별한 레지스터들이 존재한다.

프로그램 카운터(program counter, PC)는 프로그램의 어느 명령어가 실행 중인지를 알려준다.

명령어 포인터(instruction pointer, IP) 라고도 불린다.

스택 포인터(stack pointer)와 프레임 포인터(frame pointer)는 함수의 변수와 리턴 주소를

저장하는 스택을 관리할 때 사용하는 레지스터

 

프로세스 API

  • 생성 (Create) : 운영체제는 새로운 프로세스를 생성할 수 있는 방법을 제공해야 한다.
    쉘에 명령어 입력, 실행시키면 운영체제는 새로운 프로세스를 생성
  • 제거 (Destroy) : 운영체제는 강제 제거 인터페이스도 제공. 물론 왠많마녀 스스로 종료 함.
    필요 없는 프로세스를 중단시키는 API는 매우 유용
  • 대기 (Wait) : 실행 중지를 기다릴 필요가 있기 때문에 여러 종류의 대기 인터페이스가 제공됨
  • 각종 제어 (Miscellaneous Control) : 프로세스의 제거,대기 외에, 여러 제어 기능들이 제공.
    프로세스를 일시정지하거나 재개하는 기능을 제공.
  • 상태 (Status) : 프로세스 상태 정보를 얻어내는 인터페이스도 제공.
    상태 정보에는 얼마 동안 실행되었는지 또는 프로세스가 어떤 상태에 있는지 등이 포함.

 

프로그램 실행을 위하여 운영체제가 하는 첫 작업은 프로그램 코드와

정적 데이터(static data, ex- 초기값을 가지는 변수)를 메모리, 프로세스의 주소 공간에 탑재(load)하는 것.

프로그램은 디스크 or SSD에 특정 실행 파일 형식으로 존재.

 

요샌 필요할 때 부분만 메모리에 탑재한다. 이를 이해하기 위해선 페이징(paging)과 스와핑(swapping) 이해.

일단 프로그램 실행 전에 운영체제는 중요 부분을 디스크에서 메모리로 탑재해야 한다.

 

코드와 정적 데이터가 메모리로 탑재된 후, 프로세스를 실행시키기 전에 운영체제가 해야 할 일.

일정량의 메모리가 프로그램의 실행시간 스택 용도로 할당되어야 한다.

C는 지역 변수, 함수 인자, 리턴 주소 등을 저장하기 위해 스택을 사용.

운영체제는 스택을 주어진 인자로 초기화한다.

특히 main() 함수의 인자인 argc와 argv 벡터를 사용하여 스택을 초기화한다.

 

힙을 위한 메모리 영역을 할당한다.

C에서 힙은 동적으로 할당된 데이터를 저장하기 위해 사용. malloc(), free()

힙은 연결 리스트, 해시 테이블, 트리 등 크기가 가변적인 자료 구조를 위해 사용.

 

운영체제는 입출력과 관계된 초기화 작업을 수행한다. UNIX 시스템에서 각 프로세스는 기본적으로

표준 입력(STDIN), 표준 출력(STDOUT), 표준 에러(STDERR) 장치에 해당하는 세 개의 

파일 디스크립터(file descriptor)를 갖는다.

 

코드와 정적 데이터를 메모리에 탑재하고, 스택과 힙을 생성하고 초기화하고, 입출력 셋업과 관계된

다른 작업을 마치게 되면, 운영체제는 프로그램 실행을 위한 준비를 마치게 된다.

프로그램 시작지점, 즉 main()에서부터 프로그램 실행을 시작하는 마지막 작업만이 남는다.

main() 루틴으로 분기함으로써, 운영체제는 CPU를 새로 생성된 프로세스에게 넘기게 되고 프로그램 실행이 시작된다.

 

프로세스 상태

  • 실행 (Running) : 프로세서에서 실행 중. 즉 프로세스는 명령어를 실행하고 있다.
  • 준비 (Ready) : 실행 준비는 됐지만, 운영체제가 다른 프로세스를 실행하고 있는 등의 이유로 대기 중.
  • 대기 (Blocked) : 프로세스가 다른 사건을 기다리는 동안 프로세스의 수행을 중단시키는 연산.
    예 - 프로세스가 디스크에 대한 입출력 요청을 하였을 때 프로세스는 입출력이 완료될 때까지 대기 상태.

 

 

프로세스 제어 블럭(Process Control Block, PCB) : 프로세스의 관리를 위한 정보를 저장하는 자료 구조

 

자료 구조

운영체제도 일종의 프로그램.

다른 프로그램들과 같이 다양한 정보를 유지하기 위한 자료 구조를 가지고 있다.

프로세스 리스트와 같은 자료 구조를 유지한다.

 

 

 

 

 

 

 

 

 

 

 

'OS > 운영체제: 아주 쉬운 세 가지 이야기' 카테고리의 다른 글

개요  (0) 2024.09.25