1

 

1.     과제 주제 (문제 개요)

 

- 기본적으로 과제를 위한 세팅이 되어있는 (조교가 제공한) GeekOS 에 작업을 한다.

    조교님께서 project3.tar.gz 라는 뼈대 프로젝트를 제공해 주셨다.

    내부에는 [ elf.c / kthread.c / user.c / userseg.c ] 들에 베이스 코드가 세팅되어있다.

    추가로 우리가 앞으로 해야 할 것들(앞으로 코딩해야 할 부분들, 생성해야할 함수 이름들,

    파라미터들에 대한 내용들)PPT로 제공해 주심으로써 실제로 우리가 해야 할 일은 적다.

 

 

-       1. GeekOS 안에 Scheduling 을 구현한다.

4 가지 스케줄러를 구현한다. [ Round-Robin, Multilevel Feedback Scheduling, Shortest Job First (Priority based), 그리고 마지막으로 우리 조만의 User made Scheduling algorithm ]

구체적인 요구 함수와 구현을 요구하는 내용은 아래와 같다.

 

[ kthead.c : 일반적으로 스케줄링 부분에 대한 코딩 ]

 

1.     Extern int g_Quantum    설정된 Quantum

2.     Int g_scheduleSelector 어떠한 스케줄러가 선택되었는지를 저장하는 변수

3.     Int sel_time = 0                         스케줄러

 

4.     Find_Best

위에서 언급한 4 가지 스케줄러들은 각자 최적의 Thread’룰 찾는 방법은 다양하다.

어느 알고리즘은 ThreadProcessPriority 를 기반으로 가장 중요한 Thread 혹은

Process를 선택한다. / 어느 알고리즘은 Time 시간을 기반으로 가장 최적의 Thread 혹은

Process를 선택한다. 이렇게 각 알고리즘에 맞는 최고의 Thread 를 찾기 위한 함수이다.

그래서 이름이 Find_Best 이다.

 

5.     Get_Next_Runnable( void )

              선택된 스케줄링에 대해 처리를 하는 함수. 각각의 스케줄링 케이스에 대해

그에 맞는 Find_Best를 호출하여 최적의 Thread(혹은 Process)를 찾아서 bestQueue 라는

곳에 저장을 하고, 지금 현재 처리한 큐 다음의 Thread 를 받아서 그 새로 받은 Thread

에 대한 또 Get_Next_Runnable 을 처리하기 위해 준비한다.

 

6.     Set_Scheduling_Policy( int policy, int quantum )

              선택된 스케줄링에 대해 처리를 하는 함수. Policy 라는 변수로 받은 스케줄링 정책에

              대한 Setting 을 담당한다. 실제로 스케줄링에 맞는 처리를 하는 것은 Get_Next_Runnable

              이고 이 Sys_Set 부분에서는 단순히 받은 Parameter 값들을 변수에다 세팅해

놓는 것 뿐이다.

 

 

-       2. GeekOS 안에 Semaphore 를 구현한다.

Thread들은 멀티 Thread 프로그램의 경우 동시에 Thread 가 돌아가면서 각자의 코드에

(Thread 들의 코드에) 서로 영향을 미칠 수 있다. 이를 방지하기 위해 Semaphore

이용하여 다중 LineThread 내부 코드를 Atomic 하게 묶어서 서로 다른 Thread들의

코드들이 영향을 주지 못하도록 보호한다.

 

[ syscall.c : 일반적으로 세마포어 부분에 대한 코딩 ]

 

1.     typedef struct Semaphore            세마포어 구조체(type)를 만들어 준다.

2.     Is_Thread_In_List                         현재 선택된 Thread 가 특정 List 안에 있는가?

3.     Is_Thread_List_Empty                   현재 선택된 Thread 가 특정 List 안에 없는가?

4.     Remove_Thread_List                    현재 선택된 Thread 를 특정 List 에서 제거하라.

5.     Sys_SetSchedulingPolicy              Set_Scheduling_Policy(policy, quantum) 를 호출하라

6.     Sys_GetTimeOfDay                      현재 시간을 return 하라

 

7.     Sys_CreateSemaphore                  세마포어 생성

8.     Sys_P                                                     세마포어 -

9.     Sys_V                                       세마포어 +

10.   Sys_DestroySemaphore                세마포어 제거

 

 

-       3. GeekOS 안에 Timing 을 구현한다.

스케줄링마다 각각 Process (혹은 Thread)들의 각각 다른 대기시간에 따라 다른 총 소요

시간이 도출된다. 이 총 소요 시간을 계산하여 각각의 스케줄링마다의 소요시간을 도출해

내어 그들의 값을 비교하고 어느 상황에서 어느 스케줄링이 알맞는지 선택할 수 있게 한다.

 

           [ timer.c : 일반적으로 타이밍 부분에 대한 코딩 ]

 

1.     Extern int g_scheduleSelector                   어떠한 스케줄러가 선택되었는지를 저장하는 변수

2.     Int g_Quantum = DEFAULT_MAX_TICKS       설정된 Quantum

