CS/운영체제

[운영체제] 프로세스

삶_ 2022. 6. 27. 16:33

 

프로세스

  • 운영체제로부터 자원을 할당받는 작업의 단위
    • 독립된 메모리 영역을 할당받음(code, data, stack, heap 의 구조)
  • 프로세스의 상태
    • CPU에서 기계어 실행 (큐를 만들어 그안에 해야할 일들을 줄 세워줌)
    • -> 오래걸리는 할 일은 디스크/키보드 등의 입출력 큐로 넘어감
  • Process와 Program 차이점
    • 프로그램 : 어떤 작업을 위해 실행할 수 있는 파일
    • 프로세스 : cpu를 차지하면서 수행하는 수행 주체. 프로그램의 한개의 인스턴스

 

프로그램의 실행

  • Virtual memory : 실제로 존재하지 않는 메모리. 
  • Physical memory : 실제적인 메모리. 운영체제가 들어있음.

 

 

 

 

 

 

 

프로세스의 문맥

  • 필요성
    • CPU가 시분할 시스템 환경이라 돌아가면서 CPU를 나눠주게 되는데,
    • 다시 명령 수행 시, 이전에 어디까지 수행했는지 정확히 알고가야하기 때문에 필요하다
  • 하드웨어 문맥 : CPU의 수행상태. 각종 PC/레지스터 값.
  • 프로세스의 주소공간 : stack/data/code 공간을 의미
  • 커널상의 문맥 : PCB와 커널스택

 

 

 

 

문맥 교환

  • CPU를 한 프로세스에서 다른 프로세스로 CPU제어권을 넘겨주는 과정
  • CPU가 다른 프로세스에게 넘어갈때
    • CPU를 내어주는 프로세스의 상태(문맥)를 그 프로세스의 PCB에 저장
    • CPU를 새롭게 얻는 프로세스의 문맥를 PCB에서 읽어옴
    • 아래의 (2)만 문맥교환에 해당된다

 

 

프로세스의 상태

  • running
    • CPU를 잡고 명령을 수행중인 상태
    • 커널모드/사용자모드 둘다 프로세스는 running 상태이다
  • ready : CPU를 쓰려고 기다리는 상태. CPU만 보유하면 당장 명령을 수행함.
  • blocked : CPU를 받아도 못쓰는 상태. I/O 등의 이벤트가 아직 완료되지 않아서.
  • Suspended (stopped)
    • 프로세스가 중기스케줄러에 의해 메모리에서 쫒겨난 상태
    • 외부적인 이유로 프로세스의 수행이 정지된 상태

 

 

 

PCB

  • 운영체제가 각 프로세스를 제어하기 위해
  • 프로세스별로 중요한 정보를 저장해 놓는 곳
  • 각 구성요소를 가짐
    • OS가 관리상 사용하는 정보 (우선순위, 프로세스아이디,)
    • CPU 수행 관련 하드웨어 값 (레지스터 등(프로세스가 인터럽트 이후 올바르게 작업하기 위해 참조한 값))
    • 메모리 관련 (code/data/stack의 위치정보)
    • 파일 관련 (오픈해서 쓰고있는 파일이 어떤건지)

 

 

스케줄러

어떤 프로세스에게 자원을 할당할지 결정하는 운영체제의 커널코드

  • 장기 스케줄러/메모리 스케줄러
    • 프로세스에 메모리를 주는 문제
    • 보통 time sharing system에는 장기스케줄러가 없음
  • 단기 스케줄러/CPU 스케줄러
    • 어떤 프로세스에게 CPU를 할당하는 역할
  • 중기 스케줄러
    • 장기스케줄러가 없으니 메모리가 너무 부족할때, 여유공간을 위해
    • 프로세스를 통째로 메모리 -> 디스크로 쫓아냄

 

 

프로세스 생성

  • 부모 프로세스가 자식프로세스를 생성
    • 둘은 별개의 프로세스라 각자 수행됨
  • 주소공간
    • 자식은 부모의 공간을 복사
    • 자식은 그 공간에 새로운 프로그램을 올림
    • fork() 시스템 콜 : 새로운 프로세스 생성(복제)
      • 부모를 그대로 복사, 주소 공간 할당
      • fork 다음에 이어지는 exec() 시스템콜을 통해 새로운 프로그램을 메모리에 올림

 

 

