운영 체제 - 은행가 알고리즘의 시뮬레이션 및 구현

1: 실험 주제

Banker's Algorithm의 시뮬레이션 및 구현

두 번째: 실험의 목적

(1) 프로세스의 동시 실행에 대해 자세히 알아보십시오.

(2) 프로세스 교착 상태에 대한 이해를 강화하고 안전 상태와 안전하지 않은 상태의 개념을 이해합니다.

(3) 교착 상태 문제를 피하기 위해 은행가의 알고리즘 사용을 마스터합니다.

3. 전반적인 설계(배경 지식 또는 기본 원리 및 알고리즘 또는 모듈 소개, 설계 단계 등 포함)

배경 지식 및 근거:

1. 프로세스의 동시 실행: 여러 프로세스가 동시에 실행되고 시스템 리소스를 공유하므로 리소스 경쟁 및 교착 상태 문제가 발생할 수 있습니다.

2. Deadlock: 프로세스가 리소스 경쟁으로 인해 무한 대기 상태에 빠지고 계속 실행할 수 없습니다.

3. 안전한 상태와 불안전한 상태: 안전한 상태는 시스템이 자원 할당 순서를 찾을 수 있어 모든 프로세스가 원활하게 완료될 수 있음을 의미하고, 안전하지 않은 상태는 그러한 할당 순서를 찾을 수 없음을 의미합니다.

은행가의 알고리즘 원리:

뱅커 알고리즘은 프로세스 교착 상태를 방지하는 데 사용되는 리소스 할당 전략입니다. 자원의 최대 요구량과 할당된 자원의 양을 기준으로 시스템이 안전한 상태인지를 판단하여 안전한 경우 자원을 할당하고 그렇지 않은 경우 대기한다.

설계 단계:

1. 프로세스 및 리소스의 데이터 구조 정의: 프로세스의 식별, 최대 요구량, 할당량 및 요구량, 리소스의 총량 및 가용량을 표시해야 합니다.

2. 뱅커 알고리즘의 안전 상태 확인 실현: 모든 프로세스를 통과하고, 자원 할당 프로세스를 시뮬레이션하고, 시스템이 안전한 상태인지 판단합니다.

3. 리소스 할당 전략 실현: 프로세스의 최대 수요 및 할당량에 따라 리소스를 할당하고 시스템 리소스 상태를 업데이트합니다.

넷. 상세 설계(주요 데이터 구조, 프로그램 흐름도, 키 코드 등 포함)

주요 데이터 구조:

프로세스 구조: 프로세스 식별, 최대 수요, 할당량 및 수요량과 같은 정보를 포함합니다.

자원 구조: 자원의 총량과 사용 가능한 양을 포함합니다.

*루프를 입력하여 사용자가 입력한 자원 요청을 수신하십시오.

*요청이 적법한지 판단하고 적법한 경우 리소스 할당을 시도합니다.

* 시스템이 보안 상태에 있는지 판단하기 위해 은행원 알고리즘에 따라 보안 상태를 확인하십시오.

* 시스템이 안전한 상태이면 리소스를 할당하고 시스템 상태를 업데이트합니다.

* 출력 할당 결과 및 시스템 상태.

데이터 구조

프로세스 수 n

리소스 클래스 수 m

사용 가능한 리소스 벡터 사용 가능

m개의 요소를 포함하는 배열이며 각 요소는 클래스에 사용할 수 있는 리소스 수를 나타냅니다. Available[j]=K이면 시스템에 Rj 유형의 리소스 K개가 있음을 의미합니다.

최대 수요 매트릭스 최대

m 유형의 자원에 대한 시스템의 n 프로세스 각각의 최대 요구량을 정의하는 n×m 행렬. Max[i,j]=K이면 프로세스 i가 필요로 하는 Rj 타입 자원의 최대 개수가 K임을 의미한다.

할당 매트릭스 할당

시스템의 각 리소스 유형에 대해 각 프로세스에 현재 할당된 리소스 수를 정의하는 n×m 행렬. Allocation[i,j]=K이면 프로세스 i에 할당된 Rj 타입 자원의 개수가 K임을 의미한다.

수요 매트릭스 필요

