Symbolic Constants

언어/C 2016. 2. 16. 17:10

COMPOSITION

#define   name   replacement text


name : same form as a variable name. a sequence of letters and digits that begins with a letter. conventionally written in upper case(capital letter).


no semicolon at the end of a #define line


advantage : easy to change in a systematic way


source : The C programming language

Posted by 知彼知己百戰不殆
,

CPU 스케줄링

OS 2016. 1. 19. 14:54

선점 스케줄링(Preemptive Scheduling)

CPU 스케줄링 결정은 다음의 네 가지 상황 하에서 발생할 수 있다.

1. 한 프로세스가 실행 상태에서 대기 상태로 전환될 때(입출력 요청이나 자식 프로세스가 종료되기를 기다리기 위해 wait를 호출할 때)

2. 프로세스가 실행 상태에서 준비 완료 상태로 전환될 때(인터럽트가 발생할 떄)

3. 프로세스가 대기 상태에서 준비 완료 상태로 전환될 때(입출력 종료시)

4. 프로세스가 종료할 때


상황 1과 4의 경우 스케줄링 면에서는 선태의 여지가 없음. 비선점(non-preemptive), 협조적(cooperative)

비선점 스케줄링 하에서는 CPU가 한 프로세스에 할당되면, 프로세스가 종료하든지 또는 대기 상태로 전환해 CPU를 방출할 때까지 CPU를 점유한다. 


선점 스케줄링의 단점 :

데이터가 다수의 프로세스에 의해 공유될 때 경쟁 조건을 초래할 수 있음. 대부분의 UNIX 버전을 포함하여 몇몇 운영체제들은 문맥 교환을 수행하기 전에 시스템콜이 완료되거나 입출력 요구에 따른 봉쇄가 일어나기를 기다리는 방법 사용.

그러나 이런 방법은 주어진 시간 안에 태스크의 실행이 완료되어야 하는 실시간 컴퓨팅을 지원하기에는 별로.


인터럽트는 어느 시점에서건 일어날 수 있고, 커널에 의해서 항상 무시될 수 없기 때문에, 인터럽트에 의해서 영향을 받는 코드 부분은 반드시 동시 사용으로부터 보호되어야 한다. OS는 거의 항상 인터럽트를 받아들여야 함. 그렇지 않으면 입력을 잃어버리거나 또는 출력이 겹쳐서 쓰여질 수 있음. 이러한 코드 부분은 진입점에서 인터럽트 불능화(자주 발생해서는 안됨), 출구에서 인터럽트 가능화 해야 함. 


디스패처(Dispatcher)

CPU의 제어를 단기 스케줄러가 선택한 프로세스에게 주는 모듈

-문맥을 교환하는 일

-사용자 모드로 전환하는 일

-프로그램을 다시 시작하기 위해 사용자 프로그램의 적절한 위치로 이동하는 일

디스패치는 모든 프로세스의 문맥 교환 시 호출되므로, 가능한 최고로 빨리 수행되어야 함


스케줄링 기준(Scheduling Criteria)

-CPU 이용률(utilization) : 최대한 CPU를 바쁘게 유지해야 함, 실제 시스템에선 40~90% 정도

-처리량(throughput) : 작업량 측정의 한 방법은 단위 시간당 완료된 프로세스의 개수 = 처리량

-총처리 시간(turnaround time) : 메모리에 들어가기 위해 기다리며 소비한 시간, 준비 완료 큐에서 대기한 시간, CPU에서 실행하는 시간, 입출력 시간을 합한 시간

-대기 시간(waiting time) : 준비 완료 큐에서 대기하면서 보낸 시간의 합

-응답 시간(response time) : 하나의 요구를 제출한 후 첫 번째 응답이 나올 때까지의 시간

CPU 이용률과 처리량을 최대화하고 총처리 시간, 대기 시간, 응답 시간을 최소화하는 것이 바람직.

'OS' 카테고리의 다른 글

interrupt, trap, exception에 대한 간단 명료 정의  (0) 2016.03.22
컴퓨터 시스템의 구성  (0) 2015.12.26
Posted by 知彼知己百戰不殆
,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct person
{
        char name[20];
        int age;
};
 
int main() {
        struct person blair;
        strcpy(blair.name, "blair");
        printf("구조체 blair의 이름:%s\n",blair.name);
}
 
cs

