본문 바로가기
CS/Operating System

[Operating System Concepts] Chapter3 Process (Part.1)

by 개복취 2023. 10. 27.

킹룡

  1. Basic memory and process structure
  2. 5 state of process
  3. PCB Concepts
  4. Process Scheduling
  5. Context Switching
  6. OS can create process, terminate process
  7. How to create Processes?

Basic memory and process structure

 

  • 프로세스란 실행중인 프로그램으로 정의할 수 있다.
  • OS는 프로세스 단위의 작업을 관리한다.
  • HDD→load to memory영역 (process)→CPU 로 처리하는 일련의 과정이 time-sharing(시분할 시스템)을 통해 공유되어 있다. 

https://www.inflearn.com/course/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B3%B5%EB%A3%A1%EC%B1%85-%EC%A0%84%EA%B3%B5%EA%B0%95%EC%9D%98

Memory Layout : 메모리 레이아웃은 여러 개의 영역으로 나뉘어 진다.

https://www.cs.csustan.edu/~john/Classes/CS3750/Notes/Chap03/03_Processes.html

 

< 컴파일 시 크기가 결정되는 영역 >

  • Text(Code) 영역에서는 실행 가능한 코드가 저장된다. (함수, 제어문, 상수)
  • Data 영역에서는 전역변수들이 저장된다. (initialized : DATA / uninitialized : BSS)

< 런타임에 메모리 할당되는 영역 >

  • malloc 등의 메모리 할당으로 heap 영역이 런타임에 메모리가 채워진다.
  • 함수호출해서 쌓이는 곳은 stack section이다. 임시로 데이터를 저장하는 역할을 한다.
    가령, 함수인자와 반환된 주소값 그리고 지역변수들이 주로 저장된다.

이를 program in execution(process) 라 하고, OS에서 모든것을 관리한다.

 

 

 

 

5 state of process

프로세스가 실행될 때 5가지의 상태로 정의될 수 있다.

  • New : 프로세스가 새로 생김
  • Running : 명령어들이 실행되고있음
  • Waiting : 프로세스는 이벤트 발생을 대기하고 있음 ex) I/O 실행완료, 시그널 접수
  • Ready : 프로세서에 의해 프로세스가 할당되기를 기다리고 있음
  • Terminated : 프로세스는 실행을 다 끝냄

https://www.researchgate.net/figure/Process-State-Diagram_fig1_260973132

  • Ready → Running : OS에서 판단(cpu scheduling)해서 실행하도록 한다. (dispatch)
  • Running → Ready : 너무 오래 사용하거나 다른 작업을 해야할 때 인터럽트를 넣는다. (Interrupt)
  • Running → Waiting : I / O 또는 event wait 할 때 할일이 없어서 waiting queue로 가서 대기한다. (I/O completion 상태면 다시 ready → running 됨)

 

PCB Concepts

  • PCB는 여러가지 정보를 들고있다. 해당 내용들이 구조체로 존재한다.
    (Process state, Program Counter(PC), CPU register, scheduling info., Accounting info., I/O status info. ...)
  • PCB들은 OS가 관리한다. (P0, P1, P2, P3 ...)
  • 프로세스는 하나의 스레드로 실행을 하는 것과 동일하다. (하나의 프로세스로 하나만의 태스크를 처리한다.)

PCB(Process control block)

  • 프로그래밍의 정수는 멀티테스킹과, 멀티프로세싱에 있다.
  • 멀티 프로세싱이 가능한 것 처럼, 스레드도 여러개의 스레드로 효율적이게 처리할 수 있다.
  • 프로세스를 여러개 하는것보다 스레드를 더 많이 생성하는게 효율적이다. (ex. java)

 

Process Scheduling

 

https://en.wikipedia.org/wiki/CPU_time

  • CPU는 모두 다 사용하는 경우가 잘 없다. (cpu 점유 99% 이렇게 되어있다면 뭔가 잘못이 있다는 뜻)
  • multiprogramming의 이점은 CPU 활용을 극대화 시키고, 어떤 프로세스를 항상 돌려놓을 수 있다.
  • CPU는 빠르게 Switching 이 이뤄져서 각각의 프로그램들에 대해 실행도중 상호작용이 가능하다.
  • 시분할(time-sharing)을 통해 프로세스간에 CPU 코어를 빠르게 변경할 수 있고, 유저는 한 프로그램이 실행될 때 다른 프로그램을 실행할 수 있다는 장점이 있다.