n×m 행렬은 각 프로세스에 여전히 필요한 다양한 리소스의 수를 나타내는 데 사용됩니다. Need[i,j]=K이면 프로세스 i가 작업을 완료하기 위해 Rj 유형의 K 리소스가 여전히 필요함을 의미합니다.

필요[i,j]=최대[i,j]-할당[i,j]

보안 확인 알고리즘

두 개의 작업 벡터 설정

작업은 시스템에서 현재 사용 가능한 자원의 양을 기록하며 초기 값은 사용 가능입니다.

finish는 모든 프로세스가 실행되었는지 여부를 기록하며 초기 값은 길이가 n인 벡터이며 모든 값은 False입니다.

프로세스 집합에서 다음 조건을 만족하는 프로세스를 찾습니다.

완료 == 거짓;

필요 <= 작업;

찾으면 3으로 이동하고 그렇지 않으면 4로 이동합니다.

프로세스가 리소스를 획득했다고 가정하면 완료될 때까지 원활하게 실행되어 리소스를 해제할 수 있습니다.

작업 += 할당;

마침=참;

실행 2

모든 프로세스가 finish=True이면 안전함을 의미하고 그렇지 않으면 시스템이 안전하지 않습니다.

*사용자는 리소스 요청을 계속하거나 프로그램을 종료하도록 선택할 수 있습니다.

 

키 코드:

무효 초기()

{

    정수 i;

    정수 j;

    printf("프로세스 번호를 입력하세요:\n");

    scanf("%d",&n);

    printf("리소스 클래스 번호를 입력하세요:\n");

    scanf("%d",&m);    

    printf("사용 가능한 리소스 벡터를 입력하세요:\n");

    사용 가능 = (int*)malloc(sizeof(int)*m);

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

        scanf("%d",&Available[i]);

    printf("최대 수요 행렬을 입력하세요:\n");

    최대 = (int**)malloc(sizeof(int*)*n);

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

    {

        Max[i] = (int*)malloc(sizeof(int)*m);

        for(j=0; j<m; j++)

            scanf("%d",&Max[i][j]);

    }

    printf("할당 행렬을 입력하세요:\n");

    할당 = (int**)malloc(sizeof(int*)*n);

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

    {

        Allocation[i] = (int*)malloc(sizeof(int)*m);

        for(j=0; j<m; j++)

            scanf("%d",&할당[i][j]);

    }

    필요 = (int**)malloc(sizeof(int*)*n);

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

    {

        Need[i] = (int *)malloc(sizeof(int)*m);

        for(j=0;j<m;j++)

            Need[i][j] = 최대[i][j] - 할당[i][j];

    }

}

무효 요청()

{

    정수 i,id;

    new_request = (요청*)malloc(sizeof(요청));

    new_request->req_src = (int*)malloc(sizeof(int)*m);

    printf("프로세스 ID를 입력하세요\n");

    scanf("%d",&id);

    new_request->id = id - 1;

    printf("프로세스 애플리케이션 리소스 벡터를 입력하세요\n");

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

        scanf("%d",&new_request->req_src[i]);

}

무효 프로세스()

{

    int i = new_request->id;

    if(vector_compare(필요[i],new_request->req_src,m))

        {

            if(vector_compare(사용 가능,new_request->req_src,m))

            {

                vector_sub(사용 가능,new_request->req_src,m);

                vector_add(할당[i],new_request->req_src,m);

                vector_sub(Need[i],new_request->req_src,m);

                safe_detect();

            }

            또 다른

            {

                printf("프로그램이 요청한 자원이 시스템의 현재 남은 자원보다 커서 실행을 연기합니다!\n");  

                반품;

            }

                              

        }

    또 다른

    {

        printf("프로그램이 요청한 자원이 프로그램이 요구한 자원보다 커서 실행할 수 없습니다!\n");

        반품;

    }    

    if(안전)

    {

        printf("시스템 보안, 프로세스 실행 가능!\n");

        반품;

    }

    또 다른

    {

        printf("시스템이 안전하지 않아 프로세스를 실행할 수 없습니다!\n");

        vector_add(사용 가능,new_request->req_src,m);

        vector_sub(할당[i],new_request->req_src,m);

        vector_add(Need[i],new_request->req_src,m);

        반품;

    }

        

}

부울 safe_detect()

