[OS] 프로세스의 이해

Chris Kim·2024년 10월 11일

공룡책

목록 보기
3/14

본문서는 아래 링크의 강의를 듣고 요약한 글입니다.
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?srsltid=AfmBOoph9c9wgfx2gbeUCEE-RD1n9AbtKjdbkB07G3iT8rrpS1Psl_26

3-1 프로세스의 개념

프로세스 는 실행중인 프로그램이다.
프로세스는 작업을 수행하기 위해, CPU 시간, 메모리, 파일, 입출력 장치등 특정 자원들을 요구한다.
즉 보조장치에서 메인 메모리에 적재되어, CPU를 점유하고 있어야 프로세스라 할 수 있겠다.

즉 OS의 가장 주된 임무는 프로세스를 관리하는 것이다.

프로세스의 레이아웃은 다음과 같이 나뉜다.

  • Text section: 실행가능한 코드
  • data section: 전역변수
  • Heap section: 실행 중 동적할당이 이뤄진 메모리
  • Stack section: 함수 매개변수, 반환 주소, 지역변수와 같은 일시적인 데이터 저장소

프로세스의 생애주기

  • 생성(New)
  • 실행(Running): 명령어가 실행되는 중인 상태
  • 대기(Waiting): 프로세스가 임의의 이벤트가 일어나기를 기다리는 상태(예시: 입출력 대기)
  • 준비(Ready): CPU 점유, 즉 프로세서에 할당 되기를 기다리는 상태
  • 종료(Terminated): 프로세스가 실행을 종료함

PCB(Process Control Block) or TCB(Task Control Block): 프로세스를 관리하는 구조체.
각 프로세스의 정보가 PCB에 저장되고, PCB는 특정 프로세스와 관련된 많은 정보를 가지고 있음

  • 프로세스 상태(Process state)
  • 프로그램 카운터(program counter): 메모리의 어느 주소에 있는 명령어를 실행할지 써있음
  • CPU 레지스터
  • CPU 스케줄링 정보
  • 메모리 관리 정보(Memory management info)
  • 계정 정보(Account info)
  • 입출력 정보(I/O info)

프로세스

  • 단일 스레드 실행을 수행하는 프로그램이다.
  • 이런 프로세스들이 메모리에 적재되어 있는것이다.
  • 단일 스레드는 한 번에 하나의 작업만을 수행한다.
  • 현대의 운영체제는 프로세스의 개념을 확장하여, 멀티 스레드 실행을 가능케 하고, 복수의 작업을 동시에 수행할 수 있게 만들었다.
  • 그 결과 스레드는 프로세스의 경량화(lightweight) 버전이 되었다. 요즘은 멀티스레드가 대세다

3-2 프로세스 스케줄링

멀티프로그래밍의 목적은 CPU 유틸을 최대화하기 위해 프로세스들을 동시에 실행하는 것이다.
시간 공유(time sharing)은 CPU 코어를 프로세스간 전환을 빠르게 해서 유저로 하여금 각 실행중인 프로그램과 상호작용할 수 있다.

스케줄링 큐(Scheduling Queues)

  • 프로세스가 시스템에 들어오면 ready que에 들어오게 된다.(링크드 리스트로 구현됨)
  • 특정 이벤트 발생을 기다리면 wait que에 들어옴(링크드 리스트로 구현됨)

Context Switch
Context는 PCB에 나타난 프로세스다. 인터럽트가 발생하면 실행중인 프로세스의 context을 저장하고, 다시 복귀한다.
문맥 교환이란 작업이 CPU 코어를 다른 프로세서로 전환하고, 현재 프로세스의 상태를 저장하고, 다른 프로세스의 상태를 복원하는 것이다.

3-3 프로세스 연산

운영체제는 반드시 프로세스 생성, 프로세스 종료 메커니즘을 제공해야한다.
프로세스는 새로운 프로세스를 생성할 수 있다. 이때, 부모-자식 관계가 형성된다. 부모-자식은 서로 동시에 실행될 수 있으며, 부모 프로세스가 자식 프로세스가 종료될 떄까지 대기(wait)할 수도 있다.
주소 측면에서 자식 프로세스는 부모 프로세스의 복제일 수 있다. 아니면 새로운 프로그램을 적재하는 것일 수 있다.

프로세스 종료는 exit() 시스템 콜등을 통해 리소스들을 회수하면서 이뤄진다.

zombie 프로세스: 부모 프로세스가 wait()하지 않은경우
orphan 프로세스: 부모 프로세스가 wait() 하지않고 + 종료(terminated)된 경우

유닉스 기반 시스템에서 새로운 프로세스는 fork()를 사용한다. 자식 프로세스는 부모 프로세스의 주소공간을 복사하여 구성된다. 두 프로세스는 fork() 시스템 콜 이후 명령어에서 실행된다. fork() 반환이 0이면 자식, 아니면 부모 프로세스다.

fork() 시스템 콜을 수행하면 부모 프로세스는 계속 실행되거나; 자식 프로세스 종료까지 ready que에서 자신을 제거한다.

다음은 연습문제중 일부의 코드다.

int main()
{
    pid_t pid, pid1;
    pid = fork();

    if (pid == 0){
        pid1 = getpid();
        printf("child: pid = %d\n", pid); // 자식 프로세스는 pid 0
        printf("child: pid1 = %d\n", pid1);// A:자식 프로세스의 부모 프로세스 아이디
    }
    else if (pid > 0){
        
        pid1 = getpid();
        printf("parent: pid = %d\n", pid);// 자기 자신의 프로세스 아이디, A와 같아야함
        printf("parent: pid1 = %d\n", pid1);//0 이 아닌게 맞음
        wait(NULL);
    }
}
int main()
{
    pid_t pid;
    pid = fork();

    if (pid == 0){
        execlp("/bin/ls","ls", NULL);
        printf("LINE J\n");
    }
    else if(pid > 0){
        wait(NULL);
        printf("Child Complete\n");
    }
}
profile
회계+IT=???

0개의 댓글