운영체제

프로세스 생성,수행, 종료, 프로세스간 협력, 특성 분류

매일_공부 2024. 5. 19. 20:53
반응형

프로세스 생성

부모 프로세스가 자식 프로세스를 생성한다.

 

부모 프로세스가 자식 프로세스를 생성하는 것을 프로세스 생성이라고 한다.

 

리눅스, 유닉스 계열의 OS에서는 최초의 프로세스 init()이 존재하고, 

그 프로세스는 다른 자식 프로세스를 생성할 수 있고, 그 자식 프로세스는 

또 다른 프로세스를 생성할 수 있다.

 

init process는 태초의 프로세스이며, 컴퓨터 부팅시 마지막 단계에서 생성되고, PID는 1번이다.

 

 

 

이때, 프로세스의 생성에는 사용자 프로그램이 아니라 운영체제의 시스템 콜을 통해서만 가능하다

 

생성된 프로세스는 트리 구조를 형성하고 각자 고유한 번호인 pid를 가지게 된다.

 

 

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

프로세스의 트리구조
프로세스의 트리구조

 

 

 

 

 

 

 

 


 

 

프로세스는 자원을 필요로 한다.

  1.운영체제로부터 받는다.

 

  2. 부모로부터 받는다.

 

 

자원의 공유

부모와 자식이 모든 자원을 공유하는 모델

일부를 공유하는 모델

전혀 공유하지 않는 모델

 

저번 포스팅에서 설명했던 개념인 커널 쓰레드와, 사용자 쓰레드를 

적절히 활용하여 자원의 공유의 정도를 정할 수 있다.

https://mail-study.tistory.com/entry/%EC%93%B0%EB%A0%88%EB%93%9C%EB%9E%80

 

쓰레드란...? (Thread, 구성, Benefits), 커널 쓰레드, 유저 쓰레드

이 포스팅은 저번 포스팅이었던 프로세스, 컨텍스트 스위치 ,스케줄러  다음 포스팅입니다. 쓰레드와 프로세스는 밀접한 관계에 있는 만큼 저번 포스팅을 읽고 오심을 추천드립니다.  https://m

mail-study.tistory.com

 

 

 

 

 

 

 

 

 

 


 

프로세스의 수행(execution)

부모와 자식은 공존하여 수행되다.

자식이 종료(terminate) 될 때까지 부모는 기다린다.(wait)

 

 

주소공간(Adress space)

  자식은 부모의 공간을 복사함 (bianary and OS data)

  자식은 그 공간에 새로운 프로그램을 올린다. (덮어씌우기)

 

Cow(copy on write)

A process can execute a different program by the exec() system call,

replaces the memory image of the caller with a new program

(프로세스는 다른 프로그램을 exec() 시스템 콜을 통해 실행가능하다.

 프로세스는 exec()을 호출한 프로세스의 메모리 이미지를 새로운 프로그램으로 바꾼다.(덮어씌운다)) 

 

 

 

프로세스의 수행 과정
프로세스의 수행 과정

 

 

 

1. 부모 프로세스 main() 함수를 시작한다.

 

2. 부모 프로세스는 fork() 함수를 만나 fork()를 실행한다.

 

  2-1 자식 프로세스는  PID를 제외한 부모의 주소 공간을 그대로 복사해서 가져온다.

        이 단계를 시행하면 부모와 자식 프로세스는 별도의 주소 공간과 동일한 내용을 가진다.

 

  2-2  복사해온 공간에 자식이 새로운 프로그램을 올린다.

         exec() 시스템 콜을 통해 code 부분을 새로운 프로그램으로 교채한다.

 

3.  fork() 실행으로 생성된 자식은 0을 PID로 받으며, ChildProcess()를 시행한다. (그 동안 부모는 wait 상태)

 

4. 자식 프로세스가 종료되면, 부모 프로세스는 이어서 ParentProcess()를 시행한다.

 

 

fork() 시스템 콜

 Linux/Unix 환경에서 새로운 프로세스를 만드는 시스템 콜 함수이다.

 

 fork 시스템 콜은 새로운 프로세스를 위한 메모리를 할당한다. 그리고 fork()를 호출한

 프로세스의 모든 정보를 새로운 공간으로 복사하고, 생성된 프로세스는 fork() 시스템 콜이

 수행된 다음 라인부터 실행이 된다.

 

 이를 통해 부모, 자식 프로세스는 간편하게 의사소통이 가능하다.

 

 fork() 함수는 부모 프로세스에서 자식의 PID를 반환하고, 자식 프로세스에는 0을 반환하여

 부모와 자식을 구분할 수 있게 한다.

 (자식의 프로세스의 PID가 0이 되는 것이 아니다! 자식의 PID는 이미 fork() 초반에 메모리를 할당해서

 새로운 프로세스를 만들때 이미 받는다. 부모 프로세스에서 fork()의 결과로 자식에게 0이 할당되는 것 뿐이다.)

 

 GPT 답변

