본문 바로가기

컴퓨터/OS

[OS]NachOS 메인함수 분석

반응형

main( ) 함수 분석

과제의 정확성을 위해 설치해준 버전이 아닌 과제에 첨부된 4.0수정 버전의 코드를 기준으로 작성함

Q1. ThreadedKernel, UserProgKernel 두 class는 어떤 관련이 있는가? (코드 분석 설명)

일단 ThreadedKernel CLASS를 찾기 위해 검색 해주었다.

검색은 grep 명령어와 리눅스 와일드카드를 이용해 nachos-4.0의 하위디렉토리 전부에서 모든 파일을 대상으로 검색해주었다.

threads/ 디렉토리의 kernel.cc, main.h, kernel.h 와 /userporg/ 디렉토리의 userkernel.cc, userkernel.h 파일에서 해당 클래스가 검색된다.

두 클래스 모두 검색되는 파일을 기준으로 하면 main.h, userkernel.cc, userkernel.h  파일로 추려진다.

C++ 문법을 생각해 class가 정의된 부분으로 다시 검색해보았다. 

ThreadedKernel 클래스의 정의는 ./threads/kernel.h에서 UserProgKernel 클래스는 ./userpog/userkernel.h에서 정의되었음을 알 수 있다.

좌측이 userkernel.h 우측이 kernel.h 파일이다.

UserProgKernel의 class 정의를 보면 public Threadedkernel으로 Threadedkerne을 상속받는 것을 19번 라인을 통하여 알 수 있다.

즉 class UserProgKernel : public ThreadedKernel 을 보아 UserProgKernel가 Threadedkernel를 상속 받는 부모-자식 관계임을 알 수 있다.

(=UserProgKernel이 자식 , Threadedkernel이 부모이다.)

Q2. thread/nachos, userprog/nachos 두 실행 파일을 실행할 때의 main 함수가 수행하는 작업의 차이점은 무엇인가? (main.h, main.cc)

main.h의 내용을 보면 위와 같다 18번째 라인 까지는 thread/nachos, userprog/nachos이 동일하게 작동하기 때문에 생략하겠다. 

19번째 라인부터 보면 ifdef를 통하여 USER_PROGRAM이 정의되어 있다면 

20번째 라인을 통하여 userkernel.h를 include하고

21번째 라인을 통하여 KernelType을 UserProgKernel로 매크로 지정한다.

만약 그렇지 않다면 23~24를 통하여 kernel.h를 include하고 KernelType을 ThreadedKernel로 매크로 지정한다.

다시 말하자면 userprog/nachos에서는 19~21번 라인을 통하여 KernelType이 UserProgKernel이되어

class UserProgKernel의 함수들이 동작하게 되고

thread/nachos에서는 19~21번 라인을 통하여 KernelType이 Threadedkernel이되어

class Threadedkernel의 함수들이 동작하게 된다

main.cc

위 사진은 main.cc의 주석부분을 제거한 코드의 캡쳐 사진이다.

5번 라인에서 위에서 본 main.h를 include함을 알 수 있다. 

다시 말하자면 userprog/nachos에서 KernelType이 UserProgKernel이되어있고 class UserProgKernel의 함수들이 동작하게 되고

thread/nachos에서는 KernelType이 Threadedkernel이되어 class Threadedkernel의 함수들이 동작하게 된다

위와 마찬가지로 36 번째 라인까지는 공통적으로 동작하므로 설명을 생략하겠다.

37~43번째 라인까지가 두 실행 파일에서 다르게 동작하는 부분임을 코드를 통하여 알 수 있다.

37번째 라인을 보면 new KernelType(argc, argv)를 통하여 각각의 클래스 Threadedkernel,UserProgKernel을

실행하는 프로그램에 맞추어 생성한다.

그리고 38에서 43번째 까지 각각의 클래스에 정의된 함수인 Initiallize(),SelfTest(),Run()을 순차적으로 실행함을 알 수 있다.

Q3. 위의 두 실행 파일에서 사용할 수 있는 option들에는 어떠한 것들이 있는가?

// main.cc 
//	Driver code to initialize, selftest, and run the 
//	operating system kernel.  
//
// Usage: nachos -u -z -d <debugflags> ...
//   -u prints entire set of legal flags
//   -z prints copyright string
//   -d causes certain debugging messages to be printed (cf. debug.h)
//
//  NOTE: Other flags are defined for each assignment, and
//  incorrect flag usage is not caught.
//
// Copyright (c) 1992-1996 The Regents of the University of California.
// All rights reserved.  See copyright.h for copyright notice and limitation 
// of liability and disclaimer of warranty provisions.

main.cc의 상단부 주석을 보면 위와 같이 되어있다. 이를 통하여 -u, -z -d 옵션이 존재함을 알 수 있다.

-u: Legal flags의 전체 셋을 출력한다. (정의된 플래그들의 전체를 보여준다 = )

-z: 저작권 문구를 출력한다.

-d: 디버깅 메세지를 출력한다.

// If the flag is "+", we enable all DEBUG messages.

// Debug::Debug
//      Initialize so that only DEBUG messages with a flag in flagList 
//	will be printed.
//
//	If the flag is "+", we enable all DEBUG messages.
//
// 	"flagList" is a string of characters for whose DEBUG messages are 
//		to be enabled.

debug.cc의 일부를 발췌해 왔다.

디버그 모드에서는 위의 "+": 가능한 모든 디버그 메세지 와 같이 추가 옵션들이 있음을 알 수 있었다.

+ 가능한 모든 디버깅 메세지
t Thread(스레드)
s Semaphore
i Interrupt(인터럽트)
m machine(머신)
d disk(디스크)
f Filesys(파일시스템)
a address
n Network(네트워크)

와 같이 추가옵션을 찾을 수 있었다.