마이크로프로세서 및 실험2 과목 기말고사 대비 내용 정리


xvii페이지의 C-언어 관련 설명 정리


1. 프로그램 언어에서 메모리에 데이터 쓰기/읽기

x=y //y값을 x에 넣는다.


if(PINA == 1) // PINA 레지스터를 읽어서 1과 같으면 ... (조건)

x = x + 2 //x += 2 와 동일하다.

DDRA = 0xFF; //포트 A를 모두 출력 포트로 설정

PORTA = 0x5D; // 0101 1110 해당하는 포트만 HIGH로 설정


2. while()문의 문법

while(expr1) //expr1이 참값이면(0이 아니면, 1도 되고 2도 되고 0만 아니면 다 됨.)

        expr2; //expr2을 수행한다. expr1의 값은 현재 1이며 앞으로도 바뀌지 않으므로 expr2를 무한 실행한다.


3. while, for, do-while 루프 구성


for(i=0;i<10;i++)

        expr1; //i=0부터 1씩 증가하여 expr1을 실행하며, i=10이 되면 중지한다. 0부터 9까지 총 10번 실행한다.


위 for 루프문은 다음 while 루프문과 동일하다.


i=0;           //루프의 초기화

while(i<10)  //루프의 판단

{

        expr1; //루프의 몸체

        i++;   //루프의 처음으로 가기 전 수행문

}


while문과 do-while문의 비교

while(expr1) |      do{

        expr2; |              expr2;

                |      }while(expr1);

while문은 expr1을 먼저 평가하여 루프를 판단하지만 do-while문은 우선 expr2를 수행한 다음 expr1로 루프를 판단한다.


4. C-라이브러리 활용

Library : 함수를 작성하여 모아놓은 함수의 집합.

도서관에서 책을 대여하는 것처럼, 라이브러리에 있는 함수를 사용하려면 빌드 과정에서 라이브러리를 링크하여야 한다.

기본적으로 제공하는 libc.a 라는 라이브러리는 링크할 필요가 없다.(printf()같은 함수)

WinAVR에서 제공하는 라이브러리를 통틀어 avr-libc라 한다.


5. 데이터 마스크(MASK)

특정 비트를 0으로 리셋(리셋 : 0으로 만듦. 세트 : 1로 만듦.)하고 나머지는 원상태를 보존하기 위한 방법.

리셋하고 싶은 수를 0과 AND시키면 된다. 예를 들어 bit #0, #2, #6을 리셋하고 싶다면,

7 6 5 4 3 2 1 0      //bit 0~7

X X X X X X X X      //어떤 수든 상관없음. (X : don‘t care. 상관 없다는 뜻.)

1 0 1 1 1 0 1 0      //#0, #2, #6에만 0을 넣는다.

---------------      //AND시킴

X 0 X X X 0 X 0      //X는 그대로 출력.(1이었다면 그대로1, 0이었다면 그대로 0이 보존됨)


수식으로 표현하려면 다음과 같은 방법을 따른다.

1. #0, #2, #6만 1인 16진수를 구한다. 0100 0101 : 0x45

2. 이를 반전 시킨다. ~0x45 : 1011 1010 (반전시켜야 위의 수식처럼 AND시킬 준비가 완료된다.)

3. 마스크 기능을 통해 리셋하고 싶은 변수와 AND 시킨다. : My_variable & ~0x45

(AND란 곱하기이다. 1과 1을 AND하면 1, 1과 0을 AND하면 0, 0과 0을 AND하면 0이 나온다.)

4. 물론 그 결과를 저장할 변수도 필요하다. : My_changed_variable = My_variable & ~0x45

5. 마스크 하기 전의 변수 내용이 더 이상 필요 없다면 이렇게 해도 상관은 없다 : My_variable = My_variable & ~0x45


이번에는 특정 비트를 1로 세트하는 방법에 대해 설명한다.

이를 위해서 세트하고 싶은 비트만 1이고 나머지는 0이 되는 수와 OR시키면 된다.

예를 들어 bit #3, #6, #7만 세트하고 나머지를 보존하고 싶으면

7 6 5 4 3 2 1 0      //bit 0~7

X X X X X X X X      //어떤 수든 상관없음. (X : don‘t care. 상관 없다는 뜻.)

1 1 0 0 1 0 0 0      //#3, #6, #7에만 1을 넣는다.

---------------      //OR시킴

1 1 X X 1 X X X      //X는 그대로 출력.(1이었다면 그대로1, 0이었다면 그대로 0이 보존됨)


수식으로 표현하려면 다음과 같은 방법을 따른다.

1. #3, #6, #7만 1인 16진수를 구한다. 1100 1000 : 0xC8

2. 마스크 기능을 통해 세트하고 싶은 변수와 OR 시킨다. : My_variable | 0xC8

(OR은 더하기이다. 1과 1을 OR하면 1, 1과 0을 OR하면 1, 0과 0을 OR하면 0이 나온다.)

4. 물론 그 결과를 저장할 변수도 필요하다. : My_changed_variable = My_variable | 0xC8

5. 마스크 하기 전의 변수 내용이 더 이상 필요 없다면 이렇게 해도 상관은 없다 : My_variable = My_variable | 0xC8


위와 같이 필요한 비트만 선별적으로 뽑아내는 것을 “마스크한다”라고 한다. 마치 가면의 구멍을 통해 제한된 영역만을 외부에 알려주는 것과 같다.


6. C-언어에서 매크로의 사용

매크로는 선행처리기 #define 키워드를 사용하여 정의한다.

이것을 사용함으로써 문장의 의미를 더욱 확실하게 전달할 수 있다. 예를 들면

        #define DELAY_TIME 40              |

        _delay_ms(DELAY_TIME);             |      _delay_ms(40);

에서 오른쪽 문장은 40의 의미를 알 수 없지만 왼쪽 문장에서는 그 의미를 파악하기가 쉽다.

또한 소스 전체의 DELAY_TIME을 50으로 바꾸고 싶을 때, 왼쪽의 방법을 쓴다면

        #define DELAY_TIME 40 ==> #define DELAY_TIME 50

으로 간편하지만,

오른쪽의 문장을 사용한다면 소스의 해당하는 부분에서 일일이 40을 50으로 바꾸어주어야 한다.

이처럼 하나의 상수를 여러 군데 사용할 때는 매크로를 사용하는 것이 편리하다.

일반적으로, 매크로를 일반 변수와 구분하기 위하여 대문자를 사용하여 정의한다.


7. I/O 레지스터의 비트 사용

설명을 위해 EIMSK 레지스터를 고려하자.(이 레지스터가 무엇인지 여기서 굳이 알 필요는 없다.)

#7

#6

#5

#4

#3

#2

#1

#0

INT7

INT6

INT5

INT4

INT3

INT2

INT1

INT0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

0

0

0

0

0

0

0

0


만일 INT3, 즉 bit #3을 세트(1로 만듦)하고 싶다면

0000 1000 ==> 0x08 이므로

EIMSK = 0x08;

라고 할 수 있다.

그러나 이는 직관적이지 않고(한 눈에 파악하기 힘들다는 뜻), 다시 다른 비트도 세트하려고 한다면 또 다시 계산을 해 주어야 한다. 예를 들어 현재 #3이 세트되어 있는 상태에서 #2도 세트하고 싶다면

0000 1100 ==> 0x0C 이므로

EIMSK = 0x0C;

라는 과정을 거쳐야 한다.

이에 왼쪽 Shift 연산자 << 를 사용한다면 편리하다.

EIMSK 레지스터에 대해 각 비트명은 다음 매크로로 정의되어 있다.

#define INT0 0

