Computer Science/OS

스터디 - 2주차

코드몬스터 2022. 8. 22. 20:29
728x90

 

프로세스(Process)

👉 프로세스의 문맥(context)

어떤 단어를 사전에서 찾아보면 여러 가지 의미로 정의 되어 있어서 전체적인 문장 구조를 확인해야지 정확하게 어떤 의미로 사용했는지 알 수 있다.

 

즉, 프로그램이 처음 실행되어서 종료 되는 과정 중간에 끝나면(멈추게 되면) 해당 프로그램이 처음에 무엇을 어떻게 실행 되었는지 그리고 현재 시점에서 어떤 상태에 있는지 나타내기 위해서 사용되는 것이 문맥이다.

 

👉 프로세스 작업 과정

프로세스가 실행되면 메모리에 독자적인 주소 공간을 형성(stack, data, code 생성)하고 프로세스가 CPU 를 잡게 되면 프로그램 카운터(PC)가 프로세스 code 부분을 가리키고 있고 매순간 기계어를 하나씩 읽어서 레지스터에 값을 넣고 논리산술 연산을 하거나 결과를 레지스터에 저장하거나 또는 밖에 저장하거나 작업을 한다.

 

이 과정 중에 어디까지 실행되었는지 확인하는 것을 프로세스의 문맥이다

 

※ 프로세스는 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당 받아 실행 중인 것

※ 프로그램 카운터는 메모리의 어느 부분을 실행하고 있는지 가리키고 있는 Register

 

 

👉프로세스 상태

  • Running
    • 프로세스 하나가 CPU 를 잡고 있는 상태
  • Ready
    • CPU 를 기다리고 있는 상태(메모리 등 다른 조건을 모두 만족하고)
  • Blocked(wait, sleep)
    • cpu 를 할당해도 당장 instruction 을 수행할 수 없는 상태
    • process 가 요청한 event 가 즉시 만족되지 않은 상태?

👉 PCB

  • 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
  • CPU 스케줄링을 통해 우선순위를 줄 수 있다.(큐 스택처럼 보이지만 아님)

👉 🌟 문맥교환(Context Switch) 🌟

  • CPU를 하나의 프로세스에서 다른 프로세스로 넘겨주는 과정
    • 스레드(Thread) 간의 교환은 해당하지 않는다(???)
  • 다음 CPU를 얻었을 때, 문맥에서부터 다시 시작할 수 있다.

👉 스케줄러

  • Long-term scheduler 장기스케줄러
    • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
    • 프로세스기 시작(new → ready 에서 admitted(메모리에 올라가는 것을 허락 하면 변경 됨) )
    • degree of Multiprogramming(메모리에 여러 프로그램들이 동시에 올라가는 것)
      • 프로그램 몇 개를 동시에 올릴지 결정하는
    • time sharing system 에는 보통 장기 스케줄러가 없음(무조건 ready)
  • Short-term scheduler
    • 어떤 프로세스를 다음 번에 running 시킬지 결정
  • Medium-Term Scheduler(중기 스케줄러 or Swapper)
    • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
    • 프로세스에게서 memory를 뺏는 문제
    • degree of Multiporgramming 을 제거
      • 너무 많이 메모리에 올라가 있으면 프로그램 몇 개를 쫓아낸다.
    중기 스케줄러가 있기 때문에 현대 운영체제에서는 Suspended 상태가 추가 되었다.
    • 메모리를 통채로 빼앗긴 프로그램을 표현할 상태가 없다.
    • 외부적인 이유로 프로세스의 수행이 정지된 상태
    Blocked: 자신이 요청한 event 가 만족되면 Ready
  • Suspended: 외부에서 resume 해주어야 Active

스레드(Thread)

👉 스레드?

: 프로세스 하나에 CPU 수행 단위만 여러 개 두는 것을(프로그램 카운터)만 여러 개를 두는 것이다.

 

즉, 스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체 두 개 이상의 스레드가 작업하는 것을 멀티 스레드 프로세스라고 한다.

 

👉 Process Management

시스템 콜

  1. fork() 시스템 콜
    :create a child (copy)
    • 새로운 프로세스를 생성()
      • 프로그램 카운터를 복제
      • 내용을 덮어 씌우기 때문에 복제 프로세스는 자기가 원래 프로세스로 착각함.
    • 부모 프로세스는 fork 의 결과 값이 양수
    • 자식 프로세스는 fork 의 결과 값이 0
  2. exec() 시스템 콜
    : overlay new image
    • A Process can execute a different program by the exec() system call.
      • replace the memory image of the caller with a new program
    • exec 이후에 나오는 코드는 실행할 수 없는 코드이다.
  3. wait() 시스템 콜
    : sleep until child is done 
    • 커널은 child가 종료될 때까지 프로세스 A를 sleep시킨다. (block상태)
    • Child process가 종료되면 커널은 프로세스 A를 깨운다. (ready 상태)
    • 리눅스에서 프로그램 A를 실행하는 과정 자체가? wait 이다?
      • shell 의 자식 프로세스로 실행이 되는 것이다

exit() 시스템 콜

  • 자발적 종료
    • 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 커파일러가 넣어줌
  • 비자발적 종료
    • 부모 프로세스가 자식 프로세스를 강제로 종료시킴
      • 자식 프로세스가 한계치를 넘는 경우
      • 자식에게 할당 된 태스크가 더 이상 필요하지 않는 경우

👉 프로세스 종료(Process Termination)

  • 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌(exit)
    • 자식이 부모에게 output data를 보냄
    • 프로세스의 각종 자원들이 운영체제에게 반남됨
  • 부모 프로세스가 자식의 수행을 종료시킴(abort)
    • 자식이 할당 자원의 한계치를 넘어섬
    • 자식에게 할당된 태스크가 더 이상 필요하지 않음
    • 부모가 종료하는 경우
  •