1. Introduction

ushin20
|2023. 11. 21. 15:39

Operating system

OS의 역할 중 중요한 3가지는 다음과 같다.

  • Virtualization
  • Concurrency
  • Persistence

 

Virtualization

Process

프로세스는 execution stream with states이다. State에는 코드에 영향을 줄 수 있는 모든 자원이 포함된다. 가령 레지스터나 힙, 스택, 열린 파일 등이 있다.

 

프로그램 vs 프로세스

프로그램과 프로세스는 다른 개념이다. 프로그램은 정적인 코드와 데이터이며, 프로세스는 이런 프로그램의 dynamic instance이다.

 

쓰레드 vs 프로세스

쓰레드와 프로세스는 비슷한 개념이다. 쉽게 설명하자면, 쓰레드는 lightweight process이며, 하나의 프로세스는 여러개의 쓰레드를 사용할 수 있다.

 

Virtualizing the CPU

가상화의 목표는 각 프로세스가 CPU를 혼자만 사용할 수 있게 보장하는 것이다. Single processor라고 가정했을 때, 프로세스들은 Time shaeing, Space sharing 문제를 가지게 된다.

 

CPU performance를 최대화하는 방법으로는 user 프로세스가 CPU를 직접 사용할 수 있게 만드는 것이다. 그러나 이러한 방법은 프로세스가 제한된 일을 하거나, 영원히 CPU를 사용하거나, 무수한 I/O로 CPU를 느리게 만들 수 있다. 따라서 어쩔 수 없이 user 프로세스에게 제한된 operation을 주게 된다.

 

Problem 1. Restricted operations

User 프로세스에 제한된 권한을 주기 위해서는 하드웨어단에서 user 프로세스를 격리하면 된다. 

  • User process: user mode
  • OS: kernel mode

격리당한 user 프로세스가 CPU를 사용하고 싶으면, system call(trap instruction을 이용한 권한 변경)을 이용해 cpu를 사용하면 된다.

 

System call

User mode에서 user 프로세스는 자기 자신의 메모리 공간만 접근할 수 있다. 그 외의 공간을 접근하고 싶으면 system call을 이용해 OS에게 요구사항을 전달한다. 다음은 프로세스 P가 다른 메모리 공간을 read하고 싶은 경우이다.

이때의 어셈블리 언어는 다음과 같다.

  • movl $6, %eax; int $64

%6은 system call table에서 SYS_read를 의미하며 int $64는 trap instruction인 T_SYSCALL을 의미한다. 주어진 명령어를 해석하자면, Trap을 이용해 System call을 부르고, 그 중에서 read를 실행하겠다를 의미한다. System call을 실행하게 되면 kernel mode로 바뀌게 되고, OS level에서의 작업을 수행할 수 있다. 그 후, 작업이 완료되면, return-from-trap instr.을 통해 user mode인 프로세스 P로 돌아오게 된다.

 

Problem 2. Take CPU away

프로세스가 여러개 있을 수 있는데, 하나의 프로세스가 OS를 독점할 수는 없다. 따라서 프로세스가 OS를 포기했다가 다시 사용할 수 있어야 하는데, 이때 동작하던 정보(context)를 어떻게 처리할지에 대한 내용이다. 이 과정을 Context switch라고 한다.

  • Policy: 프로세스 스케쥴링 방법
  • Mechanism: context switch하는 방법

 

Context switch

프로세스가 CPU control을 가져오는 방법으로는 2가지를 생각해 볼 수 있다. 

  • Cooperative: 프로세스가 CPU 사용을 포기하기(yield())
  • Multi-tasking: HW에서 일정 시간마다 context switch하게 구현

Cooperative한 방법은 악의적인 프로세스에게 취약하기 때문에, multi-tasking으로 구현되어 있다.

 

Context switch가 일어날 때, 프로세스의 정보는 PCB(process control block)에 저장된다. PCB에는 다음의 내용이 저장된다.

  • PID
  • Process state(ready, running, blocked)
  • Execution state(registers, PC, ptr)
  • Scheduling priority
  • Open files.. etc

 

Context swtich 과정은 다음과 같다.

지금은 HW에 의해서 구현되어 있다. 쉽게 말하면 프로세스 A의 정보를 저장하고 저장되어 있던 프로세스 B의 정보를 불러와서 프로그램을 돌리는 것이다.

 

Problem 3: Slow operations

프로세스가 I/O와 같은 CPU를 사용하지 않으면서 오래 걸리는 operation을 수행할 때, context switch를 관리해줄 필요가 있다. OS에서는 프로세스의 state를 부여하고, state queue를 통해 프로세스를 관리한다.

프로세스는 크게 3가지 상태를 가지고 있다.

  • Running: 실행 중
  • Ready: 실행 가능 상태
  • Blocked: 실행 불가 상태

이와 관해서는 다음 포스팅(스케쥴링)에서 계속 다룬다.

 

Process creation

프로세스를 생성하는 방법에 대해서는 크게 2가지를 생각해볼 수 있다.

  • From scratch: 아예 쌩으로 만들기
  • Copy: 기존에 있던거 복사하기

 

From scratch

  1. code, data 메모리에 불러오기
  2. 빈 call stack 만들기
  3. PCB 만들기
  4. 프로세스 ready queue에 넣기

알짜배기로 버리는 거 없이 만들 수 있지만, 오래걸린다.

 

Clone existing process and change

  1. fork()
  2. 변경이 필요한 부분을 수정한다.

간단하지만, 쓸데없는 메모리도 복사하기도 한다. Exec(char *file)의 경우 필요한 만큼만 메모리에 올려서 사용하기 때문에, 이 경우에 효과적일 수 있다.

 

실제로 UNIX에서는 프로세스 1개를 만들고, 나머지 프로세스는 거의 다 fork()해서 사용하고 있다.

'Study > Operating System' 카테고리의 다른 글

6. Threads  (1) 2023.12.08
5. Virtual Memory  (0) 2023.12.08
4. Paging  (0) 2023.12.05
3. Memory Virtualization  (0) 2023.12.01
2. CPU Virtualization  (1) 2023.11.27