프로세스 종료

  • exit : 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌
    • 자식이 부모에게 종료사실을 알림
  • abort : 부모 프로세스가 자식의 수행을 종료시킴 (강제)
    • 자식이 할당 자원의 한계치를 넘을 때
    • 자식에게 할당된 일이 더이상 필요하지 않을 때
    • 부모가 종료하는 경우
      • 운영체제는 부모 프로세스가 종료하는경우 자식 종료 -> 부모종료 시킨다
      • (단계적 종료)

 

fork() 시스템 콜

  • 부모를 복제한 자식프로세스를 생성
  • 복제품 구분하는법
    • 부모 프로세스 : fork()의 pid값을 0보다 큰값으로 받음 
    • 자식프로세스 : fork()의 pid값을 0으로 받음

 

exec() 시스템 콜

  • 새로운 프로세스의 이미지로 덮어씌운다
  • fork()로 복제한다음 exec() 로 덮어씌울수 있음

 

wait() 시스템 콜

  • 프로세스 A가 wait()을 호출하면 blocked 상태가 됨
    • 커널은 자식이 종료할 때까지 프로세스A를 sleep 시킴
    • 자식 프로세스가 종료되면 커널은 프로세스 A를 ready 로 만듬

 

exit() 시스템 콜

  • 프로세스의 종료
    • 자발적 종료 : 마지막 프로세스 이후 exit() 시스템콜을 통해 종료됨
    • 비자발적 종료
      • 부모 프로세스가 자식 프로세스를 강제 종료시킴
      • 키보드로 kill, break 등을 친 경우
      • 부모 프로세스가 종료되기 전에 자식들이 먼저 종료됨

 

 

프로세스 간 협력

  • 독립적 프로세스 : 프로세스는 각자의 공간을 갖고 독립적으로 수행한다
  • 협력 프로세스 : 하나의 프로세스가 다른 프로세스의 수행에 영향을 미침
  • 프로세스 간 협력 메커니즘
    • Message Passing : 메세지를 전달. ex. 운영체제가 매개가 되어 프로세스 A에게 프로세스 B의 메세지를 전달 (간접/비간접)
    • Shared Memory : 운영체제가 매개가 되어 메모리를 공유
    • thread : 하나의 프로세스. 동일한 프로세스를 구성하는 스레드들간에는 주소공간을 공유하므로 협력은 가능하다

 

 

프로세스의 특성 분류

  • I/O-bound process : CPU를 잡고 계산하는 시간보다 I/O에 많은 시간이 필요한 일
  • CPU-bound process : CPU가 오랫동안 잡고있는 일
  • CPU 스케줄링이 필요하다!
    • CPU 스케줄러 : Ready 상태의 프로세스 중에 CPU를 줄 프로세스를 고름
    • Dispatcher : CPU 제어권을 CPU 스케줄러에 의해 선택된 프로세스에게 넘김 (=문맥교환)
      • Running -> Blocked (I/O 요청하는 시스템 콜)
      • Running -> Ready (타임인터럽트) (강제)
      • Blocked -> Ready (I/O 완료 후 타임인터럽트) (강제)
      • Terminate (프로세스가 종료됬을 때)
    • 스케줄링 기준
      • 이용률, 처리량, 소요시간, 대기시간, 응답시간 (CPU가 얼마나 안 놀고 일하는지에 대한..)

 

 

 

쓰레드

  • 프로세스 내부에서 CPU를 수행할 단위
  • 구성 : 프로그램카운터/레지스터/함수호출과 관련된 stack
  • 같은 프로세스 내 스레드들과 공유 (= task)
    • 그 외의것. code, 메모리
  • 스레드의 장점 : 응답성이 빠름
    • 다중 스레드의 구조에선 하나의 서버 스레드가 blocked상태인 동안에도
    • 그 내에 다른 스레드가 실행되어 빠른 처리가 가능
    • 자원을 공유하는 효과 (동일 프로세스 안의 스레드들끼리 공유)
    • 경제적 : 용량 프로세스 하나만드는게 오래걸리니 차라리 스레드를 만드는게 나음
    • 병렬성
      • 멀티 프로세스 구조에선 스레드들이 각자 병렬적으로 실행되서
      • CPU가 여러개일때 병렬적으로 잘 사용될 수 있다
  • 커널 스레드
    • 스레드의 존재를 이미 운영체제가 알때. 미리 어떻게 넘길지 아는거.
  • 사용자 스레드
    • 운영체제가 스레드의 존재를 모름. 사용자 프로그램 실행.