But how do we actually learn the content for the first time?
39 |
40 |
41 |
So we all know that Active Recall and Spaced Repetition are the most efficient ways of revising material. But how do we actually learn the content for the first time? That's what I try to answer in this video. Enjoy xx
42 |
43 |
44 |
But how do we actually learn the content for the first time?
45 |
46 |
47 |
So we all know that Active Recall and Spaced Repetition are the most efficient ways of revising material. But how do we actually learn the content for the first time? That's what I try to answer in this video. Enjoy xx
But how do we actually learn the content for the first time?
58 |
59 |
60 |
So we all know that Active Recall and Spaced Repetition are the most efficient ways of revising material. But how do we actually learn the content for the first time? That's what I try to answer in this video. Enjoy xx
61 |
62 |
63 |
But how do we actually learn the content for the first time?
64 |
65 |
66 |
So we all know that Active Recall and Spaced Repetition are the most efficient ways of revising material. But how do we actually learn the content for the first time? That's what I try to answer in this video. Enjoy xx
Que técnicas de análise estática e dinâmica existem?
51 |
52 |
53 |
54 |
55 | * Estática: Análise da complexidade assintótica e Prova ou Argumentação sobre correção.
56 | * Dinâmica: Testes de desempenho - profiling e Testes pontuais/aleatórios.
57 |
58 |
59 |
60 |
61 |
O que são pré-condições e pós-condições?
62 |
63 |
64 |
65 |
66 | * Entradas: Dados de entrada e restrições associadas (pré-condições)
67 | * Saídas: Dados de saída e restrições associadas (pós-condições)
68 |
69 |
70 |
71 |
72 |
73 | -------
74 |
75 | ## Invariantes e variantes de ciclos
76 |
77 |
78 |
79 |
O que são invariantes e variantes de ciclos?
80 |
81 |
82 |
83 |
84 | A maioria dos algoritmos são iterativos, com um ciclo principal.
85 |
86 |
87 |
88 | * Para provar que um ciclo está correto, temos de encontrar um invariante do ciclo - uma expressão booleana (nas variáveis do ciclo) ‘sempre verdadeira’ ao longo do ciclo.
89 | * Para provar que um ciclo termina, temos de encontrar um variante do ciclo – uma função (nas variáveis do ciclo).
90 |
91 |
92 |
93 |
94 |
95 |
96 | Quais são as 3 propriedades que temos de verificar num **invariante** de ciclo?
97 |
98 |
99 |
100 |
101 |
102 | * é verdadeira inicialmente, i.e., é implicada pela pré-condição;
103 | * é mantida em cada iteração, i.e., é verdadeira no fim de cada iteração, assumindo que é verdadeira no início da iteração;
104 | * quando o ciclo termina, garante (implica) a pós-condição.
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 | Quais são as 3 propriedades que temos de verificar num **variante** de ciclo?
113 |
47 |
48 | Um grafo não dirigido contém um **circuito de Euler** sse
49 | 1) é conexo e
50 | 2) cada vértice tem grau (número de arestas incidentes) par.
51 |
52 | Um grafo não dirigido contém um **caminho de Euler** sse
53 | 1) é conexo e
54 | 2) todos menos dois vértices têm grau par (estes dois vértices serão os vértices de início e fim do caminho).
55 |
56 | > Circuito = Caminho + Identificação da origem e do destino
57 | > Circuito mais restrito que Caminho
58 |
59 |
60 |
61 |
62 | Um grafo dirigido contém um **circuito de Euler** sse
63 | 1) é (fortemente) conexo e
64 | 2) cada vértice tem o mesmo grau de entrada e de saída.
65 |
66 | Um grafo dirigido contém um **caminho de Euler** sse
67 | 1) é (fortemente) conexo e
68 | 2) todos menos dois vértices têm o mesmo grau de entrada e de saída, e os dois vértices têm graus de entrada e de saída que diferem de 1.
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 | 
77 |
78 |
79 |
80 |
81 | 
82 |
83 |
84 |
85 |
86 |
87 | -----
88 |
89 | ## Pesquisa em Profundidade
90 |
91 | Se o grafo satisfizer as condições necessárias e suficientes, esta pesquisa termina necessariamente no vértice de partida, formando um circuito, embora não necessariamente de Euler
92 |
93 |
94 |
95 |
96 |
97 | 1. Escolher um vértice qualquer e efetuar uma pesquisa em profundidade a partir desse vértice
98 | 2. Enquanto existirem arestas por visitar
99 | 1. Procurar o primeiro vértice no caminho (circuito) obtido até ao momento que possua uma aresta não percorrida
100 | 2. Lançar uma sub-pesquisa em profundidade a partir desse vértice (sem voltar a percorrer arestas já percorridas)
101 | 3. Inserir o resultado (circuito) no caminho principal
102 |
103 |
104 |
105 |
106 |
107 | > Tempo de execução: O(|E| + |V|)
108 | > Cada vértice e aresta é percorrido uma única vez - Usam-se listas ligadas para efetuar inserções em tempo constante
109 |
110 |
111 |
112 |
113 | ### Problema do carteiro chinês
114 |
115 | Dado um grafo pesado conexo G=(V,E), encontrar um caminho fechado (i.e., com início e fim no mesmo vértice) de peso mínimo que atravesse cada aresta de G pelo menos uma vez é o **percurso ótimo do carteiro Chinês**. A um caminho fechado (não necessariamente de peso mínimo) que atravesse cada aresta pelo menos uma vez chama-se **percurso do carteiro**.
116 |
117 | > Se o grafo G não for Euleriano, pode-se construir um grafo Euleriano G* duplicando algumas arestas de G, selecionadas por forma a conseguir um grafo Euleriano com peso total mínimo.
118 |
119 | ----
120 |
121 | ## Grafos não dirigidos
122 |
123 |
124 |
125 |
126 |
127 | 1. Achar todos os vértices de grau ímpar em G. Seja k o número (par!) destes vértices. Se k=0, fazer G*=G e saltar para o passo 6.
128 | 2. Achar os caminhos mais curtos e distâncias mínimas entre todos os pares de vértices de grau ímpar em G.
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 | 3. Construir um grafo completo G' com os vértices de grau ímpar de G ligados entre si por arestas de peso igual à distância mínima calculada no passo 2.
142 |
143 | 4. Encontrar um emparelhamento perfeito (envolvendo todos os vértices) de peso mínimo em G'. Isto corresponde a emparelhar os vértices de grau ímpar de G, minimizando a soma das distâncias entre vértices emparelhados.
144 |
145 |
146 |
147 |
148 | 
149 |
150 |
151 |
152 |
153 |
154 | 5. Para cada par (u, v) no emparelhamento perfeito obtido, adicionar pseudo-arestas (arestas paralelas duplicadas) a G ao longo de um caminho mais curto entre u e v. Seja G* o grafo resultante.
155 | 6. Achar um circuito de Euler em G*. Este circuito é um percurso ótimo do carteiro Chinês.
156 |
172 |
173 | 1. No grafo G dado, identificar os vértices com nos diferentes de arestas a entrar e a sair
174 | 2. Determinar os caminhos mais curtos de vértices que têm défice de saídas para vértices que têm défice de entradas e representar as distâncias respetivas num grafo bipartido G’.
175 | > Os Vértices são anotados com multiplicidade (número de parelhas em que deve participar) igual ao défice absoluto
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 | 3. Formular problema de emparelhamento óptimo como problema de fluxo máximo de custo mínimo e resolver.
189 |
190 |
191 |
192 |
193 |
194 | 
195 |
196 |
197 |
198 |
199 |
200 | 4. Obter grafo Euleriano G*, duplicando em G os caminhos mais curtos entre os vértices emparelhados no passo 3, e obter um circuito Euleriano.
201 |
202 |
203 |
204 |
205 | 
206 |
207 |
208 |
209 |
--------------------------------------------------------------------------------
/examples/deadlocks/note.md:
--------------------------------------------------------------------------------
1 | ---
2 | id: "custom"
3 | ---
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
35 |
36 | # Deadlock
37 |
38 | ###### *Impasse; Bloqueio fatal; Bloqueio permanente* - bloqueio permanente de um conjunto de processos que competem por recursos do sistema ou comunicam entre si.
39 |
40 | > Deadlock versus starvation:
41 | > Deadlock (bloqueio fatal) :
42 | > * esperar indefinidamente por alguma coisa que não pode acontecer.
43 | >
44 | > Starvation (inanição) :
45 | >
46 | > * esperar muito tempo por alguma coisa que pode nunca acontecer.
47 |
48 | Vários processos, executando concorrentemente, competem pelos mesmos recursos e quando um processo detém um recurso, os outros têm de esperar.
49 |
50 |
51 |
52 |
53 | 2 processos utilizando
54 | 2 semáforos Mutex, S e Q
55 | Acontece um deadlock se a ordem de execução for, por ex.:
56 | P1 - Wait(S), P2 - Wait(Q), P2 - Wait(S)
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | ### Condições Necessárias para ocorrer deadlock
67 |
68 | ###### 4 condições tomadas em conjunto constituem condições necessárias e suficientes para um deadlock.
69 |
70 |
71 |
72 |
73 |
74 | * Exclusão mútua - Só um processo pode usar um recurso de cada vez.
75 | * Retém e espera - Um processo pode deter recursos enquanto está à espera que lhe sejam atribuídos outros recursos.
76 | * Não preempção dos recursos - Quando um processo detém um recurso só ele o pode libertar.
77 | * Espera circular - O deadlock ocorre se e só se a condição de espera circular não tiver solução. A condição de espera circular não tem solução quando as 3 primeiras condições se verificam.
78 |
79 |
88 |
89 | ----
90 |
91 | ### Tratamento de deadlocks
92 |
93 | #### Prevenir - Assegurar que pelo menos 1 das 4 condições necessárias não se verifica.
94 |
95 |
96 |
97 |
98 |
99 | Exclusão mútua
100 |
101 |
102 |
103 | Solução: usar só recursos partilháveis ...!
104 |
105 |
106 |
107 | Problema: certos recursos têm de ser usados com exclusão mútua.
108 |
109 |
110 |
111 |
112 |
113 | Retém e espera
114 |
115 |
116 |
117 |
118 | Solução: Garantir que quando um processo requisita um recurso não detém nenhum outro recurso:
119 | * Requisitar todos os recursos antes de começar a executar, ou
120 | * Requisitar os recursos incrementalmente, mas libertar os recursos que detém quando não conseguir requisitar os recursos de que precisa.
121 |
122 |
123 |
124 |
125 |
126 | Problemas:
127 | * Sub-utilização dos recursos.
128 | * Necessidade de conhecimento prévio de todos os recursos necessários. (não faz sentido em sistemas interactivos)
129 | * Possibilidade de inanição.
130 |
131 |
132 |
133 |
134 |
135 |
136 | Não preempção de recursos
137 |
138 |
139 |
140 |
141 | Solução: Permitir a preempção de recursos - Quando é negado um recurso a um processo, este deverá libertar todos os outros, ou o processo que detém esse recurso deverá libertá-lo.
142 |
143 |
144 |
145 |
146 |
147 | Problema: só é aplicável a recursos cujo estado actual pode ser guardado e restaurado facilmente (ex.: memória e registos da CPU)
148 |
149 |
150 |
151 |
152 |
153 |
154 | Espera circular
155 |
156 |
157 |
158 |
159 | Solução: Protocolo para impedir espera circular; os vários tipos de recursos são ordenados e e os processos devem requisitá-los por essa ordem.
160 |
161 |
162 |
163 |
164 |
165 | Problemas:
166 | * Ineficiência devido à ordenação imposta aos recursos - os recursos têm de ser requisitados por uma certa ordem em vez de serem requisitados à medida que são precisos. Certos recursos são negados desnecessariamente.
167 | * Difícil encontrar uma ordenação que funcione.
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 | #### Evitar - Não conceder recursos a um processo, se essa concessão for suscetível de conduzir a deadlock.
176 |
177 | Permitir que aquelas condições se verifiquem, e decidir, perante cada pedido de recursos, se ele pode conduzir a um deadlock, caso os recursos sejam atribuídos. Se sim, negar a atribuição dos recursos pedidos.
178 |
179 | Examinar dinamicamente o estado de alocação de recursos para assegurar que não vai ocorrer uma espera circular.
180 |
181 | **Assegurar que o sistema nunca entra num estado inseguro (estado que pode conduzir a deadlock).**
182 |
183 | Duas estratégias:
184 |
185 | * Não começar a executar um processo se as suas necessidades, juntamente c/ as necessidades dos que já estão a correr, forem suscetíveis de conduzir a um deadlock. **Demasiado Restritiva**
186 |
187 | * Não conceder um recurso adicional a um processo se essa concessão for suscetível de conduzir a um deadlock. **Algoritmo do Banqueiro**
188 |
189 | > Algoritmo do Banqueiro
190 | > * Vantagens: Menos restritivo do que a prevenção ; Não requer a requisição simultânea de todos os recursos necessários ; Não obriga à preempção dos recursos.
191 | > * Dificuldades: Necessidade de conhecimento antecipado de todos os recursos necessários (utilidade prática limitada) ; Overhead necessário para detetar os estados seguros.
192 |
193 | #### Deteção e Recuperação - Conceder sempre os recursos enquanto existirem disponíveis; periodicamente, verificar a existência de processos encravados e, se existirem, resolver a situação.
194 |
195 | Os recursos são concedidos se estiverem disponíveis. | Periodicamente deteta-se a ocorrência de deadlocks | Se existir deadlock, aplica-se uma estratégia de recuperação.
196 |
197 | * Deteção:
198 | * Sempre que é concedido um novo recurso $\rightarrow$ overhead elevado.
199 | * Com um período fixo.
200 | * Quando a utilização do processador é baixa.
201 |
202 | * Recuperação:
203 | * Avisar o operador e deixar que seja ele a tratar do assunto.
204 | * O sistema recupera automaticamente - Abortando alguns processos envolvidos numa espera circular ou fazendo a preempção de alguns recursos.
205 |
206 | *Mais detalhes no ppt - Solução do SO é a seguinte:*
207 |
208 | #### Ignorar os deadlocks
209 |
210 | Considera-se que é preferível que ocorra um deadlock, de vez em quando, do que estar sujeito ao overhead necessário para os evitar/detetar. O UNIX limita-se a negar os pedidos se não tiver os recursos disponíveis.
211 |
212 | > Os deadlocks ocorrem essencialmente nos processos do utilizador, não nos processos do sistema. Alguns sistemas (ex: VMS) iniciam um temporizador sempre que um processo bloqueia à espera de um recurso. Se o pedido continuar bloqueado ao fim de um certo tempo, é então executado um algoritmo de deteção de deadlocks.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ----
6 |
7 |
markdown-notes
8 |
9 |
Templates for your Note Taking Markdown Workflow
10 |
11 |
12 |
13 |
14 |
15 | ## Contents
16 |
17 | - [Contents](#contents)
18 | - [Overview](#overview)
19 | - [Installation (CLI)](#installation-cli)
20 | - [Using](#using)
21 | - [1. Templates Folder](#1-templates-folder)
22 | - [2. CLI app](#2-cli-app)
23 | - [Examples](#examples)
24 | - [Templates](#templates)
25 | - [Themes](#themes)
26 | - [Contributing](#contributing)
27 | - [License](#license)
28 |
29 | ## Overview
30 |
31 | **Based on some effective study methods (Feynman Technique, Flashcards, Cornell Note Taking Method, Charting Method, Split Page Method etc...), these markdown templates are designed to help on creating better study materials, faster and directly from your computer. Only markdown or html/css skills are required. The styles are fully customizable!**
32 |
33 | All the working files are contained in these folders:
34 | * [Templates](templates/) - for the markdown templates
35 | * [Themes](themes/) - for the styling themes
36 |
37 | > **Important**
38 | > The extension [Markdown Preview Enhanced](https://shd101wyy.github.io/markdown-preview-enhanced/#/), available for VSCode and Atom is required, not only for the notes' styled preview but also for a better html export.
39 |
40 | This is a two versions package:
41 |
42 | 1. If you do want to install the CLI app, a simple command line interface that creates the files on your current directory, follow the instructions in the next [section](#installation-cli).
43 | 2. Else, if you only need the templates, copy the files you need (a .md and the corresponding .less file, ex: [note.md](templates/note.md) and [note-style.less](themes/default/note-style.less)), from the previously mentioned folders, paste them wherever you want and start editing them. A Pro Tip is using your machine *Templates* or *Models* folder for a faster template creation.
44 |
45 |
46 | ## Installation (CLI)
47 |
48 | > `node` and `npm` are required to be installed on your system.
49 |
50 | First, `git clone` this repo. Then go to the downloaded folder and run
51 |
52 | `$ npm install`
53 | to install the dependencies
54 |
55 | `$ chmod +x md-notes.js`
56 | to make the program executable
57 |
58 | `$ npm link`
59 | or
60 | `$ sudo npm link`
61 | to create a bin link and make it possible to call the program globally on your machine.
62 |
63 | If everything went with no errors, a successful installation was accomplished.
64 | So... Start [using](#cli-app) it!
65 |
66 | ## Using
67 |
68 | ... Having everything set up,
69 |
70 | ### 1. Templates Folder
71 |
72 | If these files are on your machine *Templates* folder, you can easily spawn them on any folder using your file manager context menu.
73 |
74 | ### 2. CLI app
75 |
76 | Else, if you installed the CLI app version, then you need only to run
77 |
78 | `$ md-notes`
79 |
80 | on your terminal in the desired directory and choose the suitable options.
81 |
82 | ----
83 | Finally, open your Text Editor (VSCode or Atom) to start crafting and visualizing your markdown notes.
84 |
85 | Search for a *Markdown Preview Enhanced* **Preview Button** on the top corners of your editor to open the viewer tab. Search for the extension shortcuts or buttons to export your notes to html, for then opening it on your browser and printing them to pdf.
86 |
87 | > See [Themes](#themes) for an overview of the expected visual results
88 |
89 | ## Examples
90 |
91 | There is a [folder](examples/) containing examples of these note templates. They were also exported to html, using the recommended VSCode/Atom extension, and then printed to pdf, directly from the browser.
92 |
93 | ## Templates
94 |
95 | This [folder](templates/) contains all the available markdown templates to start creating and editing the notes. They may be very similar, but all of them must represent the initial header with all the necessary info for linking the styles and start writing the notes.
96 |
97 | > Every template must have a corresponding .less file in every available theme, following the current naming and structure.
98 |
99 | To help on creating/editing the notes, they may provide some basic code that can be commented and/or urls for some online documentation.
100 |
101 | The global font family is also specified in these headers.
102 |
103 | ## Themes
104 |
105 | Currently, there are two featured themes:
106 | + [Default Theme](themes/default/)
107 | + [Minimal Theme](themes/minimal/)
108 |
109 | More customizations may come in the future.
110 | Some example aspects/components of the Default Theme are:
111 |
112 |
125 |
126 |
127 |
128 |
129 |
130 |
131 | h1 or #
132 |
133 |
134 |
135 | 
136 |
137 |
138 |
139 |
140 |
141 |
142 | h2 or ##
143 |
144 |
145 |
146 | 
147 |
148 |
149 |
150 |
151 |
152 |
153 | h3 or ###
154 |
155 |
156 |
157 | 
158 |
159 |
160 |
161 |
162 |
163 |
164 | h4 or ####
165 |
166 |
167 |
168 | 
169 |
170 |
171 |
172 |
173 |
174 |
175 | h5 or #####
176 |
177 |
178 |
179 | Similar to h4, but smaller.
180 |
181 |
182 |
183 |
184 |
185 |
186 | h6 or ######
187 |
188 |
189 |
190 |  This will appear with a grey background color when previewing or in html.
191 |
222 |
223 | Not displayed. It is used for page breaks when printing to pdf.
224 |
225 |
226 |
227 |
228 | ## Contributing
229 |
230 | **Contributions are all welcome!**
231 |
232 | New templates and new themes are appreciated, as well as new features for expanding this idea or make it better, more functional.
233 |
234 | Whenever a new template is added, the corresponding style for every suitable theme should be also created. Follow the existing example for the Default Theme.
235 |
236 | ## License
237 |
238 | Licensed under the [MIT license](LICENSE.txt).
239 |
--------------------------------------------------------------------------------
/examples/correctness/q&a.html:
--------------------------------------------------------------------------------
1 |
2 | q&a
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
261 |
262 |
263 |
264 |
391 |
392 |
Funcionamento Correto
393 |
394 |
Qualidades Principais de um Algoritmo
395 |
396 |
397 |
398 |
Quais são as 3 qualidades principais a analisar num algoritmo?
399 |
400 |
401 |
402 |
403 |
Eficiência temporal
404 |
Eficiência Espacial
405 |
Funcionamento Correto
406 |
407 |
408 |
409 |
410 |
Que técnicas de análise estática e dinâmica existem?
411 |
412 |
413 |
414 |
415 |
416 |
Estática: Análise da complexidade assintótica e Prova ou Argumentação sobre correção.
417 |
418 |
419 |
Dinâmica: Testes de desempenho - profiling e Testes pontuais/aleatórios.
420 |
421 |
422 |
423 |
424 |
425 |
O que são pré-condições e pós-condições?
426 |
427 |
428 |
429 |
430 |
431 |
Entradas: Dados de entrada e restrições associadas (pré-condições)
432 |
433 |
434 |
Saídas: Dados de saída e restrições associadas (pós-condições)
435 |
436 |
437 |
438 |
439 |
440 |
441 |
Invariantes e variantes de ciclos
442 |
443 |
444 |
445 |
O que são invariantes e variantes de ciclos?
446 |
447 |
448 |
449 |
A maioria dos algoritmos são iterativos, com um ciclo principal.
450 |
451 |
452 |
453 |
Para provar que um ciclo está correto, temos de encontrar um invariante do ciclo - uma expressão booleana (nas variáveis do ciclo) ‘sempre verdadeira’ ao longo do ciclo.
454 |
455 |
456 |
Para provar que um ciclo termina, temos de encontrar um variante do ciclo – uma função (nas variáveis do ciclo).
457 |
458 |
459 |
460 |
461 |
462 |
463 |
Quais são as 3 propriedades que temos de verificar num invariante de ciclo?
464 |
465 |
466 |
467 |
468 |
469 |
470 |
é verdadeira inicialmente, i.e., é implicada pela pré-condição;
471 |
472 |
473 |
é mantida em cada iteração, i.e., é verdadeira no fim de cada iteração, assumindo que é verdadeira no início da iteração;
474 |
475 |
476 |
quando o ciclo termina, garante (implica) a pós-condição.
477 |
478 |
479 |
480 |
481 |
482 |
483 |
Quais são as 3 propriedades que temos de verificar num variante de ciclo?
484 |
Caminho de Euler: caminho que visita cada aresta exatamente uma vez
380 |
381 |
Circuito de Euler: caminho de Euler que começa e acaba no mesmo vértice
382 |
383 |
Condições necessárias e suficientes:
384 |
385 |
386 |
387 |
388 |
Um grafo não dirigido contém um circuito de Euler sse
389 |
390 |
é conexo e
391 |
cada vértice tem grau (número de arestas incidentes) par.
392 |
393 |
Um grafo não dirigido contém um caminho de Euler sse
394 |
395 |
é conexo e
396 |
todos menos dois vértices têm grau par (estes dois vértices serão os vértices de início e fim do caminho).
397 |
398 |
399 |
Circuito = Caminho + Identificação da origem e do destino
400 | Circuito mais restrito que Caminho
401 |
402 |
403 |
404 |
Um grafo dirigido contém um circuito de Euler sse
405 |
406 |
é (fortemente) conexo e
407 |
cada vértice tem o mesmo grau de entrada e de saída.
408 |
409 |
Um grafo dirigido contém um caminho de Euler sse
410 |
411 |
é (fortemente) conexo e
412 |
todos menos dois vértices têm o mesmo grau de entrada e de saída, e os dois vértices têm graus de entrada e de saída que diferem de 1.
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
Pesquisa em Profundidade
427 |
428 |
Se o grafo satisfizer as condições necessárias e suficientes, esta pesquisa termina necessariamente no vértice de partida, formando um circuito, embora não necessariamente de Euler
429 |
430 |
431 |
432 |
Escolher um vértice qualquer e efetuar uma pesquisa em profundidade a partir desse vértice
433 |
Enquanto existirem arestas por visitar
434 |
435 |
Procurar o primeiro vértice no caminho (circuito) obtido até ao momento que possua uma aresta não percorrida
436 |
Lançar uma sub-pesquisa em profundidade a partir desse vértice (sem voltar a percorrer arestas já percorridas)
437 |
Inserir o resultado (circuito) no caminho principal
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
Tempo de execução: O(|E| + |V|)
446 | Cada vértice e aresta é percorrido uma única vez - Usam-se listas ligadas para efetuar inserções em tempo constante
447 |
448 |
449 |
450 |
Problema do carteiro chinês
451 |
452 |
Dado um grafo pesado conexo G=(V,E), encontrar um caminho fechado (i.e., com início e fim no mesmo vértice) de peso mínimo que atravesse cada aresta de G pelo menos uma vez é o percurso ótimo do carteiro Chinês. A um caminho fechado (não necessariamente de peso mínimo) que atravesse cada aresta pelo menos uma vez chama-se percurso do carteiro.
453 |
454 |
Se o grafo G não for Euleriano, pode-se construir um grafo Euleriano G* duplicando algumas arestas de G, selecionadas por forma a conseguir um grafo Euleriano com peso total mínimo.
455 |
456 |
457 |
Grafos não dirigidos
458 |
459 |
460 |
461 |
462 |
463 |
Achar todos os vértices de grau ímpar em G. Seja k o número (par!) destes vértices. Se k=0, fazer G*=G e saltar para o passo 6.
464 |
Achar os caminhos mais curtos e distâncias mínimas entre todos os pares de vértices de grau ímpar em G.
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
Construir um grafo completo G' com os vértices de grau ímpar de G ligados entre si por arestas de peso igual à distância mínima calculada no passo 2.
477 |
478 |
479 |
Encontrar um emparelhamento perfeito (envolvendo todos os vértices) de peso mínimo em G'. Isto corresponde a emparelhar os vértices de grau ímpar de G, minimizando a soma das distâncias entre vértices emparelhados.
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
Para cada par (u, v) no emparelhamento perfeito obtido, adicionar pseudo-arestas (arestas paralelas duplicadas) a G ao longo de um caminho mais curto entre u e v. Seja G* o grafo resultante.
491 |
Achar um circuito de Euler em G*. Este circuito é um percurso ótimo do carteiro Chinês.
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
Grafos dirigidos
501 |
502 |
503 |
504 |
505 |
506 |
No grafo G dado, identificar os vértices com nos diferentes de arestas a entrar e a sair
507 |
Determinar os caminhos mais curtos de vértices que têm défice de saídas para vértices que têm défice de entradas e representar as distâncias respetivas num grafo bipartido G’.
508 |
509 |
510 |
Os Vértices são anotados com multiplicidade (número de parelhas em que deve participar) igual ao défice absoluto
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
Formular problema de emparelhamento óptimo como problema de fluxo máximo de custo mínimo e resolver.
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
Obter grafo Euleriano G*, duplicando em G os caminhos mais curtos entre os vértices emparelhados no passo 3, e obter um circuito Euleriano.
Impasse; Bloqueio fatal; Bloqueio permanente - bloqueio permanente de um conjunto de processos que competem por recursos do sistema ou comunicam entre si.
380 |
381 |
382 |
Deadlock versus starvation:
383 | Deadlock (bloqueio fatal) :
384 |
385 |
esperar indefinidamente por alguma coisa que não pode acontecer.
386 |
387 |
Starvation (inanição) :
388 |
389 |
esperar muito tempo por alguma coisa que pode nunca acontecer.
390 |
391 |
392 |
Vários processos, executando concorrentemente, competem pelos mesmos recursos e quando um processo detém um recurso, os outros têm de esperar.
393 |
394 |
395 |
2 processos utilizando
396 | 2 semáforos Mutex, S e Q
397 | Acontece um deadlock se a ordem de execução for, por ex.:
398 | P1 - Wait(S), P2 - Wait(Q), P2 - Wait(S)
399 |
400 |
401 |
402 |
403 |
Condições Necessárias para ocorrer deadlock
4 condições tomadas em conjunto constituem condições necessárias e suficientes para um deadlock.
404 |
405 |
406 |
407 |
408 |
409 |
Exclusão mútua - Só um processo pode usar um recurso de cada vez.
410 |
Retém e espera - Um processo pode deter recursos enquanto está à espera que lhe sejam atribuídos outros recursos.
411 |
Não preempção dos recursos - Quando um processo detém um recurso só ele o pode libertar.
412 |
Espera circular - O deadlock ocorre se e só se a condição de espera circular não tiver solução. A condição de espera circular não tem solução quando as 3 primeiras condições se verificam.
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
Tratamento de deadlocks
421 |
422 |
Prevenir - Assegurar que pelo menos 1 das 4 condições necessárias não se verifica.
423 |
424 |
425 |
426 |
427 | Exclusão mútua
428 |
429 |
430 | Solução: usar só recursos partilháveis ...!
431 |
432 |
433 | Problema: certos recursos têm de ser usados com exclusão mútua.
434 |
435 |
436 |
437 |
438 | Retém e espera
439 |
440 |
441 |
Solução: Garantir que quando um processo requisita um recurso não detém nenhum outro recurso:
442 |
443 |
Requisitar todos os recursos antes de começar a executar, ou
444 |
Requisitar os recursos incrementalmente, mas libertar os recursos que detém quando não conseguir requisitar os recursos de que precisa.
445 |
446 |
447 |
448 |
Problemas:
449 |
450 |
Sub-utilização dos recursos.
451 |
Necessidade de conhecimento prévio de todos os recursos necessários. (não faz sentido em sistemas interactivos)
452 |
Possibilidade de inanição.
453 |
454 |
455 |
456 |
457 |
458 | Não preempção de recursos
459 |
460 |
461 |
Solução: Permitir a preempção de recursos - Quando é negado um recurso a um processo, este deverá libertar todos os outros, ou o processo que detém esse recurso deverá libertá-lo.
462 |
463 |
464 |
Problema: só é aplicável a recursos cujo estado actual pode ser guardado e restaurado facilmente (ex.: memória e registos da CPU)
465 |
466 |
467 |
468 |
469 | Espera circular
470 |
471 |
472 |
Solução: Protocolo para impedir espera circular; os vários tipos de recursos são ordenados e e os processos devem requisitá-los por essa ordem.
473 |
474 |
475 |
Problemas:
476 |
477 |
Ineficiência devido à ordenação imposta aos recursos - os recursos têm de ser requisitados por uma certa ordem em vez de serem requisitados à medida que são precisos. Certos recursos são negados desnecessariamente.
478 |
Difícil encontrar uma ordenação que funcione.
479 |
480 |
481 |
482 |
483 |
Evitar - Não conceder recursos a um processo, se essa concessão for suscetível de conduzir a deadlock.
484 |
485 |
Permitir que aquelas condições se verifiquem, e decidir, perante cada pedido de recursos, se ele pode conduzir a um deadlock, caso os recursos sejam atribuídos. Se sim, negar a atribuição dos recursos pedidos.
486 |
Examinar dinamicamente o estado de alocação de recursos para assegurar que não vai ocorrer uma espera circular.
487 |
Assegurar que o sistema nunca entra num estado inseguro (estado que pode conduzir a deadlock).
488 |
Duas estratégias:
489 |
490 |
491 |
Não começar a executar um processo se as suas necessidades, juntamente c/ as necessidades dos que já estão a correr, forem suscetíveis de conduzir a um deadlock. Demasiado Restritiva
492 |
493 |
494 |
Não conceder um recurso adicional a um processo se essa concessão for suscetível de conduzir a um deadlock. Algoritmo do Banqueiro
495 |
496 |
497 |
498 |
Algoritmo do Banqueiro
499 |
500 |
Vantagens: Menos restritivo do que a prevenção ; Não requer a requisição simultânea de todos os recursos necessários ; Não obriga à preempção dos recursos.
501 |
Dificuldades: Necessidade de conhecimento antecipado de todos os recursos necessários (utilidade prática limitada) ; Overhead necessário para detetar os estados seguros.
502 |
503 |
504 |
Deteção e Recuperação - Conceder sempre os recursos enquanto existirem disponíveis; periodicamente, verificar a existência de processos encravados e, se existirem, resolver a situação.
505 |
506 |
Os recursos são concedidos se estiverem disponíveis. | Periodicamente deteta-se a ocorrência de deadlocks | Se existir deadlock, aplica-se uma estratégia de recuperação.
507 |
508 |
509 |
Deteção:
510 |
511 |
Sempre que é concedido um novo recurso → overhead elevado.
512 |
Com um período fixo.
513 |
Quando a utilização do processador é baixa.
514 |
515 |
516 |
517 |
Recuperação:
518 |
519 |
Avisar o operador e deixar que seja ele a tratar do assunto.
520 |
O sistema recupera automaticamente - Abortando alguns processos envolvidos numa espera circular ou fazendo a preempção de alguns recursos.
521 |
522 |
523 |
524 |
Mais detalhes no ppt - Solução do SO é a seguinte:
525 |
Ignorar os deadlocks
526 |
527 |
Considera-se que é preferível que ocorra um deadlock, de vez em quando, do que estar sujeito ao overhead necessário para os evitar/detetar. O UNIX limita-se a negar os pedidos se não tiver os recursos disponíveis.
528 |
529 |
Os deadlocks ocorrem essencialmente nos processos do utilizador, não nos processos do sistema. Alguns sistemas (ex: VMS) iniciam um temporizador sempre que um processo bloqueia à espera de um recurso. Se o pedido continuar bloqueado ao fim de um certo tempo, é então executado um algoritmo de deteção de deadlocks.