CS/운영체제

프로세스

yhsim98 2022. 7. 17. 18:51

프로그램 vs 프로세스

보조메모리 안에 있는 OS가 메인메모리에 올라가게 되는데 이것을 부팅이라 합니다.

 

보조메모리 안에는 OS 뿐만 아니라 여러 프로그램들이 들어가 있습니다.

 

여러 프로그램들도 보조메모리에 들어있다 실행 시 메인 메모리에 올라가게 됩니다.

 

이렇게 실행상태로 들어가 메모리에 들어간 것을 프로세스라 하고 보조메모리에 있는 상태를 프로그램이라 합니다.

프로세스

실행을 위해 커널에 등록되어 메모리를 할당 받은 프로그램

운영체제 입장에서의 작업의 단위입니다

 

처리가 필요한 프로그램과 필요한 데이터를 하나의 Job이라고 합니다.

 

이것을 시스템에 처리해달라고 요청하는데 그렇게 등록된 Job을 Process라 합니다.

프로세스 메모리 구조

프로세스는 메모리 공간을 시스템으로부터 할당 받습니다.

각 프로세스는 4가지 논리적인 영역으로 구성되어 있습니다.

  • Code(text) 영역
    • 실행할 프로그램의 코드가 저장됩니다.
    • CPU는 이 영역에서 명령어를 하나씩 가져와 처리하게 됩니다
      • PC(Program Counter)를 통하여 접근한 다음 register에 적재하여 실행함?
  • Data 영역
    • 전역변수와 정적변수가 저장됩니다. 이 변수들은 프로그램이 시작될 때 할당되어 프로그램 종료시 소멸됩니다
  • Stack 영역
    • 지역변수, 매개변수, 리턴값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역입니다
    • 함수 호출 시 할당되고 함수 반환 시 소멸됩니다. 로드 시(컴파일 타임) 크기가 결정됩니다
    위 세 영역은 컴파일 할 때 data, stack 영역의 크기를 계산해 메모리 영역을 결정합니다.
    • Heap 영역
      • 동적 데이터 영역입니다, 메모리 주소 값에 의해서만 참조되고 사용되는 영역입니다
        • 런타임에 크기가 결정됩니다

PCB(Process Control Block)

  • OS가 프로세스 관리에 필요한 모든 정보 저장공간, 커널에 존재한다
    • 프로세스 상태, 프로그램 카운터, 프로세서 사용기간 등의 정보
  • 프로세스 생성 시, 커널에 PCB가 생성 됨
    • 생명주기를 프로세스와 같이합니다
  • 모든 프로세스가 각각 하나씩 가지고 있다
  • CPU는 여러 프로세스를 번갈아가며 처리하는데
  • 프로세스를 수행하던 정보를 어딘가에 저장해야 다시 해당 프로세스를 처리할 때
  • 이전에 처리하던 부분부터 다시 처리할 수 있다
  • 이렇게 처리 중이던 정보를 저장하는 공간을 PCB라 한다

단일 스레드의 경우입니다

  • PID : 프로세스 식별자
  • process state : 프로세스 상태
  • Program Counter(PC) : 해당 프로세스가 다음에 실행할 명령어의 주소
    • 멀티 스레드 프로세스의 경우 각각의 스레드에 저장됩니다 
  • CPU 스케줄링 정보 : 프로세스 우선 순위, 최종 실행시간, CPU 점유시간 등등
  • 메모리 관리 정보 : 해당 프로세스의 주소 공간, page table, segment table 등
    ....

멀티 프로그래밍

메모리에 여러 프로그램을 올려서 사용하는 구조

  • 컴퓨터는 한번에 여러 프로세스를 실행합니다
  • OS는 이런 프로세스를 관리하게 됩니다
  • CPU는 여러 프로세스를 번갈아가며 처리합니다
    • 굉장히 빠른 속도기 때문에 사용자는 마치 동시에 실행되는 것처럼 느낍니다
  • CPU를 할당받았냐에 따라 프로세스 상태가 달라집니다

프로세스 상태

  • Create, New
    • 프로그램이 커널에 등록되어 메모리를 할당받은 상태
  • Active
    • Ready : 기타자원
      • ready queue 에 들어가 프로세서(cpu)할당을 기다리는 상태
      • CPU를 제외한 필요한 모든 자원을 할당받음
    • Running : 기타자원, 프로세서
      • Ready 상태에서 프로세서(cpu)를 할당받은 것
      • Ready에서 running으로 바뀌는 것을 dispatch라 한다.
    • Blocked, asleep : 암것도없음
      • Running에서 Blocked로 가는 것을 인터럽트라고 함
      • 사용중이던 프로세서를 반납한 상태
  • Suspended
    • 메모리가 없음
  • terminated
    • 수행이 끝난 상태
    • 모든 자원이 반납되고 일부 PCB 정보만 남은 상태

메모리는 한정되어 있기 때문에 하드 디스크에 있던 Job이 메모리에 올라가기 위해서는 대기를 해야 합니다.

