◦ 목적
➠PicoKernel을 이용한 프로그래밍을 통해 Multitasking Operation을 이해한다.
1. 프로그램의 설계 및 목적
1) 프로그램의 목적
본 프로그램의 목적은 사용자의 간단한 메모의 저장 및 백업에 있다.
2) 인터페이스의 설계
프로그램이 실행되면, 하나의 스레드는 exitcode가 나올 때까지 지속적으로 사용자로부터 문자열을 입력 받는다. 그리고 다른 하나의 스레드는 입력 받는 동시에 파일로 저장을 함에 목적을 둔다. 나머지 하나의 스레드는 메모의 작성이 완료되고 exitcode로 인해 상위 스레드가 동작을 멈추면 그동안의 입력되었던 파일을 MiniNoteXXX의 형태로 백업을 하도록 하였다. 스레드간의 문자열 교환을 위해 inputitem이라는 전역변수를 선언하여 문자열을 입력받고, inputitem 변수는 MAXSTRING만큼의 전체 문자열의 갯수와 문자의 개수를 할당받는다. 본 프로그램에서는 255개의 문자와 문자열을 저장하도록 하기 위해 MAXSTRING 은 255로 정의 하였다. 각 스레드간의 우선순위는 입력을 받고 저장을 하는 부분에 있어 실시간 처리를 위하여 동일한 우선순위를 주었고, 마지막 백업 부분은 전체 작업에서 가장 마지막에 하는 부분이므로 우선순위를 가장 낮게 주었다. 각각의 스레드는 서로 다른 작업을 수행하며, 이는 우선순위에 의해 수행하도록 설정하였다.
2. 프로그램의 구현
1) 프로그램 코딩
프로그램의 코딩작업은 VI 편집기를 사용하였으며, PicoKernel을 설치하여 컴파일을 하였다. (gcc -o main main.c kernel0.o context.o)
2) 프로그래밍 과정 및 결과
.. 첨부파일 참조 ..
3) 소스 코드
#include <stdio.h> #include <string.h> #define MAXSTRING 255 #define MAXCOUNT 10 char inputitem[MAXSTRING][MAXSTRING] = {0}; char *exitcode = "exit"; int count=1; int userMain(int arg) { int threadBodyA(int), threadBodyB(int), threadBodyC(int); threadCreate(20, threadBodyA, 0); threadCreate(20, threadBodyB, 0); threadCreate(15, threadBodyC, 0); } int threadBodyA(int arg){ int i=0; printf("You can stop wrinting by type 'exit'\n"); char c_prompt; while(strcmp(exitcode,inputitem[count-1]) != 0){ printf("%3d :", count); for(i=0; (c_prompt=getchar()) != '\n'; i++){ inputitem[count-1][i] = c_prompt; } if(strcmp(exitcode,inputitem[count-1]) == 0) break; else{ count++; threadYield(); } } } int threadBodyB(int arg){ FILE *ofp; int w_count=1; ofp = fopen("today.txt", "w"); while(strcmp(exitcode,inputitem[w_count-1]) != 0){ fprintf(ofp, " %s \n", inputitem[w_count-1]); w_count++; threadYield(); } fclose(ofp); } int threadBodyC(int arg){ FILE *ofp, *ifp; char c_sub[30],c_date[10]; int r_prompt; printf("Please Input the Date for BackUp.\nNot Enable the Space.\n"); printf("ex) 060322\n"); printf("Date : "); scanf("%s", c_date); sprintf(c_sub,"MiniNote%s",c_date); ifp = fopen("today.txt","r"); ofp = fopen(c_sub,"w"); while((r_prompt=getc(ifp)) !=EOF){ putc(r_prompt, ofp); } fclose(ifp); fclose(ofp); threadYield(); } |
<소스코드>
3. 결론 및 토의
본 프로그램을 작성하면서 그동안 CPU 사용율을 어떻게 배분해서 Multitasking을 구현하는지 알게 되었다. 사실 위의 프로그램은 각 function으로 구현이 가능하기 때문에, 과연 Multitasking의 예가 될 수 있을까 하는 궁금증이 남아있다. 사실상 Multitasking이라 하면 각각의 프로그램들이 서로 다른 우선순위로서 실행이 되어야 하는데, 위의 프로그램은 기능만을 스레드로 배분한 것이기 때문이다. 실질적으로 우선순위와는 거의 상관이 없어 보이기도 한다. 추후에 더 공부를 하면서 더욱 완성도 있고, 정확한 프로그램을 작성해야하겠다.
■참고 문헌
▪ Horowitz, Sahni, Anderson-Freed, Fundamentals of Data Structures in C, 사이텍미디어, 1993
댓글