#define INT1 1

#define INT2 2

...

따라서 1<<INT2 <==> 1<<2 <==> 0b00000100 (0b는 2진수라는 뜻이다.)

1 : 0000 0001

1<<2 : 0000 0100

즉 EIMSK = 0x0C; 대신

EIMSK = (1<<INT3);

EIMSK = (1<<INT2);

을 이용하면 편리하고 보기에도 직관적이다.

위 두 문장을 하나로 합치면

EIMSK = (1<<INT3) | (1<<INT2);

이다. 그러나 이 문장은 bit #2, #3을 제외한 나머지 비트를 0으로 리셋한다. (원래 값이 사라진다.)

이를 방지하기 위한 방법으로 5. 데이터 마스크(MASK)에서 배웠던 OR를 사용한다.

EIMSK = EIMSK | ((1<<INT3) | (1<<INT2)));

혹은 EIMSK |= ((1<<INT3) | (1<<INT2))); 도 같은 문장이다.

마찬가지로 bit #2, #3를 0으로 리셋하고 나머지 비트를 보존하려면 다음과 같이 작성하면 된다.

EIMSK &= ~((1<<INT3) | (1<<INT2)));



8. 변수의 범위★★★★★

지역변수 : 지정된 영역에서 쓰이는 변수.

중괄호{}내에서 선언된 변수는 모두 지역 변수. 이들 변수는 변수가 선언된 중괄호 {} 내에서만 통용된다.

file1.c

int e_data;

static int se_data;

 

void func1(int arg)

{

        int l_data;

        static int ls_data;

        while(1)

        {

                int ll_data;

        }

}

 

int func2(void)

{

        int l_data;

        static int ls_data;

}


file2.c

extern int e_data;


위의 변수들 중 func1의 l_data, ls_data, ll_data, arg, func2의 l_data, ls_data는 모두 지역 변수이다.

굵게 표시한 func1의 변수 l_data와 func2의 변수 l_data는 변수명이 서로 같지만, 통용되는 범위가 각각 func1와 func2의 내이므로 전혀 다른 변수이다. 서로 아무런 영향을 미치지 않는다.

함수 func1의 변수 ll_data는 func1의 안에 있지만 선언된 부분이 while(){}의 내부이므로 while(){}안에서만 통용되고 func1의 다른 부분에서는 존재를 알지 못한다.

func1의 arg 변수와 같이 함수의 인자로 넘어오는 변수는 함수의 지역변수로 간주된다.


외부 변수

중괄호{} 밖에서 선언된 변수. 두 가지로 나뉜다.

1. 전역 변수 : 전체 영역에서 쓰이는 변수. 프로그램의 모든 영역에서 통용되는 변수이다.

위의 변수 중 file1.c의 e_data가 해당한다.

만일 이 e_data를 file2.c에서도 사용하려면 위와 같이 extern 키워드를 사용하여 참조하여야 한다.


2. 정적 변수 : 정지 상태에 있는 변수. 변수를 선언할 때 static 키워드를 사용한다. 통용 범위는 같은 파일 내에서 변수가 선언된 아래 부분 모두이다. 위의 변수 중 se_data가 해당한다. file1.c에서 선언되었으므로 file2.c에서는 사용할 수 없다.


9. 변수의 수명

변수가 static으로 선언되어 있으면 프로그램이 끝날 때까지 소멸하지 않는다.

static으로 선언되지 않은 변수는 변수가 선언된 중괄호{}내에서만 존재하며, 중괄호를 닫는 부분 }을 만나면 해당변수는 소멸된다.

지역 변수

func1의 l_data, arg : 함수 func1에 들어올 때마다 새로 생성된다.

func1의 ll_data : while를 실행할 때마다 새로 생성된다.

func1의 ls_data : 함수 func1에 처음 들어올 때 한 번 생성되고, 소멸되지 않는다. func1에 다시 들어올 때 변수를 새로 생성하지 않고 이미 생성된 변수 ls_data를 다시 사용한다.


외부 변수

한 번 생성되면 소멸하지 않는다. 프로그램이 시작될 때 한 번만 생성된다.

file1.c의 e_data, se_data.


※변수의 범위와 수명은 항상 일치하는 것은 아니다. ls_data의 범위는 함수 func1이지만 이 함수를 벗어난다고 해도 소멸하지 않는다.

file2.c의 extern int e_data; 는 변수 선언을 하는 것이 아니라 변수 e_data가 외부파일에 선언되어 있으므로 참조하라는 뜻이다. 새로 변수가 생성되지는 않는다.

가능하면 전역 변수는 사용하지 않는 것이 바람직하다.


10. C-언어의 함수

ftype name(type1 v1, type2 v2, ...)

ftype : 함수의 타입. 함수의 반환값의 데이터 형에 따라 명시(int, char 등) 반환값이 없는 경우 void로 명시. 생략 시에는 int로 간주.

name : 함수의 이름.

v1, v2 : 인자. 없을 수도 있고 여러 개의 인자가 있을 수도 있음. 인자 앞에는 인자의 데이터 형(int, char 등)을 지정.

{}안에 함수 기능 구현. 반환값은 하나를 가지며, return문으로 반환값 명시( ex)return x; ) 반환값이 없는 경우 return 생략.




11. C-언어에서 문자열

문자 : ‘ ’를 사용. ‘A’, ‘1’ 등

문자열 : “ ”를 사용. “MyCom” 등. “1”도 가능.

문자열의 끝은 NULL문자(\0)여야 한다. 따라서 MyCom이라는 문자열을 저장하기 위해선 최소한 6개의 배열이 필요하다.


char ch;

char *pch;


ch = ‘A’;  //이 때 ch를 출력하면 A가 나온다.

pch = “MyCom”;

ch = pch[0];  //이 때 ch를 출력하면 M이 나온다.

ch = pch[1]; //이 때 ch를 출력하면 y가 나온다.

ch = “A”;  //이는 에러이다. ch는 char형이므로 배열을 저장할 수 없다.


12. switch문

switch(제어표현식)

{

case label1: //예를 들어 제어표현식이 1이고 label1=1이면 이 문장을 실행한다.

        문장1;

        break; //break를 만나면 switch문을 벗어난다.

case label2:

        문장2;

        break;

default:              //제어표현식에 해당하는 label이 없을 경우 이 default를 실행한다.

        문장3;

}


13. 헤더파일에서 선행처리기 #ifndef 사용

선행처리기 : 컴파일러가 프로그램을 컴파일하기 전에 처리하는 문장. 문법은 다음과 같다.

#ifndef 매크로명

...

#endif

“매크로명”이 매크로로 정의되어 있지 않으면 #ifndef-#endif 짝 내의 문장을 포함하여 컴파일하고, 정의되어 있으면 포함하지 않고 컴파일을 수행한다.

button.h

#ifndef _BUTTON_H_

#define _BUTTON_H_

#define BTN_SW0 0x01

#endif

outfile.h

#include “button.h”

헤더파일 outfile.h 속에서 헤더파일 button.h을 첨부하고 있다. 프로그램을 다음과 같이 작성하면 문장 1, 2에 걸쳐 button.h가 두 번 첨부된다.

1. #include “outfile.h”

2. #include “button.h”

1에서 button.h가 첨부될 때 매크로 _BUTTON_H_가 정의되지 않았으므로 매크로 _BUTTON_H_와 BTN_SW0을 정의한다.

2에서 button.h가 첨부될 때 1에서 매크로 _BUTTON_H_가 이미 정의된 상태이므로 #ifndef-#endif 짝 내의 문장을 포함시키지 않는다. 따라서 매크로 BTN_SW0이 중복해서 정의되지 않는다.