위 코드와

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct person
{
        char name[20];
        int age;
};
 
int main() {
        struct person blair={strcpy(blair.name, "blair")};
        printf("구조체 blair의 이름:%s\n",blair.name);
}
 
cs

차이점?


첫 번째 코드 : 구조체 변수를 선언해놓고 나중에 strcpy를 써서 문자열을 옮김

두 번째 코드 : 구조체 변수의 초기화

 => 구조체 배열의 초기화 과정에서는 strcpy 함수를 호출하지 않아도 됨


*참고*

구조체에 키보드로 부터 입력받을 때는 scanf같은 거 사용하면 됨








Posted by 知彼知己百戰不殆
,

구조체 : 하나 이상의 변수(포인터 변수와 배열 포함)를 묶어서 새로운 자료형을 정의하는 도구, 사용자가 새로운 자료형 정의 가능


구조체 변수의 선언

struct type_name val_name

구조체 변수 선언시 위처럼 struct선언을 추가해야 하며, 이어서 구조체 이름, 구조체 변수 이름을 선언해야 한다.


구조체 내부에 있는 변수 접근시

구조체 변수의 이름(val_name).구조체 멤버 이름



구조체 선언 방법

struct point      // 구조체 정의와 변수의 선언, 여기서 point는 int나 double처럼 자료형의 이름이 된다

{

   int xpos;

   int ypos;

} pos1, pos2, pos3;    이런 식으로 구조체를 정의함과 동시에 구조체 변수를 선언할 수도 있고


struct point     // 구조체의 정의, 여기서 point는 int나 double처럼 자료형의 이름이 된다

{

    int xpos;

    int ypos;

};

struct point pos1, pos2, pos3;   // 구조체 변수의 선언



구조체 배열

ex) struct point arr[3]; 이런 식으로 구조체 배열 선언

구조체 배열을 선언과 동시에 초기화 시 배열의 길이만큼 중괄호를 이용해서 초기화를 진행

ex) struct person arr[3]={

{"blair","290490"},{"Alice","39848"},{"Ryan","57839"} };



구조체 변수와 포인터

ex) struct point pos={11,12};

struct point * pptr = &pos; // 포인터 변수 pptr이 구조체 변수 pos를 가리킨다.

(*pptr).xpos = 10;  // pptr이 가리키는 구조체 변수의 멤버 xpos에 10 저장

(*pptr).ypos = 20;

(*pptr).xpos = 10 이 문장은 pptr -> xpos = 10; 이 문장과 동일하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
struct point {
    int xpos;
    int ypos;
};
 
struct circle {
    double radius;
    struct point * center;
};
 
int main() {
    struct point cen = {2,7};
    double rad = 5.5;
 
    struct circle ring = {rad, &cen};
    printf("Center Circle is [%d, %d]\n", (ring.center)->xpos, (ring.center)->ypos);
}
cs

위 코드에서 보면 circle 구조체 안에 구조체 포인터 center을 선언해놓고, 나중에 point형 구조체를 초기화 하면서 구조체의 주소값을 ring 구조체에 넘겨주었다. 즉, ring.center가 가리키는 값은 point형 구조체 cen이다.

*추가*  TYPE형 구조체 변수의 멤버로 TYPE형 포인터 변수를 둘 수 있다.


구조체 변수의 조소 값과 첫 번째 멤버의 주소 값

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
struct point
{
        int xpos;
        int ypos;
};
 
struct person {
        int name[1];
        int phoneNum[1];
        int age;
};
 
int main() {
        struct point pos={10,20};
        struct person man={1,1,21};
 
        printf("%p\n%p\n%p\n%p\n",&man, &man.name,&man.phoneNum,&man.age);
}
 
cs

 코드 결과값



그냥 우리가 익히 아는 주소값 개념 그대로 적용된다. 만약 int name[1]대신에 char name[20]이면 주소값이 20차이가 남



typedef 선언

typedef : 기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것을 목적으로 하는 선언

ex) typedef unsigned int * PTR_UINT; // unsigned int형 pointer을 PTR_UINT로 선언


구조체 배열의 초기화

struct person arr[2]={ 

{"김개똥","1234-1234",24},{"홍길동","1234-4234",28}

};


구조체 포인터

struct point pos = {11, 12};

struct point *pptr = &pos;