3.     PrintQ(void)                 

현재의 g_Quantum 값을 알려주는 프린트 함수이다.

4.     Timer_Interrupt_Handler 

모든 Quantum이 모두 소모되기 이전에 현재의 프로세스를 낮은 우선순위의 큐로 이동시킨다.

 

 

 

 

 

Posted by 하늘_

 

 

Why is main() in java void?

http://stackoverflow.com/questions/540396/why-is-main-in-java-void

 

Q.

In the case of languages with a C-like syntax, we declare the main() method to return an int or float value (or void). Is it possible to declare a non-void return type from main() in Java? If not, then why not? Does this mean that a Java program doesn't return any value to the OS?

A - 1.

The main() method must indeed have a void return type. From the Java Language Specification on "Execution - Virtual Machine Start-Up" (§12.1.4):

The method main must be declared public, static, and void. It must accept a single argument that is an array of strings.

It goes on to describe when a program exits in "Execution - Program Exit" (§12.8):

A program terminates all its activity and exits when one of two things happens:

  • All the threads that are not daemon threads terminate.
  • Some thread invokes the exit method of class Runtime or class System and the exit operation is not forbidden by the security manager.

In other words, the program may exit before or after the main method finishes; a return value from main would therefore be meaningless. If you want the program to return a status code, call one of the following methods (note that all three methods never return normally):

Of the three, System.exit() is the conventional and most convenient way to terminate the JVM.

 

A - 2.

This is an interesting discussion on velocityreviews on the same topic:

Highlight:

Incidentally, this is considered bad style in C and C++ just because it's the wrong signature for main, not for any universal reason independent of programming languages. It's one of those things that is not really supposed to work, but might on your implementation.

In Java, the reason main returns void is threads. C and C++ were both designed as languages before multithreading was a widely known technique, and both had threads grafted onto them at a later date. Java was designed from the beginning to be a multithreaded environment, and frankly, it would be unusual to write any non-trivial Java application that doesn't use more than one thread. So the idea that a program moves linearly from the beginning to the end of main is a bit outdated.

written by

www.designacourse.com The Easiest Way to Train Anyone... Anywhere. Chris Smith - Lead Software Developer/Technical Trainer MindIQ Corporation

 

 

Posted by 하늘_
Media Cloud/FFMPEG2013. 2. 27. 21:41


SDK, NDK, PDK, JNI는 무엇인가!?


■  SDK와 NDK, 그리고 PDK

  SDK Software Developer’s Kit의 약자로 주로 UI를 기반으로 특화된 API를 제공하여 Application Level에서의 개발을 쉽게 해주며, 기반은 Java Language이다.

  따 라서 SDK는 일반적인 Android Application 개발에 사용되며, Android Emulator를 내장하고 있어 Build와 동시에 바로 Test까지 가능하다.( 단, H/W를 직접 사용해야 하는 Application은 Test가 힘들다. )

 

  반면, NDK Native Developer’s Kit의 약자로, SDK와 마찬가지로 Application을 개발하는데에 사용되는 Framework이지만 Java 대신에 C/C++ Language를 이용하여 개발할 수 있다.

  따라서 NDK는 Application 뿐만 아니라 MiddleWare개발에도 사용되며, JNI를 통해 SDK에서 Linux에서 사용하던 C/C++을 사용할 수 있게 해준다. 그러므로, HAL( Hardware Abstraction Layer )의 구성/형태에 따라 굉장히 민감할 수 밖에 없다.

  결론적으로, 기본적으로 NDK는 JNI용 Library를 만드는 것이나, 약간의 변형을 통해 실행 파일( Executable File )도 만들 수 있다. 다만, 완벽한 형태의 Application의 제작은 NDK만으로는 사실상 불가능하다.

 

  PDKPlatform Developer's Kit의 약자로, Android의 Porting 개념으로서 SDK와 NDK를 포괄하는 개념이다.

  PDK는 반드시 Unix 계열의 OS에서 개발이 이루어져야 하며, Android의 전체 Source Code를 이용하여 개발한다. 결국 PDK는 Linux Kernel Level과 그 바로 위에 위치한 Native Library의 HAL 부분 등 Android의 깊숙한 부분에 대한 개발 방법이다. 따라서 AndroidApp 개발이 아닌 Kernel Level, 혹은 Core Frame의 개발이 목적이라면 PDK를 이용해 개발 해야 한다.



■  정리


SDK(Software development Kit) : Android App을 개발 시에 사용한다.


NDK(Native development Kit) : Android App의 개발시 C/C++의 code를 사용할 수 있다.


PDK(platform development Kit) : platfrom을 개발할 때 사용한다.



■ JNI

  Java Native Interface의 약자로, Java C/C++ Module을 연결해주는 매개체를 의미한다. , Java에서 지원하지 않는 하위(Low) 계층의 기능을 C/C++ 계층과의 연동을 통해 해결하도록 해준다.


참고 : www.flowdas.com/blog







Posted by 하늘_