fá pessoal tudo bem então vamos para mais uma aula de so e Relembrando na aula passada a gente fez uma demonstração onde listamos alguns processos brincamos um pouco com a a o o privilégio né a prioridade do processo eu sei que isso eh não foi assim tão a fundo né mas era mais para fazer uma demonstração mesmo para trazer esse conhecimento para vocês e não ficar só na teoria e daquela daquela prática toda eu queria que vocês lembrassem então de que um processo com mais privilégio né com mais prioridade o sistema operacional vai mover ele
né pro início da fila né E o que tem menos prioridade vai mover ele lá pro final da fila e assim vai né Essa ah capacidade do sistema operacional em realizar esse tipo de ação é chamada de preemptivo né preempção né É até de difícil de falar então preemptivo é essa capacidade que o sistema operacional tem de mover um processo de acordo com a sua prioridade Então se vier um processo que tem prioridade maior do que um outro o sistema operacional pode simplesmente bloquear ou mover esse processo Ah como assim né imagina lá Você tá
navegando na internet teu navegador lá tá tá em foco de repente o antivírus apita que tem algum problema né o sistema operacional consegue ah parar ali alguns processos para dar foco naquela naquele processamento lá do teu antivírus tá Eu sei é um exemplo Raso mas eh mais ou menos assim que a coisa funciona mesmo tá bom então isso foi na aula passada eh e hoje a gente vai falar mais um pouquinho sobre processos principalmente sobre multiprogramação tá Ah já não deve ser mais novidade quando a gente fala mon ah mono programado ou multiprogramado né né
o multiprogramado é quando eu consigo executar mais de um programa né mais de um processo por vez ou que na memória do meu computador vai ter lá mais de um processo e quando eu falo processo lembra né da aula anterior aula da prática né Ah nós vimos a teoria sobre processos um pouco mais aprofundada e você deve lembrar que o processo ele possui um espaço de endereçamento Aonde Ele carrega o programa em execução então o programa em execução não é o processo em si mas ele possui o processo possui um espaço de endereçamento parte na
memória RAM parte no disco né E lembra ele faz aquela troca conforme necessário e o programa né as instruções que o programa Vai executar tá nesse espaço de endereçamento tá junto com outras coisas a mais ã então num sistema operacional mono programado eu consigo executar um único processo por vez tá então é um único processo com uma única instrução por vez como é que era feita então a concorrência muito entre aspas né a aquela sensação de que mais de uma coisa está acontecendo ao mesmo tempo eh você deve lembrar então o que a gente falou
lá dos sistemas de tempo compartilhado etc então era a ideia de olha pega um pouco de processamento dá para esse processo a aqui que ele tem uma prioridade mais elevada na sequência para um pouco de processar esse o que tá acontecendo com esse processo e passa a a CPU para esse outro processo b e assim vai então percorreu alguns processos ali que estava na memória volta pro processo a processa mais um pouco e assim vai né então ele vai compartilhando a CPU e o sistema operacional vai bloqueando né E E por aí vai um sistema
multiprogramado por sua vez ah possibilita que mais de um processo esteja em execução ao mesmo tempo ou que esteja em execução né que esteja na memória ao mesmo tempo e a gente pode executar né ah tarefas de forma concorrente eh melhor do que a gente fazia quando era mono programado Tá mas como é que isso vai acontecer né Eh vamos analisar aqui de forma probabilística aproximada o cenário sobre os processos tá bom a multiprogramação ela é utilizada para melhorar o o uso da tua CPU né então ah partindo de um computador né com sistema mono
programado ele tinha um potencial x né então ele tinha uma capacidade x quando a gente multiprogramados ao mesmo tempo tendo uma eficiência muito maior né dando uma responsividade muito maior o usuário ficava menos tempo esperando né ficava menos tempo tempo Ocioso e ele podia executar mais coisas ao mesmo tempo e era bem mais rápido mas vamos lá ah você deve tá vendo aqui na tela que tem uma fórmula e eu já vou falar sobre ela tá então de forma probabilística um processo médio né ou seja pegando lá uma uma amostra de vários processos a média
deles vai ser mais ou menos essa tá então em média o o tempo que um processo passa na memória RAM 20% desse tempo ele tá sem ele tá processando alguma coisa né então ele tá requisitando o processamento lá do do processador para executar uma tarefa 80% do tempo ele tá esperando por entrada e saída né Por algum por algum dispositivo ou por alguma operação de entrada e saída isso quer dizer que ele tá ativo em 20% do tempo e 80% do tempo ele tá parado esperando isso não é louco né se a gente parar para
analisar então Ah foi desenvolvida uma uma fórmula aqui pra gente fazer uma previsão né calcular o quanto de utilização de CPU a gente tem tá E é uma fórmula bastante simples né que é essa que tá aqui embaixo ó utilização da CPU é igual a 1 - p elevado a n aonde que p é uma fração desse tempo que ele passa guardando Então se a gente tá dizendo aqui que nesse modelo ele passa 80% do tempo aguardando esse meu P seria equivalente a 80% ou 0.8 tá e o n né esse elevado a n é
a quantidade de processos que eu consigo ter em memória ao mesmo tempo vai ficar mais claro vamos analisar esse cenário hipotético aqui então imagina que nós temos uma um computador né com uma única CPU ou seja um processador Com um único Core né e com 8 GB de memória RAM beleza e considere que o sistema operacional ocupa só 2 GB de memória RAM e que cada programa de usuário ocupa 2 GB de memória RAM também bom então o que que a gente tem aqui 2 GB desses oito já estão ocupados pelo so E se a
gente abrir programas nesse computador quer dizer que ao mesmo tempo ele vai comportar três programas abertos ao mesmo tempo tá eh é isso aproximadamente tá pessoal aqui é uma ideia um modelo só pra gente calcular aqui e ver como é que se comporta tá então cada programa Vai ocupar 2 GB sobram seis porque dois já estão ocupados pelo so E aí então eu consigo três programas ao mesmo tempo então como é que fica a utilização de CPU segundo esse cenário Bom vamos lá segundo esse cenário a gente vai ter então 1 menos 0.8 né o
nosso 80% elevado a 3 né elevado ao cubo então aqui eu vou ter 1 - 0.51 né calcula aí né 08 x 08 x 08 você vai chegar nesse aproximadamente 0.511 e subtraindo aqui 1 Men 058 você vai ter 0,49 que é igual a 40% né então a gente multiplica o 049 por 100% né por 100 e você vai ter os 49% o que que isso quer dizer quer dizer que nesse cenário aonde eu tenho e 8 g de Ram né considerando que cada programa ocupa 2 GB de Ram nesse nosso cenário quer dizer que
a noss que a utilização de CPU nesse cenário é de 49% ou seja não chega a 50% então a gente não tá alcançando o grande potencial dessa CPU né a gente tá desperdiçando tempo ali o processo fica muito tempo oso e a gente tá desperdiçando muito tempo bom isso considerando que os processos são dependentes ou seja Eles não precisam comunicar com nada e que o sistema operacional não está sobrecarregado por nada tá então aqui é o cenário mais propício possível beleza bom Como que eu vou melhorar então a utilização de CPU nesse caso se a
gente tivesse que fazer isso olha só E se a gente adicionasse mais 8 GB de Ram nesse cenário lembra 2 GB ah cada programa de usuário ocupa 2 GB a gente sabe que não ocupa mas nesse nosso cenário hipotético vai ocupar Ok então se eu acrescentar mais 8 GB de Ram o que que eu vou fazer eu vou aumentar o grau de multiprogramação de três para 7 Como assim de três para S bom nos primeiros 8 GB dois eram do so e os outros seis divididos por né programas que ocupam 2 GB Então eu tinha
três acrescentando mais o eu vou dividir então né pelo número de processos e eu tenho quatro processos que podem ocupar 2 GB então de 3 né 3 + 4 vai para 7 então eu aumentei o grau de de programação de 3 para 7 Ok calculando colocando aqui no nosso modelo e calculando novamente a gente vai ter então 1 Men 021 né 08 elevado à séa potência a gente vai ter então 79 Olha que interessante sem mexer em nada né Sem Ah falar de algum conceito mais avançado só fazendo um investimento em hardware né E nem
é uma melhoria do Hardware em si é só uma aquisição de memória RAM né é uma melhoria Mas a gente não tá melhorando o processador não tá melhorando nada né A gente só está adicionando mais um módulo de memória RAM a gente aumentou para 79 o que resulta aqui num aumento né num ganho de 30% de CPU Ou seja a gente ch chegou quase em 80% adicionando mais um mais um Um Pente de memória RAM né Isso foi bastante expressivo Então nesse caso você pode ter certeza que o usuário Ficaria muito contente né ele teve
um ganho bastante interessante bom pensando assim e se a gente adicionasse mais um Será que tem um ganho expressivo de novo Será que eu chego aqui ao 100% bom vamos calcular né adicionando mais um módulo de 8 GB de Ram né e aqui a gente nem tá discutindo se é possível ou não né ou o que que é né só imagina que a gente tá colocando mais 8 GB lá e tá tudo bem Tá adicionando mais um módulo a gente M aumenta o grau de multiprogramação de 7ete para 11 e colocando na fórmula a gente
chega em 91% B legal 91% né quase 100% mas se você fizer a conta aqui você vai ver que a gente teve um ganho de 12% o que talvez Não justifique o investimento em memória RAM né ah independente do preço aqui de memória RAM etc esse esse ganho não foi expressivo então escalar desse jeito né não é tão não é tão viável né imagina como que a gente escalaria né aumentaria aqui a efetividade da do do processador né do núcleo do processador aqui só aumentando memória RAM chegaria um momento que seria insustentável né esse é
um exemplo dele bom pensando dessa forma como é que os SOS então escalam isso de forma eficiente sem que a gente tenha que ficar investindo em memória RAM é claro que se a gente tiver mais memória RAM eu consigo mais processos ao mesmo tempo em memória e se eu tiver um bom processador eu vou conseguir equilibrar essa equação e vou conseguir uma eficiência uma eficiência muito melhor né uma uma produtividade muito melhor do meu computador né mas sem fazer aqui um investimento em hardware como é que o computador resolve isso né como é que o
so resolveu isso para tornar os computadores mais eficientes né ah com conceito de trads tá você já deve ter ouvido falar sobre trads é muito comum hoje principalmente no mundo Gamer né quando alguém vai comprar um um um computador gamer lá principalmente da MD os ryen né ah é um ryzen de tanto com tantas threads né talvez você nem saiba o que seja essas tantas threads Mas você fala pô legal né você vai ver um review lá e ver que realmente é algo eficiente mas o que que de fato são essas threads né é o
que a gente vai ver aqui agora ah esse conceito apareceu precocemente em 1967 Tá apareceu pela primeira vez no sistema operacional 360 mvt eu nem sei se é assim que fala mas ah apareceu brevemente né E nem chamava trads ele tinha o nome de tarefas né de teses e quem criou foi esse senhor aqui da foto o Vittor misus mutos sei lá como é que fala o nome do cara mas ele trabalhou no projeto do multic que você já ouviu falar né nas primeiras aulas quando a gente estava trazendo o contexto histórico então foi muito
importante pra história dos sistemas operacionais tá então ele criou esse essa ideia de threads que ainda não era a ideia não é o modelo que a gente tem hoje mas ele criou e até meados dos anos 70 os sistemas operacionais né os principais os mais importantes ali e populares ainda eram mono programados ainda não deslizavam trads para você ver como é que demorou ainda eh para pegar tá E você já vai entender o por que demorou tanto bom Ah então até então eles eram mono programados O que que significa né significa que ah em memória
eu teria uma quantidade de processos Mas eu só executaria um por vez de acordo com a prioridade né Você lembra lá de arquitetura de computadores né aquela história de fila pilha etc né E aqui entra algumas coisas a mais com a prioridade dos processos tá então em cada espaço de endereçamento eu tinha apenas um né o conteúdo de um software e eu poderia executar uma operação desse software por vez não conseguiria fazer isso de forma simultânea real tá Ah mas com o desenvolvimento de um outro sistema operacional que não ficou tão famoso assim né Ã
Não não caiu nas graças populares aí que é o Mat né nesse sistema operacional foi introduzido um conceito que é o o processo peso leve tá o lightweight né que ah juntando esses dois conceitos aqui né culminou no ã na criação das threads como a gente conhece hoje ok Mas e aí o que que são essas threads né as threads ah de forma mais didática aqui né são unidades de programa em execução então Para para pensar lá num programa você deu dois cliques num programa lá aquele programa né O que foi pra memória O que
está sendo executado cada unidade desse programa em memória é uma linha de trad tá Ah se ele lida com threads né a gente não vai mais falar de e programas mas a gente vai falar de linhas de execução Então quando você executou ele Independente se ele foi feito em cima de threads ou não ele vai ser monot thread ou multithread tá então a gente vai parar para analisar de acordo com a linha de trads né com a linha de ah execução né a quantidade de execução que esse código consegue fazer sem que a gente tem
que re executar né colocar outra Instância dele na memória a gente também discutiu um pouco isso nas aulas passadas tá Ah então as threads permitem que a gente consiga executar várias subrotinas de um mesmo programa de forma concorrente ou simultâneo como que seria a simultaneidade né o paralelismo quase que real bom hoje a gente tem os computadores Octa Quad octacore hexacore né ã é muito comum então o que que significa esse Octa exa Sei lá o qu Quad né significa que é uma plaquinha de processador com mais de um núcleo um octacore Eu tenho oito
núcleos né e cada um desses núcleos ã já que a gente tá falando de threads né eles TM ados nele nele né uma quantidade de threads específica lá do fabricante né então se a gente falar que ah é um é um Octa com 12 threads significa que cada núcleo daquele consegue executar 12 coisas em simultaneidade então aí você teria 8 x 12 e seria o número de coisas em paralelo que aquele processador poderia fazer então aí né a gente precisa ter uma quantidade de memória X para fazer com que esse processador trabalhe na sua Plenitude
né trabalhe que você consiga explorar o máximo dele né então trads esse conceito de trads vai permitir que a gente Execute de forma concorrente subrotinas do mesmo processo Tá bom pode ser que você esteja pensando assim tá mas para que tudo isso não era só executar de novo o mesmo código né ou eu faço um código ah sei lá mestre né e ele chama várias instâncias dele mesmo é mais fácil do que parar para pensar nesse contexto todo sim do ponto de vista de programação né Tá correto pensar nisso mas só na questão de esforço
né no quesito esforço no quesito performance não porque um processo ele é independente lembra o processo tem a sua seu espaço de endereçamento e esse espaço de endereçamento não é compartilhado com nenhum outro processo então para um processo um processo a se comunicar com processo B ele não vai fazer isso ah né ele não consegue em memória um falar com outro porque se se fosse assim imagina que um atacante né um hacker poderia inserir um processo né te entregar um programa que quando você executasse ele estaria em memória solicitando os dados de sei lá login
e senha de qualquer coisa que você esteja logando né da conta do seu sei lá banco Facebook Instagram Seja lá o que for né então os processos não conversam entre si na memória para um processo falar com o outro né Precisa de intervenção do sistema operacional Então eu preciso de um terceiro processo pelo menos do sistema operacional que vai fornecer esse mecanismo para eu falar com entre um processo e outro né então vai acontecer uma integração como é que a gente faz isso ã em software hoje né a forma mais comum é fazendo com uma
API né a gente entrega uma API que o software B né o software a entrega uma API o software B consome essa api e leva os dados para dentro essa é uma forma muito comum de fazer essa comunicação entre dois processos diferentes tá eu sei que é um exemplo muito High level assim né a gente tá falando aqui num nível mais low level né num nível mais baixo nível Mas já dá para ter uma ideia tá então as threads vão permitir que a gente Execute mais de uma tarefa em concorrência ou em simultaneidade se eu
tiver mais de um núcleo no meu processador mas em que que vai diferir essa thread de ter dois processos iguais né Por exemplo Ah eu quero dois quero abrir dois documentos do Word eu vou abrir duas instâncias do Word tá bom e eu posso até estar falando besteira não sei se o Windows vai fazer essa diferença mas eu acho que sim a gente teria que confirmar aqui mas por exemplo Ah se eu abrir dois navegadores né vou abrir dois Chrome dois Firefox né eu tô abrindo tô executando duas vezes aquele mesmo código eu tenho ele
duas vezes na memória tá quando eu abro uma aba dentro do meu navegador eu não estou abrindo outro navegador mas eu estou abrindo Ah uma subrotina daquele mesmo navegador e ela funciona independente das demais Abas que você tem aberto lá no navegador Então você vai ver lá que de repente você tem 56 Abas abertas e você vai falar nossa é lento o Chrome é lento sei lá o que que é lento realmente né Você tem um processo e ele tá tomando conta de outros 55 né E tá compartilhando memória e quanto mais você abre são
mais coisas em execução né são mais ã tráfego né de entrada saída e consumindo alguma coisa na tua máquina e vai processamento e vai memória né mas você não tá abrindo outro Chrome é só uma subrotina do mesmo programa tá aí tá um exemplo de trad que é um outro exemplo de trad imagina que você tá lá consultando Google ou Netflix por exemplo né imagina você tá lá consultando Netflix tem tando assistir tua série favorita e o sei lá na na sua mesma casa outra pessoa também vai acessar Netflix num outro cômodo imagina que a
gente não tivesse um processo de trads a outra pessoa não ia conseguir assistir Netflix porque o servidor da Netflix estaria entregando só para você então precisaria de um servidor para cada pessoa ou que a Netflix executasse várias instâncias dela né não faz muito sentido esse modelo ele não é escalável então quando a gente fala de threads é um mesmo processo um mesmo código que consegue executar subrotinas sem que uma Instância outra Instância dele esteja na memória tá E qual a vantagem disso eu já vou falar um pouco mais das vantagens mas um overview dessas vantagens
é que processos são independentes né Você lembra que lá que cada processo tem seu espaço de endereçamento e tem lá ah variáveis memória né que ele eh com a com as quais ele vai lidar se eu tivesse que executar num sistema mono programado cada funcionalidade né que eu quisesse executar desse desse software Possivelmente seria um processo diferente Ou eu teria que executar uma né tipo uma procedure tá ele ia executar uma depois outra depois outra e a gente ia ficar lá esperando né até acabar numa num modelo multiprogramado com threads um processo vai compartilhar entre
as linhas né entre as threads o seu espaço de endereçamento e a memória e aí as threads vão compartilhar o que tiver na memória desse processo bem como as variáveis etc o contexto de software todo desse processo vai ser compartilhado pelas freds Essa é a grande vantagem e ah fazer essa comunicação né entre as threads né a thread consultar e consumir esse espaço de endereçamento e esse contexto de software é muito mais barato entre aspas né pro sistema operacional do que se fosse vários processos várias instâncias do mesmo software levando pra memória coisas que já
são repetidas né e o sistema operacional tendo que lidar com esses vários processos né lidar com prioridade segurança etc então nota que no fim das contas as threads são mais baratas entre aspas né é um esforço menor pro sistema operacional Ok então de forma mais simples partes de um processo que as trads né são partes de um processo que compartilha o mesmo espaço de endereçamento né é uma subrotina do programa em execução e pode ser executada independente do seu programa chamador o programa que você executou tá lá né e ele executa subrotinas que são independentes
desse chamador eu não preciso executá-lo novamente e possibilita a execução de rotinas de subrotinas concorrentes tá outras informações um pouco mais técnicas Às vezes as threads são chamadas né de processo leve por conta lá do sistema do Victor né que a gente viu lá e do Mat né do do sistema operacional Mat Por que que elas são leves mais tarde eu vou mostrar uma imagem Então você vai ver que o processo ele lida lá né tem todo o espaço de de endereçamento tem várias informações e a trad seria como um processo em entre aspas com
menos coisas né com menos coisas carregadas por isso que um processo leve tá existem dois tipos de threads as threads de instrução e as threads de controle então tem as threads né que são os códigos a linha execução e as threads que vão controlar essas execuções Ok e as threads compartilham o mesmo espaço de endereçamento Ahã entre outras informações né como ah variáveis o contexto de software todo exceto o contexto de hardware tá contexto de hardware não é compartilhado entre as threads só o contexto de software Ok bom e para ficar um pouco mais claro
ter uma imagem aqui um pouco mais lúdica nessa imagem eu tenho aqui na caixinha Azul uma tarefa né um mais um um programa Pense como você quiser e esse programa ele precisa fazer né executar processamento de várias coisas imagina que esse programa tenha três tenha três atividades diferentes para fazer se fosse um sistema mono programado eu teria que executar uma esperar executar outra assim que ela acabasse executaria terceira imagina que é um código lá em C ou em Java lá né que você fez e que não tá numa não tá em classes né que tá
numa procedure né então primeiro ele executa uma linha ele só executa a linha de baixo quando terminar a primeira linha e assim por diante isso é o mono programado no multiprogramado Olha o que acontece eu tenho as três tarefas em paralelo que vão ser executados e quando todas elas terminarem eu entrego o resultado né finalizo né cheguei no objetivo que foi a execução desse desse software né Por exemplo a edição de um arquivo de texto com o teu Word olha como é interessante né você tá lá com o Word aberto você nem tá sabendo mas
ele tá fazendo aquele salvamento automático se ele fosse mono programado quando ele tá fazendo salvamento ele não ia responder o teu teclado e mouse você não ia conseguir trabalhar nele né então você tá lá trabalhando nele e ele tá fazendo salvamento né caso acaba energia etc ele vai salvando lá para você e ao mesmo tempo ele tá recebendo entrada né do teu teclado e do teu Mouse olha Quantos processos estão rodando em paralelo para fazer com que você tenha a sensação de que você tá num ambiente fluído e que nada disso tá acontecendo né bom
dentre outras coisas né enquando você tá fazendo o processamento de texto né fazendo formato ação etc né então tem várias subrotinas dentro desse wordin simples que estão acontecendo de forma concorrente ou simultânea sem que você perceba beleza bom Pessoal esse é o conceito Inicial tem mais algumas coisas aqui pra gente discutir Mas vai ficar pra próxima aula Ok bom a gente se vê já já