관계 요약

  • 자식 프로세스의 PID:
    • 자식 프로세스는 시스템에서 고유한 프로세스 식별자(PID)를 가집니다.
    • 이 PID는 부모 프로세스에게 반환되며, 부모 프로세스가 자식 프로세스를 제어하거나 추적하는 데 사용됩니다.
  • fork() 결과로 반환되는 0:
    • 자식 프로세스는 fork() 호출의 결과로 항상 0을 반환받습니다.
    • 이는 자식 프로세스가 자신의 코드 경로를 분기하여 실행을 계속할 수 있도록 합니다.

 

 

 

wait() 시스템 콜

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

커널은 child가 종료될때까지 프로세스 A를 sleep 시킨다 (block 상태)

child process가 종료되면 커널은 프로세스 A를 깨운다 (ready 상태)

 

exec() 시스템 콜

  exec()은 fork()처럼 새로운 새로운 프로세스를 위한 메모리를 할당하지 않고, exec()를 호출한 프로세스가 

  아닌, exec()에 의해 호출된 프로세스만 메모리에 남게 된다.

 

 즉, exec()을 호출한 프로세스의 PID를 바꾸지 않고, 그대로 새로운 프로세스에 의해 덮어 씌어진다.

 


 

프로세스 종료(Process Termination)


프로세스는 마지막 명령을 수행한 후 운영체제에게 이를 알려준다 (exit())

자식이 부모에게 output data를 보냄 (via wait)

프로세스의 각종 자원들이 운영체제에게 반납됨

 

 

프로세스가 종료되는 경우는 다음과 같다.

 

exit() 시스템 콜

  프로세스의 종료를 알림

 

  자발적 종료

  

    프로세스가 마지막 명령을 수행한 후 exit() 시스템 콜을 호출하여 종료한다.

 

    프로세스에 명시적으로 적어두지 않아도, main 함수가 리턴되는 위치에 컴파일러가 넣어준다. 



  비자발적 종료

 

    부모 프로세스가 자식 프로세스를 강제로 종료하거나, 자식 프로세스가 

    할당된 자원의 한계치를 넘어서는 경우.

 

    자식에게 할당된 테스크가 더 이상 필요하지 않는 경우

 

    키보드로 kill, break 등을 친 경우

 

 

 

 

 


부모가 종료(exit)하는 경우

  운영체제는 부모 프로세스가 종료하는 경우, 자식이 더 이상 수행하게 하지 않는다.

 

  부모 프로세스가 종료되기 전에 자식 프로세스들은 모두 종료된다.

 

 

이처럼 프로세스는 자발적으로 종료될 수도 있고, 부모 프로세스에 의해 종료될 수도 있다.

종료되는 경우에는 해당 프로세스의 자원이 운영체제에 반납되며, 프로세스의 실행이 완전히 종료된다.

 

 

 

 

 

 

 

 


 

  프로세스와 관려된 시스템 콜

  fork() | create a chile (copy) 자식을 생성한다.

  exec() | overlay new image 새로운 이미지를 덮어씌운다.

  wait() | sleep until child is done 자식이 수행을 끝낼 때 까지 기다린다.

  exit() | frees all the resources notify parent 모든 자원을 반납하고, 부모에게 알린다.

 

 

 

 

 


프로세스간 협력

독립적 프로세스 (independent process)

 

  프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 

  하나의 프로세스는 다른 프로세스의 수행에 영향을 끼치지 못함

 


 

협력 프로세스 (cooperating process)

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

 

 

 


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

운영체제 상에서 실행 중인 프로세스 간에 정보를 주고 받는 것을 프로세스간 통신이라 한다.

프로세스는 자신에게 할당된 메모리 내의 정보만 접근할 수 있고, 이를 벗어나서 접근한 경우,

Segmentation Fault 등의 오류가 발생하게 된다. 

이는 안정성을 위해 운영체제에서 자기 프로세스의 메모리만 접근하고 강제하고 있는 것이다.

 

따라서 한 프로그렘에서 병렬성을 키우면서 공유되는 데이터를 사용하기 위해 메모리 공간을

공유하는 스레드를 이용하는 경우가 많다. 하지만, 서로 다른 프로그램(즉, 서로 다른 프로세스)의

