Red de conocimiento informático - Aprendizaje de código fuente - Pregunta sobre el sistema operativo, los buenos puntos se sumarán a la puntuación, gracias gamba

Pregunta sobre el sistema operativo, los buenos puntos se sumarán a la puntuación, gracias gamba

/f?kz=588380474

/mqt_signature/blog/static/1049595722009429104343122/

O echa un vistazo a esto, pero lo necesitas

"Sistema operativo - Algoritmo bancario"

Informe de diseño del curso

1 Propósito del diseño del curso………………………………………… …… 1

2 Requisitos para el diseño del curso………………………………………… 1

3 Descripción de los temas de diseño del curso…… ………… ………………………………………… 2

4 Principios del algoritmo bancario en el diseño de cursos……………………………… 2

5 Análisis de la estructura del programa fuente e implementación del código……………………………… 4

6 Resumen del diseño del curso……………………………… ……… ……… 25

1. Propósito del diseño del curso

El sistema operativo es el software central del sistema informático y es responsable de controlar y gestionar los recursos de todo el sistema. y organizar a los usuarios Coordinar el uso de estos recursos para que la computadora funcione de manera eficiente. "Diseño del curso de sistemas operativos" es un complemento necesario del curso teórico "Sistemas operativos" y un medio importante para revisar y probar los cursos aprendidos. El propósito del diseño de este curso es aplicar de manera integral los conocimientos que los estudiantes han aprendido y profundizar su comprensión. de sistemas operativos a través de enlaces experimentales Comprender los principios básicos y los procesos de trabajo, mejorar la capacidad de los estudiantes para analizar y resolver problemas de forma independiente y mejorar la capacidad práctica de los estudiantes.

2. Requisitos para el diseño del curso

1. Analizar el contenido del diseño y brindar soluciones (explicar los principios de implementación del diseño y la estructura de datos utilizada).

2. Dibujar el diagrama de bloques estructural básico y el diagrama de flujo del programa.

3. Debe haber instrucciones detalladas de análisis de diseño para cada parte del programa.

4. El formato del código fuente debe estar estandarizado.

5. Diseñar casos de prueba apropiados y analizar los resultados de ejecución obtenidos.

6. Problemas encontrados en el diseño, experiencia en diseño.

7. Envíe el código completo del programa, los programas ejecutables y los informes de diseño del curso a tiempo.

3. Descripción del tema del diseño del curso

El algoritmo bancario es el algoritmo más representativo para evitar puntos muertos.

Para explicar el algoritmo del banquero, primero debemos explicar los estados seguro e inseguro del sistema operativo.

Estado seguro: Si existe una secuencia segura P1,...,Pn compuesta por todos los procesos del sistema, el sistema está en un estado seguro. El estado seguro debe ser que no se produzca ningún punto muerto.

Estado inseguro: No existe una secuencia segura. Un estado inseguro no conduce necesariamente a un punto muerto.

Entonces, ¿qué es una secuencia de seguridad?

Secuencia segura: Una secuencia de proceso {P1,...,Pn} es segura si para cada proceso Pi (1≤i≤n), la cantidad de recursos que necesitará en el futuro no supera el saldo restante actual del sistema. La cantidad de recursos y la suma de los recursos actualmente ocupados por todos los procesos Pj (j < i).

Algoritmo bancario:

Podemos pensar en el sistema operativo como un banquero. Los recursos administrados por el sistema operativo son equivalentes a los fondos administrados por el banquero. sistema para asignar recursos equivalentes a Para que los usuarios pidan dinero prestado a los banqueros. El sistema operativo asigna recursos al proceso de acuerdo con las reglas establecidas por el banquero. Cuando un proceso solicita recursos por primera vez, prueba la demanda máxima de recursos del proceso. Si los recursos existentes del sistema pueden satisfacer su demanda máxima. se asignará de acuerdo con el monto de la solicitud actual, de lo contrario se difiere la asignación. Cuando un proceso continúa solicitando recursos durante la ejecución, primero se prueba si la suma de la cantidad de recursos ocupados por el proceso y la cantidad de recursos solicitados esta vez excede la demanda máxima de recursos por parte del proceso. Si excede, rechace asignar recursos. Si no excede, entonces pruebe si los recursos existentes del sistema pueden cumplir con la cantidad máxima de recursos requeridos por el proceso. Si se puede satisfacer, los recursos se asignarán de acuerdo con el. importe de la solicitud actual. De lo contrario, la asignación también se pospondrá.