이렇게 Job이 메모리에 올라가기 위해 대기하는 공간을 Job Queue라 합니다.

  • CPU는 한번에 하나의 프로세스밖에 처리하지 못합니다.
  • 메모리에 올라왔다 하더라도 CPU를 할당받기 위해서는 기다려야 합니다.
    • 할당받기 위해 기다리는 공간을 ready queue라고 합니다
  • 하나의 프로세스를 너무 오래 잡고있을 수 없기 때문에 일정 시간이 지나면 다른 프로세서를 처리합니다
  • 프로세스를 처리하다 I/O가 필요하면 CPU를 반납하고 I/O를 사용하기 위해 대기해야 합니다
    • 대기하는 공간을 device queue라 합니다

스케줄링

Job Queue에 대기하고 있던 프로그램 중 어떤 프로그램을 선택하여 메인메모리로 올릴 지 선택하는 것을 Job Scheduling이라 합니다

  • Job Scheduler가 수행하게 됩니다
  • Long-term scheduler로 분류됩니다
    • 천천히 일어나기 때문

ready queue에 있던 프로세서 중 어떤 프로세서에 CPU를 할당할지 선택하는 것을 CPU Sceduling이라 합니다.

  • CPU Scheduler가 수행하게 됩니다
  • shoret-term scheduler로 분류됩니다
    • 빈번하게 일어나기 때문

Context Switching

컴퓨터 메모리 계층 구조

현재 진행하고 있는 Task(Process, Thread)의 상태를 저장하고 다음 진행할 Task의 상태 값을 읽어 적용하는 과정을 말합니다.

  • Context
    • CPU가 해당 프로세스를 실행하기 위한 프로세스와 관련된 정보들의 집합
    • CPU register context
      • cpu의 register에 있는 프로세스에 대한 정보
        • PC, SP 등
      • 메인 메모리에서 cpu의 register로 데이터가 올라가고 프로세서는 그것을 바탕으로 수행
    • PCB, Code 등
      • 메모리에 올라가있는 프로세스에 대한 정보
      • 어떤 코드를 실행하고 있는지 가리키는 PC, SP 등등
  • Context saving
    • 현재 프로세스의 Register context를 저장하는 작업
      • PC(Program Counter), SP(Stack Pointer) 등의 값을 PCB에 저장한다???
        • PC
          • 메모리로부터 실행될 다음 명령의 주소를 갖는 컴퓨터 프로세서의 CPU 레지스터이다.
          • 프로세서는 PC를 통해 메모리에 접근합니다
        • SP : 해당 CPU가 참조하고 있던 스택 주소
        • CPU의 레지스터가 해당 값들을 가지고 있다
        • Context Switching이 일어날 때 프로세스의 PCB에 저장
    • CPU에서 수행중이던 정보를 저장
  • Context restoring
    • Register context를 프로세스로 복구하는 작업
  • Context switching
    • 실행 중인 프로세스의 context를 저장하고
    • 앞으로 실행 할 프로세스의 context를 복구하는 일
    • 커널이 수행한다
      • OS의 dispacher 가 수행

context switching은 비용이 큰 연산이므로 가능하면 줄이는 것이 좋다

 

Operations on Processes

Process Creation

프로세스는 트리 구조로 되어 있습니다. 즉, 프로세스가 자식 프로세스를 만듭니다. PCB에 저장된 pid값으로 프로세스를 식별하는데, 이는 운영체제가 정해준 고유 번호입니다. 

 

프로세스가 시스템 콜의 fork()함수를 호출하면 부모 프로세스는 자신과 같은 자식 프로세스를 생성합니다. fork()함수는 부모 프로세스에게는 자식 프로세스의 pid를, 자식 프로세스에게는 0을 반환합니다.

 

Process Termination

exit()를 호출하면 프로세스를 종료시킬 수 있다. 부모 프로세스가 자식 프로세스보다 먼저 종료되면 자식 프로세스는 그 상위 프로세스를 부모 프로세스로 바라봅니다.

 

자식 프로세스가 종룔되었는데, 부모 프로세스가 자식 프로세스가 반환한 정보를 회수하지 않으면 자식 프로세스는 종료되었음에도 정보가 메모리에 남아 있는 좀비 프로세스 상태가 됩니다.

 

 

 

인터럽트

인터럽트가 발생하는 경우

인터럽트는 CPU가 프로그램을 실행하고 있을 때 실행중인 프로그램 밖에서 예외 상황이 발생하여 처리가 필요한 경우 CPU에게 알려 예외 상황을 처리할 수 있도록 하는 것

  • 프로세스가 커널 수준 스레드를 통해 system call 요청?
  • I/O request
    • 입출력을 요청할 때 인터럽트
  • time slice expired
    • CPU 사용기간이 만료 되었을 때
  • fork a child
    • 자식 프로세스를 만들 때

등등

reference

http://www.kocw.net/home/cview.do?cid=5c3c30382c7bbcf6

https://www.youtube.com/watch?v=MJTr37lgaMA&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=6
https://velog.io/@cchloe2311/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0