button.h에서 #ifndef-#endif을 사용하지 않으면 2에서 매크로 BTN_SW0이 중복 정의되어 에러가 발생하게 된다.

14. 함수의 인자를 사용한 데이터 출력

int main()

{

        int x, result;

        x = 2;

        square(x, result);

}


void square(int a, int k)

{

        k = a * a;

}

위 예제에서 k는 4이다. 그렇다면 result는 4의 값을 갖는가? 그렇지 않다. 그 이유는 함수로 보낸 인자들은 복사된 값이기 때문이다. 원본을 복사한 종이에 아무리 낙서해도 원본은 변하지 않는다.

그렇기 때문에 다음과 같이 포인터를 사용한다.

int main()

{

        int x, result;

        x = 2;

        square(x, &result);

}


void square(int a, int *k)

{

        *k = a * a;

}

위와 같이 포인터를 사용할 경우, 원본을 변경하는 것이기 때문에 result는 올바른 결과값인 4를 갖는다.(잘 모르겠다면 포인터를 공부할 것)


15. 정적함수

정적 변수와 유사하게 함수가 정의된 파일에서만 함수가 통용되고 외부에는 함수의 존재를 숨길 때 사용할 수 있다. 함수의 타입 앞에 static을 쓰면 정적함수가 된다.

static int func(int x, int y)

{      ...    }


16. C-언어에서 형 변경

char(1byte)형 변수 A의 데이터를 short(2byte)형 변수 B에 저장하는 경우를 고려해보자. 서로 형이 다르므로

B = (short)A;  //A=0x23일 때 B=0x0023

와 같이 형을 변경하여 저장하여야 한다. 반대의 경우

A = (char)B; //B=0x1223일 때 A=0x23

와 같이 상위 바이트의 데이터를 손실하게 된다.

형의 변경을 명시하지 않으면 컴파일러가 자동적으로 왼쪽 변수의 형으로 변경하여 데이터를 저장한다.

B = A;         //A값을 short형으로 변경 후 B에 저장.

서로 다른 형의 데이터를 연산하면 바이트 수를 크게 차지하는 변수의 형으로 변경하여 연산되고, 결과는 바이트 수를 가장 크게 차지하는 변수의 형이 된다. 즉 A+B의 연산의 결과는 A값을 short형으로 변경하여 계산되고, 그 결과 역시 short형이 된다.




17. 서식이 있는 출력 함수 (printf, sprintf)사용하기

함수의 끝 글자 f는 서식(formatted)을 뜻한다. 두 함수 모두 동일한 서식에 따라 인쇄를 한다. 단 인쇄를 하는 장치가 다를 뿐이다.

printf() - 디폴트 장치에 출력한다. PC에서 디폴트 장치는 화면을 말한다.

sprintf() - 주어진 문자열에 인쇄를 한다. 문자열은 인쇄에 필요한 충분한 메모리를 가져야 한다.

char buf[100];

sprintf(buf, “ABC”);             //buf에 문자열 “ABC”를 저장한다. 화면상에는 아무런 변화가 없다.

printf(“%s”, buf);               //buf 문자열을 출력한다. 이 과정에서 화면에 출력된다.


18. 배열과 포인터

C언어에서 배열을 선언하면 정의된 배열 개수만큼의 메모리를 할당하고 배열 이름에 할당된 메모리의 첫 주소를 저장한다.

short array[4]

array -> array[0] <=> *(array+0)

array[1] <=> *(array+1)

array[2] <=> *(array+2)

array[3] <=> *(array+3)


배열명 array는 첫 번째 short형 변수를 가리킨다. 배열의 이름은 첫 주소를 저장하므로 포인터이다.

array + 1 : 주소 array로부터 1-번째 있는 short형 변수의 주소

*(array+1) : 해당 위치를 역참조. 만일 array[] = “abc”라면 ‘b’ 출력. = array[1]

배열과 포인터는 동일하므로 함수에서 배열을 인자로 선언할 때는 두 가지를 쓸 수 있다.

void func(short *ary)

void func(short ary[])

배열은 첫 주소만 알면 각 배열 요소를 알 수 있으므로 함수에 배열을 넘기고자 할 때는 배열의 첫 주소, 즉 배열의 이름만 넘긴다.


19. 정수 계산에서 코딩에 따른 계산 정확도



20. 조건 연산자 exp1 ? exp2 : exp3

exp1가 참이면 exp2를 수행하고 거짓이면 exp3을 수행한다. 예를 들면 x=1, y=2 인 상황에서

k = (x>y) ? x : y

(x>y)는 거짓이므로 y를 수행한다. 따라서 k=y 즉 k=2가 된다.


21. 매크로 함수

매크로를 문장을 대체하는 용도로만 사용하지 않고, 함수와 유사하게 사용할 수 있다.

예를 들어 부호가 있는 변수의 절대값을 계산하는 문장을 고려해보자. 이는 조건 연산자를 사용하여 다음과 같이 표시할 수 있다.

y = a>=0 ? a : -a ;

이를 매크로 함수로 정의하면

#define ABS(x)       x >= 0 ? x : -x

이다. 따라서 y = a>=0 ? a : -a ; 대신 y = ABS(a); 로 간편하게 표시할 수 있다.

그러나 위의 매크로 함수는 문제점이 있다. 만일 y = ABS(a+1); 라는 문장을 실행시킨다면

y = a+1 >= 0 ? a+1 : -a+1 ; 과 같이 실행된다. 이러한 문제점을 해결하기 위하여 다음과 같이 정의해야 한다.

#define ABS(x)       (x) >= 0 ? (x) : -(x)

그러면  y = ABS(a+1); 는 y = (a+1) >= 0 ? (a+1) : -(a+1) ; 로 실행되어 올바른 계산을 수행한다.


22. typedef 키워드

새로운 데이터형을 정의할 때 사용하는 키워드.

typedef <기존 데이터형> <새 데이터형>;

예를 들어 unsigned long int 라는 데이터형은 너무 길어서 불편하다. 따라서

typedef unsigned long int ulong;         과 같이 줄여서 정의할 수 있다.


23. 스택(stack)

데이터를 임시로 저장하는 메모리 공간.

자동 변수는 함수가 호출되면 생겼다가 종료되면 사라짐. 따라서 함수가 수행되는 동안만 임시적으로 존재. 컴파일러는 자동 변수를 모두 스택에 할당한다. 프로그램에서 함수의 호출은 빈번히 일어나므로 스택은 속도가 빠른 내부 메모리 영역에 위치시키는 것이 일반적임.


교재 2장, 3장 1절, 21장 1절, 22장 2절, 27장 1절


2장 미리 알아두어야 할 일반적 사항

2.1 이진수/16진수의 계산. 십진수에서 이진수와 16진수로의 변환. 이진수와 16진수의 덧셈과 뺄셈.(인터넷 검색 이용)

2.2 데이터의 단위.

Bit : 이진수(Binary Digits)의 약자로서 0 또는 1을 가진다.

Nibble : 4비트. 개의 수를 표시할 수 있으므로 1자리의 16진수를 표현할 수 있다.

Byte : 8비트. 데이터의 크기를 표시하는 가장 기본적 단위.

Word : 2Byte. / Paragraph : 16Byte. / Page : 256Byte.

Kbyte : 일반적으로 Kilo는 배를 뜻하나, 컴퓨터에서 Kilo는 배를 가리킨다.

따라서 1Kbyte = 1024byte.

Mbyte : 일반적으로 Mega는 배를 뜻하나, 컴퓨터에서 Mega는 배를 가리킨다.

따라서 1Mbyte = 1024Kbyte.

