[운영체제] 운영체제 반효경 교수님 2017년 - 3. 프로세스 관리

June·2021년 4월 27일
0
post-thumbnail

프로그램의 실행 (메모리 load)

각각의 프로그램들은 각각의 공간, 즉 가상 메모리를 가진다. 자기만의 가상 메모리 공간은 0번지부터 시작된다. 당장 필요한 부분은 물리적인 메모리에 올라가고, 당장 필요없으면 디스크의 swap area에 내려간다. 가상 메모리와 실제 메모리의 주소의 차이가 있으므로 address translation이 필요하다.

가상 메모리는 코드, 스택, 데이터 영역이 있다. 코드 영역에는 컴파일된 기계어가 있고, 데이터 영역에는 전역 변수 같은 것들, 스택에는 지역 변수, 함수 호출과 관련된 정보 같은 것들이 들어 있다.

커널도 프로그램이므로 커널 영역에 코드, 스택,데이터 형태로 되어있다.

커널 주소 공간의 내용

data

  • PCB는 Process Control Block의 준말이다. 곧 뒤에서 나온다.

stack

  • 각 프로세스마다 따로 스택을 두고 있다.

사용자 프로그램이 사용하는 함수

사용자 정의 함수 또는 라이브러리 함수는 사용자 프로그램의 프로세스 안에 code 영역에 있는 것이고, 커널 함수는 커널에 들어 있다. 커널 함수를 쓸 때는 cpu 제어권이 운영체제에 넘어간다.

프로그램의 실행

프로세스의 개념

프로세스의 문맥은 시간에 따라 변화하는 것이다.

cpu의 program counter가 어디를 가리키고 있는가, register에 무슨 값을 넣고 있었는가, 메모리에 뭐를 가지고 있었는가 등등. 각 프로세스마다 PCB를 가지고 있다.

프로세스의 상태

cpu가 하나밖에 없기 때문에 cpu에서 기계어를 수행하는 프로세스는 매순간 하나다. 그림상 CPU안에 하나의 프로세스가 있다. CPU를 기다리고 있는 프로세스는 ready 상태에 있다. cpu를 줘봤자,무의미한 상태를 blocked (Wait, sleep) 상태라고 한다. 기다리는 이유는 IO 때문일 수도 있고 프로세스간의 공유 데이터를 사용하기 위해 기다리는 걸수도 있다.

각 큐마다 상태가 어떤지 운영체제가 데이터 영역에 PCB를 두고 관리한다

프로세스 상태도

온전하게 생성되면 ready 상태가 된다. ready 상태는 cpu만 주면 바로 실행된다. 따라서 ready 상태는 메모리에 올라가 있다. cpu 스케줄러가 이 프로세스에게 cpu를 주면 running 상태가 된다. timer interrupt에 걸려서 ready queue에 갈 수도 있고, 오래 걸리는 작업에 걸려서 blocked 상태가 될 수도 있다. 마지막은 자신의 일을 다하고 cpu를 내어놓는 것이다.

Process Control Block (PCB)

PCB는 운영체제의 커널의 주소공간에 프로세스마다 갖고 있다.
모든 프로세스가 대등하지 않기 때문에 priority로 관리한다.

문맥 교환 (Context Switch)

cpu를 빼앗기 전에 해당 프로세스의 PCB에 레지스터 값 등을 저장하고 CPU를 넘겨준다.
새로 cpu를 얻는 프로세스이 경우에는 PCB의 값들을 복원시켜서 CPU를 준다.

1번은 문맥 교환이 아니다. 문맥 교환은 사용자 프로세스 A에서 사용자 프로세스 B로 cpu가 넘어가는 것을 말한다.

문맥 교환이 일어날때는 바뀔 프로세스의 PCB를 save하고 새로운 프로세스의 PCB를 load한다. 1번 같은 경우는 모든 것을 save하고 load하지 않고 일부만 하기 때문에 overhead 작다.

프로세스를 스케줄링하기 위한 큐

Ready Queue와 다양한 Device Queue

프로세스 스케줄링 큐의 모습

스케줄러 (Scheduler)

단기 스케줄러는 cpu scheduler이고 장기 스케줄러는 memory scheduler라고 보면 된다.
timer interrupt가 걸릴때마다 단기 스케줄러가 호출된다.