(*pptr).xpos = 10;  or  pptr->xpos=10; (*연산과 . 연산을 -> 연산으로 대신)


typedef 선언

기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것

ex) typedef int INT;     //int의 또 다른 이름 INT를 부여

typedef struct (point)<< 구조체 변수 이름인 point는 생략가능

{

int xpos;

int ypos;

} Point;

그리고 이렇게 되면 구조체 변수 이름인 point는 거의 쓰이지 않아서 생략이 가능하다. 다만 생략할 경우 struct point man; 이런 식으로 선언 못함


구조체도 call by reference가 가능하다.

typedef struct point

{

~~~~

} Point;

void OrgSymTrans(Point * ptr)

{

~~~~

}

int main() {

Point pos={7,-5};

OrgSymTrans(&pos);

}

Posted by 知彼知己百戰不殆
,

int atoi(const char * str);      문자열의 내용을 int형으로 변환

long atop(const, char * str);      문자열의 내용을 long형으로 변환

double atof(const char * str);      문자열의 내용을 double형으로 변환

Posted by 知彼知己百戰不殆
,

초보자들이 하는 실수:

char str1[]="123";

char str2[]="123";

if(str1==str2)

  printf("equal");

else

  printf("not equal");


이런 식의 문자열 비교는 배열 str1과 str2의 주소 값을 비교하는 것이다. 배열의 이름은 배열의 주소 값을 의미한다!


1
2
3
4
#include <string.h>
 
int strcmp(const char * s1, const char * s2);
int strncmp(const char * s1, const char * s2, size_t n);
cs

Tip~! 문자열 비교를 해보면 ABC와 ABD를 비교하고, printf를 찍어보면 C와 D의 아스키코드 차이값인 양수 1반환

ABC와 ABE를 비교해보면, 양수 2반환


strcmp("ABCD", "ABCDE"); 를 하면 널 문자도 비교 대상에 속하므로, E의 아스키코드 값이 널의 아스키 코드 0보다 크므로 음수가 반환된다.


Posted by 知彼知己百戰不殆
,
1
2
3
4
#include <string.h>
 
char * strcat(char * dest, const char * src);
char * strncat(char * dest, const char * src, size_t n);
cs

문자열을 뒤에 이어 붙일 때는 널문자가 입력된 그 부분부터 바로 문자열을 덧붙임

널 문자가 저장된 위치에서부터 복사가 진행되어야 덧붙임 이후에도 문자열의 끝에 하나의 널 문자만 존재하는 정상적인 문자열이 된다.

Posted by 知彼知己百戰不殆
,
1
2
3
4
#include <string.h>
 
char * strcpy(char * dest, const char * src);
char * strncpy(char * dest, const char * src, size_t n);
cs

strcpy는 널 값은 복사를 안하니까 sizeof같은 거로 최소값 잡아주고 마지막 값에는 0을 따로 넣어주어야 printf나 puts시 오류 안 생김

Posted by 知彼知己百戰不殆
,
1
2
3
#include <string.h>
 
size_t strlen(const char * s);
cs

전달된 문자열의 길이를 반환하되, 널 문자는 길이에 포함하지 않는다.

Posted by 知彼知己百戰不殆
,

컴퓨터 시스템의 구성

OS 2015. 12. 26. 18:39

소프트웨어는 시스템호출(system call 또는, 모니터 호출)이라 불리는 특별한 연산을 실행하여 인터럽트를 발생시킬 수 있다.

메모리 장치는 단지 일련의 메모리 주소만을 인식한다.

 

반도체 디스크(solid state disk) 위의 저장 시스템은 휘발성이다.

 

인터럽트 구동 방식의 입출력 : 디스크 입출력과 같은 대량의 데이터를 전송하는 데에는 높은 오버헤드 초래

해결? 직접 메모리 접근(Direct Memory Access, DMA) 장치 사용

 

 

대칭적 다중 처리(Symmetric MultiProcessing, SMP) : 가장 일반적인 다중 처리기 시스템

 

그림(SMP)에서 각 처리기가 자신의 레지스터 집합과 로컬 캐시를 갖는다. 하지만 모든 처리기는 메모리를 공유한다.

'OS' 카테고리의 다른 글

interrupt, trap, exception에 대한 간단 명료 정의  (0) 2016.03.22
CPU 스케줄링  (0) 2016.01.19
Posted by 知彼知己百戰不殆
,