Gbyte : 1Gbyte = 1024Mbyte.


2.3 데이터의 표시

최상위비트(MSB)

bit #7

bit #6

bit #5

bit #4

bit #3

bit #2

bit #1

bit #0

↑ 

  최하위 비트(LSB)


이진수로 표시하는 것이 바람직하나 숫자를 표시할 때 자리수가 매우 커져 사용하기에 불편하다. 컴퓨터에서는 16진수를 많이 사용한다. 한 바이트로 표시된 수는 여덟자리 이진수이므로 이를 16진수로 표시할 때 니블(4비트) 단위로 끊어서 표시하면 된다.

예를 들어 이진수

1

1

1

0

1

0

0

1

       E        |        9             

이므로 이다. (E : 1110, 9 : 1001)


2.4 보수를 사용한 음수의 표시

컴퓨터에서 신호는 1과 0만 사용하기 때문에 양수만 표현한다. 음수를 표현하기 위해서는 보수를 이용한다.


반응형

[OS]운영체제론 중간고사 - 문제 및 해설


1.   (12점)

A.      운영체제란 무엇인가?(6점)

운영체제란 하드웨어와 소프트웨어가 서로 잘 동작하도록 도와주는 소프트웨어이다. 또한 운영체제는 자원을 관리하고, 인터페이스를 제공하며, 응용 프로그램들을 동작하도록 돕는다.(내 답)

B.       멀티프로그래밍과 멀티프로세싱을 구분하시오.(6점)

멀티프로그래밍 시스템은 하나의 프로세서에 하나이상의 프로그램은 동시에 수행시킨다. 멀티프로그래밍 시스템은 여러 개의 프로그램을 메인 메모리에 저장해 놓고 프로세서를 여러개의 프로그램들 사이로 빠르게 스위치하여 프로그램을 동작시킨다. 멀티프로세싱시스템은 둘 이상의 프로세서를 가진 컴퓨터 시스템이다.

ᅟ멀티프로그래밍은 프로세서와 I/O 자원 이용률을 증진하기 위해 개발되었다. 멀티프로세싱은 실제로 프로그램을 병렬 수행하게 함으로써 처리 속도를 증가시키기 위한 노력으로 개발되었다.(교수님 답)

멀티프로그래밍은 CPU연산과 입출력 연산을 동시에 할 수 있다. 연산을 병행하여 수행하므로, 사용자가 느끼기에 연속적으로 처리하는 것처럼 보인다.

멀티프로세싱은 여러 개의 프로세스가 협력하여 하나 혹은 여러 프로그램을 동시에 수행한다. 따라서 아주 효율적인 시스템이라 할 수 있다.(내 답)

2.   (16점)

A.      사용자 모드, 커널모드와 특권 명령어를 최소권한원칙을 가지고 설명하시오.(8점)

만일 운영체제를 사용하는 모든 사용자가 운영체제의 모든 권한을 갖는다면, 고의적이거나 악의적인 명령어에 의해 시스템에 문제가 생길 수도 있다. 이를 방지하기 위해서 사용자 모드와 커널모드를 만들었다. 사용자 모드에서는 메모리 접근과 기타 주요한 데이터로의 접근을 금지한다. 이를 최소권한원칙이라 한다.

커널모드에서는 모든 명령어 사용과 메모리 접근이 가능하다.

특권 명령어란 커널모드에서만 접근할 수 있는 명령어를 뜻한다.(내 답)

B.       고급언어를 작성된 프로그램이 수행을 위해 어떤 과정을 거치는지 간략하게 설명하시오. 또한 절대 로더와 재배치가능한 로더를 비교하시오.(8점)

컴파일러에 의해 컴파일된다. 오브젝트에 의해 기계어로 번역된다. 다양한 모듈이 사용된다. 링커에 의해 모듈과 라이브러리들이 링크된다. 로더에 의해 상대적인 메모리 주소가 할당되고, 메모리 위에 적재되고 수행된다.

절대 로더는 프로그램과 데이터를 직접 링커 혹은 프로그래머가 지정한 메모리 주소에 위치하여 저장한다. 재배치가능한 로더는 적재(load)할 모듈의 상대적 주소를 메모리 블록내의 주소의 offset에 의해 결정된 절대적 주소로 변환한다. 절대 로더는 재배치가능한 로더보다 단순하고 빠르게 수행한다. 재배치가능한 로더는 보다 유연하기 때문에 메모리의 허비를 최소화한다. 재배치가능한 로딩은 절대 로딩보다 시스템 상에 더 많은 프로그램들을 허락한다.

절대 로딩은 중첩되는 주소들을 가진 2개의 프로그램은 동시에 수행될 수 없지만 재배치가능한 로딩은 그러한 문제는 없다. 재배치가능한 로딩은 메모리내의 프로그램에 어디에 위치할 것인지에 대해 프로그래머가 알 필요가 없다. 즉 프로그래밍을 좀 더 쉽게 만든다.(교수님 답)

3.   (10점)스레드와 프로세스의 정의를 하고 이들을 비교하여 설명하시오.

프로세스는 실행중인 프로그램이고, 스레드는 프로세스 안에서 나누어지는 작업 단위이다. 프로세스는 스레드에 비해 함수 호출 시 작업 속도가 빠르지만 Data 교환이 느리다. 프로세스는 메모리를 공유하지 않지만 스레드는 메모리를 공유하므로 이에 접근하여 발생할 수 있는 문제에 대해 잘 대비하여야 한다.(내 답)

4.   (프로세스)(24점)

A.      신호와 메시지 교환 방법을 사용하여 프로세스간 통신(IPC)을 비교하시오.(8점)

신호는 이벤트가 발생하였다는 것을 다른 프로세스에게 알려주는 단순하고 효율적인 방법이다. 그러나 신호는 데이터를 보낼 수 없기 때문에 신호가 다른 프로세스에게 보낼 수 있는 정보의 양에 따라 프로세스에서 신호 사용이 제한된다. 또한 신호는 한 운영체제 내의 IPC에 제한된다.

메시지 교환은 하나의 프로세스가 많은 데이터를 다른 프로세스에게 전달하게 한다. 그러나 이 방법은 신호와 비교하면 상당한 오버헤드를 가진다. 즉 메시지를 위하여 메모리를 할당하고 송신자와 수신자의 이름과 위치를 알아야 하는 등의 오버헤드가 존재한다.(교수님 답)

B.       퀀텀의 크기를 정하는 일은 효율적인 운영체제를 만드는데 매우 중요하다. 매우 긴 시간을 사용할 경우에도 문제이고 매우 짧은 시간을 사용하는 경우에도 문제이다. 이러한 2 경우에 왜 문제가 생기는 지를 설명하시오. (8점)

퀀텀이 매우 길다면, 한 프로그램이 퀀텀동안 시스템을 독점하여 다른 프로세스들에게 빠른 응답을 하지 못하게 된다.

반대로 퀀텀이 매우 짧다면, 운영체제가 매우 많은 수의 문맥 교환을 하기 때문에 실제 프로그램 실행은 매우 더디게 된다. 즉, 한 퀀텀의 사용 시간을 비교하면 문맥 교환의 시간이 실제 프로그램 수행 시간보다 길 수 있기 때문에 효율적이지 못하고 실제 프로그램 수행 완료까지 오래 걸린다.(교수님 답)

C.       사용자 수준 스레드와 커널 수준 스레드와 그들의 조합 방법에 대해 설명하시오. (8점)

