Jump to content

Threads


skiller10
 Share

Recommended Posts

Boas,

Alguém me consegue explicar ou indicar algum sitio onde aprender a trabalhar com threads.

Preciso de fazer o seguinte:

- Lançar um processo numa sandbox e que ao fim de X tempo, caso o processo não tenha terminado, seja terminado "à força".

- Preciso também de controlar a memória que esse processo pode utilizar, ou seja, se o processo atingir Y memório, o processo é terminado "à força".

Obrigado desde já a todos os que me conseguirem ajudar.

Cumprimentos,

skiller10

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Link to comment
Share on other sites

Se são processos, não são threads.

Se tiver mesmo que ser em C++, calculo que existam bibliotecas de alto nível para o efeito. Em C, usando a sempre fiável clib, em ambientes unix, tens aqui um excelente artigo do Rui Carlos que explica as práticas básicas típicas de aplicações multi-processo.

https://www.revista-programar.info/artigos/programacao-concorrente-em-ambientes-unix/

Link to comment
Share on other sites

Vai ser em ambiente linux.

Quanto ao clib, sabes alguns bons tutoriais onde aprender?

E quanto ao sandbox, como posso conseguir isso?

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Link to comment
Share on other sites

O mais simples, para a sandbox, seria criares um programa que iria iniciar a execução do vigiado, gravar o seu PID e medir o tempo decorrido. Para medir o consumo de memória tens várias opções discutidas aqui : http://stackoverflow.com/questions/131303/linux-how-to-measure-actual-memory-usage-of-an-application-or-process.

