본 글은 KOCW 이화여대 반효경 교수님의 운영체제 강의를 듣고 정리한 내용입니다.
http://www.kocw.net/home/m/search/kemView.do?kemId=1226304
- 프로그램의 실행과정을 이해하고 커널이 가진 내용과 사용자 프로그램이 사용하는 함수를 알아본다.
- 프로세스의 개념, 상태, 문맥과 운영체제가 프로세스를 큐에 넣고 관리하는 형태에 대해 알아본다.
- 스케줄러의 세 종류인 장기, 단기, 중기 스케줄러에 대해 알아본다.
- 프로세스의 상태 변화와 프로세스 중 CPU 수행 단위인 스레드에 대해 알아본다.
- 프로세스의 생성에 있어 자식 프로세스가 부모 프로세스를 복제, 새로운 과정을 덮어씌우는 과정과 프로세스의 종료에 대해 알아본다.
Process
🔹 프로세스의 개념
-
실행중인 프로그램
- 프로그램의 실행
-
프로세스의 context(문맥)
- CPU 수행상태를 나타내는 하드웨어 문맥
- Program counter
- 각종 register
- 프로세스의 주소 공간
- 프로세스 관련 커널 자료구조
- PCB (Process Control Block)
- Kernel stack
🔹 프로세스의 상태
- Ready, Running, Blocked
- Running
- CPU를 잡고 instruction을 수행중인 상태
- Ready
- CPU를 기다리는 상태 (메모리 등 다른 조건을 모두 만족하고)
- Blocked (Wait, Sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- Process 자신이 요청한 event(ex.I/O)가 즉시 만족되지않아 이를 기다리는 상태
- ex) 디스크에서 file을 읽어와야하는 경우
- New : 프로세스가 생성중인 상태
- Terminated : 수행이 끝난 상태
- Suspended(stopped) : 중기 스케줄러에 의해, ...
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out 된다
- ex) 사용자가 프로그램을 일시정지시킨 경우 (break key)
시스템이 여러이유로 프로세스를 잠시 중단시킴(메모리에 너무 많은 프로세스가 올라와있을때)
- Blocked : 자신이 요청한 event 가 만족되면 Ready
- Suspended : 외부에서 resume해주어야 Active
- 프로세스 상태도
💠 인터럽트
🔹 Process Control Block (PCB)
🔹 프로세스를 스케줄링하기 위한 큐
- Job queue
- Ready queue
- 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device queues
- I/O device의 처리를 기다리는 프로세스의 집합
- 프로세스들은 각 큐들을 오가며 수행!
🔹 스케줄러 (Scheduler)
- 운영체제 안에있는 코드의 일부다.
- Long-term scheduler (장기스케줄러 or job scheduler)
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
- 프로세스에 memory(및 각종자원)을 주는 문제
- degree of Multiprogramming (== 메모리에 올라가있는 프로그램 수) 을 제어
- time sharing system에는 보통 장기 스케줄러가 없음 (무조건 ready)
- Short-term scheduler (단기 스케줄러 or CPU scheduler)
- 어떤 프로세스를 다음번에 running 시킬지 결정
- 프로세스에 CPU를 주는 문제
- 충분히 빨라야함 (millisecond 단위)
- Medium-term scheduler (중기 스케줄러 or Swapper)
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
- 프로세스에게서 메모리를 뺏는 문제
- degree of Multiprogramming을 제어
🔹 스레드 (Thread)
-
A thread is a basic unit of CPU utilization
-
Thread 의 구성
- 별도로 가지는 것들 (이외에는 다 공유)
- program counter
- register set
- stack space
-
Thread가 동료 Thread와 공유하는 부분 (=task)
- code section
- data section
- OS resources
-
전통적인 개념의 heavyweight process는 하나의 스레드를 가지고있는 task로 볼 수 있다
-
다중 스레드로 구성된 태스크 구조에서는 하나의 서버스레드가 blocked(waiting)상태인 동안에도 동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있음 → 응답성 빨라짐
-
동일한 일을 수행하는 다중스레드가 협력하여 높은 처리율(throughput)과 성능향상을 얻을 수 있다
-
스레드를 사용하면 병렬성을 높일 수 있다
-
PCB
-
장점
- 응답성이 빠르다
- 자원을 공유하는 효과가 있음
- 경제적
- 스레드 하나를 만드는 것보다 프로세스 하나를 만드는 것이 30배 더 시간이 소요됨 (오버헤드 차이)
- Multi processor 유용성 : 병렬성 추구 가능
-
구현 방법
- Kernel Threads : 운영체제가 스레드의 존재를 알게 구현하는 것
- User Threads : 운영체제가 스레드의 존재를 모름
🔹 프로세스 생성
- 부모프로세스가 자식프로세스 생성
- 프로세스의 트리 (계층구조) 형성
- 프로세스는 자원을 필요로 함
- 자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델
- 수행 (Execution)
- 부모와 자식은 공존하며 수행되는 모델
- 자식이 종료(terminate)될때까지 부모가 기다리는(wait) 모델 - blocked 상태
- 주소공간 (Address space)
- 자식은 부모의 공간을 그대로 복사함 (binary and OS data)
- 자식은 그 공간에 새로운 프로그램을 올림
- ex) UNIX
- fork() 시스템 콜이 새로운 프로세스를 생성
- 부모를 그대로 복사 (OS data except PID + binary)
- 주소 공간 할당
- fork 다음에 이어지는 exec() 시스템콜을 통해 새로운 프로그램을 메모리에 올림
🔹 프로세스 종료
- 프로세스가 마지막 명령을 수행후 운영체제에게 이를 알려줌 (exit)
- 자식이 부모에게 output data를 보냄 (via wait0
- 프로세스의 각종 자원들이 운영체제에게 반납됨
- 부모 프로세스가 자식의 수행을 종료시킴 (abort)
- 부모보다 자식이 먼저 종료
- 자식이 할당자원의 한계치를 넘어서면 자식에게 할당된 태스크가 더이상 필요하지 않음
- if) 부모가 exit 된 경우
- 자식이 더이상 수행되지 않도록 자식들을 먼저 다 종료되고 부모가 종료
- 단계적인 종료 (가장 말단의 자식부터)
🔹 시스템 콜
🧐 fork()
- A process is created by the fork() system call
- 복제 생성 (자식프로세스 생성)
- parent process:pid > 0 ; child process:pid = 0
🧐 exec()
- A process can execute a different program by the exec() system call
- 새 프로그램으로 대체
- 보통 fork()를 먼저하고 자식에게는 execlp()를 해서 새롭게 돌리는 구조
🧐 wait()
- 프로세스 A가 wait() 시스템 콜을 호출하면
- 커널은 child가 종료될때까지 프로세스 A를 sleep 시킨다 (block 상태)
- Child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)
🧐 exit()
- frees all the resources, notify parent
- 프로세스의 종료
- 자발적 종료
- 마지막 statement 수행후 exit() 시스템 콜을 통해 프로그램에 명시적으로 적어주지않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌
- 비자발적 종료
- 부모 프로세스가 자식 프로세스를 강제 종료시킴
- 자식프로세스가 한계치를 넘어서는 자원요청
- 자식에게 할당된 태스크가 더이상 필요하지않음
- 키보드로 kill, break 등을 친 경우
- 부모가 종료하는 경우
- 부모프로세스가 종료하기 전에 자식들이 먼저 종료됨
🔹 프로세스간 협력
-
독립적 프로세스 (Independent process)
- 프로세스는 각자의 주소 공간을 가지고 수행되므로 원치적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지못함
-
협력 프로세스 (Cooperating process)
- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
-
프로세스간 협력 메커니즘 (IPC : Interprocess Communication)
-
메시지를 전달하는 방법
- message passing : 커널을 통해 메시지 전달
- 프로세스 사이에 공유변수를 일체 사용하지 않고 통신하는 시스템
- 방식
-
주소 공간을 공유하는 방법
- shared memory : 서로 다른 프로세스간에도 일부 주소공간을 공유하게하는 shared memory 매커니즘이 있음
** thread : thread는 사실상 하나의 프로세스이므로 프로세스간 협력이라고 보긴 어렵지만 동일한 프로세스를 구성하는 스레드 간에는 주소 공간을 공유하므로 협력이 가능