{

    int *작업 = 사용 가능;

    bool *finish = (bool*)malloc(sizeof(bool)*n);

    정수 i;

    //완료 초기화

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

        finish[i] = 거짓;

    

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

    {

        if(finish[i]==False&&vector_compare(work,Need[i],m))

        {

            printf("프로세스 %d 실행 시도\n", i+1);

            vector_add(work,Allocation[i],m); //프로세스 실행을 시도하고 리소스를 해제합니다.

            finish[i] = 참;

            i = -1; //할당을 시도한 후 i++를 고려하여 처음부터 아직 실행 가능한 프로세스가 있는지 확인하므로 여기서는 -1

        }

    }

    

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

        if(완료[i]==거짓)

            부서지다;

    만약(i==n)

        안전 = 참;

    또 다른

        안전 = 거짓;

}

 

5: 실험 결과 및 분석

이 코드는 Banker 알고리즘의 안전 검사 부분을 구현합니다. 뱅커 알고리즘은 시스템이 교착 상태에 빠지는 것을 방지하기 위해 사용되는 자원 할당 및 스케줄링 알고리즘입니다. 모든 프로세스가 실행을 완료할 수 있도록 프로세스의 최대 리소스 요구 사항과 현재 사용 가능한 리소스를 미리 계산하여 안전한 시퀀스가 ​​있는지 판단합니다.

다음은 코드의 보안 검사 부분을 분석한 것입니다.

1. safe_detect() 함수는 보안 검사에 사용됩니다. 현재 시스템에서 사용할 수 있는 리소스 벡터 사용 가능, 프로세스의 최대 수요 매트릭스 Max 및 할당 매트릭스 Allocation을 입력으로 받아들입니다.

2. 작업 벡터와 프로세스의 완료 상태를 기록하기 위해 함수 내부에 보조 배열 work와 Boolean 배열 finish가 생성됩니다.

3. 완료 배열을 초기화하고 모든 프로세스의 완료 상태를 False로 초기화합니다.

4. 보안 검사의 기본 논리는 루프 순회입니다. 각 프로세스 i에 대해 완료 상태가 False이고 현재 사용 가능한 리소스 작업이 프로세스 i의 수요 벡터 Need[i]보다 크거나 같다고 판단합니다. 조건이 만족되면 프로세스 i가 실행될 수 있음을 의미합니다. 즉, 프로세스 실행을 시도하고 해당 리소스를 해제합니다.

5. 프로세스 i의 실행을 시도한 후 프로세스 i의 완료 상태를 True로 설정하고 프로세스 i에 할당된 자원의 양만큼 가용 자원 벡터 작업량을 늘립니다.

6. 조건을 충족하는 프로세스가 없거나 모든 프로세스가 완료된 것으로 표시될 때까지 시작 부분으로 돌아가 조건을 충족하는 다음 프로세스를 계속 검색합니다.

마지막으로 모든 프로세스가 완료된 것으로 표시되는지 확인하십시오. 그렇다면 시스템은 안전한 것으로 간주되고 변수 safe는 True로 설정되고, 그렇지 않으면 safe는 False로 설정됩니다.

실험에서는 다양한 프로세스 및 리소스 상황을 시뮬레이션하여 테스트할 수 있습니다. 입력 프로세스 리소스 요청에 따라 시스템은 은행가의 알고리즘에 따라 리소스를 할당하고 할당 결과 및 시스템 상태를 출력합니다. 시스템이 안전한 상태인지 여부와 리소스 할당을 관찰할 수 있습니다.

6. 요약 및 경험

이 실험을 통해 프로세스의 동시 실행과 교착 상태 문제를 더 잘 이해하고 은행원 알고리즘의 원리와 구현을 배웠습니다. 실제 코딩을 통해 Banker의 알고리즘을 구현하여 알고리즘에 대한 이해를 높이고 프로그래밍 능력을 향상시킵니다. 동시에 실험 과정을 통해 리소스 경쟁 및 보안 상태의 개념에 대해 더 깊이 이해하고 교착 상태 문제를 피하는 방법에 대한 명확한 아이디어를 갖게 되었습니다. 실험 결과를 분석함으로써 시스템의 보안성과 자원 할당 전략의 유효성을 더 잘 평가할 수 있어 실제 시스템 설계 및 개발에 유용한 경험을 제공합니다.

추천

출처blog.csdn.net/CSH__/article/details/131382772