운영체제 - 03

Updated:

강의

http://www.kocw.net/home/search/kemView.do?kemId=1226304

운영체제 - 프로세스 관리

1. 프로세스의 개념

  • 프로세스는 프로그램의 실행이다.

  • 프로세스의 문맥(context)

    • CPU 수행 상태를 나타내는 하드웨어 문맥
      • program counter
      • 각종 register
    • 프로세스의 주소 공간
      • code, data, stack
    • 프로세스 관련 커널 자료 구조
      • PCB(Process Control Block) : 프로세스의 정보를 저장
      • Kernel stack : 프로세스는 각각 kernel에 stack을 차지

2. 프로세스의 상태

2.1 Running : CPU를 잡고 instruction을 수행중인 상태

2.2 Ready : CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)

2.3 Blocked (Wait, sleep) : CPU를 당장 instruction 수행할 수 없는 상태

  • 운영체제는 각 프로세스의 PCB를 보고 상태를 측정

3. PCB (Process Control Block)

  • 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
  • PCB가 위치하는 것은 data영역이나 프로세스에 대한 전반적인 정보(문맥)을 다 가지고 있음
  • 왜냐하면 이를 저장해야 시스템 콜 이후에 마지막 실행시점을 알아야 거기부터 다시 시작해야하기 때문에
  • 구성요소
    1. OS가 관리상 사용하는 정보
    2. CPU 수행 관련 하드웨어 값
    3. 메모리 관련
    4. 파일 관련

4. 프로세스 문맥 교환(Context Switch)

  • 시스템콜 or 인터럽트 발생 시 반드시 문맥교환이 일어나는 것이 아님

  • 위의 경우보다 아래 경우가 부담이 훨씬 큼.
  • 왜냐하면 위의 경우 캐쉬 메모리 플러시를 사용해서 금방 바꾸나
  • 아래의 경우 아예 다른 프로세스로 바뀌기 때문에 삭제하고 다시 저장해야하므로

5. 프로세스를 스케쥴링하기 위한 큐

  • Job queue : 현재 시스템 내에 있는 모든 프로세스의 집합
  • Ready queue : 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
  • Device queue : I/O device의 처리를 기다리는 프로세스의 집합
  • 프로세스는 각 큐를 오가며 수행

6. 스케쥴러(Scheduler)

  • 운영체제에서 실행되는 어느 기능. 코드라고 보면 됨.
  • 그냥 거의 운영체제다 라고 보면 됨

6.1 Long-term 스케쥴러(장기 or job 스케쥴러)

  • 프로세스가 New상태중이다가 admitted가 되어 ready가 되게 만드는 것

  • 시작 프로세스 중 어떤 ready queue로 보낼지 결정
  • 프로세스에 memory(및 각종 자원)을 주는 문제

  • degree of Multiprogramming(프로그램의 수라고 보면 됨)을 제어
  • time shareing system에는 보통 장기 스케쥴러가 없음 (무조건 ready)
  • 즉, 이런 스케쥴러는 없다고 보면 됨. 굉장히 옛날 꺼일때나 있는 거.
  • 요즘 운영체제에서는 프로세스가 실행되면 곧바로 실행되기 때문에.
  • 그럼 자원 관리를 어찌하냐? 그래서 6.3 중기 스케쥴러가 있음

6.2 short-term 스케쥴러 (단기 or CPU 스케쥴러)

  • 어떤 프로세스를 다음번에 running시킬지 결정
  • 프로세스에 CPU를 주는 문제
  • 충분히 빨라야 함(millisecond 단위)

6.3 Medium-term 스케쥴러(중기 or Swapper)

  • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫒아냄
  • 프로세스에게서 메모리를 뺏는 문제
  • degree of Multiprogramming을 제어

7. 추가된 프로세스의 상태

  • 프로세스가 자기 코드 사용 : user mode
  • 프로세스가 자기 코드가 아닌 디스크나 운영체제 코드 사용 : 모니터 모드

7.1 Suspended (Stopped)

  • 외부적인 이유로 프로세스의 수행이 정지된 상태

  • 프로세스는 통째로 디스크에 swap out 된다.
  • ex) 사용자가 일시정지. 시스템이 여러 이유로 프로세스 중지
  • suspended block은 I/O로 인하여 block상태였는데 메모리마저 빼앗긴 프로세스이다.
  • 그렇다고 suspended ready 프로세스는 외부에서 resume하기 전까진 실행이 안된다.
** blocked vs suspended **
  • blocked는 실행 중인거다. 단지 CPU 제어권이 없을 뿐 자신이 요청한 내용이 만족하면 다시 ready
  • suspended는 강제로 중지된 것. 외부에서 resume해야 Active