사용자 수준 스레드는 사용자 영역에서 스레드 연산을 수행한다. 특권 명령을 실행할 수 없거나 커널 프리미티브에 직접 접근할 수 없는 런타임 라이브러리가 스레드를 생성한다. 다대일 스레드 맵핑이로고도 한다. 멀티 스레드 프로세스 하나에 있는 모든 스레드에 실행 문맥 하나를 맵핑한다.

그림입니다.
원본 그림의 이름: clip_image001.png
원본 그림의 크기: 가로 1187pixel, 세로 651pixel

커널 수준 스레드는 각 스레드마다 고유한 실행 문맥을 맵핑하는 방법으로 사용자 수준 스레드의 한계를 해결했다. 일대일 스레드 맵핑이라고도 한다. 상호작용성이 증가하는 장점이 있다.

그림입니다.
원본 그림의 이름: clip_image003.png
원본 그림의 크기: 가로 1213pixel, 세로 627pixel

사용자 수준 스레드와 커널 수준 스레드의 조합을 수행하면 다대다 스레드 맵핑이 된다. 이 방식은 많은 사용자 수준 스레드를 한 그룹의 커널 스레드에 맵핑한다. 스레드 풀링을 통해 오버헤드 문제를 해결한다.(책 참고)

 그림입니다.
원본 그림의 이름: clip_image005.png
원본 그림의 크기: 가로 1197pixel, 세로 613pixel


5.   (10점) 몇 가지 독립적인 계산을 동시에 수행하는 알고리즘에 대해 스레드를 사용하는 경우와 사용하지 않는 경우 어느 쪽이 더 효율적인가? 이 질문에 답하기 어려운 이유는 무엇인가?

이 문제의 답은 스레드의 구현 방식과 시스템이 하나의 프로세스 혹은 다중 프로세스를 사용하느냐에 따라 다를 수 있다. 시스템이 다중프로세스 시스템이면 각 스레드가 각 독립적인 프로세서에서 수행된다면 스레드를 사용하는 함수는 매우 효율적일 수 있다. 그러나 시스템이 하나의 프로세서로 운영된다면 스레드를 생성하고 스레드간 문맥을 교환(Context switching)하는데 걸리는 추가적인 오버헤드 때문에 스레드를 사용하는 함수는 비효율적일 수 있다.(교수님 답)

만일 단일 프로세서를 이용하는 경우, 스레드를 사용해도 프로세서는 1개만 존재하므로 스레드를 사용하지 않는 경우보다 잦은 문맥교환이 일어나므로 비효율적이다. 그러나 멀티프로세서 환경인 경우, 스레드가 사용되면 시스템을 효율적으로 사용할 수 있다. 예를 들어 여러 서버에 대한 접속을 시도한 후 대기해야 하는 상황에서 스레드가 존재한다면 한 서버에 접속을 시도한 후 대기하는 동안 다른 스레드에게 CPU를 할당할 수 있다. 해당 질문에 대한 답변은 상황에 따라 달라질 수 있으므로 답하기가 어렵다.(내 답)

6.   (24점) (비동기식 병렬 수행)

A.      운영체제 커널에서 바이너리 세마포어와 바이너리 세마포어 연산을 구현하는 방법을 자세히 설명하시오. (8점)

커널은 세마포어의 값을 표현하도록 한 비트를 할당할 뿐만 아니라 세마포어에 블록된 스레드를 대기하도록 큐를 할당한다. 이러한 큐는 PCB들의 영결 리스트(linked list) 데이터 구조를 사용하여 구현될 수 있다.

스레드가 P 동작을 호출할 때 커널은 인터럽트를 비활성화시킨다. 세마포어 값이 0이면 스레드는 블록 큐의 끝에 추가된다.이 때 사용되는 블로 큐가 연결 리스트(linked list)구조를 사용한다. 그 후 인터럽트가 재활성화된다. 세마포어 값이 1이면 스레드는 새마포어 값을 0 로 설정하고 인터럽트를 재활성화한다. 다시 말하면 세마포어 값이 1이면 자원이 있는 상태이고 0이면 자원이 없는 상태이다.

스레드가 V 동작을 호출할 때 커널은 P 동작과 같이 먼저 인터럽트를 비활성화한다. 그리고 커널은 블록 큐가 비어 있는지를 확인한다. 만일 큐가 비어있다면(즉, 대기하고 있는 스레드가 없다면) 세마포어의 갑슬 1로 설정하고 인터럽트를 활성화시킨다. 만일 세마포어를 기다리고 있는 스레드가 있다면(즉, 큐에 스레드가 있다면) 커널은 블록 큐로부터 스레드를 꺼내어 (deque 시키고) 그 스레드를 준비 큐에 넣는다. 그리고 인터럽트를 재활성화 시킨다.(교수님 답)

B.       단일 프로세서 시스템에서 상호배제 프리미티브를 구현할 때, 인터럽트를 활성화하고 비활성화하는 이유를 설명하시오. (8점)

실제로 상호배제 기능을 구현하는 것은 매우 직선적이다. 스레드가 enterMutualExclusion()을 수행할 때 모든 인터럽트는 비활성화된다. 그리고 스레드는 중요 영역을 인터럽트가 안 들어오는 상태에서 수행된다. 쓰레드가 exitMutualExclusion()를 수행할 때 인터럽트는 재활성화된다. 인터럽트를 비활성화시키지 않은 상태에서 중요 영역에 들어가는 경우, 인터럽트들에 의해 다른 스레드들이 수행되기 때문에 중요 영역을 수행하는 스레드의 수행 시간이 길어지기 때문에 다른 스레드들이 해당 중요 영역을 사용하기를 원할 때 많은 시간이 지연되는 문제가 있다.(교수님 답)

하나의 스레드가 임계 영역을 수행중일 때, 다른 스레드가 해당 영역을 접근하면 상호 배제가 이루어지지 않는다. 인터럽트에 의해 CPU 권한을 빼앗기지 않음으로써 상호 배제를 이룰 수 있다.(내 답)

C.       상호배제 프리미티브는 바쁜 대기나 블록킹을 사용하여 구현할 수 있다. 각 접근법의 적용 가능성과 상대적인 장점을 논의하시오. (8점)

이러한 2가지 방법은 장단점이 있기 때문에 응용에 맞게 사용되어야 한다. 바쁜 대기 방법으로써 스레드가 계속하여 작업을 수행할 수 있을 때까지(즉, 어떤 플래그가 설정될 때까지) 프로세서는 플래그를 계속 검사한다. 플래그가 설정될 때 만일 해당 프로세스가 실행 상태에 있다면 계속하여 수행한다. 그렇지 않다면(즉, 준비 상태이 있다면) 스레드는 실행상태가 되었을 때 동작을 계속한다. 이 방법의 문제는 해당 스레드가 계속하여 수행되기 전에 많은 시간을 지연된다면 프로세서는 시간을 허비하게 된다는 것이다. 블록 방법에서는 어떠한 프로세서 시간도 허비하지 않는다는 것이다. 스레드는 플래그를 검사하여 설정이 되어 있지 않았다면 프로세서 사용을 포기하고 즉시 블록 상태로 들어간다. 스레드가 계속하여 수행될 때(즉, 다른 스레드가 자원을 다 사용하고 반납할 때) 스레드 먼저 블록 상태를 준비 상태로 상태 전이를 하고 준비 큐의 앞에 그 스레드를 삽입하여 바로 바로 수행하게 한다. 실시간 응용에서는 스레드들이 바로 반응할 필요가 있다. 즉 자원이 반납되는 플래그가 설정되면 바로 즉시 해당 스레드가 동작되어야 한다. 스레드를 블록 상태에서 준비상태로 만들고 준비 큐에 넣는 것은 오버헤드 시간을 요구한다. 이는 실시간 응용에서는 알맞지 않을 수 있기 때문에 바쁜 대기 방법이 좋을 수 있다.(교수님 답)