4. Principios del algoritmo bancario en el diseño de cursos

1. La idea del algoritmo bancario

Primero realice una verificación de legalidad de la solicitud del usuario, es decir, verifique si la solicitud no es mayor de lo que se necesita y si no es mayor de lo que es. disponible. Si la solicitud es legítima, se realizará una asignación de prueba. Finalmente, se llama al algoritmo de verificación de seguridad para realizar verificaciones de seguridad en el estado después de la asignación de prueba. Si es seguro, asigne; de ​​lo contrario, no asigne, restablezca el estado original y rechace la solicitud.

2. La estructura de datos principal utilizada en el algoritmo bancario

Vector de recursos disponibles int Disponible[j] j es el tipo de recurso.

Matriz de demanda máxima int Max[i][j] i es el número de procesos.

Matriz de asignación int Allocation[i][j]

Matriz de demanda int need[i][j]= Max[i][j]- Asignación[i][j]

El número de recursos solicitados int Request i[j] El número de recursos j solicitados por el proceso i

Vector de trabajo int Work[x] int Finish[y]

3. Algoritmo bancario bank()

El proceso i emite una solicitud para solicitar k recursos j, Solicitud i[j]=k

(1) Verifique si el monto de la solicitud no es mayor que la demanda: Solicitud i [j] <= necesidad [i, j], si no se cumplen las condiciones y se vuelven a ingresar, la solicitud no puede exceder la demanda.

(2) Verifique si el monto de la solicitud es menor que la cantidad de recursos disponibles en el sistema: Solicite i[j]<=disponible[i,j]. falla, bloquea el proceso y usa goto La declaración salta a volver a solicitar recursos.

(3) Si se cumplen las dos condiciones anteriores, el sistema asignará tentativamente recursos al proceso solicitante y modificará los valores en la siguiente estructura de datos:

Disponible[i] , j]= Disponible[i,j]- Solicitar i[j];

Asignación[i][j]= Asignación[i][j]+ Solicitar i[j];

necesidad[i][j]= necesidad[i][j]- Solicitar i[j];

(4) Después de la asignación de prueba, realice una verificación de seguridad y llame a la función segura() para verificar esto Si el sistema está en un estado seguro después de la asignación de recursos secundarios. Si es seguro, los recursos se asignarán oficialmente al proceso; de lo contrario, esta asignación de prueba se invalidará, se restaurará el estado de asignación de recursos original y el proceso esperará.

(5) Utilice la instrucción de bucle do{…} while para ingresar el carácter y/n para determinar si se debe continuar con la aplicación de recursos.

4. Algoritmo de verificación de seguridad (función segura ())

(1) Establezca dos vectores:

Vector de trabajo Trabajo, que indica que el sistema puede proporcionar varios tipos de procesos necesarios para continuar ejecutando Número de recursos, Trabajo= Disponible, al inicio de la ejecución del algoritmo de seguridad.

Finalizar, que indica si el sistema tiene suficientes recursos asignados al proceso para completar su operación. Al principio, haga Finish[i]=0; cuando se asignen suficientes recursos al proceso, establezca Finish[i]=1.

(2) Encuentre procesos que cumplan las siguientes condiciones en el proceso:

Condición 1: Finalizar[i]=0

Condición 2: necesitar[; i ][j]<=Work[j]

Si lo encuentra, ejecute el paso (3); de lo contrario, ejecute el paso (4)

(3) Después de que el proceso obtenga el recurso; , se puede ejecutar sin problemas hasta que se complete y se liberen los recursos asignados, por lo que se debe ejecutar:

Trabajo[j]= Trabajo[j]+ Asignación[i][j] ;

Finish[i]=1;

vaya al paso 2;

(4) Si se cumplen todos los Finish[i]=1, significa que el sistema está en un estado seguro; de lo contrario, en una condición insegura.

5. Análisis de la estructura del programa fuente e implementación del código

1. Estructura del programa

El programa *** tiene las siguientes cinco partes:

(1) Inicialización chushihua(): se utiliza para inicializar el programa para iniciar los datos de entrada: número de procesos, tipos de recursos, la cantidad disponible de varios recursos, la cantidad asignada de varios recursos para cada proceso, la demanda máxima de varios recursos por cada proceso, etc.

(2). Verificación de seguridad actual segura (): se utiliza para determinar la seguridad del estado actual y se procesa de manera diferente según las indicaciones de llamada en diferentes lugares.

(3). Banco del algoritmo Banker (): un módulo que simula e implementa el algoritmo Banker y llama a otros módulos para realizar el proceso de simulación del algoritmo Banker.

(4). Muestra el estado actual show(): muestra los detalles de asignación de recursos actuales, que incluyen: el número total de varios recursos (todos), el número actual de varios recursos disponibles en el sistema y qué ha obtenido cada proceso La cantidad de recursos y la cantidad de recursos que aún necesita cada proceso.

(5). El programa principal main()

Llame a las funciones de inicialización, estado de visualización, verificación de seguridad y algoritmo bancario una por una para que el programa avance de manera ordenada. .

2. Estructura de datos

Variables globales utilizadas por el programa:

const int x=10, y=10; //Definir constantes

int Disponible[x]; //Cantidad de varios recursos disponibles

int Allocation[y][y]; //El número actual de recursos asignados a cada proceso

int Max[y][y]; //El número máximo de requisitos para varios recursos por cada proceso

int Need[y][y]; //Matriz de demanda

int Request[x] //Solicitar cada Número de recursos de clase

int Work[x]; //Vector de trabajo, el sistema de tablas puede proporcionar la cantidad de diversos recursos necesarios para la operación del proceso

int Finish[y]; / Si el sistema de tablas tiene suficientes recursos para asignar al proceso, 0 significa no, 1 significa sí

int p[y] //Secuencia de seguridad de almacenamiento

int i,j; ; // Variables globales, utilizadas principalmente en declaraciones de bucle

int n,m; //n es el número de procesos, m es el número de tipos de recursos

int l=0 , contador=0;

3. Declaración de función

void chushihua(); //Función de inicialización del sistema

void safe(); //Función de algoritmo de seguridad

void bank(); Función del algoritmo bancario

void show (); // Genera la situación actual de asignación de recursos

4. Función principal main()

int main()

