Unix V6 함수 리턴과 스위칭 2(완)


그럼 실제로 UNIX V6에서 스위칭 되는 소스를 한번 봐보겠습니다


1. 데이터 영역 구조


일단 소스를 보기 전에 데이터 세그먼트 메모리 구조 부터 보기로 하겠습니다.

일단 주소는 간단한 설명을 위해 100부터 시작했음을 알려 드립니다.

UNIX V6 데이터 영역 0번지에는 user 구조체가 자리잡고 있고 그 위에 데이터 영역과 스택 영역이 자리 잡고 있습니다.

이해 하시는데 문제 없을 거라 생각하고 다음으로 넘어 가겠습니다.




2. fork() 함수와 newproc() 리턴 값 1

UNIX V6 72page 리스트 3.3 fork() 소스 13라인의 설명을 보면 부모 프로세스는 0을 리턴 받고

자식 프로세스는 1를 리턴 받는다고 나옵니다.


하지만 newproc() 함수를 보면 0을 리턴하는 소스는 있지만 눈을 씻고 봐도

1를 리턴하는 소스는 볼수가 없습니다.



 


소스 설명에는 switch() 함수가 1을 리턴해서 1을 가져 온다고 써있는데




도.대.체 어떻게 아무런 접점도 찾을수 없는 fork()함수와 switch()가

switch() 함수가 1을 리턴했는데 어떻게 fork()함수가 1을 리턴 받을까요?





3. fork() 함수와 newproc() 리턴 값 2


그럼 설명에 들어 가겠습니다.

일단 fork() 함수 13 라인과 데이터 영역 메모리 그림부터 보겠습니다.




저번에 했던 함수와 스택 구조 그림을 그대로 그려 보면서 그 과정을 보겠습니다.

fork() 함수 13라인이 실행 되고 있는 그림입니다.


R5 = 100

R6 = 99

R7 = fork() 13라인



지역변수가 여러개 혹은 없을수 있지만 신경 쓰지 않아도 되므로 지역변수들이라고 써놓았습니다.

그리고 위의 fork() 함수를 실행하고 있는 프로세스는 부모 프로세스입니다.(자식은 아직 생생도 되지 않았죠..)

여기서 newproc() 함수를 호출합니다.




4. newproc() 호출 1


자 그럼 이제 newproc를 호출 합니다.

전 게시글을 보셨으면 이해 하실수 있을겁니다.

스택에 리턴 어드레스 저장(fork함수 13라인), fork() 함수 프레임 저장(R5 = 100)

어셈블리언어로 하면(r6가 99에서 시작함)


mov r7, -(r6)    --> 스택에 리턴 어드레스(fork 함수 13라인)를 저장, 그리고 r6 = r6 -1

mov r5, -(r6)    --> 스택에 fork함수 프레임 주소(100) 저장, 그리고 r6 = r6 -1




5. newproc() 호출 2


이제 R5에 R6(97)값을 넣으면 되지요.


mov r6, r5    --> R5 = R6(97) --> R5 = 97





6. 함수 프레임및 스택 포인터 저장


자 이제 함수 프레임및 스택 포인터를 저장합니다.(newproc 함수 50라인)





savu 함수는 user 구조체에 r5, r6레지스터값을 저장하는 함수 입니다.

그림으로 보니 아무것도 아니죠? ^^





7. 프로세스 복제 1


자 이제 부모 프로세스가 자식 프로세스를 생성하는 작업을 완료하고



데이터 영역을(newproc 함수68라인) 복사합니다.






8. 프로세스 복제 2


데이터 영역 복제 완료하면 아래와 그림과 같습니다.



unix v6 PDP 11 시스템은 cpu가 하나 밖에 없으며 한번에 하나의 프로세서만 실행 시킬수 있습니다.

그러므로 부모로부터 복제된 자식 프로세스는 메모리 복제가 일어난 상태이고 실행중이 아닙니다.




9. 부모 프로세서의 리턴



부모 프로세서는 실행을 계속하여 newproc() 71라인으로 오게 되며 0을 리턴 받습니다.







10. 자식 프로세스의 실행 1


자식 프로세스는 실행중이 아니라고 했습니다.

그럼 자식 프로세스는 어디서 다시 실행될까요?


바로 switch() 함수 입니다.


일정 시간이 되거나 우선순위가 되면 자식 프로세스는 실행가능상태에서 실행상태로 변하고

실행을 재게 합니다.(switch 함수)




switch 함수 40라인 전에서 자식 프로세스가 선택되었다고 가정합니다.

40라인에서 retu 함수가 실행 됩니다.


retu 함수는 그림에 나타나 있듯이 user 구조체에 있는 R5, R6값을 cpu로 옮기는 작업을 합니다.

하지만 아직 cpu는 자식 프로세스를 완전하게 실행하고 있지 않습니다.





11. 자식 프로세스의 실행 2 - 데이터 영역 사용


아직 위그림까지는 데이터 영역을 완벽하게 사용하지 못하고 있습니다.

또한 자식 프로세스가 완벽하게 실행하고 있다고 볼수 없습니다.(아직 switch 함수 실행중)




이제 switch 41라인까지  왔습니다.

여기서 드디어 cpu가 데이터 영역을 완벽하게 자식프로세스로 바꿉니다.


하지만 아직도 소스는 switch 함수를 실행중입니다.

아직 자식 프로세스가 실행중이라고 말하기에는 좀 부족합니다.





12. 함수 리턴과 fork() 함수 복귀!!! - 스위칭 완료!!!!


무엇이 부족할까요?

fork 함수 13라인을 보면 자식 프로세스는 1를 리턴 받는다고 나옵니다.


책에서 fork() 함수가 newproc()호출하면 부모 프로세스는 0을 리턴받고

자식 프로세스는 1를 리턴 받는다고 했습니다.


자 그럼 switch 함수 48라인이 실행 되면 어떻게 될까요?




여기서 swtich 함수에서 return를 했습니다.

저번 게시물에서 봤던 함수 리턴입니다.



저번 게시물에서 봤던 그대로 따라해 보겠습니다.

그럼 아래와 그림 같이 될것입니다.




 (1). 스택에서 R5 값 100(fork 함수 프레임)을 가져온다.

 (2). 스택에서 리턴 어드레스 값을 가져온다. R7 = fork() 13라인

 (3). switch() 에서 리턴한 값 1을 가져온다.


자!!! 그럼 자식 프로세스는 이제 어디를 실행하고 있나요?


fork 함수 13라인을 실행하고 있습니다.(사실 14라인이지만 ㅎㅎ 캡쳐 실패)


이것이 스위치의 원리입니다.


참고로 위의 게시글과 같이 UNIX V6 exec 함수 14라인 (sleep 함수 호출)도 한번 해보세요.

동일하게 exec 14라인으로 되돌아 올것입니다.



그럼 이제 unix v6 스위치가 끝났습니다.



오타나 이해 되지 않으시면 댓글이나 혹은 다른 연락 가능한 곳으로 문의 주세요^^




+ Recent posts