Os processadores Intel da família x86 costumam dar a possibilidade e o programador criar sub-rotinas em Assembly (procedimentos ou funções). Para isso, o programador deve conhecer muito bem a arquitetura e organização do computador. A programação de computadores em linguagem de baixo nível exige que saibamos como manipular dados em memória respeitando as regras de inserção e remoção impostas pela estrutura de dados conhecida como pilha. Segundo Silberchartz (2011), um programa possui quatro áreas principais, em memória, a saber: seção de texto, seção e dados, heap e pilha. A figura abaixo ilustra a estrutura de um processo em memória principal.
SILBERSCHATZ, Abraham. Fundamentos de Sistemas Operacionais. 8. ed. Rio de Janeiro: LTC, 2011.
Considere que você é um desenvolvedor Open Source e está ajudando a comunidade de Sistema Operacional de Código aberto a desenvolver um algoritmo de gerenciamento da pilha em memória. Assim sendo, você decide criar um programa que simule condições semelhantes às de um Sistema Operacional que manipula a pilha.
Os dados a serem armazenados na pilha devem simular processos, sendo que cada elemento a empilhar/desempilhar deve possuir:
- O PID do cada processo (Process ID, é um código gerado automaticamente pelo sistema – cada processo tem seu próprio PID);
- O nome do programa/comando que gerou o processo.
O programa deve ter um menu principal em forma de laço de repetição que atenda aos seguintes requisitos:
- O menu sempre deve imprimir o conteúdo da pilha (da base em direção ao topo);
- Após a impressão do conteúdo da pilha, o usuário deve ser informado de que pode realizar as seguintes operações:
1) Inserir um elemento na pilha;
2) Remover um elemento da pilha;
3) Esvaziar a pilha;
0) Encerrar o programa.
A operação “Inserir um elemento na pilha” deve pedir para que o usuário informe o nome do programa ou comando que será empilhado. O programa deve associar um PID a esse nome automaticamente, e empilhar ambos os dados: PID + nome. Caso a pilha esteja cheia, o usuário deve receber uma mensagem informando: “Pilha cheia, impossível empilhar mais elementos.”.
A operação “Remover um elemento da pilha” tentar remover um elemento da pilha. Caso haja elemento para ser removido, o PID e o nome do elemento desempilhado devem ser impressos na tela. Caso não seja possível desempilhar elementos, o programa deve imprimir a mensagem “Pilha vazia, impossível desempilhar elementos.”, na tela.
A operação “Esvaziar a pilha” deve remover todos os elementos da pilha.
A operação “Encerrar programa” deve finalizar o processo.
Observação 1: o código-fonte deve ser escrito de forma a implementar estruturas de dados estáticas. Nesse caso, nossa pilha deverá ter, no máximo, 5 posições para armazenar elementos (tamanho igual a 5).
Observação 2: a correção será feita em ambiente de desenvolvimento Bloodshed Dev C++, portanto garanta que seu código-fonte esteja de acordo com a sintaxe do padrão C ANSI e, além disso, que seu programa compile em ambiente Dev C++. Os agentes de correção não farão modificações no código-fonte para que ele compile. Essa é uma responsabilidade do aluno!
A Minha Duvida nesse conteúdo e:
Como faço para criar esse PID.
- O PID do cada processo (Process ID, é um código gerado automaticamente pelo sistema – cada processo tem seu próprio PID);
- O nome do programa/comando que gerou o processo.
como que ficaria o comando em linguagem c para esvaziar toda a Pilha.
3) Esvaziar a pilha
Soluções para a tarefa
Resposta:
// PARA VOCÊS TREINAREM FIZ O EXERCÍCIO PARA RECEBER APENAS NÚMEROS, ENTÃO CABE A VOCÊS TRANSFORMAREM PARA RECEBER TEXTOS. ESPERO TER AJUDADO.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
// DEFININDO O TAMANHO
#define tamanho 5
//DECLARANDO A ESTRUTURA
typedef struct tipo_pilha{
int dados[tamanho];
int topo;
int ini;
}pilha_tipo;
// VARIÁVEIS GLOBAIS
tipo_pilha pilha;
int op;
//FUNÇÃO DE RETORNO PARA MOSTRAR A PILHA
void mostrar_pilha(){
int i;
printf("\nSua pilha: \n\n");
for ( i = 0; i < tamanho; i++ ){
printf("%d \n", pilha.dados[i]);
}
}
// FUNÇÃO DE RETORNO PARA RETORNAR O MENU
void mostrar_menu(){
printf("\n\n1 - Adicionar elemento na pilha.\n"
"2 - Excluir elemento da pilha.\n"
"3 - Esvaziar a pilha totalmente.\n"
"0 - Encerrar o programa.\n");
}
//FUNÇÃO PARA EMPILHAR OS ELEMENTOS
void empilhando(){
if ( pilha.topo == tamanho ){
printf("A pilha está cheia!");
system("pause");
}
else{
printf("\nDigite o elemento a ser empilhado: ");
scanf("%d", &pilha.dados[pilha.topo]);
pilha.topo++;
}
}
//FUNÇÃO PARA DESEMPILHAR OS ELEMENTOS
void desempilhando(){
if ( pilha.ini == pilha.topo ){
printf("A pilha está vazia!\n");
system("pause");
}
else{
pilha.dados[pilha.topo - 1] = 0;
pilha.topo --;
}
}
// FUNÇÃO PARA ESVAZIAR A PILHA
void esvaziar_pilha(){
int i;
if ( pilha.topo == pilha.ini ){
printf("A pilha já está vazia!\n\n");
system("pause");
}
else{
for ( i = 0; i < tamanho; i++){
pilha.dados[pilha.topo - 1] = 0;
pilha.topo --;
}
}
}
int main(){
setlocale(LC_ALL, "Portuguese");
pilha.topo = 0;
pilha.ini = 0;
op = 1;
while ( op != 0 ){
mostrar_pilha();
mostrar_menu();
printf("\nEscolha sua opcao: ");
scanf("%d", &op );
switch (op){
case 1:
empilhando();
break;
case 2:
desempilhando();
break;
case 3:
esvaziar_pilha();
break;
}
}
return (0);
}
Explicação:
Resposta:
alguém consegue passar a resposta?
Explicação:
não consegui fazer :(