http://www.kocw.net/home/search/kemView.do?kemId=978503
프로세스 생성(Process Creation)
프로세스는 부모 프로세스에 의해 만들어진다. 부모 프로세스가 만든 프로세스를 자식 프로세스라 하며 같은 줄에 있는 프로세스들을 sibling process라 부른다. 이러한 프로세스들의 관계를 트리 형태로 나타낸 것을 프로세스 트리라 부른다. 프로세스들은 모두 Process Identifier(PID)를 갖고 있으며 PID를 통해 프로세스를 식별할 수 있다. (PPID는 Parent의 PID를 뜻함) 가장 처음 만들어지는 모든 프로세스들의 부모 프로세스를 init이라 하며 PID가 0 혹은 1이고 해당 init 프로세스를 통해 다른 프로세스들이 문어발처럼 생성된다. 아래는 이러한 과정을 표현한 그림이다.
프로세스의 생성은 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 단위로 전환한다.
테스트를 통해 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)
'운영체제' 카테고리의 다른 글
운영체제 기본 10 - 주기억장치 관리 (0) | 2023.01.26 |
---|---|
운영체제 기본 9 - 프로세스 동기화 (0) | 2023.01.23 |
운영체제 기본 6 - 프로세스 관리 (0) | 2023.01.19 |
운영체제 기본 5 - 운영체제 서비스 (0) | 2023.01.19 |
운영체제 기본 4 - 이중 모드, 하드웨어 보호 (0) | 2023.01.19 |