프로세스가 생성될때 new에서 admitted되어야 ready상태가 된다. 이 admit을 해주는 것이 장기스케줄러이다. 프로세스가 생성될 떄 필요한 부분이 메모리에 들어오도록 허락해주는 것이다. 우리가 다루는 일반적인 운영체제는 장기스케줄러 없이 바로 ready 상태가 된다.

degree of multiprogramming이란 몇개의 프로그램을 메모리에 올릴지 결정하는 것이다.

중기 스케줄러는 swapper라고 부르는데, 장기 스케줄러의 대안이다. 메모리가 부족해서 성능이 떨어지면 memory를 뺏는 것이다. 중기 스케줄러 때문에 suspended라는 프로세스의 상태가 생긴다

프로세스의 상태 (Process State)

꼭 중기스케줄러에 의해 suspended되는 것은 아니다. 다만 공통적으로 외부 원인에 의해 되는 것이다.

blocked와 suspended 둘다 cpu를 얻지 못하지만, blocked는 실행중이다 (cpu에서의 실행만 실행이 아니라 IO에서의 실행도 실행이다). suspended는 아예 정지된 것이다.

suspended에서 위로 올라가는 것은 외부에서 해줘야 하는 것이다. 외부에서 메모리를 주거나, 사람이 재개시켜야한다.

프로세스의 상태도

만약 IO를 하다가 suspended가 되었으면 IO는 계속할 수 있다. IO를 끝나면 Suspended block에서 suspended ready가 될 수 있다.

running이 두가지로 나뉘어져있다. 자신의 코드를 수행중일 때 usermode라고 하고, 시스템콜을 했을때 해당 프로세스는 kernel 모드에 있다. usermode, kernel mode 둘다 해당 프로세스의 러닝이라고 부른다.

인터럽트 (Interrupt)

프로세스 A가 IO가 필요할 때 system call을 해서 software interrupt를 하고 IO가 끝나고 디스크 컨트롤러가 끝났다고 hardware interrupt를 건다.

Thread

프로세스에서 cpu의 수행 단위를 쓰레드라고 부른다.

PCB에서 program counter, 즉 코드의 어느 부분을 수행하고 있는지만 그리고 레지스터 값, 그리고 stack space는 쓰레드 별로 각각의 값을 가진다. 웹브라우저 혹은 문서 편집기를 여러개 띄어 놓으면 코드 부분은 share한다. context switch의 오버헤드를 절약할 수 있다.

크롬 같은 경우 보안상의 이유로 독립적인 프로세를 만들기는 한다.

쓰레드의 장점

쓰레드를 이용해서 웹 브라우저 같은 경우, 하나의 쓰레드가 네트워크로부터 이미지를 가져올때 다른 쓰레드는 가져온 텍스트라도 보여줄 수 있다. 즉 쓰레드를 이용해서 비동기식 입출력을 효율적으로 하는 것이다.

Single and Multithreaded Process

Benefits of Threads

Implementation of Threads

운영체제가 쓰레드를 알게 만드는 것을 kernel thread라고 하고 user thread는 운영체제는 thread의 존재를 모르는 것이다. 그럼 운영체제는 프로세스에 cpu를 주고 프로세스가 cpu를 쓰레드에게 주는 것이다.

프로세스 생성 (Process Creation)

부모 프로세스가 운영체제에게 자식 프로세스를 만들어 달라고 요청하는데, 그 시스템 콜을 fork라고 한다.

프로세스가 만들어지면 독자적인 공간이 생기는데, 부모의 공간을 복사한다. exec을 이용해서 새로운 것을 씌우는 것이다.

프로세스 종료 (Process Termination)

항상 자식을 먼저 죽이고 부모가 종료된다.

fork() 시스템 콜

fork하는 순간 아래와 같이 된다.

자식 프로세스는 fork의 다음부터 실행된다. 부모와 자식을 구분하기 위해 부모 프로세스는 양수를 갖게되고, 자식 프로세스는 0을 갖게 된다.

exec() 시스템 콜

exec은 새로운 함수로 덮어 씌우는 것이다. 덮어 씌우면 아예 새로운 프로그램을 덮어 씌어서 아래는 실행되지 않는다.

0개의 댓글