본문 바로가기

문과 코린이의, [운영체제] 기록

[문과 코린이의 IT 기록장] 운영체제(OS) - Process Management (프로세스 생성 (Process Creation), 프로세스 종료 (Process Termination), fork() 시스템 콜, exec() 시스템 콜, wait() 시스템 콜, exit() 시스템 콜, 프로..

반응형

 

[문과 코린이의 IT 기록장] 운영체제(OS) - Process Management (프로세스 생성 (Process Creation), 프로세스 종료 (Process Termination), fork() 시스템 콜, exec() 시스템 콜, wait() 시스템 콜, exit() 시스템 콜, 프로세스 간 협력)

[문과 코린이의 IT 기록장] 운영체제(OS) - Process Management (프로세스 생성 (Process Creation), 프로세스 종료 (Process Termination),  fork() 시스템 콜, exec() 시스템 콜, wait() 시스템 콜, exit() 시스템 콜, 프로세스 간 협력)

 


 

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net

2021.07.07 - [문과 코린이의, [운영체제] 기록] - [문과 코린이의 IT 기록장] 운영체제(OS) - 운영체제(운영체제(OS)란?, 운영체제(OS)의 기능 및 목표, 운영체제의 분류, 몇 가지 용어, 운영체제의 예, 운영체제의 개괄적인 구조)

 

[문과 코린이의 IT 기록장] 운영체제(OS) - 운영체제(운영체제(OS)란?, 운영체제(OS)의 기능 및 목표,

[문과 코린이의 IT 기록장] 운영체제(OS) - 운영체제(운영체제(OS)란?, 운영체제(OS)의 기능 및 목표, 운영체제의 분류, 몇 가지 용어, 운영체제의 예, 운영체제의 개괄적인 구조) 운영

vansoft1215.tistory.com

2021.07.10 - [문과 코린이의, [운영체제] 기록] - [문과 코린이의 IT 기록장] 운영체제(OS) - System structure & Program execution (컴퓨터 시스템 구조, 동기식 입출력과 비동기식 입출력, 서로 다른 입출력 명령어, 저장장치 계층 구조, 프로그램의 실행..

 

[문과 코린이의 IT 기록장] 운영체제(OS) - System structure & Program execution (컴퓨터 시스템 구조, 동기

[문과 코린이의 IT 기록장] 운영체제(OS) - System structure & Program execution (컴퓨터 시스템 구조, 동기식 입출력과 비동기식 입출력, 서로 다른 입출력 명령어, 저장장치 계층 구..

vansoft1215.tistory.com

2021.07.17 - [문과 코린이의, [운영체제] 기록] - [문과 코린이의 IT 기록장] 운영체제(OS) - 프로세스(Process) (프로세스의 개념, 프로세스의 상태 (Process State), PCB, 문맥 교환 (Context Switch), 프로세스를 스케줄링 하기 위한 큐, 스케줄러, Thread)

 

[문과 코린이의 IT 기록장] 운영체제(OS) - 프로세스(Process) (프로세스의 개념, 프로세스의 상태 (Pro

[문과 코린이의 IT 기록장] 운영체제(OS) - 프로세스(Process) (프로세스의 개념, 프로세스의 상태 (Process State), PCB, 문맥 교환 (Context Switch),  프로세스를 스케줄링 하기 위한 ..

vansoft1215.tistory.com


1. 프로세스 생성 (Process Creation)

- 프로세스의 생성 방법 : 복제생성

 : 부모 프로세스(Parent porcess)가 자식 프로세스(Children process)를 생성함.

 * 프로세스의 트리(계층 구조) 형성

 : 즉, 부모 프로세스의 문맥(주소공간[Code,Data,Stack], CPU 문맥[PC register] ...)을 모두 자식프로세스는 복사함.

 : 부모 프로세스가 자식 프로세스를 복제 생성할 때, 직접 생성하지는 않으며, OS에게 fork() 시스템 콜을 통해 자식 프로세스를 만들어달라고 요청한다.

 

- 프로세스는 자원을 운영체제로부터 받으며, 부모와 공유하기도 공유하지 않기도 한다.

 * 원칙적으로는 공유하지 않는다. 자식 프로세스가 부모 프로세스의 값을 복사하지만, 다른 값으로 변경되게 되면서 독립적인 프로세스가 되기 때문

 * 자식 프로세스가 부모 프로세스를 그대로 카피하게 되면 메모리에 같은 두개의 값이 올라가서 메모리 낭비가 됨. 따라서 값이 변경되게 될 경우에, 그제야 부모의 공유하던 일부를 카피해서 자식 프로세스를 생성하는 것을 일반적인 기법으로 사용하는데, 이를 Copy-On-Write 기법이라고 함.

 

- 프로세스의 수행(Excution)과 관련해서는, 부모와 자식이 공존하며 수행되는 모델과, 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델이 있다.

 

cf ) 프로세스 생성 과정

- fork() 시스템 이 새로운 프로세스를 생성 : 부모를 그대로 복사 (OS data except PID + binary), 주소 공간 할당

- fork() 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림.

 


2. 프로세스 종료 (Process Termination)

- exit() 시스템 콜 [ 자발적 프로세스 종료 ]

: 이 시스템 콜을 하면, 프로세스가 종료된다.

: 또한 이 시스템 콜을 명시적으로 쓰지 않더라도 프로세스가 마지막 명령을 수행한 후, 운영체제에게 이를 알려준다.

* 자식 프로세스가 부모 프로세스에게 output data를 보낸 후(via wait system call), 프로세스의 각종 자원들이 운영체제에게 반납됨.

 

- abort() 시스템 콜 [ 비자발적 프로세스 종료 ]

: 자식 프로세스가 할당 자원의 한계치를 넘어선 요청을 하는 경우, 부모가 강제로 자식 프로세스를 종료시키는 경우 발생된다.

: 자식 프로세스에게 할당된 테스크가 더 이상 없는 경우 발생된다.

: 부모 프로세스가 먼저 종료(exit)되는 경우 발생한다. 

 * 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되지 않도록, 아래부터 단계적으로 종료시킨다.

 


3. fork() 시스템 콜

- 사용자 프로그램이 자식 프로세스를 만드는 코드이다. 

int main(){
	int pid;
    pid = fork()
    // 부모 프로세스 : Pid > 0
    // 자식 프로세스 : Pid = 0
    
    // 자식 프로세스는 새로 똑같은 문맥이 복사되지만, main부터 실행되는 것이 아닌 이 부분부터 실행됨
    // 그 이유는 PC register 또한 복사하기 때문에, 실행한 다음 코드부터 시작해야 한다는 것을 인식하기 때문
    if(pid == 0) // 자식 프로세스
    	cout<< Hello I'm child;
    else if(pid > 0)
        cout<< Hello I'm Parent;
}

 

- 부모 프로세스와 자식 프로세스의, pid(프로세스의 주민등록번호와 같은 것) 차이

 * 부모 프로세스 : Pid > 0

 * 자식 프로세스 : Pid = 0

- 이는 아래의 문제들을 해결하기 위해 설정된 것임

 a. 복제된 자식 프로세스가 자신이 복제본이 아닌 원본이라고 주장하는 것을 막기 위해

 b. 부모와 똑같은 프로그램이 복사되어, 똑같은 제어 흐름을 따라가야 할 것 같은 문제

 


4. exec() 시스템 콜

- 복제된 자식 프로세스를 완전히 새로운 프로세스로 태어나게 하는 역할을 하는 것.

int main(){
	int pid;
    pid = fork();
    
    if(pid==0)
    	cout<< "Hello I'm Child";
        // 새로운 프로세스로 만들어짐
        execlp("/bin/date", "/bin/date", (char*)0);
        
    else if(pid>0)
    	cout<< "Hello, I'm parent";
}

* exec를 하면, 다시 이전으로 돌아갈 수 없음.

 

int main(){
	cout<<"Hello I'm child";
    // fork()를 하지 않고, exee()만 사용해서 프로그래밍을 할 수 있음.
    execlp("/bin/date", "/bin/date", (char*)0);
    // 아래의 코드는 출력될 수 없음
    cout<< "Hello I'm parent";
}

 


5. wait() 시스템 콜

- 프로세스 A가 wait() 시스템 콜을 호출하면

 : 커널은 A의 자식 프로세스들이 모두 종료될 때까지, 프로세스 A를 sleep시킨다. (block 상태)

  * 즉 CPU 실행 불가능한 상태로 만듦

 : 자식 프로세스가 종료되면, 커널은 프로세스 A를 깨운다. (ready 상태) 

  * 즉 CPU 실행 가능한 상태로 만듦

** 이는 자식 프로세스가 종료(terminate)될 때까지, 부모가 기다리는(wait) 모델임

 


6. exit() 시스템 콜

- 프로세스를 종료시킬 때 호출하는 시스템 콜.

 * 명시적으로 적지 않더라도, 자발적으로 종료될 때 사용됨

 

- 프로세스의 종료

1) 자발적 종료

- 마지막 명령 수행 후, exit() 시스템 콜 발생

- 프로그램에 명시적으로 적어주지 않아도, main함수가 리턴되는 위치에 컴파일러가 넣어줌으로써 발생

 

2) 비자발적 종료

- 부모 프로세스가 자식 프로세스를 강제 종료시킬 때 발생

 * 자식 프로세스가 한계치를 넘는 자원을 요청하거나, 자식에게 할당된 테스크가 더이상 필요하지 않은 경우

- 키보드로 kill, break 등을 치는 경우 발생 (사람이 의도적으로 발생시키는 것)

- 부모 프로세스가 종료하는 경우, 자식들이 먼저 종료되어야 할 때 발생

 


7. 프로세스 간 협력

1) 독립적 프로세스 (independent process)

- 프로세스는 각자의 주소 공간을 가지고 수행되므로, 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못한다.

 

2) 협력 프로세스 (Cooperating process)

- 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있다.


[ 프로세스 간 협력 메커니즘 (IPC : Interprocess Communication) ]

(1) 메시지를 전달하는 방법

- message passing : 커널을 통해 메시지 전달

- 프로세스는 원래 독립적이며, 자신의 메모리 주소 공간만 볼 수 있으므로, 원칙적으로 서로 직접적인 메세지 전달은 불가능함. 따라서 커널을 통해 메세지를 전달함.

 * message system : 프로세스 사이에 공유변수(shared variable)를 일체 사용하지 않고 통신하는 시스템

 

a. Direct Communitcation

: 통신하려는 프로세스의 이름을 명시적으로 표시함. 즉, 전달받을 프로세스를 직접 명시함.

b. Indirect Communication

: mailbox(또는 port)를 통해 메시지를 간접 전달. (우체통처럼)

 * 직접적으로 명시하지 않았기 때문에, 그 요청을 수행하는 적절한 프로세스가 아무거나 실행된다.

 

(2) 주소 공간을 공유하는 방법 

- shard memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 매커니즘

 * 이를 활용하려면 두 프로세스는 상당히 신뢰할 수 있는 관계여야 함

 

 

Message passing vs Shared memory

 

cf) Thread : thread는 사실상 하나의 프로세스이므로, 프로세스 간 협력으로 보기는 어렵지만, 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능하다.

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형