Operating System Ch 03

LeemHyungJun·2022년 9월 28일
0

Operating System

목록 보기
3/14
post-thumbnail

운영체제 수업 + Operating System Concepts 10E 정리 내용

Operating System Ch03 : Processes

Program vs Process

1. Program

  • 실행 가능한 형태로 디스크에 저장된 것
  • 메모리에는 로드되기 이전의 상태
  • 메모리에 로드되면 kernel에 의해 실행된다.

2. Process

  • 메모리에 로드되서 실행이 되는 프로그램 인스턴스
  • 실행, 스케줄링이 가능한 기본적인 단위
  • 프로세스는 고유의 식별자인 PID를 가짐
    • 관리를 위한 ID
    • 프로그램이 프로세스가 되면서 부여된다.

Process Concept

1. What is the process?

  • 프로그램이 실행될 수 있는 인스턴스
  • 프로그램 안에 있는 코드의 흐름(control flow)을 encapsulation 한다.
  • dynamic and scheduling -> 정적인 코드 덩어리를 CPU위로 올려서 차례대로 실행하는 것

Process Address Space

  • logical memory, virtual memory의 관리는 OS가 해준다.
  • 해당 그림은 옛날 Unix구조 OS의 메모리 공간에 대한 그림이다.
    • stack이나 heap의 위치 등 OS마다 다르게 생겼다.
  • Stack & Heap
    • Stack : 함수호출과 관계되는 지역변수와 매개변수 등이 저장, stack frame 단위로 저장
    • Heap : 동적할당한 변수들
    • 각자 반대 방향에서 가까워지는 방향으로 메모리가 쌓이는 것은 서로 겹치지 않게 하기 위해서 이다.

Process State

1. State diagram

  • process는 다양한 처리방법이 존재한다.
    • 끝나기를 기다리는 process, 다 끝나고 다음 시작을 준비하는 process 등
  • ready : 시작할 준비가 된 상태
  • ready->running : 스케줄링에 의해서 OS가 ready인 process들 중에서 실행할 process를 골라서 running한다.
  • running->ready : 타이머 interrupt 등 (IO처리에 대한 작업이 아닌 것)을 통해서는 시간이 되는 순간 waiting이 아닌 바로 running에서 ready로 돌아간다.
  • running->waiting : system call이 오면 OS가 올라와야 하기 때문에 running을 멈추고 waiting 상태로 바뀐다.
  • waiting->ready : interrupt에 대한 확인을 하고 해당 interrupt가 자기 자신 process에 대한 interrupt인 경우는 waiting에서 ready로 이동한다.
  • terminated : running하던 작업이 모두 끝나면 terminated로 이동하고, 해당 프로세스가 메모리에서 제거되고 버퍼 또한 정리한다.
  • CPU 의 특성상 running인 상태는 하나뿐이다.

Process State Transition

1. Linux example

  • Runnable : ready 상태
  • 고유한 PID 존재

Process Control Block (PCB)

1. Information associated with each process

  • context의 흐름 중에서 실행하다 중단된 것(실행 도중에 interrupt가 들어온 것)들에 대한 정보 저장
  • process를 스위칭 하면서 process를 제어하는 정보를 담고 있는 것
  • PCB에 포함된 것
    • process state
    • process number
    • program counter
    • register
    • memory limits
    • list of open files

Context Switch (CPU Switch)

1. context switch 구조

  • 그림에서 나타난 시나리오 : 두 개의 process가 동작 + OS개입
  • context switching
    • process 진행 하던 것을 저장(PCB)
    • 스케줄러를 실행하여 다음에 실행할 process를 결정
    • 결정된 process의 정보를 reload해서 실행
  • context switching이 일어나는 경우는 state diagram에서 다른 상태로 전환될 때 발생한다.
  • 동시에 일어나는 것 처럼 보이게 하기 위해서 만들어낸 구조
  • 연산만 계속 하는 process의 경우 (interrupt가 없는) 다른 process로 넘어가는 동작을 하지 못하고 다른 process는 연산만 하는 process를 기다려야 한다. -> overhead

2. Administrative overhead

  • multi-process를 위해서 필요한 overhead
  • overhead가 발생하지만 하나만 동작하는 batch 동작보다 훨씬 빠르다.
  • hardware support를 통해서 overhead를 최적화하려고 노력한다.

9/22 수업

Schedulers

1. Scheduler

  • 어떤 process를 선택하여 실행할 것 인지를 담당
  • cf) queue : 데이터를 모아두고 random access해서 뽑아 쓸 수 있는 데이터 구조를 말한다.