Queing Diagrams

  • 프로세스가 시스템에 들어갈 때에(또는 작업이 끝났을 때) 'Ready queue' 로 들어가서 CPU 자원을 획득한다.
  • 이러한 프로세스는 'wait queue' 상태로 있으면서 이벤트가 발생하기를 기다린다.
  • Device가 여러개라면 Wait queue는 여러개 일 수 있다.
  • Ready queue, Wait queue 를 통해 CPU 스케쥴링을 알 수 있다. 또한 아래와 같이 링크드 리스트로 순서를 나타낼 수 있다.

rdy q, wait q

  • I/O : IO 처리가 끝나고 (일반적으로 I/O 처리가 가장 느리다) ready queue에 들어간다.
  • time slice expired : 기다릴게 없다면 ready queue로 들어간다.
  • child fork : 'New' 상태이기 때문에 child process는 ready queue로 들어간다.
  • interrupt: 인터럽트가 기다리고 발생하면 ready queue로 들어간다.

 

Context Switching

Context Switching

  • 컨텍스트 스위칭이란 cpu 가 다른 프로세스에 넘겨주는 과정이다.
  • 컨텍스트 스위칭 하는 시간은 순수한 오버헤드 시간이다. → 하드웨어 자원에 크게 좌우된다.
  • 현재 위치를 기억하고 있다가 다른 프로세스를 수행하고 나서 복원하는 과정을 이야기한다.
    • 시스템은 현재 실행하고 있는 컨텍스트를 저장하고 있다가, 다른 프로세스로 변경하고 다시 돌아올 때 그 상태를 복구한다.

 

OS can create process, terminate process

  • 프로세스 밑에 자식 프로세스를 실행시킬 수 있다.
  • pid를 통해 각기 다른 프로세스를 구분한다.
  • 부모와 자식 모두 concurrent 하게 실행되는 경우, 부모가 wait 하고 자식이 terminate 될 때까지 돌아가는 두가지 경우가 있다.
  • 또, 부모의 프로세스를 복제하는 경우새로운 프로세스로 실행하는 경우 두가지가 있다.
#include <stdio.h>
#include <unistd.h>
#include <wait.h>

int main()
{
	pid_t pid; // fork a child process
    
    pid = fork();
    if (pid < 0) {
		fprintf(stderr, "Fork Failed");
        return 1;
    }
    else if (pid == 0){ //child process
    	execlp("/bin/ls", "ls", NULL);
    }
    else { // parent process
    	wait(NULL);
        printf("Child Complete");
    }
    return 0;
}
  • 자식 프로세스를 fork를 통해 만들어주고
  • execlp 를 통해 자식 프로세스에서 ls 명령어를 실행하도록 하고
  • 자식이 끝날때까지 기다리고, 완료되면 child complete라고 출력할 수 있도록 한다.
  • exec 시스템콜은 호출하면 프로세스의 주소 공간을 새 프로그램으로 덮어 씌운다.

life cycle of process

  • 그럼 종료는 어떻게함? → 그냥 리턴하고 끝나면 프로세스가 끝나는 거임
  • 중간에 끝내고 싶다면 exit으로 해제한다.
  • os 입장에서 모두 끝났으면 모든 자원들을 회수하도록 해준다.

https://www.scaler.com/topics/operating-system/zombie-and-orphan-process-in-os/

  • parent 가 child 생성을 했는데 프로세스를 끝내지않고 중간에 리턴해버리면 좀비프로세스가 됨
  • parent 가 wait을 호출하지 않고 종료했다면 고아프로세스가 된다.
  • daemon, background process 를 만들 때 주로 활용된다.

How to create new processes? → Fork!

  • if pid == 0 이면, 자식 프로세스가 종료됨을 나타낸다.
  • fork가 실행이 되었다면 같은 PCB 를 갖는 자식 프로세스에게 복사한다.
    • go-to (jump)로 실행한다.
    • printf 찍고, 그 이후로 프로세스가 끝난다면 os에 반납하고 레디큐에있는 child process 의 순서로 프로그램 카운터가 이동한다.
    • 그리고, 자식 프로세스에서 한번 더 printf 찍고 자식프로세스 종료된다.

  • fork 이후 두가지 선택이 강요된다 (continue its execution | wait)
    • parent process에서 wait을 걸어줄 때, 자식프로세스 pid 찍히고 부모프로세스 pid가 찍힌다.