운영체제

운영체제 기본 8 - 프로세스 생성과 종료

hs-archive 2023. 1. 23. 12:28

http://www.kocw.net/home/search/kemView.do?kemId=978503

 

운영체제

운영체제의 정의 및 역할 등에 대해 알아보고, 운영체제의 주요 요소들, 즉 프로세스 관리, 주기억장치 관리, 파일 시스템 등에 대해 공부한다.

www.kocw.net


프로세스 생성(Process Creation)

프로세스는 부모 프로세스에 의해 만들어진다. 부모 프로세스가 만든 프로세스를 자식 프로세스라 하며 같은 줄에 있는 프로세스들을 sibling process라 부른다. 이러한 프로세스들의 관계를 트리 형태로 나타낸 것을 프로세스 트리라 부른다. 프로세스들은 모두 Process Identifier(PID)를 갖고 있으며 PID를 통해 프로세스를 식별할 수 있다. (PPID는 Parent의 PID를 뜻함) 가장 처음 만들어지는 모든 프로세스들의 부모 프로세스를 init이라 하며 PID가 0 혹은 1이고 해당 init 프로세스를 통해 다른 프로세스들이 문어발처럼 생성된다. 아래는 이러한 과정을 표현한 그림이다.

init 프로세스와 프로세스 생성 과정
Windows 7 프로세스 나열
Ubuntu Linux 프로세스 나열

 

프로세스의 생성은 system call을 통해 이루어지며 fork(), exec() 등이 있다. fork()는 부모 프로세스를 복사하는 명령으로 새 프로세스가 들어갈 공간을 만드는 명령이고, exec()는 실행 파일을 메모리로 가져오는 명령이다.

 

프로세스 종료(Process Termination)

프로세스의 종료는 exit() 명령을 통해 이루어지며 해당 process가 가졌던 모든 자원(process가 사용한 메모리, process가 열었던 파일들, printer 연결 등)을 OS에게 반환한다.

 

스레드(Thread)

프로그램 내부의 흐름, 맥이라고 할 수 있다. 모든 프로그램은 최소 하나의 스레드를 갖고 있다. 아래 코드는 위에서부터 아래로 단 하나의 흐름을 따라 실행된다. 따라서 single thread program이라 할 수 있다.

public class Test {
    public static void main(String[] args) {
        int n = 0;
        int m = 6;

        while (n < m) {
            System.out.println(n);
            n++;
        }

        System.out.println("Bye");
    }
}

 

다중 스레드(Multithread)

한 프로그램에 두 개 이상의 스레드가 존재하면 해당 프로그램을 다중 스레드 프로그램이라 한다. 스레드는 매우 짧은 시간 간격으로 스위칭되므로 여러 스레드가 동시에 실행되는 것처럼 보인다. 이러한 것을 concurrent(동시에 실행되는 것처럼 보임)라 부르며 반대의 개념으로는 simultaneous(실제로 동시에 실행됨)가 있다. 다중 스레드의 예로는 Web browser(화면을 출력하는 스레드 + 데이터를 받아오는 스레드, ...), 워드 프로세서(화면을 출력하는 스레드 + 키보드 입력받는 스레드 + 철자/문법 오류 확인 스레드, ...), 동영상 플레이어, 이클립스 IDE 등등이 있다. 사실상 우리가 사용하는 대다수의 프로그램은 다중 스레드 프로그램이다.

다중 스레드

 

Thread vs Process

다중 스레드 이야기를 들어보니 스레드와 process가 비슷해 보일 수 있다. 둘 다 매우 짧은 시간 간격으로 스위칭하여 실행되어 동시에 실행되는 것처럼 보이는 방식이 특히 그럴 것이다. 이 둘의 차이점을 알아보자.

 

우선 프로세스는 메모리 상에서 실행 중인 프로그램을 뜻하고 스레드는 그러한 프로세스 안의 흐름을 뜻한다. 그냥 아예 다른 것이고 또, 프로세스는 할당받은 자원을 다른 프로세스와 공유하지 않고 각자의 주소 공간을 갖지만 같은 프로세스 아래의 스레드들은 프로세스의 자원(file, I/O, ...)과 메모리 공간(code, data)을 공유한다. (개별적인 PC(program count), SP(stack pointer), register, stack 등은 공유하지 않는다.)

 

이러한 스레드라는 개념을 context switching에 적용하면 context switching의 단위가 process에서 thread로 변경된다. 이렇게 변경 단위를 process에서 thread로 바꾸면 thread는 process에 비해 갖고 있는 정보의 양도 적고 또, 서로 공유하고 있는 자원 및 메모리는 많아서 context switcing 할 때 overhead의 부담이 적어지게 된다는 장점이 있다. 그리고 만약 스레드 단위로 콘텍스트 스위칭이 일어나지 않는다면 하나의 스레드가 완전히 끝날 때까지 다른 스레드들은 가만히 기다려야 하는데 프로그램의 특성상 언제 끝날지 모르는 스레드가 있을 수도 있거니와 하나의 스레드가 끝날 때까지 기다리는 방식은 매우 비효율적이기 때문에 실제 OS에서도 context switching은 process 단위가 아닌 thread 단위로 전환한다.

thread 단위의 컨텍스트 스위칭

 

테스트를 통해 OS가 실제로 스레드 단위로 콘텍스트 스위칭을 하는지 확인할 수도 있다. 만약 OS가 프로세스 단위로 콘텍스트 스위칭을 한다면 아래 프로그램은 영원히 "B"만 출력할 것이다. 하지만 실제 실행 결과는 B와 A가 번갈아가며 출력된다. 이를 통해 OS가 스레드 단위로 콘텍스트 스위칭을 한다는 것을 알 수 있다. 참고로 아래 코드의 경우 main 스레드와 th 두 개의 스레드가 있는 다중 스레드 프로그램이다.

public class Test {
    public static void main(String[] args) {
        MyThread th = new MyThread();
        th.start();

        while (true)
            System.out.println("A");
    }
}

class MyThread extends Thread {
    public void run() {
        while (true)
            System.out.println("B");
    }
}

 

 

 

 

 


https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85) 

 

스레드 (컴퓨팅) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 두 개의 스레드를 실행하고 있는 하나의 프로세스. 스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으

ko.wikipedia.org