8. Thread

  • CPU의 단위 수행
  • 동일한 프로세스에서 코드는 쉐어하지만 여러 개의 수행하는 코드 동작 대해서 각각 관리하자.
  • 비동기식 입출력 상태에서 효과적으로 사용된다.

8.1 구성

  • 프로그램 카운터 (PCB에 있음)
  • 레지스터 set (PCB에 있음)
  • stack space

8.2 공유하는 부분(=task)

  • 코드 섹션
  • 데이터 섹션
  • OS 자원(ex: files)
**이외 모든 것들은 공유하지 않음

8.3 장점

  • 빠른 처리
  • 자원 공유
  • 경제성 (프로세스 하나 만드는 것보다 효율적)
  • 병렬성 (CPU가 여러개 있을 때 말하는 것)

8.4 구현

8.4.1 커널 스레드
  • 커널로 제공되는 스레드
8.4.2 사용자 스레드
  • 프로세스에서 제공되는 스레드

9. 프로세스 생성

  • 부모 프로세스가 자식 프로세스 생성
  • 커널(운영체제)에게 프로세스를 만들어 달라고 요청(fork)
  • 트리(계층)구조 형성
  • 원칙적으로는 각자의 자원을 가져야 하나(CPU를 차지하기 위한 싸움) 일부는 공유할 수 도 있다.
  • 주소 공간
    • 자식은 부모의 공간을 복사
    • 자식은 그 공간에 새로운 프로그램을 올림
  • fork() : 시스템 콜이 새로운 프로세스를 생성. 즉, 복제 생성
  • exec() : 다른 프로그램을 실행하고 싶으면 자식 위에 덮어 씌우는 것

10. 프로세스 종료

  • exit : 프로세스 종료. 모든 자원을 반납.
  • wait: 자식이 종료되면 부모에게 알림.
  • abort : 부모가 자식을 종료시킴
    • 자식이 자원의 할당치를 넘어섬
    • 더 이상 할일이 없음
  • 부모가 먼저 종료할 경우 운영체제가 나서서 자식을 먼저 죽이고 부모를 죽임

11. fork() 시스템 콜

  • 왼쪽 소스에서 fork를 실행하면 바로 오른쪽 코드가 생성. 즉, 자식 프로세스가 생성
  • 이때 pid는 프로세스를 구분. pid가 0이면 부모 아니면 자식. 각자 다른 로직을 할 수 있게 구성

12. exec() 시스템 콜

  • 프로세스는 exec()를 통해 다른 프로그램을 실행
  • 자신은 현재 프로그램을 그대로 수행하고 자식 프로세스에게 다른 프로그램을 새로이 실행시킬려고 할때 사용
  • exec() 호출 후에 있는 코드는 실행하지 않는다. 아예 다른 프로세스가 되기 때문이다.

13. wait() 시스템 콜

  • 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다. (block 상태)
  • child process가 종료되면 커널은 프로세스 A를 wake 시킨다.
  • ex) 리눅스 창에서 vi 커맨드를 치면 커널(프로세스)에 커맨드를 치기 전까지 편집기(child process)가 켜진다. 이때 커널(프로세스)을 sleep상태로 만듬. 다른 커맨드 치기 전(즉, child 프로세스인 편집기가 종료되기 전)까지

14. exit() 시스템 콜

  • 자발적 : 사용자가 넣을 수도 있으나 컴파일러가 알아서 exit를 프로그램 main 함수 끝에 코드에 넣어서 종료시킴

  • 비자발적: 부모 프로세스가 자식 프로세스를 강제 종료
  • 키보드로 kill, break
  • 부모가 종료되어 운영체제가 자식을 죽이고 부모를 죽일 때

15. 프로세스 간 협력

15.1 독립적 프로세스

  • 자신만의 주소 공간을 가지는 것이 원칙

15.2 협력 프로세스

  • 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음

15.3 협력 메커니즘(IPC: interprocess Communication)

  • 메시지를 전달하는 방법 : message passing

  • 주소공간을 공유하는 방법

    • shared memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유
    • ** thread : thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 프로세스를 구성하는 thread를 간에는 주소 공간을 공유하므로 협력이 가능.

    thread는 프로세스 안에서 여러개로 만들어진 작업 단위이다. 따라서 thread로 다른 프로세스와 주소 공간을 공유하는 것이 아니지만 단순히 주소 공간을 공유한다는 개념을 비교하기 위해 써놓음

16 Message Passing

16.1 메시지 시스템

  • 프로세스 사이에 공유 변수를 사용하지 않고 통신하는 시스템

16.2 Direct Communication

  • 통신하려는 프로세스의 이름을 명시적으로 표시

16.3 Indirect Communication

  • mailbox를 통해 메시지를 간접 전달
  • 누가 받아볼지 모름. 협력하는 어느 프로세스가 가져감