저번 포스팅 Critical section - 공유메모리 에서 pipe로 통신하는 방법 외에도 여러가지 방법이 있어서 그중, 공유메모리를 이용한 통신을 알아보도록 하자.

일단 기본적으로 프로세스간 통신을 위해 알아야 할 함수들이다.

 

int shmget(key_t key, size_t size, int shmflg); // key: 공유하는 키값, size:크기, shmflg:생성 및 접근, 성공하면 양의 정수, 실패 시 -1 리턴

 

shmflg 옵션들

1) IPC_CREATE

 

키에 해당하는 값이 없다면 새로 생성한다.

IPC_CREATE 값을 입력후 | 연산자를 덧붙여 허용권한 설정.

만약 있다면 무시하며, 접근권한을 설정해준다.

 

2)IPC_EXCL

 

공유 메모리가 이미 있다면 실패를 반환하고 접근 불가능.

이옵션을 제거해 주어야 기존 공유메모리에 접근할 수 있다.


void* shmat(int smId, const void* shm_addr, int flag); // smId:공유메모리 식별자, shm_addr:공유 메모리와 연결하고자 하는 프로세스 내부의 메모리.(프로그래머가 직접 정해주는 것보다 시스템에 의해 할당되는 것이 좋으므로 일반적으로 null(0)을 세팅) flag: 속성 설정(SHM_RND:공유메모리와 연결되는 프로세스 내부 어드레스를 시스템이 관리하도록 함 , SHM_RDONLY: 읽기 전용으로 메모리를 연결, SHM_REMAP:연결영역을 대체)
가상 메모리와 물리적메모리 영역을 연결해주는 함수.

int shmdt(const void* shm_addr);
프로세스가 작업을 끝내고 더 이상 메모리 공유가 필요 없을 때, 공유메모리와 연결된 프로세스 내부의 가상 메모리 연결을 해제.

 

공유메모리를 설정하면 공유메모리의 semid가 주어지는데 이 ID로 공유메모리를 식별하거나 찾아들어간다.

 

 

ipcs : 현재 공유메모리 보기.

ipcrm shm [shmid] : 공유메모리 제거.

 

간단한 예제를 보면서 사용법을 익히기로 한다.

 

shared.c

 

#include<stdio.h>
#include<stdlib.h>
#include<sys/shm.h>                //공유메모리 함수의 라이브러리

struct shared_use_st{               //some_text 배열을 공유메모리로 사용할 것임.
                int written_by_you;
                char some_text[2048];
};

int main()
{
        int shmid;
        void* shared_memory=(void*)0;
        int running=1;
        struct shared_use_st* shared_stuff;

        shmid = shmget((key_t)1234,sizeof(struct shared_use_st),0666 | IPC_CREAT);    

        //공유메모리생성
        if(shmid == -1){
                printf("Shmget Error\n");
                exit(1);
        }
        shared_memory = shmat(shmid,(void*)0,0);    //생성한 공유메모리를 shared_memory변수에 붙인다.
        if(shared_memory == (void*)-1)
        {
                printf("Shared_memory location Error\n");
                exit(1);
        }
        shared_stuff = (struct shared_use_st *)shared_memory;//형변환후 최종적으로 구조체를 공유메모리로 설정한다.
        shared_stuff->written_by_you = 0;
        while(running){
                if(shared_stuff->written_by_you)        //written_by_you ==1이면 입력받은내용이있으므로 출력후에 0으로 바꿔줌.
                {
                        printf("Wirten is : %s\n",shared_stuff->some_text);
                        sleep(rand()%4);
                        shared_stuff->written_by_you =0;
                        if(strncmp(shared_stuff->some_text,"end",3)==0)    // end를 입력하면 종료.
                                running=0;
                }
        }

        return 0;
}

 

 

shared1.c

 

#include<sys/shm.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct shared_use_st{
        int written_by_you;
        char some_text[2048];
};

int main()
{
        int running =1;
        void *shared_memory =(void *)0;
        struct shared_use_st* shared_stuff;
        char buffer[100];
        int shmid;

        shmid = shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);

        if(shmid==-1){
                printf("Shmid Error\n");
                exit(1);
        }
        shared_memory = shmat(shmid,(void*)0,0);
        if(shared_memory == (void*)-1)
        {
                printf("Shamt Error\n");
                exit(1);
        }
        printf("Memory located at %p\n",shared_memory);
        shared_stuff = (struct shared_use_st*)shared_memory;
        while(running)
        {
                while(shared_stuff->written_by_you==1)
                {
                        sleep(1);
                        printf("waiting for client...\n");
                }
                printf("Enter some text...\n");
                fgets(buffer,100,stdin);
                strncpy(shared_stuff->some_text,buffer,2048);
                shared_stuff->written_by_you=1;
                if(strncmp(buffer,"end",3)==0)
                {
                        running=0;
                }
        }
        return 0;
}

 

shared.c과 shared1.c가 서로 통신을 하면서 shared1.c에서 입력한 값을 shared.c에서  출력하게 끔하는 소스이다.

shm_com.h라는 라이브러리에 sturct shared_use_st구조체가 선언되어 있다는 것을 알게됬으나, Ubuntu 11.10버전에서는 이상하게 라이브러리가 존재하지 않아서 소스딴에서 전역변수로 넣어주었다. 공유메모리 어렵다 ...조금더 확실히 알고 가야할듯하다. 하지만 지금은 시험보기 3시간전ㅋㅋㅋㅋㅋㅋㅋㅋ

