Transcrição do áudio
E coleguinha, agora vamos falar sobre os tipos de processos. Se você olhou e prestou bem atenção, caramba, aqui nessa imagem, você viu que tem alguns processos que eles ficam aqui na faixa de 1 a 99 da prioridade de execução, enquanto os do usuário estão aqui em cima. Se você olhar, sempre a prioridade maior são dos processos que estão aqui embaixo. Lembrando que no Linux, se um processo ele entra aqui para execução e naturalmente tinha algum em execução aqui em cima, esse que está aqui de cima para, de ser executado para execução de prioridade maior. Infelizmente, maior é inverso aqui, ou seja, 1 é a maior prioridade de tudo. 1 de 39 é aquele que menor tem prioridade nesse modelo aqui. É inverso o número, tá? Sempre achei pai a isso. Sempre confundiu meus alunos na prova e sempre foi uma boa questão de pôr na prova para derrubar aos milhões de alunos, né? Você põe e derruba milhão de alunos. O usuário, tá? O usuário, jamais faria isso. E aí, o que acontece? Geralmente aqui são os processos de real time nessa área vermelha aqui e são do núcleo, que são de gestão do sistema operacional. Então, os processos de real time, eles têm um, como posso dizer, eles têm um tempo de execução maior, eles passam mais vezes em execução, eles conseguem naturalmente, quando eles entram para a execução. Praticamente eles ganham o núcleo quase que imediatamente, vou falar imediatamente, porque nós temos os tempos de execução, tá? Lembrando que você é quem menos tem naturalmente recurso na máquina, você é o usuário. Por quê? Você tem que lembrar que no livro do Turnbull, lá no capítulo de introdução, sistema operacional, ele é aquele sistema que ele faz a gestão, né? Naturalmente dos recursos. Então ele é uma máquina estendida e ele é um gestor de recursos, tá escrito lá. Máquina estendida, porque ele faz uma abstração da máquina real e você, então, com uma programação mais humana, consegue utilizá-lo como programação mais humana. Você não tem que programar ali em linguagem de máquina, conhecer os registradores e tudo mais, por isso que ele é uma máquina estendida, por isso que ele é uma abstração. Então nós conseguimos programar em C, C mais mais, tá? Senão nós teremos que ir para linguagem de máquina. Então nós não programamos em cima do hardware, nós programamos em cima do sistema operacional, isso tem um operacional, então ele é a abstração do hardware. E ele faz uma gestão do hardware para que não ocorra merdas, do tipo condição de corrida. Pô, parece que... Eu estou rindo, galera. Eu falo assim, mas condição de corrida acontece com tanta frequência. Cara, é assustador, cara, é assustador. Condição de corrida, para quem não sabe, gente, é a forma mais comum de você levar uma aplicação a fazer um transbordo de memória e alcançar uma área da memória que não era do processo, tá? Então a condição de corrida parece que virou uma febre no mundo hacker. Então, futs, e ele... Então ele é essa máquina estendida e ele faz essa gestão do hardware, certo? Então é natural que ele tenha mais prioridade que você na sua máquina, mesmo que você tenha comprado e pagado o seu duro trabalho. Vamos lá. Ah, nós temos ali, tá? Política de agendamento normal para processos que não são de tempo real é do tipo order, tá? Ou seja, ele foca primeiro no tempo real, que são esses dois aqui, os dois algoritmos, e os outros é order for the slender. Então nós temos um, dois, três algoritmos aqui dentro do mundo lino, certo? Ó, pif, implementa um algoritmo de escalonamento simples, fila, estrutura de dados, fila entra atrás, eu ia falar... Eu ia falar besteira, mas eu vou tomar um banho. Uma coisa pela frente, sai, entendeu? E naturalmente... Fifo é assim, entendeu? Vocês viram estrutura de dados, caramba. Ainda bem que falei besteira, hein? Então ele entra atrás e alguma coisa sai na frente. Então uma tarefa dessas FIFO, né? Ela sempre vai ser executada ali com uma agenda. E se tiver um order em execução, a FIFO vai entrar e executar. Tanto que ela tem um ponto interessante, ele é só... Ela não tem time likes, ou seja, quem leu o livro do Tânio, ela não tem quantum de execução, ou seja, ela é executada até ser bloqueada, por que que ela é bloqueada? Ela é bloqueada porque ela precisa de um dispositivo de entrada e saída, então ela vai para bloqueada. E não tem time likes, e ela vai até terminar sua tarefa, tá? Bom, plus ou mais tarefas, naturalmente na FIFO, né? Na mesma prioridade são executadas e rodizam entre elas. Então imagine que você tem um agendamento order, aí você coloca uma FIFO com dois processos, esses dois processos vão ser executados, naturalmente, né? Eles vão sair dali, se terminar seu tempo de execução, que é o desempeilamento total da pilha de funções ou métodos, seja lá, se você seja em POL, em orientação... Estruturado, terminou, sai de execução, né? Isso, bloqueado quando ele precisa de um dispositivo de entrada e saída, tipo um CD-ROM, pendrive, algo assim, tá? Ou ocorre um erro, saída voluntária. E aí eles fazem rodizos dois até terminar a fila, que está dentro de order. Cara, é bem... Ele é bem grudento no núcleo, né? Ele é para que não seja interrompido. Geralmente coloca-se na FIFO processos que não podem ser interrompidos. Beleza? Bom, se um FIFO pode ser executado, todas as tarefas com prioridade mais bonitas, baixa, não podem ser executados até que sejam concluídos a FIFO. Beleza? Acontece que está, né? É aquele detalhe do inverso, né? Basicamente, vamos imaginar que eu tenho dois processos com prioridade de 90. Dois processos na prioridade de 90, tá? E tem um processo na 120. Enquanto os dois processos da 90 não terminar, o da 120 não vai ser executado. Ainda bem que hoje nós temos multiprocessamento, tá? Porque se essa coisa grudar em um núcleo, em uma linha de processamento, então você não tem nenhum problema mais grave, né? Se você pegar aqui, então... Então, montar um zoom aqui. Por isso que você tem o quê? Muita gente fica puto, porque tem... Ah, eu tenho um núcleo real. Essa marca tem 36 reais, né? Mas faz 72 linhas de processamento, certo? A gatope. Eu tenho que colocar a gatope no meu... O que acontece? Meu Linux, ele não... Toda vez que eu liga esse Linux, ele acorda zerado. Entende? Eu preparei ele para isso. Então, sempre que ele acorda, ele acorda zerado. Sempre que eu abro ele, eu ligo ele e ele está zerado. Eu tenho que instalar tudo de novo. Por isso você me vê instalando a gatope sempre aqui nas aulas, né? Por causa disso. Não é que o Linux não salva. É que eu programei ele para ser assim. Nessa máquina, eu tenho dois núcleos reais só, certo? E aí ele faz cada núcleo real duas threads, certo? Nessa máquina. Uma virtualização. O que acontece? Quando você tem... Peraí, peraí, peraí, peraí, peraí. Vai fechando, não porque isso tem merda, né? Que, ó... Quando você tem uma coisa dessa daqui, quanto mais linhas de processamento melhor, o sistema fica mais suave. Entende? Então, é interessante você realmente ter lá 12, 14 núcleos reais. E fazer 24, 28 threads de processamento. Porque se um desse cara pega uma thread de processamento, ele fica lá. Naquela linha, digamos assim. Se ele entrasse aqui, uma bolsa dessa entrasse aqui, em um, ele grudaria em um aqui. O que que está processando tão... tanto aqui? Porque essa máquina, não teoricamente, ela não tem. É só para apresentar. Lá ele, porra. Bom, pega uma linha aqui, ó. E ele vai ficar presa aqui, ele não vai. E aí, outros processos vão poder encaixar em outros... Outras linhas de processamento. Por isso que é importante você realmente ter muitas... Múltiplas linhas de processamento. Muita gente fica até puto com isso, né? Porque a caderninha de processamento fica mais fraca. Vai ter até uma briga sobre processador mais forte. Desculpa, galera. Estou morrendo. Aproveita aí, compra o curso, hein? Tem processadores que têm a linha mais forte, com menos linhas de processamento. Mas quando ele pega isso aqui, ele agarra mais, ele patina. E você tem processadores como o meu, né? E ele tem, porra, trocentas linhas de processamento. Mas são bem fraquinhas, entende? E ele é encarado como um processador, essas linhas de processamento. Então, isso aqui fica mais suave. Isso distribui mais os processos, tá? É que eu faço um tipo de virtualização, eu faço o seguinte. Eu tenho minha máquina com a pancada de núcleos. Aí eu pego as várias máquinas virtuais e dou os núcleos para eles. E, na verdade, o convidado, ele passa o processamento para a máquina inferior. É um tipo de virtualização conhecido como SHAN. É um SHAN server. Eu uso um SHAN server aqui na minha máquina. Basicamente, entende? Então, para mim é interessante esse número de núcleos. E todas as minhas máquinas virtuais, ó. Aqui eu estou rodando agora umas quatro máquinas virtuais, ou cinco máquinas virtuais. Ele consegue distribuir, mas consegue distribuir muito bem isso aí. Consegue distribuir muito bem. Uma, duas, três, quatro, cinco, seis, sete, oito máquinas virtuais sendo processadas. E os processos dessas máquinas virtuais sendo quase todos passados, então, para o meu hospedeiro. É o meu estomaprofissional onfitrião. Então, aí é interessante, né? Pega a porcaria dessa daqui. Bom, não trava tudo, né? Bom, o RR é idêntico ao FIFA. É certo que cada processo só pode ser executado até esgotar uma fatia do tempo pré-determinada. Ou seja, RR é uma FIFA com, quanto com, slide-time de execução. Que deixaria mais suave para processadores comendo as linhas de processamento. Então, esse cara aqui é muito bom quando você tem processadores com muitas linhas de processamento. Esse cara aqui já é bom quando você tem o que? Processadores comendo as linhas de processamento. Porque ele tem um quanto, um de tempo, então ele para a fila de execução dele e dá oportunidade para outro processo executar um pouquinho. E aí ele volta e executa um pouquinho, sua fila vai, sai e fica nessa. Então, são dois tipos de algoritmos interessantes aqui, beleza? Bom, o agendamento de tempo real no Linux, suave, oferece um negócio suave, tá? Ele é um real-time, a noção de que o Kernel tenta agendar aplicativos nos prazos. E, naturalmente, o Kernel nem sempre promete ser capaz de cumprir o processamento. O Linux não foi projetado para ser um desktop, tá? Linux não foi projetado para ser o isso que nós somos aqui fazendo com ele, mostrando ele aqui, entendendo ele aqui. Ele foi projetado para ser servidores, cara. Por isso que Linux demorou para ter interfaces gráficas. Acho que as pessoas nunca entenderam isso no mundo Linux. Linux não é para nós. Linux é para as máquinas, para a máquina. Não é para nós. Então, meu amigo, aí vem aquilo que eu quero falar com vocês. Nós estamos hoje adaptando o mundo Linux para o mundo do usuário e aí nós temos algumas inconsistências, tá? Linux foi projetado, então, para dar luxo, para dar vazão. É, claro, a vazão mesmo de, naturalmente, processos. Não para te atender. Você tem que ler o livro do Terrible de Sistemas Operacionais Modernos. Ele vai falar num ponto chamado Zoológico de Sistemas Operacionais. Aonde ele fala, olha, um sistema operacional de usuário, ele precisa de ser, de atender o usuário. Entende? Já um sistema operacional de servidor precisa de executar o Lots de processamento, um batch que ele chama. E esse escalonamento do que é melhor naquele momento é feito baseado para servidores, não para usuários comuns, e aí nós estamos usando ele aqui como desktop. E isso é um grande problema do mundo Linux, tá? Bom, as prioridades em tempo real variam inclusive de um Max RT Pro, né? Nós temos os dois constantes, é 100, então nós podemos chegar até 100. Tinha um A99, vamos colocar assim, que é o padrão, beleza? Desculpa, aqui é 99, galera, desculpa, tem um erro aqui, ó. Você é bom, tá? Localizei um erro aqui. É 99, então é de 1 a 99, você pode chegar, beleza? E aí, naturalmente, todo o processo de usuário, ele sai com sua priorite em 120. Teoricamente, era para ser fixo, como assim? Todo o processo que nasce com uma prioridade, ele morre com aquela prioridade, tá? Processos de usuário nascem com priorite em 120 e acabou. Aí eu vou ter que invocar o top agora, tá aí. Cara, eu estou rodando um processo muito monstro, muito monstro, muito monstro, em uma outra máquina virtual, eu não posso mostrar para vocês. E ele está literalmente esmagando os processadores. Ó, presta atenção. Esse processo aqui, tá? Está com 20 e ele é priorite em 120, tá? Ele é do usuário e ele nasce com essa priorite em 120 e ele morre com essa priorite em 120. Seus filhos vão ser criados com a priorite em 120, entende? E acabou, ele não tem nenhuma regalia sobre os outros processos do usuário. Todos os processos de usuário, teoricamente, teriam o mesmo rigor. Nenhum deles seria melhor que nenhum outro. Vamos colocar assim. Mas está vendo esse Xorg aqui? Cara, esse processo é muito importante. Cara, o Xorg é o que está renderizando minha tela que você está vendo agora. Você concorda comigo que renderizar essa tela é muito importante? Se fosse assim, qualquer programa que eu fosse abrir aqui, iria competir com o Xorg e iria derrubar essa fluidez na montagem de tela, eu estou rindo e por que tem um processo que está esmagando, meu Deus núcleo ali? É tudo quadrado aqui hoje. Vamos lá. Então, o que acontece teoricamente? Teoricamente esse processo é muito importante, eu não poderia deixar ele com a mesma prioridade dos outros de 120. Então, é possível eu regular uma outra variável, uma outra variável, chamada NICE. Aonde se eu coloco menos um, então 120 menos um, vai ser 119. Então, todo processo 119, ele passa mais tempo sendo executado em execução, ou seja, ele fica menos tempo em apto a processamento, ou seja, ele espera para alcançar algum núcleo. Então, ele passa mais vezes, ele acelera mais e então quer dizer que o tempo para ele passa mais rápido. Cara, vamos pensar assim, vamos lá. Você já virou aquele lance do interestre lá, o filme. Vocês viram que um cara ficou perto de um buraco negro, enquanto outros foram para um planeta de menor massa, e o tempo passou diferente para eles, legal. Se você já tem uma noção sobre isso já, esquece a Marvel, esquece o DC. Vamos pensar em uma coisa mais culta. O que acontece? Todo o processo que ele passa mais em execução, o tempo para ele passa mais rápido. Como assim? Todo o processo, quando ele é bloqueado, ou quando ele vai para a fila apto, ou pronto para a execução, ele dorme. Nós dormimos, mas o tempo continua, não é assim? Nós seres humanos. A máquina não. O processo dorme e o seu contador de tempo para. Entende? Então, quer dizer que quanto mais um processo passa para a execução, o tempo de vida é maior. Por isso que é tão difícil de definir tempo de vida para processos. Legal. Então, quer dizer que se você olhar naturalmente um processo que ele tem menos 19, caso 120 menos 1, ele já está processando a mais tempo que qualquer outro processo. A visão dele é que ele está bem, bem à frente em seu tempo. Por isso que o contagem de tempo é tão difícil para as máquinas. Envolve tudo isso. Legal. Olha que complicado, né? Está vendo aqui um grupo de processos com 120 menos 20? Foi regulado assim, né? 120 de priorite menos 20 de nice. Embora ele esteja como root, ele foi inicializado por ação humana de usuário. É um serviço. É um serviço para o usuário. Mas que está sendo executado como root. Ele não está como real time. Agora, se você achar um processo assim, Rt real time, esse cara aqui é nativo. Quer dizer que ele é um priorite entre 1 a 99. E ele está ali entre 1 e 99. Beleza? Caramba, mano. E ele está natural que ele vai ter mais tempo de processamento. Legal? Chamadas do sistema relacionados ao agendador. Então, Linux fornece uma família de chamadas para gerenciamento do schedule. Vocês viram isso, sabe aonde? Quando vocês leram lá no livro do Tannimbo, naquela questão de, vamos ver a questão de interrupções de sistema. Chega um pacote na minha placa de rede. É elevado uma interrupção para o sistema. E o schedule conhece o tratador de interrupção da placa de rede. Que nada mais é do que um processo real time, que vai ser agendado. Então, o schedule coloca o agendamento do real time, que vai analisar a placa de rede. E esse processo, então, tem priorite muito elevado. Beleza? Então, são chamadas ao set schedule e ao get schedule. Define e obtém a política de agendamento do sistema personal. E que, Pazmi, você pode muito bem, programando em C, C mais mais, interagir com o schedule, mostramos agora nas últimas aulas, uma programaçãozinha básica, que você consegue pegar essa lista, você consegue tratar essa lista. Mas, lógico, você tem que ser um super usuário, ou seja, você tem que programar em C, C mais mais, e o seu programa tem que ser executado como root, para ter acesso aos barraproc. Essas informações todas estão no diretório barraproc.doLinux. Está tudo lá. Não pega quem não quer. Se a implementação é chamada a maioria das vezes, faz uma verificação caramba, que isso aqui eu deveria estar muito bêbado por escrever essa merda. Às vezes eu tenho esse problema. Eu tenho um trabalho muito difícil que eu vou fazer, eu vejo duas cervejas, sinto, passo e marco o que eu fiz, acordo outro dia e não vou voltar para esse problema. Então, tem as chamadas no sistema que verifica os argumentos, configura e faz todo tipo de limpeza. Isso aqui é chamado de troca de contexto. Entenda-se isso como troca de contexto. Então, um trabalho importante, porém, apenas para ler ou escrever as políticas. E tem um struct chamado TaskStruct lá dentro daquela biblioteca. Esqueda que eu passei para vocês. Tem set parâmetro, get parâmetro. Você consegue chegar a customizar alguma coisa. Então, como funciona no mundo Windows? Windows, vamos pegar a linha 9x e a NT. Então, lembra do zoológico do Thunderbolt? O que acontece? Um Windows da linha 9, ele priorizava no escalonamento dele o que o usuário pedia. Enquanto que no Windows NT 2000, NT, o NT depois do 2000, ele priorizava o processo mais curto. Então, por um momento da história, gente, para muitos aqui não sabem, o Windows NT 2000 server veio tão bom que as pessoas instalavam a linha 9x, Windows 98, o Emillenium, desculpa o nator, se aqui está, galera. Desculpa. Eles tiravam essa linha 9x e colocavam 2000 server como sistema operacional de desktop, mas ele era focado praticamente em jobs mais curtos, enquanto a 9x era o que você pedia. Isso tem tudo a ver com o zoológico de sistemas operacionais. Aí o que acontece? No Linux não. Você não vai encontrar um Linux server e o Linux não server. Algumas distribuições vão colocar, mas não é do mundo Linux. O mundo Linux, Linux é Linux, acabou. O kernel do Linux é o mesmo em ambos os cenários, do usuário e do servidor, beleza? O que nós temos é uma série de parametrizações, né, nessas priorites, que você consegue chegar a customizar aquela distribuição para um, ou trabalhar mais com jobs e trabalhar com batch, em caso servidores, ou trabalhar com chamadas do usuário. Entendeu a jogada? Então tem essas parametrizações. Nós também temos a função nasci, e é quando nós colocamos aquele número de para ajudar. Então vamos lá. Vamos abrir aqui de novo aqui o top. O top. Tá vendo aqui o "-1"? Foi dado um renaice. Todo naice é zero. Todo o processo nasce com a sua priorite adequada e o seu naice zero. Então eu posso dar um renaice em "-1". Então quer dizer que imagine que o processo de usuário é 120 e eu dou um renaice "-1". Então ele ficou com, teoricamente, 120-1 e 19. 19 é isso? Então ele passa mais vezes agora no processador. Legal? Então esse naice é um ajuste fino que é dado. Naice é zero, mas que o naice depois ele vai ser ajustado com um comando renaice. E você consegue naturalmente dar um set user naice para o usuário, para os processos dele nascer com aquele tipo, com aquela prioridade. Legal? Bom, e também nós temos ele vários, nesse struct, nós temos vários parâmetros que impactam inclusive na distribuição dos processos, ali como eu posso dizer no núcleo. Cara, só esse capítulo, o set, próximo eu vou falar sobre comunicação e processos, só esse capítulo set, esse trecho-munstro, e esse capítulo oito, cara, eles dão dois livros, três livros talvez, tá? Capítulo oito é sobre memória, que nós vamos falar mais para frente aí. Cara, é um capítulo que você tem que tomar ali naturalmente, ele com muita atenção ali, tá? Estudar direitinho, principalmente o oito e esse trecho do schedule. Costuma cair em prova? Cara, prova de certificação cai, prova de certificação cai. Mas as provas mais avançadas. Digamos que está avançado demais esse capítulo set, para esse ponto do livro. Capítulo oito também está avançado demais, mas esses dois capítulos são muito importantes, porque nós trabalhamos no mundo hacker, né? Nós somos aqui por causa desse mundo, e é interessante como os processos são executados, porque nós podemos manipular esses processos. Então, todo hacker, ele acaba fazendo, de tal forma que ele manipula. Quer ver? Eu tenho um processo espião. O processo espião, ele nunca pode ter o nice menor que zero. Sempre os processos espião estão com o nice maior que zero. Tá? Porque tem menos atenção de qualquer ferramenta anti-mower no sistema operacional, cara. Você acredita? Olha a jogadinha. Então, é importante questão de memória, condição de corrida, a condição de transporte de endereço de processo. Cara, é foda, hein, cara. Então, recomendo ler mais sobre o assunto. Até mais, tchau!