2. Long-term scheduler (job schedular)

  • 디스크에 저장된 것들 중에서 어떤 것을 메모리로 올릴 것인지를 결정
  • ready queue로 올릴 것을 고르기
  • 메모리의 크기가 현재는 매우 커져서 고민하지 않고 다 올려두고 처리해도 문제가 없어서 현재는 사용 안한다.
  • virtual memory가 생기고 완전히 사라졌다.

3. Medium-term scheduler (swapper)

  • CPU에서 실행중인 프로세스에서 디스크로 내릴 것을 고르는 것
  • virtual memory가 생기고 완전히 사라졌다.

4. Short-term scheduler (CPU scheduler)

  • ready queue에 있는 것 중에서 CPU에 할당에서 실행할 것을 고르기

Representation of Process Scheduling

1. Queueing diagram

  • waiting의 이유
    • system call
    • for multi-process
    • 특정 interrupt 기다림 (ex - std::cin)

2. Ready queue and various IO device queues

  • IO 관련 ready queue의 종류
  • 각각 IO 디바이스에 맞게 용도별로 나눠둔다.

Operations on Processes (POSIX)

1. Process creation

  • fork()
    • 새로운 process를 만들기 위해 OS에게 요청

2. Process execution

  • exec()
    • 디스크에 남아 있는 process가 되지 못한 형태의 것 들을 이미 만들어진 process에 덮어쓰기 후 실행

3. Process termination

  • exit()
    • process 종료, buffer 정리, 메모리 정리 등을 모두 다 수행하고 OS에게 권한을 돌려준다.
  • _exit()
  • process의 종료는 하지만 뒷정리는 하지 않고 종료
  • 사용할 경우가 별로 없다.
  • abort()
    • 비정상 종료
    • exit()의 동작과 같은 동작을 한 후 비정상 종료의 원인 로그 정보를 report
  • wait()
    • multi-processing으로 실행될 때 부모가 자식의 작업이 끝날 때 까지 기다리는 것

4. Cooperating processes

  • IPC (Inter-Process Communication) : 여러개의 process간의 협업 (데이터가 process와 process 사이에서 왔다갔다 하는 것)

Process Creation: Unix/Linux

1. fork()

  • int fork()
    • PID를 return 해준다.
  • 새로운 PCB초기화, 메모리 영역 초기화 -> 새로운 영역 만들기
  • 기존에 가지고 있던 PCB를 새롭게 만든 영역에 복사 (PID만 다르고 나머지는 모두 같다)
  • 새롭게 만들어진 PCB영역을 ready queue에 집어 넣는다.

2. Sharing of open files between parent and child after fork()

fork()

1. fork() 예시코드 (C언어)

#include <sys/types.h>
#include <unistd.h>

int main()
{
	int pid;
    
    if((pid = fork()) == 0)
    	printf("Child of %d is %d\n", getpid(), getid()); //child
	else
    	printf("I am %d. My child is %d\n", getid(), pid); //parent
}
  • getppid() : 부모의 pid를 return
  • getpid() : 현재 pid를 return
  • == 0 인 경우는 자식 process를 가리킨다.
  • 위 코드는 multi-processing이 진행된다. 즉 fork()를 통해서 프로그램의 패스를 여러 개로 만들어서 동작하게 할 수 있다.

2. 실행결과

  • 첫번째 실행
    I am 31098. My child is 31099.
    Child of 31098 is 31099.
  • 두번째 실행
    Child of 31100 is 31101.
    I am 31100. My child is 31101.
  • 출력 결과가 다른 이유는 스케줄러에 의해서 순서가 바뀔 수 있기 때문이다.

3. Why fork() ?

  • web server에서 많이 사용된다.

Process Execution: Unix/Linux

1. exec()

  • int exec(char * prog, char *argv[])
    • prog : program
  • 전제 조건으로 이전에 fork()가 실행되어야 한다.
  • exec()이 실행되면 현재 process가 멈춘다.
  • exec()을 실행하면 자식 process에 prog에 담긴 program을 덮어쓴다.
    • 부모와 완전히 다른 자식이 만들어진다.

2. exec() example

  • shell 구현 코드가 좋은 예시이다.
  • (pid = fork()) == 0 이 부분에서 현재 pid가 자식인지 확인하고 exec()을 실행하는 것이다.
    • 부모는 건드리면 안되기 때문에
int main() 
{
	while (1) 
    {
		char *cmd = read_command(); 
        int pid;
		if ((pid = fork()) == 0) 
        {
			exec(cmd); panic(“exec failed!”);
		} 
        else 
        { 	
        	wait (pid);
		} 
    }    
}