바쁜 대기의 경우 플래그를 설정하여 해당 플래그를 지속적으로 검사한다. 그러나 이는 오직 해당 플래그를 확인하는 일에만 CPU를 사용하므로 비효율적이다. 블록킹의 경우 플래그를 검사하여 스레드가 사용할 자원이 없다고 판단되면 블록 상태로 만들어 블록 큐에 삽입한다. 사용할 자원이 생기면 준비상태로 스레드를 적재시킨 후 실행한다. 실시간 시스템의 경우 블록킹을 사용하면 스레드가 블록->준비->실행상태를 거치므로 시간이 걸린다. 그러므로 실시간 시스템의 경우 바쁜대기의 방법이 더 적절하다.(내 답)

7.   (5점)운영체제를 배우면 프로그래밍에 어떤 도움이 되는가?

운영체제를 공부함으로써 컴퓨터 구조를 파악할 수 있으므로 프로그래밍을 할 때 스레드와 프로세스를 더욱 효율적이고 정확하게 구성할 수 있다.(내 답)

8.   (20점)분산 시스템에서 여러 개의 컴퓨터에서 한 컴퓨터의 자원(예:데이터베이스, 프린터)을 사용하고자 하고 있다. 이러한 목표를 얻기 위해서는 어떠한 방법이 있는지 아는 범위내에서 설명하시오. 기본적으로 네트워크를 활용한다고 가정하고, 네트워크 프로그램은 주어진다고 생각하시오.(보너스 점수)

프로세서의 속도에 차이가 있을 경우 버퍼나 스풀링을 이용하여 속도 문제를 해결할 수 있다.(내 답, 5점 받음)

반응형

[OS]운영체제론 연습문제 8장 - 문제 및 해설

02 다음 각 문제를 어떤 수준의 스케줄러에서 결정해야 하는가?

a.   프로세서를 사용할 수 있을 때, 준비 상태 프로세스 중 어떤 프로세스에 프로세서를 할당할 것인가?

   -저수준 스케줄링

b.  디스크에 스풀되어 대기하는 일련의 배치 프로세스 중 어떤 것을 시작할 것인가?

-저수준 스케줄링

c.   프로세서에 대한 단기적인 부하를 줄이려면 어떤 프로세스를 일시 정지할 것인 것인가?

-중간 수준 스케줄링

d.  멀티프로그래밍의 균형을 유지하려면 입출력 중심이라고 알려진 일시 정지 프로세스 중 어떤 것을 활성화할 것인가?

-고수준 스케줄링

교수님 답

a. 스패(혹은 스케러)

b. 수준 쥴러

c. 간수준 케쥴러

d. 간수준 케쥴러


03 스케줄링 정책과 스케줄링 메커니즘의 차이를 설명하라.

스케줄링 정책은 시스템이 프로세스를 선택할 때, 어떤 기준-처리량을 최대화할 지, 자원 활용도를 최대화할 지, 공정성, 응답 시간, 우선순위 등-에 따라 선택을 할지를 결정하는 것이다. 스케줄링 정책에는 선점/비선점 스케줄링, 정적/동적 우선순위 스케줄링 등이 있다.

스케줄링 메커니즘은 스케줄링 정책들이 어떠한 메커니즘을 쓸 것인지-문맥 전환, 퀀텀 등-를 결정하는 것이다.

교수님 답

책은 쥴러의 수준에 사용어지는 혹은 집합다. 니즘은 책을 하는 실제 스템 SW다.


04 다음은 일반적인 스케줄링의 목표다. P391

a.   공평성 : 스케줄링 규칙이 유사한 프로세스들을 모두 동일하게 대우하고, 어떤 프로세스도 스케줄링 때문에 무기한 연기에 빠지지 않는다면 공평한 원칙이라고 할 수 있다. P393

b.  처리량 극대화 : 스케줄링 규칙은 단위 시간당 가능하면 많은 프로세스가 서비스를 받을 수 있도록 해야 한다.

c.   적정 시간 안에 반응을 얻는 대화식 사용자 수 극대화

d.  예측 가능성 : 유사한 시스템 부하 시에는 주어진 프로세스가 항상 비슷한 시간 동안 실행해야 한다.

e.  오버헤드 최소화

f.   자원 활용도의 균형 유지 : 스케줄링 메커니즘은 시스템 자원을 부지런히 사용하게 해야 한다.

g.  반응성과 자원 활용도 사이의 균형 유지

h.  무기한 연기 방지

i.   우선순위 준수

j.   핵심 자원을 보유한 프로세스에 우선권 부여

k.  오버헤드가 많은 프로세스에 낮은 수준의 서비스 제공

l.   시스템 부하가 커질 때도 점진적인 성능 저하 : 규모 확장성

위에서 열거한 목표 중 다음 각 사항에 직접 적용되는 것을 선택하라.

i.       특정 사용자가 특히 오랜 시간 동안 대기했다면, 해당 사용자에게 우선권을 준다.

-h. 무기한 연기 방지

ii.       직원 1,000명이 근무하는 회사에서 급여 계산을 수행하는 사용자가 있다. 이 사용자는 급여 계산 작업을 매주 일정한 시간 안에 수행하려고 한다.

-b. 처리량 극대화

iii.      시스템은 대부분의 장치를 바쁘게 활용할 수 있는 방향으로 프로세스를 적절하게 배분해야 한다.

-f. 자원 활용도의 균형 유지

iv.      시스템은 중요한 프로세스를 선호해야 한다.

-j. 핵심 자원을 보유한 프로세스에 우선권 부여.

v.       중요한 프로세스가 도착하더라도, 요구하는 자원을 중요하지 않은 다른 프로세스가 보유하고 있다고 해서 해당 프로세스를 앞지를 수는 없다.

-i. 우선순위 준수

vi.      시스템이 가장 바쁠 때 많은 프로세스를 관리하는 오버헤드 때문에 시스템이 다운되면 안 된다.

-k. 오버헤드가 많은 프로세스에 낮은 수준의 서비스 제공

vii.      시스템은 입출력 중심 프로세스를 선호해야 한다.

-i. 우선순위 준수

viii.     문맥 전환은 가능하면 빨리 수행해야 한다.

-e. 오버헤드 최소화

교수님 답

i. 무기한 연기 방지를 위해서는 h), 공평성을 위해서는 a), 예측 가능성을 위해서는 d)

ii. d)

iii. 자원활용도의 균형유지를 위해서는 f), 반응성과 자원활용도간 균형유지를 하기 위해서는 g)

iv. i)

v. j)

vi. l)

vii. c)

viii. e)


06 다음 사항이 올바른지 판단하고 답에 대한 이유를 설명하라.

a.   프로세서를 프로세스로부터 강제로 제거할 수 없다면, 해당 프로세스 스케줄링 규칙은 선점형이다.

올바르지 않다. 프로세스로부터 프로세서를 강제로 제거할 수 없는 스케줄링 규칙은 비선점형 스케줄링이다. 비선점형 스케줄링은 프로세스 수행이 완료될 때까지 대기하며 처리 시간을 예측할 수 있다는 장점이 있다.

b.  실시간 시스템은 대체로 선점형 프로세서 스케줄링을 사용한다.

올바르다. 선점형 프로세서 스케줄링은 우선순위가 높은 프로세스에 빨리 응답해야 하는 시스템에서 유용하다. 만일 실시간 시스템에서 인터럽트에 대해 제시간에 응답하지 않으면 큰 재앙을 초래할 수도 있다.

