ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인강 3) Process 1
    운영체제 2021. 4. 15. 07:55

    강의 url www.kocw.net/home/search/kemView.do?kemId=1226304

    1) 프로그램의 실행 과정을 이해하고 커널이 가진 내용과 사용자 프로그램이 사용하는 함수를 알아본다.
    Keyword - 프로세스, 가상 메모리, Address transition, 프로세스의 주소 영역 및 커널 주소 영역 (data/stack/code)
    2) 프로세스의 개념, 상태, 문맥과 운영체제가 프로세스를 큐에 넣고 관리하는 형태에 대해 알아본다.
    Keyword - 프로세스의 컨텍스트, Process status(running/ready/wait) 그리고 queue, PCB, Program counter, register, interrupt, 
    3) 스케줄러의 세 종류인 장기, 단기, 중기 스케줄러에 대해 알아본다.

    1) 프로세스

    프로그램 실행시 파일시스템이 메모리에 올라가서 되는 것이 프로세스이다.
    1 프로세스가 메모리에 올라가기전에 virtual memory 가 있다. 프로그램이 실행될 떄 그 프로그램 만의 독자적인 address space가 만들어진다. 가상의 메모리 영역이며 모든 프로그램은 그 메모리 시작점을 0으로 가짐.
    2 모든 프로세스가 메모리에 올라가는 것이 아니며, 당장 필요한 부분만 실제 메모리에 올라가며 당장 필요하지 않은 부분은 disk의 Swap area로 올라간다. 
    3 그리고 stack/data/code 중 일부는 파일 시스템에 실행 파일 형태로 남아있기도 한다.
    4 실제 메모리에는 운영체제 ~ 그리고 프로세스들로 구성되어있고 가상 메모리는 그 프로세스만 대응하고 있기에 해당 메모리들을 매핑시키기 위한 Address translation을 수행한다.
    5 code -> 실질적으로 수행되는 코드들 (기계어로 번역 되는 부분), data -> 프로세스가 종료되기까지의 정보가 저장되는 영역(동적할당 및 전역변수 등의...), stack -> 함수 안에 위치하고 있는 지역변수들
    6 Kernel 또한 하나의 프로세스 이기 때문에 stack/data/code 영역으로 나뉜다. Kernel Adress Space - Stack/Data/Code

    Kernel Adress Space

    커널 코드 영역
    1 운영체제는 시스템의 자원을 관리하기 때문에 그러한 코드들을 가지고 있음
    2 사용자들에게 편리한 서비스를 제공하기 위한 코드들을 가지고 있음
    3 프로그램/하드웨어로 부터 인터럽트를 받을 수 있는 시스템콜/인터럽트 처리코 코드 들을 가지고 있음

    커널 데이터 영역
    1 운영체제는 모든 하드웨어/프로세스들을 관리하여야기 때문에(CPU, Memory 할당), 모든 하드웨어들을 관리하기 위한 자료구조를 가지고 있고, 모든 프로세스들을 관리할 자료구조를 가지고 있다. 프로세스에 대해선 Process Control Block, PCB를 가지고 있다.

    커널 스택 영역
    1 프로그램 A가 실행되다가 운영체제에게 요청하면 운영체제가 실행되는데, 운영체제 또한 프로그램이기 때문에 함수로 실행된다. 만약 A때문에 운영체제가 실행되었을 땐, 운영체제의 A 커널스택을 쓰고, 만약 프로그램 B에 의해 운영체제가 호출되었을 땐 B 커널스택을 쓰는 구조로 된다. 커널함수가 어느 프로세스별로 호출되었는 가를 관리하기 위해 프로세스 별 스택 영역을 쓴다. (이 부분은 추상적인 듯 하다.)

    커널의 코드(시스템 콜)를 실행한다는 것은 가상 메모리의 주소공간을 가로질러서 다른 프로그램 영역(OS)로 가야하기 때문에 CPU 제어권을 운영체제로 넘겨야한다. 그러면 인터럽트 라인을 통해 신호를 보내어 운영체제에게로 CPU 제어권을 넘긴다음 커널의 코드를 실행한다.

    2) 프로세스의 컨텍스트

    프로세스는 프로그램이 실행되는 것이다. 마치 인생에는 소년기 청년기 정년기 장년기가 있고 생이 소멸하듯, 프로세스 또한 어떠한 이유로 탄생하여 상태를 가지다 소멸하게된다. 프로세의 상태를 볼 때에는 몇 가지 지표가 있다.
    1 CPU 수행 상태를 나타내는 Program Counter 및 각 종 register (하드웨어 문맥)
    2 프로세스의 주소공간 code, data, stack.
    3 프로세스 관련 커널 자료 구조 PCB, kernel stack.

    프로세스의 상태

    Running ( hold CPU ) - CPU 스케쥴러에 의해 ready queue에서 running  으로 바뀔 때,
    Ready ( wait for CPU )
    - 1 필요에 의해 프로세스의 필요 부분이 메모리에 적재될 때
    - 2 running 중 할당시간 만료로 timer interrupt에 의해 ready queue로 들어올 때
    - 3 Blocked된 것의 작업이 끝나 ready queue로 들어올 때.
    Wait/Blocked ( Blocked eg. I/O ) 
    - CPU를 주어도 당장 instruction을 수행할 수 없는 상태 
    - Process 자신이 요청한 event(eg. I/O)가 즉시 만족되지 않아 이를 기다리는 상태 (eg. sw 예로는 공유 데이터 등이 Lock 걸려 있을 수도 있음)
    - 키보드, 디스크등의 작업이 끝났을 때, 키보드 컨트롤러/디스크 컨트롤러는 CPU에게 인터럽트를 걸고 운영체제에게 CPU 제어권이 넘어간다. 운영체제는 작업이 끝난 내용을(eg. 키보드 입력 또는 디스크 읽기) Wiated된 프로세스의 메모리 영역에 저장시킨다음, 해당 프로세스를 Ready Queue로 이동시킨다.

    PCB

    - 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
    - 1 OS가 관리상 사용하는 정보 ( Process status (running/ready/wait), PID, scheduling information, priority )
    - 2 CPU 수행 관련 하드웨어 값 ( Program counter, registers ) . 실제로 CPU에는 Program counter, Register가 있는데에도, PCB는 커널의 데이터 영역에도 Program Counter, Register가 있다. PCB에도 따로 또 보관을 하는것인 데, CPU를 얻었다 뺐겼다 하는데 (Context Switch) 각 프로세스가 어디까지 시행했는지 기억하기 위해 각 PCB에 저장해두어야함. A라는 프로세스가 CPU의 제어권을 가지고 수행하다가 B라는 작업으로 제어권을 넘겨줄 때, 넘겨주기 전에, CPU에 저장된 Program counter 및 Register를 해당 A프로세스의 PCB에 저장해둔다. 그리고 B에게 CPU를 넘겨주는데 B의 PCB에 저장된 Program counter, Register를 CPU의 Program counter, Register로 복원후 running 한다. 이 과정은 문맥 교환Context Switch이다.
    - 3 메모리 관련 (code/data/ stack) 
    - 4 파일 관련 (file descriptor )

    문맥교환

    CPU가 하나의 프로세스에서 또 다른 프로세스로 넘어가는 과정. 이는 사용자 프로세스에 한정한다.
    왜냐하면, Interrupt/System call을 통해 CPU의 제어권은 항상 반드시 운영체제로 손바뀜이 일어나기 때문이다. 

    1) context switch가 아닌 예는 다음과 같다. Process A  -> kernel mode -> Process A : 이 예는 context switch가 아니다. 예로, A 작업을 하다가 Wait Queue에 있는 B 프로세스에서 인터럽트가 들어왔을 때 (eg. 정확히는 Keyboard controller가 입력이 다끝났다고 인터럽트를 발생시켰을 때) CPU의 제어권이 A 에서 운영체제로 넘어간다음, 운영체제가 프로세스 B를 ready queue로 옮긴다음, CPU 제어권이 다시 프로세스 A로 넘어간 경우. 이 경우는 context switch가 아니다.

    2) context switch는 다음과 같다. Process A -> kernel mode -> Process B : 예로, 할당시간 만료 또는 I/O 등의 작업으로 A 프로세스가 running queue 또는 wait queue로 진입할 때 발생한다. 

    context switch가 아닌 1)의 경우에도 kernel도 레지스터를 써야하기 때문에, Process A의 진행상태 일부를 PCB에 save 하긴하지만!, 2)의 경우보다 overhead가 크지않다. (eg. cache memory flush)

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

    Job queue - 현재 시스템 내에 있는 모든 프로세스의 집합 .. 모든 queue를 가리킴.
    Ready queue - 메모리 상에 존재하면서 CPU를 잡아서 실행하기 위해 대기하는 프로세스의 집합.
    Device queues - 해당 device 때문에 blocked된 프로세스들.

    ready queue, magnetic queue, disk queue, terminal queue 를 보여주는 자료구조

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

    fork a child : 자식 프로세스를 하나 생성한다. 사람으로 비유하자면, 갓난아기를 만드는 게 아닌, 자기와 나이가 똑같은 복제인간을 만드는 것과 같다. 그렇게 되면 CPU를 경쟁하는 관계가 된다. 보통은 자식에게 먼저 CPU를 양보한다.
    wait for an interrupt : 오래 걸리는 작업때문에 (꼭 I/O 때문만은 아닌) interrupt를 기다리다 interrupt가 발생하면 ready queue로 넘어온다. 
    위 예는 예 중의 예라, 그냥 다양한 모습을 보여주는 것이다. 더 다양한 스케쥴링 큐의 모습이 존재한다.~..

    3) 스케쥴러

    스케쥴러는 운영체제 함수 또는 코드 중의 일부분이다. 운영체제에서 스케쥴링의 역할을 하는 코드 영역을 스케쥴러라고 한다. 운영체제의 역할이라고 보면 된다.

    Long-term scheduler (job scheduler)
    - 프로세스에 memory 및 각종 자원을 할당하는 문제
    - 프로세스 상태도에서 ready로 올라가기 까지 다음의 상태를 거치는데,  new -> admitted -> ready, 장기 스케쥴러는 프로세스를 ready queue까지 (프로세스의 필수 부분이 메모리에 할당되기까지) admitted 하는 과정을 책임진다.
    - 현대식의 time sharing system에서는 일반적으로 장기 스케쥴러가 없다. 프로그램이 실행되면 무조건 메모리에 진입하게 된다.
    - 메모리에 여러 프로그램을 올리는 것(a.k.a degree of Multiprogramming) 을 제어
    - 현대식엔 Job scheduler가 없는데 ㅋㅋ, 현대에서는 그 역할을 Swapper 가 한다.
    Short-term scheduler (CPU scheduler)
    - 어떤 프로세스를 다음번에 Running 시킬지 결정한다.
    - 충분히 빨라야함(millisecond 단위)
    Medium-Term Scheduler (Swapper)
    - 현대식의 운영체제에선 시작된 프로그램은 모두 메모리에 올라오는데, 프로세스가 너무 많아 메모리의 경합이 지나치게 발생될 때 특정 프로세스의 메모리를 통째로 빼앗아 디스크로 쫓아냄
    - 프로세스에서 memory를 뺐는 문제
    - 메모리에 여러 프로그램을 올리는 것(a.k.a degreeofMultiprogramming) 을 제어

    중기 스케쥴러에 의해 프로세스의 상태가 하나 더 추가되는데, 이는 Suspended(stopped)라 불리며 Swapper 때문에 프로세스가 수행이 정지된 상태이다.

    Suspended ( Stopped )
    - 외부적인 요인에 의해 프로세스의 수행이 정지된 상태. (eg. 사용자의 강제 정지 break key ctrl+z)
    - Swapper에 의해 프로세스가 통째로 디스크로 out 당할 때.

    Suspended는 다른 상태 Running, Ready, Blocked 와 다른 점은 후자 세 상태는 프로세스가 어떠한 작업들을 꾸준히 한다. running은 CPU 제어권을 얻어 instruction을 실행하듯, Blocked는 I/O 등의 작업을 프로세스가 참여. 그에 반해 Suspended는 프로세스의 어떠한 작업들이 아예 stop된 상태이다. 후자 세 상태는 자신이 요청한 event가 만족되면 Ready이나, Suspended는 외부에서 Resume을 시켜줘야 Active 된다.

    더 자세한 내용은 다음 강의(다음 포스트)에서 다룬다.

    '운영체제' 카테고리의 다른 글

    인강 ) 프로세스 동기화(2)  (0) 2021.05.05
    인강 6) 프로세스 동기화(1)  (0) 2021.04.29
    인강 4) Process 2  (0) 2021.04.16
    인강 3) Process 1  (0) 2021.04.15
    1 Overview  (0) 2021.04.07

    댓글 0

Designed by Tistory.