Quando o tempo expirasse ou o uso de memória fosse excedido poderias enviar um sinal SIGKILL ao processo com o PID gravado (http://www.csl.mtu.edu/cs4411.ck/www/NOTES/signal/kill.html). Mas existem situações em que os processos não podem ser terminados mesmo com SIGKILL: http://en.wikipedia.org/wiki/SIGKILL

Link to comment
Share on other sites

O que pretendo com o sandbox não é apenas controlar o tempo e memória utilizados, mas também não permitir que o processo aceda a outros ficheiros nem consigo fazer alterações em nada no sistema. (Peço desculpa caso não esteja a utilizar os termos correctos)

Vou agora ler o tópico que me indicaste pedrotuga 😛

EDIT:

Estive a ler e acho que não é bem o que pretendo, vou tentar ser mais claro. O que pretendo é desenvolver um programa/script (que vou designar Controlador por exemplo) em C/C++ que irá por sua vez iniciar outro programa/script (que vou designar Trabalhador).

O controlador após iniciar o Trabalhador (que será um ficheiro executável no terminal) terá que controlar a memória e tempo utilizados pelo Trabalhador e caso ultrapassem os limites faz o Trabalhador parar. Terá também que controlar que o Trabalhador não aceda a outros ficheiros nem a qualquer configuração do sistema, e detectar caso o Trabalhador "encrave".

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Link to comment
Share on other sites

O que pretendo com o sandbox não é apenas controlar o tempo e memória utilizados, mas também não permitir que o processo aceda a outros ficheiros nem consigo fazer alterações em nada no sistema. (Peço desculpa caso não esteja a utilizar os termos correctos)

Vou agora ler o tópico que me indicaste pedrotuga 😛

EDIT:

Estive a ler e acho que não é bem o que pretendo, vou tentar ser mais claro. O que pretendo é desenvolver um programa/script (que vou designar Controlador por exemplo) em C/C++ que irá por sua vez iniciar outro programa/script (que vou designar Trabalhador).

O controlador após iniciar o Trabalhador (que será um ficheiro executável no terminal) terá que controlar a memória e tempo utilizados pelo Trabalhador e caso ultrapassem os limites faz o Trabalhador parar. Terá também que controlar que o Trabalhador não aceda a outros ficheiros nem a qualquer configuração do sistema, e detectar caso o Trabalhador "encrave".

Isto é um tópico no qual há pessoas no fórum bem mais sabidas do que eu.

Olhando para a tua descrição fico com mais dúvidas do que respostas.

Em ambientes unix o acesso a recursos é de um modo geral controlado por permissões de utilizador. Um exemplo, os telefones androids correm cada aplicação com um utilixador diferente para assim atribuir permissões a cada aplicação que são dadas só com a permissão do utilizador do telemovel.

No windows supostamente o cenários seria igual, mas a esmagadora maioria dos utilizadores do windows usam o seu computador com permissões de administrador de sistema (não me perguntes porquê). O chromium por exemplo, usa uma tecnica chamada sandbox, que parece-me ser o que estás a descrever, mas não sei muitos detalhes sobre a implementação e acho que é só para o windows:

http://www.chromium.org/developers/design-documents/sandbox

Os sistemas operativos suportam controlo de permissões, e as aplicações que correm neles estão sujeitas a essas permissões. Mas como é que no contexto de um utilizador tiras permissões a um processo que corre no sistema operativo?

Não sei se existe alguma framework que crie tipo uma máquina virtual para correr aplicações, mas se existir deve ser o cabo dos trabalhos para aceder a recursos do sistema operativo onde correr. Ou se for fácil de usar, a implementação e configuração não serão triviais com toda a certeza.

Link to comment
Share on other sites

Bem, para ires a esse nível de controlo podes estudar o utilitário 'strace', que apresenta uma listagem de todas as chamadas ao SO. Usando esse código como base podes interceptar as chamadas de I/O de modo a apenas permitir as que te interessarem.

Quanto a detectar o "encravanço" do Trabalhador a única maneira simples é através da instrumentação do mesmo de modo a responder a um sinal enviado pelo Controlador. Caso o Trabalhador fique num ciclo infinito não responderá ao sinal e aí tens a tua detecção.

Link to comment
Share on other sites

O GDB não me permite fazer isso a um nível mais alto?

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Link to comment
Share on other sites

Queres fazer um judge pa concursos, certo? Tás mesmo decidido a fazer algo do zero?

Se procurares por esses termos, acho que encontras muita coisa na net. O código do mooshak penso que é opensource também.

http://apps.topcoder.com/forums/?module=Thread&threadID=627983&start=0&mc=5#1041578

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Queres fazer um judge pa concursos, certo? Tás mesmo decidido a fazer algo do zero?

Sim, vai ser a minha PAP.

Já tinha procurado e visto o código do mooshak inclusivé mas não conhecia esse tópico no topcoder, parece-me uma grande ajuda para começar  😁.

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Link to comment
Share on other sites

Acho que ha mais topicos pelo topcoder. Podes ir procurando lá usando o Google, e.g.

"sandbox site:apps.topcoder.com/forums"

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

😛

Já agora mogers, há algo que gostasses de ver numa plataforma de programação que não exista no uva, usaco, etc.?

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Link to comment
Share on other sites

consegues ser mais especifico? um judge como a uva ou o spoj tem objectivos diferentes duma usaco. O que é que pretendes fazer exactamente no teu projecto?

PS: o que é uma PAP? desconheço a sigla.. projecto de fim de curso?

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

Traduzido à letra PAP significa Projecto de Aptidão Profissional 😛

O meu projecto será uma plataforma de programação que para além de ter uma área com problemas para submeter, etc terá também outras áreas como notícias sobre a informática, algoritmia, etc, área de aprendizagem que será semelhante à área de tutoriais algorítmicos  do topcoder, e mais umas coisas mas no fundo é esta a minha ideia.

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Link to comment
Share on other sites

Eu acho que cada problema deve ter a sua própria área de discussão, para que os posts não fiquem dispersos e seja simples ver quais foram as dúvidas e respectivas respostas de cada problema.

Depois de resolver um problema, é interessante ter acesso a um artigo de análise do mesmo.

Podias também usar tags sobre os problemas, noticias, .. para que seja fácil encontrar tudo o que existe sobre um determinado tema.

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Link to comment
Share on other sites

A parte da análise já tinha pensado e vai estar disponível 😄

As restantes sugestões são muito boas também e já as apontei 😛

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Link to comment
Share on other sites

Depois de resolver um problema recebe-se uma pass, com ela é possível aceder ao tópico de discussão do problema que acabamos de resolver na parte do fórum do teu site.

No primeiro post, temos as propostas de resolução do problema (posteriormente, se algum utilizador tiver uma boa solução, ela também pode ser posta lá), nesse tópico será possível colocar dúvidas acerca das soluções que estão lá, colocar a sua resolução, entre outros...

Se me lembrar de mais alguma coisa aviso 😄 btw qual vai ser o idioma do site ?

Link to comment
Share on other sites

A minha ideia é ter uma análise como na USACO, apenas fica disponível depois de se resolver o problema. O tópico estará disponível para todos para esclarecem dúvidas, pedir ajudar, etc.

Quanto ao idioma será português mas mais tarde talvez inclua também inglês.

"Eu acredito que a vida está constantemente nos testando em nosso nível de confiança, e a vida tem grande recompensa reservada àqueles que demonstram uma confiança sem fim para agir até conseguir. Este nível de resolução pode mover montanhas, mas ele tem de ser constante e consistente. Tão simples quanto isso possa soar, ainda é o denominador comum que separa aqueles que vivem seus sonhos dos que vivem simplesmente.."

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.