#4. Process Management

 

 

* 프로세스의 생성
: 부모 프로세스가 자식 프로세스를 생성.
 cf> 생성하는 방법 : 복제 생성(메모리(code, data, stack), cpu문맥(pc)을 copy.)

 

 v. 계층구조 : 트리구조

 v. 프로세스는 자원을 필요함(실행이 되려면)
  - os로부터 받는다.
  - 부모와 자원을 공유한다.
   (공유하지 않는 모델도 있고, 일부만 공유하는 모델도 있다.)

 
  #보통 일반적인 경우는 자원을 공유하지 않고, 자식 프로세스가 생성되자마자 서로 cpu를 더 차지 하기 위한 경쟁관계가 된다.

 

 v. 수행(Excution)
  - 부모와 자식은 공존하며 수행되는 모델
  - 자식이 종료(terminate)될 때까지 부모가 기다리는(wait)모델

 

  # 부모와 자식이 공존하며 수행되는 모델이 있고, 자식을 생성하고 종료 될때까지 기다리는 모델이 두가지가 있다. 이 것들을 자세히 알아보자.

  # 메모리를 아끼기 위해 공유할수 있는거는 copy하지 않고 공유하는 효율적인것들도 있다.

 

 vv. 주소공간(address space)
  - 자식은 부모의 공간을 복사함(복제 생성)-------1단계(fork)
  - 자식은 그 공간에 새로운 프로그램을 올림------2단계(exec)

 

 vv. 유닉스의 예
  - fork() 시스템 콜이 새로운 프로세스 생성
   .부모를 그대로 복사 (os data except PID + binary)
   .주소 공간 할당

 

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

 

# 일단 fork()로 생성한다음에 복제해서 exec()를 사용해서 필요한거만 덮어 씌운다.

 

* 프로세스 종료

 v. 프로세스가 마지막 명령을 수행한 후 os에게 이를 알려줌(exit)
  - 자식이 부모에게 output data를 보냄(via wait).
    # 자식이 항상 부모보다 먼저 죽는다!!


  - 프로세스의 각종 자원들이 os에게 반납됨

# 자발적으로 프로세스가 종료되는것 : exit
    비 자발적으로 종료 되는것        : abort

 

 v. 부모 프로세스가 자식의 수행을 종료시킴(abort)
  - 자식이 할당 자원의 한계치를 넘어섬
  - 자식에게 할당된 task가 더 이상 필요하지 않음
  - 부모가 종료(wait)하는 경우
   . os는 부모 프로세스가 종요하는 경우 자식이 더 이상 수행되도록 두지 않는다.
   . 단계적인 종료

 

# 자식이 사치(자원한계치 이상)부리거나,

(일시키려고 자식을 생성했기 때문)할 일이 없거나,

 부모가 먼저 죽게 되는

경우에 자식을 죽인다.

 

 

* fork() 시스템 콜

 

 


# fork를 사용해서 프로세스를 만드는 코드
# fork() 빨간 부분은 시스템콜 부분이다.

 

# 문제점 : fork를 통해 복제를 할 경우 문제점
1) 복제를 해놨더니 지가 원본이라고 주장한다. 부모 프로세스를 자식 취급을 하면, 굉장히 혼란스러운 상황이 발생.
2) 부모와 똑같은 제어흐름을 따라가야 될거 같다....

해결책)) 
 1.부모와 자식을 구분을 해준다.
   어떻게?)) return value를 다르게 한다.
             자식은 0, 부모는 양수가 된다. (pid 설명.)

 2. 부모와 자식 프로세스가 다른일을 하게 해주는 system call
   : exec()

 

* exec() 시스템 콜
 : 어떤 프로그램을 완전히 새로운 프로세스로 태어나게 해주는 역할을 한다.


 

 

 

# execlp는 일종의 함수인데, 이것이 exec 시스템콜을 하게 된다.
# exec을 하게되면 fork와 달리 main 처음부터 실행을 하게 된다.

 

 

* wait()
 : 자식이 종료될때까지 기다리는 시스템 콜

 

 


ex> 리눅스 커널도 wait() 시스템콜이 사용된다. (콘솔 기다리는 거 상상하자.)


* exit()
 : 프로그램을 종료할때 실행하는 시스템 콜.

 

 

 

# 보통 자발적으로 종료될때 실행이 된다, 코드가 없어도(code에 exit()가 없어도) 마지막 코드 읽어주고 exit()가 실행됨.


* 프로세스와 관련한 시스템 콜(정리)

 

 - fork() : 부모 프로세스 복제 생성하는 것.
 - exec() : 완전히 새로운 프로그램으로 덮어 씌우는 것
 - wait() : 자식이 종료될때 까지 기다리는 것
 - exit() : 모든 자원을 반납하고 부모 프로세스한테 죽는다고 알리는 것.

 

 


* 프로세스 간 협력

 

 

 

# 프로세스는 원칙적으로 독립적이다.(부모가 자식을 죽이는것 말고는 프로세스들이 서롤 영향을 미치지 못한다.)

# process 협력: 프로세스간의 정보 교환
  정보를 교환하는 방법 => IPC

 

 

* Message Passing
 : 커널을 통해서 메시지를 passing 할수 있다.

 

# 메세지 패싱에는 또 2가지 방법이 있다.
: 상대 메시지를 받아볼 프로세스 이름을 명시 하느냐 안하느냐에 따라 2가지로 나뉨. (직접 통신 / 간접 통신)


# 2가지 방법으로 나누지만, 어쨋껀 메세지를 전달하려면 os의 kernel을 통해 전달해야 하는건 똑같다.

why?)) 프로세스 끼리는 메세지를 전달하는게 불가능 하기 때문에! 


# 간접 메시지는 아무나 꺼내갈수 있게 할수 있다! (상황에 따라 맞게 설계하도록 하자.)

 

 

* 일부 주소 공간을 공유하는 IPC
 : 아래 그림은 물리적인 공간

 

 

# 원칙적으로 process들은 독자적인 주소공간을 각자 가지고 있지만 일부 process들은 주소 공간을 공유한다.

# 공유된 주소공간은 접근을 바로 할 수 있다.

# shared 공간을 쓰려면 kernel한테 mapping(인제 shared 공간을 사용하겠다)을 해놓고, 그때부터는 사용자 프로세스끼리는 한쪽에서 쓰면 다른쪽에서 볼수있다.
 즉, shared memory 처음 하는것은 kernel의 도움을 받지만, 일단 kernel이 한번 해주면 그 이후는 가능하다. 
 
** 단, shared memory를 쓰려면 두 프로세스는 굉장히 신뢰할만한 프로세스여야 한다.

cf> 쓰레드들간의 협력은 주소공간을 같이 쓰기 때문에 유용하다.

 

 

 

'cs > os' 카테고리의 다른 글

#5-2. CPU SCHEDULING  (1) 2018.01.08
#5. CPU SCHEDULING  (0) 2018.01.04
#3-3. Thread  (0) 2017.12.29
#3-2. Process  (0) 2017.12.27
#3-1. Process  (0) 2017.12.27

+ Recent posts