c.   시분할 시스템은 대체로 비선점형 프로세서 스케줄링을 사용한다.

올바르지 않다. 대화식 시분할 시스템에서는 선점형 스케줄링을 통해 각 사용자가 수용할 만한 반응 시간을 보장할 수 있다.

d.  처리 시간 예측은 비선점형 시스템보다는 선점형 시스템에서 더 용이하다.

올바르지 않다. 비선점형 스케줄링은 프로세스가 완료될 때까지 대기하므로 처리 시간을 예측할 수 있다.

e.  우선순위 구조의 한 가지 약점은 해당 시스템이 우선순위를 충실하게 지키지만 우선순위 자체가 무의미할 수도 있다는 점이다.

교수님 답

a. 짓. 형은 세서가 제적 프로스로 제거할 다는 것을 미한.

b. 참. 실시간 템의 공의 요건은 프로스의 데드인을 족시 력이. 능력은 비스에 응답을 빨리 하는 이다.

c. 짓, 로운 대하 빠른 답을 하기 서는 스케링을 한다. 

d. 짓. 점형 템에서 로세 프로서를 하면 때까지 작한. 즉,

다른 프로스들에 의해 반복으로 점되는 가능때문에 하는 측의 확실 .

e. . 템에서 선순위 정은 이다. 러나 우선 위를 키는 템에 서는 순위가 프로스가 사용 있을 때, 높은 순위의 로세스가 사용 요구 우를 해보. 우에는 순위가 거의 미해다.


09 데드라인 스케줄링이 복잡한 이유를 설명하라. P409

사용자들은 정확한 자원 요구량을 미리 제시해 해당 프로세스가 데드라인까지 완료할 수 있게 보장해야 한다. 이러한 정보는 얻기 어렵다.

시스템은 데드라인에 맞춰 프로세스를 실행하되 다른 사용자들에 대한 서비스에 심각한 악영향을 미치면 안 된다.

시스템은 데드라인이 될 때까지 자원 요구량을 철저하게 계획해야 한다. 새로운 프로세스들이 도착해 예상치 못한 자원들을 요청할 수도 있으므로 매우 어려운 일이다.

여러 데드라인 프로세스들이 한꺼번에 활성화되는 경우 스케줄링이 아주 복잡해진다.

데드라인 스케줄링이 요구하는 강도 높은 자원 관리는 상당한 오버헤드를 가져올 수도 있다.

교수님 답

다음의 내용 모르기 때문에 데드 쥴링 하는데 있어서 불확 한다.

- 프로세스의 수행시간

- 필요한 원의

작하서는 시스내에서 하는 시스템 측할 것이.

러한 문에 라인 스케링이 다. 역으로 러한 것들을 리할 있다면 드라인 케쥴 가능다.


10 대화식 사용자들에게 FIFO가 부적절한 프로세서 스케줄링이라는 점을 예를 들어 설명하라.

FIFO방식은 실행 시간이 긴 프로세스들 때문에 짧은 프로세스들이 오래 대기해야 하는 경우가 있다. 또한 중요하지 않은 프로세스 때문에 중요한 프로세스들이 오래 대기할 수 있다. 따라서 FIFO 방식은 사용자 입력에 대해 짧은 시간 안에 반응함을 보장할 수 없다. 그러므로 대화식 사용자들에게 FIFO는 부적절한 프로세서 스케줄링이다.

교수님 답

FIFO의 으로 로세 하면 로세 완료까지 작한 가정 . , 비선 조로써 한다. 조는 시스 미있는 답시간을 보장 못하게 한다. 로써 (혹은 시간이 긴) 세스가 하나의 로세서를 템에 어간 하자. 세스가 수행 다른 프로스들은 수행할 다. 페이 SNS 지를 내고하는 용자는 세스가 료할 이러한 용자 들에 대해 응할 .


11 [연습문제 8-10]의 답을 바탕으로, 라운드로빈 방식이 대화식 사용자들에게 더 나은스케줄링인 이유를 설명하라.

라운드로빈 방식은 FIFO 순서대로 디스패치하지만 퀀텀 시간 안에서만 수행한다. 이 방식은 적절한 반응 시간을 보장해야 하는 대화식 환경에서 효과적이다. 시스템은 효율적인 문맥 전환 메커니즘을 사용하고, 대기 프로세스를 메인 메모리에 유지해 선점 때문에 발생하는 오버헤드를 최소화해야 한다.

교수님 답

운드 식은 럭에 럽트 점형 조이. 시간이 로세스 로세들을 지연 . 로세들도 주기으로 세서의 권리를 얻기 문이. 자들은 좋은 답시 만큼 빈번 하게 로세들을 받는.


14 다음 각 항목에서 잘못된 점을 지적하라.

a.   SPF는 SRT보다 처리량을 늘릴 수 없다.

경우에 따라 SRT는 SPF보다 더 많은 오버헤드를 발생시킬 수 있다. 그러므로 SPF는 SRT보다 더 많은 양의 처리를 할 수 있다.

b.  SPF는 공평하다.

공평하다는 것은 스케줄링 규칙이 유사한 프로세스들을 모두 동일하게 대우하고, 어떤 프로세스도 스케줄링 때문에 무기한 연기에 빠지지 않는다는 것을 의미한다. SPF방식은 완료 시까지 실행 시간이 가장 짧을 것으로 예상하는 프로세스를 선택한다. 만일 실행 시간이 상대적으로 짧은 프로세스가 계속하여 도착한다면 상대적으로 긴 프로세스는 무기한 연기에 빠질 수 있다. 따라서 공평하다고 할 수 없다.

c.   프로세스가 짧을수록, 시스템은 더 나은 서비스를 제공해야 한다.

우선순위가 낮은 프로세스가 우선순위가 높은 프로세스에 할당해야 할 핵심 자원을 보유하고 있어서 해당 프로세스를 빨리 반납할 수 있게 하기 위하여 우선순위가 낮은 프로세스에 평소보다 더 긴 실행 시간을 허용하는 ‘우선순위 역전’ 기술을 쓰는 경우가 아닌 한, 시스템은 짧은 프로세스에 굳이 더 나은 서비스를 제공해야 할 이유는 없다. 스케줄링 방법에 따라 짧은 프로세스가 더 높은 우선순위를 가질 수도 있지만, 그렇지 않은 경우도 있으므로 반드시 짧은 프로세스에게 더 나은 서비스를 제공해야 하는 것은 아니다.

d.  SPF는 짧은 프로세스를 선호하므로 시분할 시스템에서 유용하다.

SPF는 프로세스의 예상 종료 시간을 예측할 수 없다. 적절한 반응 시간을 보장해야 하는 환경에서는 부적합하다.

교수님 답

a. SRT는 점에 드는 오버드시 하기 문에 세스 시간이 짧을 SPF가 량이 많을 다.

b. 프로스들이 동작 서대로 서비되지 는다. 수행 간이 프로스들은 짧은 스가 먼저 비스 떄문에 다려야 다.

c. 템에 빠른 응답 간을 장하기 위해 적인. 세스의 대적인 중요(우선 )와 다른 항들을 시한 이다. 분의 세스 높은 선순 하지 어떤 로세들은 하게 긴급 스될 있다. 예가 데드 쥴링데, 여기서는 드라 왔지만 족할 진행을 하지 못한 프로스는 우선위를 당받 시간을 소비 한다.

d. SPF는 선점형 쥴링 책이 화식 용자가 시간을 있다. SPF가 완료까지 계속 만들기 문이.

22 스케줄링 정책의 두 가지 공통적인 목적은 반응 시간을 최소화하고 자원 활용도를 극대화하는 것이다.