{

cout<<…… //Muestra el mensaje de inicio del programa

chushihua(); // Llamada a la función de inicialización

cout<

showdata() // Genera el estado inicializado

/ /===Determinar la seguridad del estado actual===

safe(); // Llamada a la función del algoritmo de seguridad

if (l

cout<<"\nEl estado actual no es seguro y no se puede aplicar. ¡¡¡El programa se cierra!!!!!"<

cout<

system; ("pausa");

sign(); // Llamar a la función de firma

return 0; // break; > else {

int i; //Variable local

l=0;

cout<<"\n¡¡¡Estado seguro!!!"<

cout<<"La secuencia de seguridad es: ";

cout<

for (i=1; i

cout<<"==>>"<<"Proceso"<<"("<

}

para (i= 0; i

cout<

}

bank(); // Llamada a la función del algoritmo bancario

return 0;

}

5. Diagrama de flujo del algoritmo bancario del sistema operativo:

p>

2. Código fuente:

#include

#include

#include

#include

//Definir variables globales

const int x=10,y=10 // Constante, fácil; para modificar

int Disponible[x] //Cantidad de cada recurso disponible

int Allocation[y][y] //Los recursos asignados actualmente de cada proceso Cantidad

p>

int Max[y][y]; //El número máximo de recursos requeridos por cada proceso

int Need[y][y] //Cuántos recursos aún se necesitan

int Request[x]; //¿Cuántos recursos solicitar?

int Work[x] //El vector de trabajo indica que el sistema puede proporcionar varios tipos de recursos necesarios para el proceso continuará ejecutándose. Número de recursos

int Finish[y]; //Indica si el sistema tiene suficientes recursos para asignar al proceso, 1 significa sí

int p[ y]; //Secuencia de seguridad de almacenamiento

int i,j; //i representa el proceso, j representa el recurso

int n,m //n es el número de proceso i , m es el número de tipos de recursos j

int l=0; //l se usa para registrar cuántos procesos tienen Finish[i]=1. Cuando l=n, significa que el estado del sistema. es seguro

int counter=0 ;

//Declaración de función

void chushihua() //Función de inicialización

void safe; (); //Algoritmo de seguridad

void show(); //Función muestra, estado actual de salida

void bank() //Algoritmo bancario

void jieshu(); //Finalizar función

p>

void chushihua()

{

cout<<"Ingrese el número de procesos: ";/ /Comience a ingresar datos relevantes a partir de ahora

cin >>n;

cout<<"Ingrese el número de tipos de recursos: ";

cin>> m;

cout<

for (j= 0; j

{

cout<<"Recursos de entrada"<

t;" Cantidad disponibleAvailable["<

cin>>Available[j]; //El proceso de ingresar números...

Trabajo [j]=Available[j]; //Inicializa el trabajo[j], su valor inicial es el número de recursos disponibles actualmente

}

cout<

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

{

for (j=0; j

{

cout<<" Entrada procesar "<

cin>>Asignación[i][j];

}

cout<

Finalizar[i]=0;//Inicializar Finalizar[i]

}

cout <

for ( i=0 ; i

{

para (j=0; j

{

cout <<" Ingrese el número máximo de requisitos para el recurso "<

cin>>Max[i][j];< / p>

if(Max[i][j]>=Allocation[i][j]) //Si la demanda máxima es mayor que la cantidad asignada, calcula la demanda

Necesidad[i ][ j] = Max[i][j]-Asignación[i][j];

else

Necesidad[i][j]=0;//Max es menos de lo asignado, dichos recursos son suficientes y no se requiere ninguna solicitud adicional

}

cout<

}

cout << endl<<"Inicialización completada"<

}

//Función de algoritmo de seguridad

void safe()

{

l=0;

for (i=0; i

{ //i++

if (Finish[i]==0)

{ //Encuentra la condición de proceso 1 de Finish[i]==0 una por una

counter=0;

for (j=0; j

{

if (Trabajo[j]>=Necesidad[i][j]) contador=contador+1;/ /Disponible es mayor que la demanda, cuenta

}

if(counter==m) //Cada tipo de recurso de i proceso se ajusta a Trabajo[j]>=Necesidad[i ][ j] Condición 2

{

p[l]=i; //Secuencia de seguridad de almacenamiento

Finalizar[i]=1; bandera de proceso Para asignación

for (j=0; j

Trabajo[j]=Trabajo[j]+Allocation[i][j] // Liberar recursos

l=l+1; //Contando, hay L procesos que ahora son seguros. Cuando L=N, significa que se cumple la secuencia de seguridad

i=. -1; / /Comienza desde el primer proceso y continúa buscando procesos que cumplan las condiciones uno y dos

}

}

}

}

//Mostrar la función de estado actual

void show() //Función mostrar, muestra la situación actual de asignación de recursos

{

int i,j ; //Variables locales

int All[y]; //El número total de varios recursos

int L1;

cout< <"El estado actual es:"<

cout<<"El número total de varios recursos:"<

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

{

cout<<" recurso"<

All[j]=Available[j] ; //Cantidad total = disponible + asignado

para (i=0;i

cout<

}

cout<

for (j=0;j

cout<<" recurso"<

cout<

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

{

for (j=i;j

cout<

for(L1=0;L1

{

cout<<"Proceso "<&l

t;L1<<":";

for (j=i;j

cout<

}

}

cout<

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

{

for (j=i;j

cout<

for(L1=0;L1

{

cout<<"Proceso"<

for (j=i;j

cout<

}

}

}

//Banquero Función de algoritmo

void bank()

{

cout<

int k=0; //Se utiliza para ingresar el número de proceso

bool r=false; //El valor inicial es falso, ingrese Y para continuar con la aplicación y configúrelo en verdadero

do{ //Ingresar solicitud

cout<<"Ingresar al proceso de solicitud de recursos (0-"<

cin>>k;

cout<

while(k>n-1) // Manejo de errores de entrada

{

cout<

cout<

cin>>k;

cout<

}

cout <

for (j=0; j

{

do{ //do… ...ciclo while para determinar la situación de entrada de la aplicación

cout<<"Proceso"<

cin>>Solicitud[j];

cout<

if(Request[j]>Need[k][j]){ //Se produce un error cuando la solicitud es mayor que la demanda, solicitando volver a ingresar (la cantidad de préstamos no está permitida) exceder la demanda)

cout<<"¡La solicitud es mayor que la requerida!"<

cout<<"La cantidad del recurso solicitado"<

"<

cout<<"¡Vuelva a ingresar!"<

}

else //Primero determine si la aplicación es mayor que la demanda. Luego determine si la solicitud es mayor que la cantidad disponible

if(Request[j]>Available[j]){ //La solicitud es mayor que la cantidad disponible, debemos bloquear y espera?

cout<<"\nNo hay tantos recursos. El número de recursos disponibles actualmente "<

Finish[k]=0; //El proceso está esperando

goto ppp; //La instrucción goto salta para finalizar esto aplicación

}

} while(Solicitud[j]>Necesidad[k][j] //Solicitud[j]>Disponible[j]||

}

//Cambiar los valores de Avilable, Allocation y Need

para (j=0; j

Disponible[j] = Disponible[j]-Solicitud[j] ;

Asignación[k][j] = Asignación[k][j]+Solicitud[j];

Necesidad[k][j] = Necesidad[k][j ]-Solicitud[j];

Trabajo[j] = Disponible[j];

}

//Determinar la seguridad del estado actual

safe(); //Llamar a la función del algoritmo de seguridad

if (l

{

l=0;

cout<<"\nDespués de la asignación de prueba, el estado no es seguro, por lo que no se asignará. Restaure el estado original"<< endl;

//Restaurar datos

para (j=0; j

{

Disponible[j ] = Disponible[j]+Solicitud[j];

Asignación[ k][j] = Asignación[k][j]-Solicitud[j];

Necesidad[k ][j] = Necesidad[k][j]+Solicitud[j];

Trabajo[j] = Disponible[j];

}

for (i=0; i

Finish[ i]=0; //El proceso se establece en estado no asignado

}

else

{

l=0;

p>

cout<<"\n¡¡¡Solicitud de recursos exitosa!!!"<

for(j=0;j

{

if(Necesidad[k][j]==0);

else { //Si un recurso no se ha solicitado por completo, el proceso no se puede ejecutar y los recursos propios no se pueden liberar Recursos

l=1 //Establezca l en 1 como indicador de juicio<; /p><

p> break;

}

}

if(l!=1){ //El proceso se puede ejecutar, luego libera todos los recursos del proceso

for (j=0;j

Disponible[j]=Disponible[j]+Asignación[k][j];

Asignación[k][j]=0;

}

cout<<"¡El proceso ha obtenido todos los recursos necesarios y liberará todos los recursos que posee después de la ejecución!"<

}

l=0; //Restablecer a cero

cout<<"\n¡Estado seguro!"<

cout<<"La secuencia de seguridad es: ";

cout<

Finish[0]=0;

for (i=1; i

cout<<"==>>"<<"Proceso"<<"("<

Finalizar[i]=0; //Todo el proceso se establece en estado no asignado

}

cout<

}

show( ); // Muestra el estado actual

ppp: //La aplicación es mayor que la cantidad disponible, por lo que debe bloquearse y esperar para finalizar esta aplicación de recursos. La declaración GOTO salta aquí

.

cout<

char* b=new char //Ingrese y/n para determinar si continuar solicitando; <

cin>>b ;

cout<

cout<<"------------ -------------- ------------------"<

cout<< endl;

if(*b== 'y'||*b=='Y')

r=true;

else{

r=false; // Si la entrada no es Y, entonces Let R =false

jieshu(); // Llama a la función final

}

} while (r==true);

}

//Función final

void jieshu()

{

cout<

cout<<"\t\t Cálculo de demostración completado"<

cout<< endl<

}

//Función principal

int

main()

{

cout<

chushihua(); // Llamada a la función de inicialización

cout<

show(); //Salida del estado actual

safe ( ); //Juzga la seguridad del estado actual

si (l

{

cout<<"\nEl estado actual no es seguro, ¡solicitud rechazada!"<

cout<

devuelve 0;

}

else

{

int i; //variable local

l=0;

cout <

cout<<"Proceso"<<"("<

for (i=1; i>"<<"Proceso"<<"(" <

for (i=0; i

cout <

}

bank(); //Llamar a la función del algoritmo bancario

cout<<"\t\t Cálculo de demostración completado"<

return 0;

}

Resultados de la ejecución:

1. Resultados de la inicialización

2. Pruebe si la asignación de recursos del sistema es segura. Resultados:

6. Resumen del diseño del curso

Las características básicas del sistema operativo son la concurrencia y el *compartimiento. El sistema permite que se ejecuten múltiples procesos simultáneamente y compartan los recursos de software y hardware del sistema. Para maximizar el uso de los recursos del sistema informático, el sistema operativo debe adoptar una estrategia de asignación dinámica. Sin embargo, esto puede fácilmente causar un "punto muerto" debido a recursos insuficientes y una asignación incorrecta. El diseño de mi curso esta vez es utilizar el algoritmo bancario para evitar un "punto muerto". El algoritmo del banquero es un proceso de asignación de recursos para que la secuencia de asignación no provoque un punto muerto. La idea central de este algoritmo es: al asignar recursos de acuerdo con este método, siempre habrá un proceso después de cada asignación. Si se le permite ejecutarse solo, definitivamente obtendrá todos los recursos que necesita, es decir. , podrá finalizar, y dichos recursos podrán ser devueltos a su conclusión para satisfacer las necesidades de otros solicitantes.

Este programa se lleva a cabo según las ideas anteriores. Sin embargo, debido a la prisa, el diseño de este curso tiene las siguientes deficiencias: 1. No se pueden realizar operaciones concurrentes, es decir, cuando los recursos totales alcanzan la cantidad de recursos requeridos por varios procesos al mismo tiempo, estos procesos No se pueden realizar al mismo tiempo y solo se pueden ejecutar uno por uno. Los procesos se ejecutan de forma secuencial. 2. La secuencia del proceso de escaneo es única y solo se puede escanear en el orden en que llegan los procesos (es decir, número). La secuencia de seguridad resultante solo se puede generar en función de esta secuencia. 3. El número de procesos y recursos se limita a un máximo de diez.

4. Después de ejecutar el programa, la interfaz es deficiente. La cantidad de procesos, la cantidad de recursos necesarios, la cantidad de recursos asignados y la cantidad de recursos disponibles no se pueden entender claramente de un vistazo.

Aunque este curso se diseñó rápidamente, aún así aprendí muchos conocimientos prácticos. Además de tener una comprensión más profunda de este algoritmo, también revisé el lenguaje C y no recuerdo muchos puntos de conocimiento en el proceso, por lo que me gustaría agradecer a mis profesores y compañeros que me ayudaron en este proceso.

La idea final es: siempre que lo hagas tú mismo, puedes aprender conocimientos.

¡Gracias de nuevo a los profesores y compañeros que me han ayudado!