운영체제 수업 + 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)
- 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()
- 새로운 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() ?
Process Execution: Unix/Linux
1. exec()
int exec(char * prog, char *argv[])
- 전제 조건으로 이전에
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)
4. Marshalling parameters
- Marshalling : function call의 parameter, return call을 잘 정리해서 정상적으로 동작할 수 있게 하는 것
Execution of RPC