데이터를 공유하려면 결국 다른 프로세스의 메모리를 접근할 필요가 발생한다.

 

따라서 이때는 IPC라는 것을 사용하게 된다.

 

 

https://do-my-best.tistory.com/entry/%EC%9A%B4%EC%98%81-%EC%B2%B4%EC%A0%9C-Operating-System-IPC

 

운영 체제 (Operating System) - IPC

1. IPC의 정의 및 필요성 IPC란 InterProcess Communication으로, Process 들 간에 데이터 및 정보를 주고 받기 위한 메카니즘이다. 각 프로세스의 독립된 영역 외의 영역과 커뮤니케이션 하는 것이기 때문에

do-my-best.tistory.com

위의 포스팅은 매우 자세하고, 구현까지 잘 설명되어있으니, 꼭 한번쯤은 봤으면 좋겠다.

 

 

 

Message Passing : 커널을 통해 메시지 전달

Message Passing
Message Passing

  통신하고자 할 때마다 kernel의 도움으로 고정(혹은 가변)길이의 메시지를 보내고 받으면서, 

  서로 다른 프로세스가 통신하는 방식이다.

  

  위 방식의 구현으로는 Pipe, Message queue, Socket이 있다.

 

  모두가 통신할 때마다 커널을 경유해야 하므로, 통신 속도 자체는 떨어지지만,

  커널을 경유함으로서 (자세하게는 커널의 데이터 버퍼링을 통해) 커널이 제공하는

  동기화 덕분에 동기화 문제 없이 구현할 수 있다.

 

  하지만 send는 문제 없지만, recive의 경우, 그 프로세스가 실행중이지 않다면

  메시지를 받지 못하므로, 문맥 전환과 관계 있다. 

  

 

 

주소공간을 공유하는 방법 

 

Sharing memory
Sharing memory

  Shared memory : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 만드는 shared memory 메커니즘이 있다.

 

  프로세스의 특정 메모리 영역을 서로 공유하여 그 영역에 읽고 씀으로써 서로 다른 프로세스가 통신하는 방식이다.   

 

   이 공유 메모리는 초기에는 커널의 도움이 필요하지만, 공유 메모리가 설정되면

   커널과 관계없이 응용프로그래밍 레밸에서 읽고 쓰는 것이 가능하다.

 

  프로세스들이 공유 메모리에 직접 접근하는 방식이라서 통신 자체의 비용은 적지만,

  메모리에 서로 다른 프로세스가 동시에 접근 가능하다는 특징 때문에 동기화가 필요하다는 

  문제가 있다.

 

  세마포어나 locking 같이 동기화에 대한 제어를 설정하다보면 오히려 Message passing

  방식보다 느려질 수도 있다. 

 

thread

thread는 사실항 하나의 프로세스이므로 프로세스간 협력으로 보기는 어렵지만,

동일한 process를 구성하는 thread 간에는 주소 공간을 공유하므로 협력 가능하다,

 

 

 

 

 

 

 

 


 

프로세스 특성 분류

프로세스는 그 특성에 따라 다음 두가지로 나눈다.

I/O bound Process

I/O bound Process

 

  CPU를 잡고 계산하는 시간보다 I/O에 많은 시간이 필요한 job

  (many short CPU burst)

 

CPU bound procss

CPU bound procss
CPU bound procss

  계산 위주의 job

  (few very long CPU burst)

 

 

CPU가 실행하는 프로세스가 어떤 특징을 가지고 있는지에 따라 프로그래밍의 방식을

잘 선택해야 한다.

 

CPU 스케줄링에 관한 내용은 다음 포스팅에서 설명하겠다.

 

 

 

출처

https://velog.io/@sunaookamisiroko/4.-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%83%9D%EC%84%B1

https://charles098.tistory.com/75

https://velog.io/@yuseogi0218/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%83%9D%EC%84%B1%EA%B3%BC-%EC%86%8C%EB%A9%B8

https://hyunah-home.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EA%B4%80%EB%A6%AC-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%83%9D%EC%84%B1%EA%B3%BC-%EC%A2%85%EB%A3%8C-%EB%B6%80%EB%AA%A8-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%9E%90%EC%8B%9D-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4

https://jwprogramming.tistory.com/55

https://namu.wiki/w/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%84%20%ED%86%B5%EC%8B%A0

https://www.baeldung.com/cs/cpu-io-bound

KOCW 이화여자대학교 운영체제 반효경 교수 (반효경 [운영체제]  Process Management 1,2 )

http://www.kocw.net/home/cview.do?cid=3646706b4347ef09

 

운영체제

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

www.kocw.net

 

 

 

반응형