a.   이 두 가지 목적이 어떻게 상충하는지 설명하라. P392

반응 시간을 최소화하려면 언제든지 사용할 수 있는 충분한 자원을 보유하면 된다. 그러나 이 전략을 사용하면 자원 활용도가 떨어진다.

b.  이 장에서 제시한 스케줄링 정책을 이 두 가지 관점에서 분석하라. 사용자의 반응 시간에 편중된 정책은 어떤 것인가? 자원 활용도를 극대화하는 방향으로 편중된 정책은 어떤 것인가?

사용자의 반응 시간을 최소화하기 위해선 선점형이어야 한다. 따라서 반응 시간에 편중된 정책은 라운드로빈 방식이다.

자원 활용도를 극대화하기 위해선 프로세서가 노는 시간 없이 동작하는 것을 말한다. 자원 활용도 극대화에 편중된 정책은 SPF이다.

c.   두 가지 상충하는 목적을 균형 있게 이룰 수 있는 시스템이 되도록 새로운 스케줄링 정책을 개발하라.

자원을 적절히 활용하면서도 사용자의 반응 시간을 최소화하려면 다중 큐를 이용한 이기적 라운드로빈 방식을 들 수 있다.

교수님 답

a. 수행간이 짧은 프로스가 주요 장치 사용 다면, 세스 빠른 응답간을 하더 자원 도는 매우 것이.

b. 조는 빠른 반응간을 보장는데 I/O 프로스들의 도를 공한. 짧은 서비스 시간을 요구 세스 모든 장치 대해 항상 하게 되지 않기문에 어떤 치들은 활용 낮을 .

공유 스케러는 보다 나은 용률을 공한. 프로 간이 순위 프로스의 행시간 다양한 장치 공유 공평 내에 쉽에 하여 되기 이다.

c. 자원 도를 형있게 하기 활용 들을 사용 로세들에게 우선위를 여준. 우선 순위 룹내 짧은 요구를 원하는 프로스에게 우선 주게 로써 먼저 행하 한다.


27 EDF와 SPF를 비교, 대조하라.

EDF는 최단 데드라인 우선 스케줄링 정책으로써 데드라인이 가장 임박한 프로세스를 디스패치하는 선점형 스케줄링이다.

SPF는 최단 프로세스 우선 스케줄링 정책으로써 비선점형이다. 실행 시간이 가장 짧을 것으로 예상하는 프로세스를 선택하여 실행한다. FIFO보다는 평균 대기 시간이 감소하지만 종료 시간을 예측하기가 어렵다.

EDF는 선점형인데 반하여 SPF는 비선점형이다. EDF는 데드라인이 가장 이른 프로세스를 먼저 스케줄링하고, SPF는 실행 시간이 가장 짧을 것으로 예상되는 프로세스를 먼저 스케줄링한다. 두 정책 모두 프로세스 완료 시간을 예측하기가 어렵다는 공통점이 있다.

교수님 답

   EDF와 SPF 모두 평균 소화 률을 최대하도록 하는 선점형 쥴링 알고즘이. EDF서는 처리 드라 하는 프세스 SPF에서는 처리 정의는 단위간당 되는 로세들의 수이.


28 정적 실시간 스케줄링 알고리즘이 동적 실시간 스케줄링 알고리즘보다 적절한 때는 언제인가?

하드 실시간 시스템은 프로세스가 데드라인을 철저히 지키도록 보장해야 한다. 정적 스케줄링 알고리즘은 특정 시스템에 이러한 속성을 부여함은 물론 구현 오버헤드를 줄여준다.

교수님 답

정적 실시간 케쥴링 고리 선점형 하드어를 하지 않는 스템에 알맞다. 즉, 시스 그것의 모든 드라 함을 해야 하다는 것을 한다. 즉, 원을 공유 로운 프로스가 만들지지 않는 경우에 하다. 로세 들어 는다는 시간 스케링을 수행할 실제 수행 시작시 알고 있었던 프로스들을 제외 로운 로세 어져 행하지 다는 다.

고로 동적 실시간 케쥴링 고리 시간에 따라 세스의 선순 변할 하다.


29 썬에서 현재의 솔라리스 운영체제를 구현하기 전에 주로 워크스테이션으로 사용한썬 유닉스 시스템 70은 기본 우선순위를 할당하고, 우선순위를 조절함으로써 프로세스들을 스케줄링했다. 기본 우선순위는 최대 -20에서 최소 +20이었고, 중간 값은 0이었다. 우선순위 값은 시스템의 조건이 변함에 따라 조절되었다. 이 값들을 기본 우선순위 값에 더해 현재 우선순위 값을 계산했다. 그리고 현재 우선순위 값이 가장 높은 프로세스를 먼저 디스패치했다.

        우선순위 조절은 최근 프로세서 시간을 비교적 적게 사용한 프로세스들을 선호하는 경향이 강했다. 스케줄링 알고리즘은 동작 방식이 변하는 프로세스들이 이점을 얻도록 프로세서 사용 형태를 재빨리 ‘잊는다’. 알고리즘은 최근 5Xn초 동안의 프로세서 사용 현황을 90% 잊는다. n은 마지막 1분 동안의 실행 가능 프로세스 수의 평균이다. 이러한 프로세스 스케줄링 알고리즘과 관련해 다음 각 질문에 답하라.

a.   시스템 부하가 클 때와 작을 때 중 언제 프로세서 중심 프로세스를 선호하는가?

시스템 부하가 클 때 프로세서 중심 프로세스를 선호한다.

b.  입출력 중심 프로세스는 입출력 완료 후에 어떻게 즉시 실행할 수 있는가?

입출력 중심 프로세스는 프로세서를 잠시 사용하고 반납한다. 따라서 프로세서 시간을 비교적 적게 사용하므로 우선순위가 높아진다.

c.   프로세서 중심 프로세스가 무기한 연기될 위험이 있는가?

우선순위가 낮은 프로세스는 프로세서 시간을 비교적 적게 사용했으므로 우선순위가 점점 높아진다. 따라서 무기한 연기될 위험이 크지 않다.

d.  시스템의 부하가 증가할 때 프로세서 중심 프로세스는 상호 작용 반응 시간에 어떤 영향을 미치는가?

부하가 증가하면 프로세서 중심 프로세스는 이따금씩 지연이 생길 수도 있다.

e.  이 알고리즘은 프로세스가 프로세서 중심에서 입출력 중심으로, 혹은 그 반대로 변할 때 어떻게 반응하는가?

교수님 답

a. 스템 작을때

b. 근의 세서 사용 하가 작게 다. 프로서를 바로 용할 .

c. 세스가 수행할 높은 순위를 얻을 때까지 알고즘은 최근의 프로세서 용한 것을 억하지 하기 무기한 기될 성은 .

d. 로세서 프로스들은 화식 세스보다 낮은 선순 가진. 그래서 화식 프로스들이 좋은 답시 . 세서 세스 끔씩 사용간인 퀀텀을 아서 한다. 프로 중심 프로스가 수록 많은 퀀텀이 된다. 이것은 대화식 용자에게는 응답간이 어지게 하는 . 물론 프로 중심 세스의 커지면 지점이 된다. 프로 중심 세스를 받지 . 라도 화식 자의 답시 시키지 않는. 고리에서는 합리 세서 하가 템상 화식 자에게 응답간을 동작 하였.

e. 알고즘은 “기억 실” 떄문에 조정다. 로세서 심에서 입출력 중심 시스 간동안 세스 중심 려하문에 약간 동작이 다. 에서 로세서 중심 퀀텀 세스에게 로세 많이 하게 다.


반응형

+ Recent posts