Ap´os um tempo coletando um lote de jobs, a fita era rebobinada e levada para a sala da m´aquina onde era montada numa unidade de fita. O operador ent˜ao carregava um programa especial (o antecessor do sistema operacional de hoje), que lia o primeiro job da fita e o executava. A sa´ıda era escrita numa segunda fita, em vez de ser impressa. Ap´os o fim da execu¸c˜ao de cada job, o sistema operacional automaticamente lia o pr´oximo job da fita e come¸cava a execut´a-lo. Quando todo o batch era feito, o operador removia as fitas de entrada e de sa´ıda, substituia a fita de entrada pelo pr´oximo batch e levava a fita de sa´ıda para um IBM-1401 produzir a impress˜ao off-line (isto ´e, n˜ao conectada ao computador principal).
A estrutura de um job (um programa de usu´ario) de entrada t´ıpico ´e mostrada na Figura 83.
Figura 83 – Um deck de cart˜oes perfurados organizando a estrutura de um job.
Fonte: Operating Systems: Design And Implementation - Andrew S. Tanenbaum.
9.16
A Terceira Gera¸c˜ao - CIs e Multiprograma¸c˜ao (1965-1980)
Nos anos 60, muitos fabricantes de computadores tinham duas linhas de produto distintas e totalmente incompat´ıveis. Por um lado havia os computadores cient´ıficos, em grande escala, orientado por palavras, tais como o 7094, que era usado para c´alculos num´ericos em ciˆencia e engenharia. Por outro lado, havia os computadores comerciais, orientados por caracter, tais como o 1401, que era vastamente usado para classifica¸c˜ao em fita e impress˜ao, por bancos e companhias de seguros.
O desenvolvimento e a manuten¸c˜ao de duas linhas de produto completamente diferentes era uma proposta cara para os fabricantes. A IBM, no intuito de resolver os problemas, introduziu o sistema 360. O 360 era uma s´erie de m´aquinas compat´ıveis por software, variando de tamanho a partir do 1401 at´e o mais potente 7094. As m´aquinas diferiam apenas em pre¸co e performance (capacidade de mem´oria, velo- cidade do processador, n´umero de perif´ericos I/O permitidos, e assim por diante). J´a que todas as m´aquinas tinham a mesma arquitetura e o mesmo conjunto de instru¸c˜oes, pelo menos em teoria, programas escritos para uma m´aquina poderiam
Apesar dos sistemas operacionais da terceira gera¸c˜ao terem sido bem apropria- dos para a execu¸c˜ao de programas envolvendo grandes c´alculos cient´ıficos e de processamento de dados comerciais compactos, eles eram ainda, basicamente, siste- mas em “batch”.
A necessidade de se ter um tempo de resposta menor abriu espa¸co para “time- sharing”, uma variante da multiprograma¸c˜ao, em que cada usu´ario tem um terminal “on-line”. Embora a primeira s´erie de sistemas em time-sharing (CTSS) tenha sido desenvolvida no MIT, num IBM 7094 especialmente modificado, ele n˜ao se tornou verdadeiramente popular at´e que a necessidade de prote¸c˜ao de hardware ficasse mais difundida durante a terceira gera¸c˜ao. Ap´os o sucesso do sistema CTSS, o MIT, o Laborat´orio Bell e a General Electric (ent˜ao o maior fabricante de computado- res) decidiram embarcar no desenvolvimento de um “computador utilit´ario”, uma m´aquina que suportasse milhares de usu´arios em “time-sharing” simultaneamente. Os projetistas desse sistema, conhecido como MULTICS (MULTiplexed Information and Computing Service), tinham em mente uma grande m´aquina que fornecesse servi¸co de computa¸c˜ao para todos. Mas a id´eia de um computador utilit´ario falhou. Mesmo assim, o MULTICS teve uma enorme influˆencia nos sistemas subsequentes. Outro importante desenvolvimento durante a terceira gera¸c˜ao foi o de mini-computadores, come¸cando com o DEC PDP-1 em 1961. Para certos tipos de trabalhos n˜ao-num´ericos era quase t˜ao r´apido quanto o 7094 e fez surgir uma nova ind´ustria. Foi rapidamente seguido por uma s´erie de outros PDPs (que diferentes da fam´ılia IBM, eram todos incompat´ıveis) culminando com o PDP-11.
Um dos cientistas do Laborat´orio Bell que trabalhou no MULTICS, Ken Thompson (ver na se¸c˜ao 9.18), logo depois encontrou um pequeno PDP-7 sem uso e come¸cou a escrever uma vers˜ao simplificada mono-usu´ario do MULTICS. Brian Kernighan apelidou esse sistema de UNICS (UNiplexed Information and Computing Service), mas sua grafia foi mais tarde trocada para UNIX. Posteriormente foi levado para um PDP-11/20, onde funcionou bem, o bastante para convencer o Laborat´orio Bell em investir no PDP-11/45 para continuar o trabalho. Outro cientista do Laborat´orio Bell, Dennis Ritchie, juntou-se a Thompson para reescrever o sistema numa linguagem de alto n´ıvel chamada C, projetada e implementada por Ritchie. O Laboratorio
9.17. 1968 - Programa¸c˜ao Concorrente 147
Bell licensiava o UNIX para Universidades, quase gratuitamente e dentro de poucos anos, centenas delas estavam usando-o. O UNIX logo estendeu-se para muitos outros computadores, e logo j´a era o mais aplicado para computadores do que qualquer outro sistema operacional da hist´oria e seu uso est´a at´e os tempos atuais.
9.17
1968 - Programa¸c˜ao Concorrente
O campo da programa¸c˜ao concorrente iniciou uma explosiva expans˜ao no final dos anos 60. Um programa ordin´ario consiste de declara¸c˜oes de dados e instru¸c˜oes execut´aveis em uma linguagem de programa¸c˜ao. As instru¸c˜oes s˜ao executadas se- quencialmente sobre um processador, o qual aloca mem´oria o c´odigo e para os dados do programa. Um programa concorrente ´e um conjunto de programas sequenciais ordin´arios os quais s˜ao executados em uma abstra¸c˜ao de paralelismo. Usamos a palavra processo para programas sequenciais e reservamos a palavra programa para o conjunto de processos.
Um breve hist´orico da pesquisa em programa¸c˜ao concorrente para os primeiros computadores ´e agora contada. Em 1968, E. W. Dijkstra: Cooperando Processos Seq¨uenciais. Em 1971, E. W. Dijkstra: Ordem hier´arquica de processos seq¨uenciais. Em 1973 C. L. Liu e J. W. Layland: Algoritmos de escalonamento para multipro- grama¸c˜ao em ambiente de tempo real. Em 1974, C. A. R. Hoare: “Monitores, um conceito para estruturar sistemas operacionais”. Em 1974, Leslie Lamport: “Uma nova solu¸c˜ao para o problema da programa¸c˜ao concorrente de Dijkstra”. Em 1976, J. H. Howard: “Provando monitores”. Tamb´em em 1976, S. Owicki e D. Gries: “Verificando propriedades de programas paralelos: uma abordagem axiom´atica”. Neste
caso, a l´ogica pode ser usada para expressar tais propriedade. Em 1977, P. Brinch Hansen: “A arquitetura de programas concorrentes”.
Em 1978 C. A. R. Hoare (1934) fez o CSP (“Comunicating Sequential Proces- ses”). Mais outras obras significativas foram nas seguintes ´areas: os algoritmos de ordena¸c˜ao Quicksort e QuickSelect, a L´ogica de Floyd-Hoare (um sistema formal com um conjunto de regras l´ogicas para um racioc´ınio rigoroso sobre a corretude na computa¸c˜ao), a linguagem formal CSP (usada para especificar as intera¸c˜oes entre processos concorrentes), que serviu de inspira¸c˜ao para a linguagem de programa¸c˜ao Occam em m´aquinas de arquitetura paralela, a sincroniza¸c˜ao entre processos concor- rentes utilizando o conceito de monitor (conceito que usa a ideia da oculta¸c˜ao de dados), a especifica¸c˜ao axiom´atica de linguagens de programa¸c˜ao,
Em 1978, E. W. Dijkstra(1930-2002), Leslie B. Lamport (1941-) ´e um cientista da computa¸c˜ao Estadunidense, que juntamente com A. J. Martin, C. S. Sholten e E. F. M. Steffens criaram em coopera¸c˜ao o “garbage collection”, meio de se coletar lixo em uma mem´oria de computador. E em 1980, E. W. Dijkstra e C. S. Sholten estudaram sobre “Detec¸c˜ao de termina¸c˜ao”.
Figura 84 – Charles A. R. Hoare - criou a ideia do monitor e a ´algebra do CSP para especificar e provar sistemas concorrentes.
Fonte: www.en.wikipedia.org/.
Edsger Wybe Dijkstra (1930-2002) foi um cientista da computa¸c˜ao Holandˆes conhecido por suas contribui¸c˜oes nas ´areas de desenvolvimento de algoritmos e progra- mas, linguagens de programa¸c˜ao, sistemas operacionais e processamento distribu´ıdo.
Figura 85 – Edwin Dijkstra - A ideia dos sem´aforos.
Fonte: cacm.acm.org.
Dijkstra foi um dos membros mais influentes da computa¸c˜ao gera¸c˜ao fundadora da ciˆencia. Entre os dom´ınios em que suas contribui¸c˜oes cient´ıficas s˜ao fundamentais s˜ao projeto de algoritmo, linguagens de programa¸c˜ao, projeto de programas, sistemas operacionais, processamento distribu´ıdo, especifica¸c˜ao formal e verifica¸c˜ao e, projeto de argumentos matem´aticos. Al´em disso, Dijkstra foi intensamente interessados no ensino, e nas rela¸c˜oes entre Ciˆencia Computa¸c˜ao acadˆemica e da ind´ustria de software. Durante seus mais de quarenta anos como um cientista de computa¸c˜ao, que incluiu posi¸c˜oes na academia e da ind´ustria, as contribui¸c˜oes de Dijkstra trouxe-lhe
9.17. 1968 - Programa¸c˜ao Concorrente 149
muitos pr´emios e distin¸c˜oes, incluindo maior honra da Ciˆencia de Computa¸c˜ao, o Prˆemio Turing ACM.
Figura 86 – Leslie Lamport - Introduziu novos conceitos na ciˆencia computacional, tais como rel´ogios l´ogicos.
Fonte: https://pt.wikipedia.org/wiki/Leslie Lamport.
Outros trabalhos relevantes - Em 1981, G. Ricart e A. Agrawala: “Um algoritmo ´
otimo para exclus˜ao m´utua distribu´ıda”. Tamb´em em 1981, G. L. Peterson: “O problema da exclus˜ao m´utua”. J´a em 1982, J. Misra e K. M. Chandy: “Detec¸c˜ao de termina¸c˜ao em Communicating Sequencial Processes”. Em 1983, G. L. Peterson: “Uma nova solu¸c˜ao para o prolema de programa¸c˜ao concorrente de Lamport usando vari´aveis compartilhadas”. Tamb´em em 1983, o Department of Defense, USA, criou a linguagem de programa¸c˜ao Ada, para programar concorrentemente. J´a em 1985, D. Gelernter criou a linguagem Linda, baseada num espa¸co de tuplas. Concorrente de Hoare, Arthur John Robin Gorell Milner (1934-2010), conhecido por Robin Milner, publicou CCS (Calculus of Communication Systems) e Communication and Concurrency em 1990.
Um programa concorrente ´e executado por se compartilhar o poder de processa- mento de um ´unico processador entre os processos desse programa. A unidade de processamento concorrente ´e o processo. O paralelismo ´e abstrato porque n˜ao re- queremos que um processador f´ısico seja usado para executar cada processo, da´ı chamar-se de pseudo-paralelismo. S˜ao casos de concorrˆencia, a sobreposi¸c˜ao de I/O e processamento (Overlapped I/O and Computation), a multiprograma¸c˜ao (multi-programming), a multi-tarefa¸c˜ao (multitasking). No in´ıcio dos tempos dos primeiros SOs, controlar I/O n˜ao era feito concorrentemente com outra computa¸c˜ao sobre um ´unico processador. Mas a evolu¸c˜ao do SOs, fez surgir a concorrˆencia, retirando da computa¸c˜ao principal, alguns microsegundos necess´arios para controlar I/O. Entretanto, era mais simples programar os controladores de I/O como processos separados, os quais s˜ao executados em paralelo com o processo de computa¸c˜ao princi- pal. Assim, era feito nos computadores de grande porte da ´epoca. Uma generaliza¸c˜ao de sobreposi¸c˜ao de I/O dentro de um ´unico programa ´e sobrepor a computa¸c˜ao e I/O de diversos programas.
Figura 87 – Robin Milner - CCS, uma estrutura te´orica para analisar sistemas concorrentes.
Fonte: Google Images - www.britannica.com.
Multiprograma¸c˜ao veio a ser a execu¸c˜ao concorrente de diversos processos inde- pendentes sobre um processador. Surgiram os sistemas time-slicing, compartilhando o processador entre diversas computa¸c˜oes de processos. Ao contr´ario do que um processo esperar para o t´ermino de uma opera¸c˜ao de I/O, o processador era j´a compartilhado atrav´es de um hardware (timer ) usado para interromper uma com- puta¸c˜ao de um processo em intervalos pre-determinados (time-slice). Para tal, foi criada a ideia de um programa do SO chamado Scheduler, que at´e hoje, ´e executado para determinar qual processo deve ser permitido executar no pr´oximo intervalo. Sistemas interativos com time-slicing usam multiprograma¸c˜ao com time-sliced, para dar a um grupo de usu´arios a ilus˜ao que cada um tem acesso a um computador dedicado. O Scheduler pode tamb´em levar em considera¸c˜ao, prioridades dos processos. Por causa das poss´ıveis intera¸c˜oes entre os processos que compreendem um programa concorrente ´e dif´ıcil escrever um programa concorrente correto. Para interagirem, processos precisam se sincronizar e se comunicar diretamente ou n˜ao, o que chamado de sincroniza¸c˜ao de processos. Resolvendo um problema por decomposi¸c˜ao em di- versos processos concorrentes, a execu¸c˜ao de diversos aplicativos (programas) por um ´
unico usu´ario, eu uma m´aquina de um ´unico processador pode ser, por exemplo como: N: Integer := 0;
Process P1 is begin N := N + 1;
end P1;
9.17. 1968 - Programa¸c˜ao Concorrente 151
N := N + 1; end P2;
Se um compilador traduzir estas declara¸c˜oes de alto n´ıvel em instru¸c˜oes INC (in- cremento), como na Figura88, qualquer intercala¸c˜ao das sequˆencias de instru¸c˜oes dos dois processos dar˜ao o mesmo valor. Este programa sendo implementado em instru¸c˜oes INC de um linguagem “assembly” (montagem).
Se o mesmo programa for implementado usando os registradores de uma linguagem Assembly, como na Figura 89, algumas intercala¸c˜oes d˜ao resposta errada.
Figura 88 – Programando concorrˆencia com instru¸c˜oes INC.
Fonte: Ben-Ari, Principles of Concurrent Programming.
Figura 89 – Programando concorrˆencia com instru¸c˜oes de Assembly em registradores.
Fonte: Ben-Ari, Principles of Concurrent Programming.
e as estruturas de programa¸c˜ao concorrente cl´assicas, controladas por sem´aforos, monitores e Locks, para poder sincronizar processos ou threads, num ambiente multithreading moderno.
Se dois processos rodam em m´aquinas distintas e eles devem ser comunicar para cooperar um com o outro, esses dois processos precisam se comunicar remotamente, em uma redes de computadores rede de computadores, atrav´es do mecanismo de sockets existentes em cada um processos.