A Process Tree in Linux

  • pid = 0 : IDLE process
  • pid = 1 : init

Process Creation/Execution: Windows

1. CreateProcess()

  • BOOL CreateProcess(char *prog, char *args, ...)
  • Unix의 fork()exec()을 합친 동작
  • 부모 자식의 관계가 없고, 완전히 새로운 process를 만든다.
  • args?
    • Copies “args” into memory allocated in address space

Process Termination

1. Normal termination

  • return from main()
  • calling exit() and _exit() : 예외처리를 통한 종료

2. Abnormal termination

  • calling abort()
  • terminated by signal

3. Wait for termination of a child process

  • wait() : 정리가 다 된 process를 OS에 보고하고 부모로 해당 정보를 보내주기
  • zombie : 부모가 있기는 하지만 wait()상태가 아니어서 자식이 process가 끝났지만 보고할 곳이 없는 상태
  • orphan : 자식 process보다 부모 process가 먼저 종료된 상태

9/28 수업

Multiprocess in Application Program

1. Google Chrome Browser in multiprocess with 3 different types of process:

  • Browser process : 사용자 인터페이스, disk, IO 담당
  • Renderer process : web page 운영, Browser process와 협력하여 작동한다.
  • Plug-in process : 광고 차단 등 보안을 위한 프로세스
  • sand box : 격리되어있는 환경 -> 보안 취약점을 미리 확인해보고 실행

Multiprocess in Mobile Systems

1. Some mobile systems allow only one process to run, others suspended

  • 초기의 iOS는 one process였다. 단 음악 프로그램 제외
  • 사용자 입장에서 multi-process를 잘 모르기 때문에 다른 장점을 살리기 위해서

2. Due to screen real estate, user interface limits iOS provides for

  • Single foreground process : 유저가 보는 인터페이스 처리
  • Multiple background process : 직접 유저와 소통은 없지만, 시스템을 위해서 동작하는 것
  • iOS는 안드로이드 보다는 제약이 많다.

3. Android runs foreground and background, with fewer limits

  • 안드로이드는 iOS보다 더 높은 자유도 제공
  • 안드로이드는 리눅스 기반이기 때문에 그대로 사용한다면, 메모리나 여러 제약이 생긴다.
    -> 모바일 디바이스에서 구현이 불가능한 것들은 제거하고 사용

Inter-Process Communication(IPC)

1. Communication models

  • message passing
    • process A와 process B가 서로 협력을 할 때
    • 함께 쓸 수 있는 message queue를 부탁하고 kernel이 만들어준다.
    • 해당 message queue를 kernel이 관리해준다.
    • 더 안정적이다 / overhead가 심하다.(by context switch)
  • shared memory
    • process A와 process B가 서로 협력을 할 때
    • kernel이 개입하게 되면 느려진다.
    • kernel이 개입하지 않은 공간인 shared memory를 요청하고 할당 받는다.
    • 더 빠르다.(kernel의 개입x) / 동기화 문제 발생(kernel이 관리 해주지 않아서 개발자가 다 관리 해줘야 한다.)
  • message queue의 동작
    • kernel이 공간을 만들어주면 각 process는 message queue에 쓰고 읽고를 반복한다.
    • 만약 process A가 process B의 결과를 받아서 처리해야 한다면, process B가 끝날때 까지 기다려야 한다. -> kernel이 처리 해줌
    • 동기화 문제를 해결하기가 쉽다 -> kernel이 동기화를 처리해주기 때문에
  • shared memory
    • kernel에게 빌려서 사용하는 것이기 때문에 shared memory를 쓰는 process가 종료되기 전에 kernel에게 반환시켜줘야 한다.
    • C++의 동적 할당과 비슷한 동작

2. Cooperating processes

  • Bounded buffer problem (Producer-Consumer problem)
  • Circular queue를 shared memory로 사용
    • Producer : 데이터를 넣음
    • Consumer : 데이터를 뺌

3. Unix/Linux IPC

  • pipes
  • FIFOs
  • message queue
  • shared memory
  • sockets

Client-Server Communication

1. Sockets

  • 4계층
  • process 간 통신 -> 원격에 있는 process와 통신

2. Remote procedure call (RPC)

  • 다른 서버에 매우 무거운 라이브러리가 있을 때 해당 기능의 일부를 RPC를 통해서 호출

3. Remote Method Invocation (RMI)

  • RPC를 Java에서 부르는 방식

4. Marshalling parameters

  • Marshalling : function call의 parameter, return call을 잘 정리해서 정상적으로 동작할 수 있게 하는 것

Execution of RPC

0개의 댓글