'O.S' 카테고리의 다른 글

Semaphore  (0) 2012.04.27
파일 디스크립터(File descriptor)  (0) 2012.04.24
Process Scheduling - Multilevel Queue scheduling,Multilevel feedback Queue Scheduling  (0) 2012.04.22
Process Scheduling  (0) 2012.04.19
Process Scheduling - Round_Robin  (0) 2012.04.19

Multilevel Queue scheduling

 

Multilevel Queue scheduuling은 기존의 FCFS or SJF or Priority의 방법은 Queue를 하나씩 두었던 반면에 이 Multilevel scheduling은 Queue를 여러개 두어 각각의 큐마다 우선순위를 두는 방식이다.

우선순위는 위의 System Process Queue가 가장 높고 밑의 Student Process가 가장낮다.

 

Multilevel Queue Scheduling은 각각의 큐가 서로다른 Priority를 가지고 있어서 기존의 Priority 알고리즘보다 조금 더 세밀한 프로세스의 관리가 가능하고 각각의 Queue마다 서로 다른 알고리즘 구현이 가능하다는 장점이 있지만, 프로세스가 한번 큐에 속하게 되면 다른 큐로 이동이 불가능 하다는 단점이 있다.  만약 student process에 대기중인 프로세스가 있지만, system Queue에 계속해서 프로세스가 들어온다면 student Queue에 있던 프로세스는 stavation 현상이 일어나게 된다.

※Stavation = 프로세스가 실행되지 못하게 계속 남게 되는 현상.

Priority 알고리즘에서는 Queue가 하나이기 때문에 Aging기법으로 해결하였으나, Multilevel Queue알고리즘에는 큐가 여러개이고 한번 속하면 다른 큐로 이동이 불가능 하기 때문에

 

Multilevel Feedback Queue Scheduling을 이용하여 문제를 해결하였다.

 

Multilevel Feedback Queue Scheduling

 

Multilevel Feedback Queue scheduling 은 위의 Multilevel Queue Scheduling 알고리즘을 확장한 개념으로, 프로세스가 큐를 이동할 수 있다는게 특징이다.

 

위처럼 Queue가 3개가 있다고 가정하자.

 

맨 위Queue의 우선순위가 가장 높고 맨밑의 우선순위가 가장낮다.

Multilevel feedback Queu Scheduling은 마지막큐를 제외하고는 time quantum을 두어서 실행시킨다.만일 첫번째 큐에 프로세스가 들어왔지만, 지정된 타임퀀텀내에 실행이 종료되지않으면 preemptive가 일어나게 되고 실행되던 프로세스는 두번째 Queue에 들어가게 된다. 만일, 두번째 Queue에서도 실행이 종료되지 않으면 마지막 FCFS Queue에 들어가게되며 실행이 종료된다.

하지만,  quantum=16인 Queue의 프로세스가 실행되던 도중에 첫번쨰 Queue에 프로세스가 들어오게 되면 Preemptive가 일어게 됨.

'O.S' 카테고리의 다른 글

파일 디스크립터(File descriptor)  (0) 2012.04.24
공유메모리 함수 - shmget , shmat , shmdt  (2) 2012.04.23
Process Scheduling  (0) 2012.04.19
Process Scheduling - Round_Robin  (0) 2012.04.19
Process Scheduling - Priority  (0) 2012.04.19

[Scheduling 기준척도]

 

 

CPU utilization  = CPU를 가능한 바쁘게 유지시키는지.

 

Turnaround time = 하나의 프로세스가 끝나는 시간.

 

Throughput = 시간 단위당 비슷한 프로세스가 몇개나 완료되는지.

 

Response Ratio(서비스시간+대기시간)/서비스시간 = 멀티태스크

 

Process Scheduling

 

CPU 스케쥴링 결정은 다음과 같은 네 가지의 경우에 발생 할 수 있다.

 

1. Process의 상태가 Runing -> Ready 상태로 전환 될때.

 

2. Process가 I/0 (입출력)요청을 하고 ready 상태로 전환 될때.

 

3. Process의 종료시.

 

4. Process의 상태가 Runing -> wait 상태로 전환 될 때.

다음과 같은 네가지 경우에서 3 ,4 상태의 경우 스케쥴링이 일어날 여지가 없지만, 1 ,2의 경우 프로세스를 임의로 상태를 전이시킬 수 있는데, 이러한 것을 Preemptive(선점)라 한다. 3 ,4의 경우에는 Nonpreemptive(비선점)라고 함.

nonpreemptive 스케줄링은 CPU에게 하나의 프로세스가 할당되면 그 프로세스가 I/O요청을 하여 빠져나오거나 종료 될 때까지 계속 프로세스를 실행 시키는 것이다.

preemptive스케줄링은 공유메모리 관련해서 문제가 일어난다.(프로세스의통신(공유메모리)참조.)

 

Process의 Scheduling에는 4가지 종류가 있는데

 

1. FCFS (First - come,First-serverd)

 

2. SJF (Shortest - Job - First)

 

3. Priority

 

4. Round - Robin

+ Recent posts