3 - 2,  week3

리눅스에서 프로세스를 만들어보자!

 

1. 서론

프로세스는 누가 만드는가? 프로세스다!

사람이 사람을 만들듯이 사람과 비슷하다.

 

첫 프로세스는 rom에서 부트로드로 os를 띄우고 

그 다음부터는 프로세스가 프로세스를 만든다.

ex. 로그인 화면, 명령프롬프트 등등

 

=forming a tree of processes

(parent process create child processes)

 

2. 구체적인 방법

fork라는 system call을 한다. == 부모님끼리 사랑을 나눈다

(사람과의 차이점? 프로세스는 완벽하게 복제해버린다.)

 

그러면 다른 걸 만들고 싶으면 ? exec 호출한다.

(부모 프로세스와 다르게 된다.)

 

fork는 메모리 공간도 동일하게 사용하는데 exec는 따로 할당된다.

 = process' memory space

 

3.과정

one process => fork => two processes

if exec then another process

 

exit를 호출하면 child가 끝난다.

 

(3.20 ppt참고하기) 그림과 같이 작동하는게 shell이다.

 

-> 과제는 shell 만들기!!! 그림 보고 만들자.

shell == bin/bash in linux

fork하는 순간 shell이 두개가 된다. 부모랑 똑같으니깐 근데 같으면 의미가 없으니깐

pwd하면 bin/pwd로 바뀐다. 즉, exec를 발동시킨거다.

 

(그러면 이제 현재 경로가 보이는데 그게 바로 child process가 한 것이다.)

 

parent는 wait하고 있다가, child가 끝나면(exit) 다시 명령을 내릴 수 있는데 그때 프롬프트 켜지는 게

부모 프로세스가 하는 것.

 

=> linux process creation and execution의 대표적인 model

=> 핵심적인 기능 세개에 대해서 배워보는 것이다.

 

4.fork()

create a new process

시스템 콜을 해도 내 눈에는 안보이지 구분도 안가

근데 return value로 구분 가능하다( 자식이 0, 부모가 child의 process id를 리턴한다)

(모든 프로세스가 고유한 아이디를 갖는다 = 주민등록번호)

-> 이를 통해서 부모인지 자식인지 구분할 수 있다.

 

자신의 pid는 getpid()

자신의 부모의 pid는 getppid()

fork() 후 리턴되는 pid는 child process의 pid

 

정리.

복제가 된다. 그러나 독립적이다.

자기만의 resource(process control block)를 갖는다.

한가지 예외는 return value가 다르다.

 

5.실습

3.22 ppt참고

 

sys/types.h는 커널내부에서 사용하는 타입 pid_t (process id type)

사실은 typedef short int pid_t

 

fork하는 순간 두 개의 프로세스가 돌아간다.

-1 = error

0 = child

natural = parrent

 

6.실전

vi fork1.c -> gcc fork1.c - o fork1

nano fork1.c -> control+o -> control+x -> gcc fork1.c -o fork1

이제 실행시키려면 ./fork1 (환경변수를 안해줘서 파일의 경로를 적어줘야함.)

(수정하려면 프롬프트에 nano fork1.c 기입한다.)

(tip 위로 화살표하면 아까 코드가 나온다.)

 

코드

unistd.h 는 fork메소드, sleep메소드

linux에서 sleep메소드를 사용한다.

 

7.시험에 나온다!!!!   ppt 3.24 -> 코드보고 채우는 문제 나올 것 같음.

fork1.c에 해당하는 code에서 실행된다. pc가 여길 가르킨다.

data, heap 영역은 비어있다.

stack은 pid(4바이트), message(4바이트), n(4바이트),을 가지고 있다.

실행하다가 fork를 만나는 순간 프로세스가 2개 되니깐 똑같은 메모리가 만들어진다.

똑같은게 동시에 존재.

 

cpu가 context swithcing하면서 왔다갔다 실행

메세지에 문자열 상수를 가르키니깐 코드열에 this is child process, this is parent process문자열이 있다.

message에 주소가 있으니깐 위의 코드를 가리키고 있따는 거지

자식의 message pointer은 this is child를 가리키지. 부모는 parent가리키고.

 

process 아이디 확인해볼까? ps  process가 생성될때마다 다이나믹하게 형성된다.

여기서 pid는? child의 경우에는 fork()의 리턴값이 0이지!

 

memory layout이 프로세스가 끝나면 사라지는데 각각 3초, 5초후에 사라진다

다 끝나고 ps치면 process가 bash(shell, 명령창), ps만 있네

 

**ps -ea는 내가 실행시키는 것 외에도 백그라운드 프로세스 전체를 자세히 보여준다.

***ps는 현재 실행중인 사용자와 관련된 프로세스를 확인할 수 있다.

 

 

 

 

 

 

+ Recent posts