Boas. Tenho um projecto de SO para fazer, so que não sei como começar. Não venho pedir que façam por mim mas se possivel podiam me ajudar a compreender um exemplo de código fornecido pelo prof: http://comp.ist.utl.pt/ec-so/labs/exemplos/tabacaria.zip Dentro do zip existem varios ficheiros, eu entendo o que a maior parte faz, mas não percebo o que faz o auxiliar.c. Pq usam um processo auxiliar para kontrolar o processo fumador (ver dentro do zip)? Pq não ser a tabacaria a controlar esses semaforos? Agradecia ajuda urgentemente para ver se percebo como funciona o sistema de semaforos e avançar com o projecto. Obrigado.
com 170 alunos por ano, n csgs arranjar ng q te explique bem isso? pois eu bem te entendo lol.. em relação á dúvida em sí o auxiliar é só um ficheiro de exemplo, q penso q n tem nada a ver com o resto do prog
tem a ver pq é o que faz ligaçao do fumador ah tabacaria, mas não percebo pq tantas voltas. Não conheço ninguem com a cadeira que perceba disto Amanha devo encontrar por la alguem que possa chatear, so que como queria avançar alguma coisa hj, vim aqui
O objectivo disto e simples. garantir que as acções sao unicas. passando a explicar tens o auxiliar que garante que so o fumador ou a tabacaria acede ao ficheiro com o stock disponivel. tabacaria adiciona 1 fumador retira 1 tabacaria actualiza stock fumador actualiza stock se acontece isto ficas com informação errada no sistema, e com os semaforps garantes que só um acede ao "sistema", ficando "vermelho" para o outro "utilizador".
portanto, o fumador e tabacaria controlam os semaforos entre eles, e o auxiliar serve para controlar o estado das variaveis globais?
Pensa desta forma o auxiliar é o porteiro que te deixa entrar numa casa, mas nessa casa so pode estar uma pessoa de cada vez. Se a casa estiver vazia ele deixa-te entrar, se alguem tiver la dentro coloca o sinal a vermelho e mais ninguem entra, ate o outro sair, depois do outro sair o semaforo fica verde, e outra pessoa já pode entrar.
ai tens de ter um semaforo inicializado a 10.(tipo com um vector).. e vais decrementando a medida ke vao entrando e incrementando a medida ke vai saindo
E se não souber o tamanho de inicio? uma das koisas do projecto é: - um nr indefinido de processos estão à espera da ordem de um principal - o principal dá a ordem e os processos fazem tudo - quando terminam todos os processos, o principal faz outra coisa qqr. Neste momento arranjei uma maneira "ao desenrasca" em que uso um metodo que não me parece o ideal: uso uma opção que vi no man do semops em que o semaforo "deixa passar" se estiver a 0, e assim fico com um sem binário facil de controlar. Mas o problema é que nas aulas aprende-se o contrário e não tou a ver como fazer ao contrário :|
so se for comum semaforo e + uma variavel de condição... mas essa veriavel teria de estar em memoria partilhada pra poder ser acedida por varios processos, ou seja era mais um caso de exclusao mutua ke terias de implementar... mas tu tens a certeza ke o numero de processos com permisssao de entrada é dinâmico?
Sim, aquilo vai-se metendo processos a correr, os que calhar, e depois há um que dá ordem pa iniciarem, e por fim kuando todos acabarem esse principal faz outras coisas. Podes me dar um exemplo de como fazer isso do semaforo e variavel? eu sei como por a variavel a memoria partilhada. pensei em fazer algo do genero: Código: if(variavel == ze) assinalar(semaforo.init) e os outros processos iriam usar o espera(semaforo.init), mas ao fazer espera aquilo decrementa e assim so pode entrar um processo na mesma. Não tou a ver como mando todos ao mesmo tempo avançarem.
se bem percebi as funções : assinalar(semaforo.init) espera(semaforo.init) foram dadas pelos profs certo? nao sei como elas funcionam no entando posso recomendar-te uma exelente bibliografia aki: ESTG - Sistemas Operativos tens ta as descrições de como isso funciona mmo a pata e como funciona a sinalização de varios processos .. saca a parte de semaforos está exelente e tem la um exemplo parecido com o que keres
tks pela ajuda. Amanha vou ver esses pdfs. Quanto às funções não sao bem dadas pelos profs, mas é o que eles usam nos exemplos e nas aulas, so que os exemplos que eles deram são todos binários e não é isso que preciso
Curiosamente aqui na EST-Setúbal o projecto de SO também é semáforos. Isso mete threads e tal. Ai o que vale é que é so pó semestre que vem. E podemos implementar o projecto na linguagem que quisermos (normalmente é C# ou Java).
Pois, a mim o projecto é sobre mta m*rda, semaforos, sockets, mailboxs, pipes, sinais etc, mas pa começar tenho so a parte dos semáforos. Os vossos pdfs tão porreiros, tem o codigo o as coisas explicadas. A minha cadeira é um bocado mal dada, os acetatos têm uns topicos e algum codigo, nada explicado. E as aulas são às 8 da manhã que um gajo nem fixa nada.
por acaso aki na ESTG essas cadeiras são mto bem dadas... e fica-se a perceber as coisas, os pdf's e as listagem de codigo tb estão simples de perceber.. este ano tb andamos a dar semaforos e threads mas em Sistemas Distribuidos e Paralelos... é mto mais fixe, mete isso tudo e muito mais, vamos fazer um servidor em C, e depois clientes em java ... vai ser altamente
Boas. Continuo com o projecto, agora ando um bocado enrascado com mapeamento de ficheiro em memoria. Tenho o ficheiro com o seguinte formato: quantidade alimento estilo: 1 banana 10 ananas 1000 arroz etc, e ao mapear o ficheiro obtive uma string que corresponde ao ficheiro todo. Ora agora qual a forma mais eficiente de obter a quantidade e o nome? Optei por definir um tamanho fixo para cada linha e assim leio por exemplo 20 em 20 caracteres e daí saco o numero e defino o resto como a string. Mas isto parece-me pouco eficiente pois a string fica com os espaços até preencher os 20 caracteres. Alguma ideia luminosa?
while ((read = getline (&line, &len, file)) != -1) { linha = (char *) malloc (strlen (line) + 1); strcpy(linha,line); assim poes o ke les do getline na variavel linha, alocada dinamicamente... mas nada que um "man getline" n te explique melhor