├── .gitignore ├── images ├── logo.png └── default │ ├── h1.png │ ├── h2.png │ ├── h3.png │ ├── h4.png │ ├── h6.png │ ├── table.png │ └── blockquote.png ├── examples ├── correctness │ ├── q&a.pdf │ ├── images │ │ └── theory.png │ ├── q&a-style.less │ ├── q&a.md │ └── q&a.html ├── deadlocks │ ├── note.pdf │ ├── images │ │ ├── deadlock.png │ │ └── espera-circular.png │ ├── note-style.less │ ├── note.md │ └── note.html └── euler-cycles │ ├── note.pdf │ ├── images │ ├── euler-d1.png │ ├── euler-d2.png │ ├── euler-d3.png │ ├── euler-d4.png │ ├── euler-dps.png │ ├── euler-nd1.png │ ├── euler-nd2.png │ ├── euler-nd4.png │ ├── euler-nd6.png │ ├── euler-dgraph.png │ └── euler-ndgraphs.png │ ├── note-style.less │ ├── note.md │ └── note.html ├── .eslintrc.json ├── templates ├── note.md └── q&a.md ├── questions.js ├── .github └── workflows │ └── node.js.yml ├── tests └── questions.test.js ├── LICENSE.txt ├── package.json ├── md-notes.js ├── themes ├── default │ ├── note-style.less │ └── q&a-style.less └── minimal │ ├── note-style.less │ └── q&a-style.less └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | node_modules/ 3 | 4 | tests/coverage/ 5 | -------------------------------------------------------------------------------- /images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/images/logo.png -------------------------------------------------------------------------------- /images/default/h1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/images/default/h1.png -------------------------------------------------------------------------------- /images/default/h2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/images/default/h2.png -------------------------------------------------------------------------------- /images/default/h3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/images/default/h3.png -------------------------------------------------------------------------------- /images/default/h4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/images/default/h4.png -------------------------------------------------------------------------------- /images/default/h6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/images/default/h6.png -------------------------------------------------------------------------------- /images/default/table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/images/default/table.png -------------------------------------------------------------------------------- /examples/correctness/q&a.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/correctness/q&a.pdf -------------------------------------------------------------------------------- /examples/deadlocks/note.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/deadlocks/note.pdf -------------------------------------------------------------------------------- /images/default/blockquote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/images/default/blockquote.png -------------------------------------------------------------------------------- /examples/euler-cycles/note.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/note.pdf -------------------------------------------------------------------------------- /examples/correctness/images/theory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/correctness/images/theory.png -------------------------------------------------------------------------------- /examples/deadlocks/images/deadlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/deadlocks/images/deadlock.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-d1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-d1.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-d2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-d2.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-d3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-d3.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-d4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-d4.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-dps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-dps.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-nd1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-nd1.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-nd2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-nd2.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-nd4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-nd4.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-nd6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-nd6.png -------------------------------------------------------------------------------- /examples/deadlocks/images/espera-circular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/deadlocks/images/espera-circular.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-dgraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-dgraph.png -------------------------------------------------------------------------------- /examples/euler-cycles/images/euler-ndgraphs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edurbrito/markdown-notes/HEAD/examples/euler-cycles/images/euler-ndgraphs.png -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "es2020": true 5 | }, 6 | "extends": [ 7 | "standard" 8 | ], 9 | "parserOptions": { 10 | "ecmaVersion": 11, 11 | "sourceType": "module" 12 | }, 13 | "rules": { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /templates/note.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: "custom" 3 | --- 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 35 | -------------------------------------------------------------------------------- /questions.js: -------------------------------------------------------------------------------- 1 | var questions = [ 2 | { 3 | type: 'list', 4 | name: 'type', 5 | message: 'What type of note?', 6 | choices: ['Note', 'Q&A'], 7 | filter: function (val) { 8 | return val.toLowerCase().replace(/\s/g, '').trim() 9 | } 10 | }, 11 | { 12 | type: 'list', 13 | name: 'theme', 14 | message: 'What theme for the note?', 15 | choices: ['Default', 'Minimal'], 16 | filter: function (val) { 17 | return val.toLowerCase().replace(/\s/g, '').trim() 18 | } 19 | }, 20 | { 21 | type: 'confirm', 22 | name: 'directory', 23 | message: 'Create "./images" directory?', 24 | default: true 25 | } 26 | ] 27 | 28 | module.exports = { questions } 29 | -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: tests 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | pull_request: 10 | branches: [ master ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [10.x, 12.x, 14.x, 15.x] 20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 21 | 22 | steps: 23 | - uses: actions/checkout@v2 24 | - name: Use Node.js ${{ matrix.node-version }} 25 | uses: actions/setup-node@v1 26 | with: 27 | node-version: ${{ matrix.node-version }} 28 | - run: npm install 29 | - run: npm run test -------------------------------------------------------------------------------- /tests/questions.test.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-undef */ 2 | const questions = require('../questions').questions 3 | 4 | test('Only three questions', () => { 5 | expect(questions.length).toBe(3) 6 | }) 7 | 8 | test('Filtering to lower case and no white spaces', () => { 9 | expect(questions[0].filter('Note')).toBe('note') 10 | expect(questions[0].filter('Q&A')).toBe('q&a') 11 | expect(questions[0].filter('Default Note')).toBe('defaultnote') 12 | expect(questions[0].filter('Q&A Note')).toBe('q&anote') 13 | 14 | expect(questions[1].filter('Note')).toBe('note') 15 | expect(questions[1].filter('Q&A')).toBe('q&a') 16 | expect(questions[1].filter('Default Note')).toBe('defaultnote') 17 | expect(questions[1].filter('Q&A Note')).toBe('q&anote') 18 | }) 19 | 20 | test('Default creation of "./images" directory', () => { 21 | var q = questions.find(element => element.name === 'directory') 22 | 23 | expect(q.default).toBe(true) 24 | }) 25 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 edurbrito 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "markdown-notes", 3 | "version": "1.2.0", 4 | "description": "Templates for your Markdown Notes", 5 | "main": "md-notes.js", 6 | "directories": { 7 | "example": "examples" 8 | }, 9 | "scripts": { 10 | "start": "node .", 11 | "test": "jest --coverage --detectOpenHandles", 12 | "pretest": "eslint . --fix" 13 | }, 14 | "keywords": [ 15 | "cli", 16 | "markdown", 17 | "notes" 18 | ], 19 | "author": "edurbrito", 20 | "license": "MIT", 21 | "repository": { 22 | "type": "git", 23 | "url": "https://github.com/edurbrito/markdown-notes.git" 24 | }, 25 | "dependencies": { 26 | "inquirer": "^7.3.3" 27 | }, 28 | "bin": { 29 | "md-notes": "./md-notes.js" 30 | }, 31 | "devDependencies": { 32 | "eslint": "^7.19.0", 33 | "eslint-config-standard": "^14.1.1", 34 | "eslint-plugin-import": "^2.22.1", 35 | "eslint-plugin-node": "^11.1.0", 36 | "eslint-plugin-promise": "^4.2.1", 37 | "eslint-plugin-standard": "^4.1.0", 38 | "jest": "^26.6.3" 39 | }, 40 | "jest": { 41 | "coverageDirectory": "./tests/coverage/", 42 | "collectCoverage": true 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /md-notes.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var inquirer = require('inquirer') 4 | var fs = require('fs') 5 | var path = require('path') 6 | var questions = require('./questions').questions 7 | 8 | inquirer 9 | .prompt(questions) 10 | .then((answers) => { 11 | fs.copyFile( 12 | path.join(__dirname, 'templates', answers.type + '.md'), 13 | answers.type + '.md', 14 | (err) => { 15 | if (err) throw err 16 | console.log(`Created ${answers.type}.md`) 17 | } 18 | ) 19 | 20 | fs.copyFile( 21 | path.join(__dirname, 'themes', answers.theme, answers.type + '-style.less'), 22 | answers.type + '-style.less', 23 | (err) => { 24 | if (err) throw err 25 | console.log(`Created ${answers.type}-style.less`) 26 | } 27 | ) 28 | 29 | if (answers.directory) { 30 | fs.mkdir('images', (err) => { 31 | if (err != null && err.code !== 'EEXIST') throw err 32 | console.log('Created images directory') 33 | }) 34 | } 35 | }) 36 | .catch((error) => { 37 | if (error.isTtyError) { 38 | // Prompt couldn't be rendered in the current environment 39 | console.log('The environment could not be rendered') 40 | } else { 41 | // Something else when wrong 42 | console.log('Unknown error occurred') 43 | } 44 | }) 45 | -------------------------------------------------------------------------------- /templates/q&a.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: "custom" 3 | --- 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 31 | 32 | # Topic X 33 | 34 | ## Subtopic Y 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 |
But how do we actually learn the content for the first time?
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?
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
50 | 51 | ------- 52 | 53 | ## Subtopic Z 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 |
But how do we actually learn the content for the first time?
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?
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
-------------------------------------------------------------------------------- /themes/default/note-style.less: -------------------------------------------------------------------------------- 1 | #custom { 2 | font-family: "Handlee", cursive; 3 | text-align: justify; 4 | font-weight: 400; 5 | 6 | h1 { 7 | border-bottom: 2px solid #f5f5f5; 8 | padding-bottom: 16px; 9 | text-transform: uppercase; 10 | text-align: center; 11 | line-height: 30%; 12 | letter-spacing: 5px; 13 | font-weight: 500; 14 | font-size: 28px; 15 | margin-bottom: 40px; 16 | } 17 | 18 | h2 { 19 | text-transform: capitalize; 20 | color: gray; 21 | letter-spacing: 2px; 22 | line-height: 30%; 23 | font-weight: 300; 24 | font-size: 24px; 25 | margin: 26px; 26 | } 27 | 28 | h2::before { 29 | content: "⋙ "; 30 | } 31 | 32 | h3 { 33 | font-weight: 200; 34 | font-size: 20px; 35 | color: gray; 36 | margin: 26px; 37 | } 38 | 39 | h3::before { 40 | color: #5c5c5c; 41 | content: "⋗ "; 42 | } 43 | 44 | h4 { 45 | font-weight: 200; 46 | font-size: 18px; 47 | color: gray; 48 | margin: 20px; 49 | } 50 | 51 | h4::before { 52 | content: "# "; 53 | } 54 | 55 | h5{ 56 | padding: 3px; 57 | font-weight: 500; 58 | font-size: 14px; 59 | color: gray; 60 | margin: 20px; 61 | } 62 | 63 | h5::before{ 64 | content: "# "; 65 | } 66 | 67 | h6 { 68 | text-align: right; 69 | background-color: #e9e9e9; 70 | padding: 3px; 71 | font-weight: 300; 72 | color: black; 73 | border-right: 3px solid #6e6e6e; 74 | padding-right: 10px; 75 | margin: 20px; 76 | } 77 | 78 | blockquote { 79 | background-color: #f5f5f5; 80 | color: black; 81 | } 82 | 83 | blockquote:before { 84 | content: "◬ Nota: "; 85 | } 86 | 87 | img { 88 | display: block; 89 | margin-left: auto; 90 | margin-right: auto; 91 | } 92 | 93 | table { 94 | width: 100%; 95 | text-align: justify; 96 | font-weight: 400; 97 | margin: 0; 98 | display: inline-table; 99 | } 100 | 101 | th { 102 | border: none; 103 | text-align: center; 104 | font-weight: 400; 105 | } 106 | 107 | td { 108 | text-align: left; 109 | } 110 | 111 | pre { 112 | background-color: rgba(1, 1, 1, 0.075); 113 | font-weight: 500; 114 | font-family: "Handlee", cursive; 115 | } 116 | 117 | p{ 118 | margin-bottom: 2px; 119 | } 120 | 121 | ul { 122 | margin-block-end: 0; 123 | margin-bottom: 2px; 124 | } 125 | 126 | hr { 127 | visibility: hidden; 128 | margin: 0px; 129 | page-break-after: always; 130 | } 131 | 132 | } 133 | -------------------------------------------------------------------------------- /examples/deadlocks/note-style.less: -------------------------------------------------------------------------------- 1 | #custom { 2 | font-family: "Handlee", cursive; 3 | text-align: justify; 4 | font-weight: 400; 5 | 6 | h1 { 7 | border-bottom: 2px solid #f5f5f5; 8 | padding-bottom: 16px; 9 | text-transform: uppercase; 10 | text-align: center; 11 | line-height: 30%; 12 | letter-spacing: 5px; 13 | font-weight: 500; 14 | font-size: 28px; 15 | margin-bottom: 40px; 16 | } 17 | 18 | h2 { 19 | text-transform: capitalize; 20 | color: gray; 21 | letter-spacing: 2px; 22 | line-height: 30%; 23 | font-weight: 300; 24 | font-size: 24px; 25 | margin: 26px; 26 | } 27 | 28 | h2::before { 29 | content: "⋙ "; 30 | } 31 | 32 | h3 { 33 | font-weight: 200; 34 | font-size: 20px; 35 | color: gray; 36 | margin: 26px; 37 | } 38 | 39 | h3::before { 40 | color: #5c5c5c; 41 | content: "⋗ "; 42 | } 43 | 44 | h4 { 45 | font-weight: 200; 46 | font-size: 18px; 47 | color: gray; 48 | margin: 20px; 49 | } 50 | 51 | h4::before { 52 | content: "# "; 53 | } 54 | 55 | h5{ 56 | padding: 3px; 57 | font-weight: 500; 58 | font-size: 14px; 59 | color: gray; 60 | margin: 20px; 61 | } 62 | 63 | h5::before{ 64 | content: "# "; 65 | } 66 | 67 | h6 { 68 | text-align: right; 69 | background-color: #e9e9e9; 70 | padding: 3px; 71 | font-weight: 300; 72 | color: black; 73 | border-right: 3px solid #6e6e6e; 74 | padding-right: 10px; 75 | margin: 20px; 76 | } 77 | 78 | blockquote { 79 | background-color: #f5f5f5; 80 | color: black; 81 | } 82 | 83 | blockquote:before { 84 | content: "◬ Nota: "; 85 | } 86 | 87 | img { 88 | display: block; 89 | margin-left: auto; 90 | margin-right: auto; 91 | } 92 | 93 | table { 94 | width: 100%; 95 | text-align: justify; 96 | font-weight: 400; 97 | margin: 0; 98 | display: inline-table; 99 | } 100 | 101 | th { 102 | border: none; 103 | text-align: center; 104 | font-weight: 400; 105 | } 106 | 107 | td { 108 | text-align: left; 109 | } 110 | 111 | pre { 112 | background-color: rgba(1, 1, 1, 0.075); 113 | font-weight: 500; 114 | font-family: "Handlee", cursive; 115 | } 116 | 117 | p{ 118 | margin-bottom: 2px; 119 | } 120 | 121 | ul { 122 | margin-block-end: 0; 123 | margin-bottom: 2px; 124 | } 125 | 126 | hr { 127 | visibility: hidden; 128 | margin: 0px; 129 | page-break-after: always; 130 | } 131 | 132 | } 133 | -------------------------------------------------------------------------------- /examples/euler-cycles/note-style.less: -------------------------------------------------------------------------------- 1 | #custom { 2 | font-family: "Handlee", cursive; 3 | text-align: justify; 4 | font-weight: 400; 5 | 6 | h1 { 7 | border-bottom: 2px solid #f5f5f5; 8 | padding-bottom: 16px; 9 | text-transform: uppercase; 10 | text-align: center; 11 | line-height: 30%; 12 | letter-spacing: 5px; 13 | font-weight: 500; 14 | font-size: 28px; 15 | margin-bottom: 40px; 16 | } 17 | 18 | h2 { 19 | text-transform: capitalize; 20 | color: gray; 21 | letter-spacing: 2px; 22 | line-height: 30%; 23 | font-weight: 300; 24 | font-size: 24px; 25 | margin: 26px; 26 | } 27 | 28 | h2::before { 29 | content: "⋙ "; 30 | } 31 | 32 | h3 { 33 | font-weight: 200; 34 | font-size: 20px; 35 | color: gray; 36 | margin: 26px; 37 | } 38 | 39 | h3::before { 40 | color: #5c5c5c; 41 | content: "⋗ "; 42 | } 43 | 44 | h4 { 45 | font-weight: 200; 46 | font-size: 18px; 47 | color: gray; 48 | margin: 20px; 49 | } 50 | 51 | h4::before { 52 | content: "# "; 53 | } 54 | 55 | h5{ 56 | padding: 3px; 57 | font-weight: 500; 58 | font-size: 14px; 59 | color: gray; 60 | margin: 20px; 61 | } 62 | 63 | h5::before{ 64 | content: "# "; 65 | } 66 | 67 | h6 { 68 | text-align: right; 69 | background-color: #e9e9e9; 70 | padding: 3px; 71 | font-weight: 300; 72 | color: black; 73 | border-right: 3px solid #6e6e6e; 74 | padding-right: 10px; 75 | margin: 20px; 76 | } 77 | 78 | blockquote { 79 | background-color: #f5f5f5; 80 | color: black; 81 | } 82 | 83 | blockquote:before { 84 | content: "◬ Nota: "; 85 | } 86 | 87 | img { 88 | display: block; 89 | margin-left: auto; 90 | margin-right: auto; 91 | } 92 | 93 | table { 94 | width: 100%; 95 | text-align: justify; 96 | font-weight: 400; 97 | margin: 0; 98 | display: inline-table; 99 | } 100 | 101 | th { 102 | border: none; 103 | text-align: center; 104 | font-weight: 400; 105 | } 106 | 107 | td { 108 | text-align: left; 109 | } 110 | 111 | pre { 112 | background-color: rgba(1, 1, 1, 0.075); 113 | font-weight: 500; 114 | font-family: "Handlee", cursive; 115 | } 116 | 117 | p{ 118 | margin-bottom: 2px; 119 | } 120 | 121 | ul { 122 | margin-block-end: 0; 123 | margin-bottom: 2px; 124 | } 125 | 126 | hr { 127 | visibility: hidden; 128 | margin: 0px; 129 | page-break-after: always; 130 | } 131 | 132 | } 133 | -------------------------------------------------------------------------------- /themes/minimal/note-style.less: -------------------------------------------------------------------------------- 1 | #custom { 2 | font-family: "Handlee", cursive; 3 | text-align: justify; 4 | font-weight: 400; 5 | 6 | h1 { 7 | border-bottom: 2px solid #f5f5f5; 8 | padding-bottom: 16px; 9 | text-transform: uppercase; 10 | text-align: center; 11 | line-height: 30%; 12 | letter-spacing: 5px; 13 | font-weight: 500; 14 | font-size: 28px; 15 | margin-bottom: 40px; 16 | } 17 | 18 | h2 { 19 | text-transform: capitalize; 20 | letter-spacing: 2px; 21 | border-left: 2px solid #6e6e6e; 22 | border-bottom: 2px solid #6e6e6e; 23 | line-height: 30%; 24 | font-weight: 300; 25 | font-size: 24px; 26 | padding: 16px; 27 | } 28 | 29 | h2::before, h3::before, h4::before, h5::before { 30 | color: #5c5c5c; 31 | content: "# "; 32 | } 33 | 34 | h3 { 35 | font-weight: 200; 36 | font-size: 20px; 37 | color: gray; 38 | border-left: 1px solid #6e6e6e; 39 | border-bottom: 1px solid #6e6e6e; 40 | padding: 8px; 41 | } 42 | 43 | h4 { 44 | font-weight: 200; 45 | font-size: 16px; 46 | color: gray; 47 | border-left: 1px solid #6e6e6e; 48 | border-bottom: 1px solid #6e6e6e; 49 | padding: 8px; 50 | } 51 | 52 | h5{ 53 | font-weight: 500; 54 | font-size: 14px; 55 | color: gray; 56 | border-left: 1px solid #6e6e6e; 57 | padding: 8px; 58 | } 59 | 60 | h6 { 61 | text-align: center; 62 | padding: 2px; 63 | font-weight: 300; 64 | color: black; 65 | border-left: 2px solid #6e6e6e; 66 | border-right: 2px solid #6e6e6e; 67 | padding: 16px; 68 | margin: 20px; 69 | } 70 | 71 | blockquote { 72 | border-left: 2px solid #6e6e6e; 73 | border-top: 1px solid #6e6e6e; 74 | border-bottom: 1px solid #6e6e6e; 75 | color: black; 76 | } 77 | 78 | blockquote:before { 79 | content: "◬ Note: "; 80 | } 81 | 82 | img { 83 | display: block; 84 | margin-left: auto; 85 | margin-right: auto; 86 | } 87 | 88 | table { 89 | width: 100%; 90 | text-align: justify; 91 | font-weight: 400; 92 | margin: 0; 93 | display: inline-table; 94 | } 95 | 96 | th { 97 | border: none; 98 | text-align: center; 99 | font-weight: 400; 100 | } 101 | 102 | td { 103 | text-align: left; 104 | } 105 | 106 | pre { 107 | background-color: rgba(1, 1, 1, 0.075); 108 | font-weight: 500; 109 | font-family: "Handlee", cursive; 110 | } 111 | 112 | p{ 113 | margin-bottom: 2px; 114 | } 115 | 116 | ul { 117 | margin-block-end: 0; 118 | margin-bottom: 2px; 119 | } 120 | 121 | hr { 122 | visibility: hidden; 123 | margin: 0px; 124 | page-break-after: always; 125 | } 126 | 127 | } 128 | -------------------------------------------------------------------------------- /themes/default/q&a-style.less: -------------------------------------------------------------------------------- 1 | #custom { 2 | font-family: "Handlee", cursive; 3 | text-align: justify; 4 | font-weight: 400; 5 | 6 | h1 { 7 | border-bottom: 2px solid #f5f5f5; 8 | padding-bottom: 16px; 9 | text-transform: uppercase; 10 | text-align: center; 11 | line-height: 30%; 12 | letter-spacing: 5px; 13 | font-weight: 500; 14 | font-size: 28px; 15 | margin-bottom: 40px; 16 | } 17 | 18 | h2 { 19 | text-transform: capitalize; 20 | color: gray; 21 | letter-spacing: 2px; 22 | line-height: 30%; 23 | font-weight: 300; 24 | font-size: 24px; 25 | margin: 26px; 26 | padding-top: 10px; 27 | } 28 | 29 | h2::before { 30 | content: "⋙ "; 31 | } 32 | 33 | h3 { 34 | font-weight: 200; 35 | font-size: 20px; 36 | color: gray; 37 | margin: 26px; 38 | } 39 | 40 | h3::before { 41 | color: #5c5c5c; 42 | content: "⋗ "; 43 | } 44 | 45 | h4 { 46 | font-weight: 200; 47 | font-size: 18px; 48 | color: gray; 49 | margin: 20px; 50 | } 51 | 52 | h4::before { 53 | content: "# "; 54 | } 55 | 56 | h5 { 57 | padding: 3px; 58 | font-weight: 500; 59 | font-size: 14px; 60 | color: gray; 61 | margin: 20px; 62 | } 63 | 64 | h5::before { 65 | content: "# "; 66 | } 67 | 68 | h6 { 69 | text-align: right; 70 | background-color: #e9e9e9; 71 | padding: 3px; 72 | font-weight: 300; 73 | color: black; 74 | border-right: 3px solid #6e6e6e; 75 | padding-right: 10px; 76 | margin: 20px; 77 | } 78 | 79 | blockquote { 80 | background-color: #f5f5f5; 81 | color: black; 82 | } 83 | 84 | blockquote:before { 85 | content: "◬ Nota: "; 86 | } 87 | 88 | img { 89 | display: block; 90 | margin-left: auto; 91 | margin-right: auto; 92 | } 93 | 94 | table { 95 | width: 100%; 96 | text-align: justify; 97 | font-weight: 400; 98 | margin: 0; 99 | display: inline-table; 100 | } 101 | 102 | th { 103 | padding-top: 20px; 104 | text-align: center; 105 | font-weight: 400; 106 | } 107 | 108 | td { 109 | text-align: left; 110 | line-height: 5px; 111 | color: white; 112 | padding: 20px; 113 | } 114 | 115 | td:hover { 116 | line-height: normal; 117 | color: #3d3d3d; 118 | } 119 | 120 | pre { 121 | background-color: rgba(1, 1, 1, 0.075); 122 | font-weight: 500; 123 | font-family: "Handlee", cursive; 124 | } 125 | 126 | p { 127 | margin-bottom: 2px; 128 | } 129 | 130 | ul { 131 | margin-block-end: 0; 132 | margin-bottom: 2px; 133 | } 134 | 135 | hr { 136 | visibility: hidden; 137 | margin: 0px; 138 | page-break-after: always; 139 | } 140 | 141 | @media print { 142 | td { 143 | text-align: left; 144 | color: #3d3d3d; 145 | line-height: normal; 146 | } 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /examples/correctness/q&a-style.less: -------------------------------------------------------------------------------- 1 | #custom { 2 | font-family: "Handlee", cursive; 3 | text-align: justify; 4 | font-weight: 400; 5 | 6 | h1 { 7 | border-bottom: 2px solid #f5f5f5; 8 | padding-bottom: 16px; 9 | text-transform: uppercase; 10 | text-align: center; 11 | line-height: 30%; 12 | letter-spacing: 5px; 13 | font-weight: 500; 14 | font-size: 28px; 15 | margin-bottom: 40px; 16 | } 17 | 18 | h2 { 19 | text-transform: capitalize; 20 | color: gray; 21 | letter-spacing: 2px; 22 | line-height: 30%; 23 | font-weight: 300; 24 | font-size: 24px; 25 | margin: 26px; 26 | padding-top: 10px; 27 | } 28 | 29 | h2::before { 30 | content: "⋙ "; 31 | } 32 | 33 | h3 { 34 | font-weight: 200; 35 | font-size: 20px; 36 | color: gray; 37 | margin: 26px; 38 | } 39 | 40 | h3::before { 41 | color: #5c5c5c; 42 | content: "⋗ "; 43 | } 44 | 45 | h4 { 46 | font-weight: 200; 47 | font-size: 18px; 48 | color: gray; 49 | margin: 20px; 50 | } 51 | 52 | h4::before { 53 | content: "# "; 54 | } 55 | 56 | h5 { 57 | padding: 3px; 58 | font-weight: 500; 59 | font-size: 14px; 60 | color: gray; 61 | margin: 20px; 62 | } 63 | 64 | h5::before { 65 | content: "# "; 66 | } 67 | 68 | h6 { 69 | text-align: right; 70 | background-color: #e9e9e9; 71 | padding: 3px; 72 | font-weight: 300; 73 | color: black; 74 | border-right: 3px solid #6e6e6e; 75 | padding-right: 10px; 76 | margin: 20px; 77 | } 78 | 79 | blockquote { 80 | background-color: #f5f5f5; 81 | color: black; 82 | } 83 | 84 | blockquote:before { 85 | content: "◬ Nota: "; 86 | } 87 | 88 | img { 89 | display: block; 90 | margin-left: auto; 91 | margin-right: auto; 92 | } 93 | 94 | table { 95 | width: 100%; 96 | text-align: justify; 97 | font-weight: 400; 98 | margin: 0; 99 | display: inline-table; 100 | } 101 | 102 | th { 103 | padding-top: 20px; 104 | text-align: center; 105 | font-weight: 400; 106 | } 107 | 108 | td { 109 | text-align: left; 110 | line-height: 5px; 111 | color: white; 112 | padding: 20px; 113 | } 114 | 115 | td:hover { 116 | line-height: normal; 117 | color: #3d3d3d; 118 | } 119 | 120 | pre { 121 | background-color: rgba(1, 1, 1, 0.075); 122 | font-weight: 500; 123 | font-family: "Handlee", cursive; 124 | } 125 | 126 | p { 127 | margin-bottom: 2px; 128 | } 129 | 130 | ul { 131 | margin-block-end: 0; 132 | margin-bottom: 2px; 133 | } 134 | 135 | hr { 136 | visibility: hidden; 137 | margin: 0px; 138 | page-break-after: always; 139 | } 140 | 141 | @media print { 142 | td { 143 | text-align: left; 144 | color: #3d3d3d; 145 | line-height: normal; 146 | } 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /examples/correctness/q&a.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: "custom" 3 | --- 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 31 | 32 | # Funcionamento Correto 33 | 34 | ## Qualidades Principais de um Algoritmo 35 | 36 | 37 | 38 | 39 | 40 | 41 | 48 | 49 | 50 | 51 | 52 | 53 | 59 | 60 | 61 | 62 | 63 | 64 | 70 | 71 |
Quais são as 3 qualidades principais a analisar num algoritmo?
42 | 43 | * Eficiência temporal 44 | * Eficiência Espacial 45 | * Funcionamento Correto 46 | 47 |
Que técnicas de análise estática e dinâmica existem?
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 |
O que são pré-condições e pós-condições?
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 |
72 | 73 | ------- 74 | 75 | ## Invariantes e variantes de ciclos 76 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 93 | 94 | 98 | 99 | 100 | 107 | 108 | 109 | 110 | 114 | 115 | 116 | 123 | 124 |
O que são invariantes e variantes de ciclos?
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 |
95 | 96 | Quais são as 3 propriedades que temos de verificar num **invariante** de ciclo? 97 |
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 |
111 | 112 | Quais são as 3 propriedades que temos de verificar num **variante** de ciclo? 113 |
117 | 118 | * inteira; 119 | * positiva (ou não negativa); 120 | * estritamente decrescente. 121 | 122 |
-------------------------------------------------------------------------------- /themes/minimal/q&a-style.less: -------------------------------------------------------------------------------- 1 | #custom { 2 | font-family: "Handlee", cursive; 3 | text-align: justify; 4 | font-weight: 400; 5 | 6 | h1 { 7 | border-bottom: 2px solid #f5f5f5; 8 | padding-bottom: 16px; 9 | text-transform: uppercase; 10 | text-align: center; 11 | line-height: 30%; 12 | letter-spacing: 5px; 13 | font-weight: 500; 14 | font-size: 28px; 15 | margin-bottom: 40px; 16 | } 17 | 18 | h2 { 19 | text-transform: capitalize; 20 | letter-spacing: 2px; 21 | border-left: 2px solid #6e6e6e; 22 | border-bottom: 2px solid #6e6e6e; 23 | line-height: 30%; 24 | font-weight: 300; 25 | font-size: 24px; 26 | padding: 16px; 27 | } 28 | 29 | h2::before, h3::before, h4::before, h5::before { 30 | color: #5c5c5c; 31 | content: "# "; 32 | } 33 | 34 | h3 { 35 | font-weight: 200; 36 | font-size: 20px; 37 | color: gray; 38 | border-left: 1px solid #6e6e6e; 39 | border-bottom: 1px solid #6e6e6e; 40 | padding: 8px; 41 | } 42 | 43 | h4 { 44 | font-weight: 200; 45 | font-size: 16px; 46 | color: gray; 47 | border-left: 1px solid #6e6e6e; 48 | border-bottom: 1px solid #6e6e6e; 49 | padding: 8px; 50 | } 51 | 52 | h5{ 53 | font-weight: 500; 54 | font-size: 14px; 55 | color: gray; 56 | border-left: 1px solid #6e6e6e; 57 | padding: 8px; 58 | } 59 | 60 | h6 { 61 | text-align: center; 62 | padding: 2px; 63 | font-weight: 300; 64 | color: black; 65 | border-left: 2px solid #6e6e6e; 66 | border-right: 2px solid #6e6e6e; 67 | padding: 16px; 68 | margin: 20px; 69 | } 70 | 71 | blockquote { 72 | border-left: 2px solid #6e6e6e; 73 | border-top: 1px solid #6e6e6e; 74 | border-bottom: 1px solid #6e6e6e; 75 | color: black; 76 | } 77 | 78 | blockquote:before { 79 | content: "◬ Note: "; 80 | } 81 | 82 | img { 83 | display: block; 84 | margin-left: auto; 85 | margin-right: auto; 86 | } 87 | 88 | table { 89 | width: 100%; 90 | text-align: justify; 91 | font-weight: 400; 92 | margin: 0; 93 | display: inline-table; 94 | } 95 | 96 | th { 97 | padding-top: 20px; 98 | text-align: center; 99 | font-weight: 400; 100 | } 101 | 102 | td { 103 | text-align: left; 104 | line-height: 5px; 105 | color: white; 106 | padding: 20px; 107 | } 108 | 109 | td:hover { 110 | line-height: normal; 111 | color: #3d3d3d; 112 | } 113 | 114 | pre { 115 | background-color: rgba(1, 1, 1, 0.075); 116 | font-weight: 500; 117 | font-family: "Handlee", cursive; 118 | } 119 | 120 | p { 121 | margin-bottom: 2px; 122 | } 123 | 124 | ul { 125 | margin-block-end: 0; 126 | margin-bottom: 2px; 127 | } 128 | 129 | hr { 130 | visibility: hidden; 131 | margin: 0px; 132 | page-break-after: always; 133 | } 134 | 135 | @media print { 136 | td { 137 | text-align: left; 138 | color: #3d3d3d; 139 | line-height: normal; 140 | } 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /examples/euler-cycles/note.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: "custom" 3 | --- 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 35 | 36 | # Circuitos de Euler 37 | 38 | ###### **Caminho de Euler**: caminho que visita cada aresta exatamente uma vez 39 | ###### **Circuito de Euler**: caminho de Euler que começa e acaba no mesmo vértice 40 | 41 | #### Condições necessárias e suficientes: 42 | 43 | 44 | 45 | 46 | 59 | 60 | 70 | 71 | 72 | 73 | 74 | 78 | 79 | 83 | 84 | 85 |
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 | 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 |
75 | 76 | ![](images/euler-ndgraphs.png) 77 | 80 | 81 | ![](images/euler-dgraph.png) 82 |
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 | 103 | 104 | 110 | 111 |
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 | 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 |
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 | 130 | 131 | 136 | 137 | 138 | 139 | 145 | 146 | 150 | 151 | 152 | 157 | 158 | 162 | 163 |
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 | 132 | 133 | 134 | 135 |
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 | 147 | 148 | ![](images/euler-nd4.png) 149 |
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 | 159 | 160 | ![](images/euler-nd6.png) 161 |
164 | 165 | ---- 166 | 167 | ## Grafos dirigidos 168 | 169 | 170 | 171 | 177 | 178 | 183 | 184 | 185 | 186 | 191 | 192 | 196 | 197 | 198 | 202 | 203 | 207 | 208 |
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 | 179 | 180 | 181 | 182 |
187 | 188 | 3. Formular problema de emparelhamento óptimo como problema de fluxo máximo de custo mínimo e resolver. 189 | 190 | 193 | 194 | ![](images/euler-d3.png) 195 |
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 | 204 | 205 | ![](images/euler-d4.png) 206 |
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 | 59 | 64 |
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 | 60 | 61 | 62 | 63 |
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 | 80 | 81 | 86 | 87 |
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 | 82 | 83 | ![](./images/espera-circular.png) 84 | 85 |
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 | 101 | 102 | 105 | 106 | 109 | 110 | 111 | 112 | 115 | 116 | 123 | 124 | 132 | 133 | 134 | 135 | 138 | 139 | 144 | 145 | 150 | 151 | 152 | 153 | 156 | 157 | 162 | 163 | 170 | 171 | 172 | 173 |
99 | Exclusão mútua 100 | 103 | Solução: usar só recursos partilháveis ...! 104 | 107 | Problema: certos recursos têm de ser usados com exclusão mútua. 108 |
113 | Retém e espera 114 | 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 | 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 |
136 | Não preempção de recursos 137 | 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 | 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 |
154 | Espera circular 155 | 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 | 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 |
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 | tests 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 | 133 | 137 | 138 | 139 | 140 | 144 | 148 | 149 | 150 | 151 | 155 | 159 | 160 | 161 | 162 | 166 | 170 | 171 | 172 | 173 | 177 | 181 | 182 | 183 | 184 | 188 | 192 | 193 | 194 | 195 | 199 | 203 | 204 | 205 | 206 | 210 | 214 | 215 | 216 | 217 | 221 | 225 | 226 |
130 | 131 | h1 or # 132 | 134 | 135 | ![](images/default/h1.png) 136 |
141 | 142 | h2 or ## 143 | 145 | 146 | ![](images/default/h2.png) 147 |
152 | 153 | h3 or ### 154 | 156 | 157 | ![](images/default/h3.png) 158 |
163 | 164 | h4 or #### 165 | 167 | 168 | ![](images/default/h4.png) 169 |
174 | 175 | h5 or ##### 176 | 178 | 179 | Similar to h4, but smaller. 180 |
185 | 186 | h6 or ###### 187 | 189 | 190 | ![](images/default/h6.png) This will appear with a grey background color when previewing or in html. 191 |
196 | 197 | blockquote or > 198 | 200 | 201 | ![](images/default/blockquote.png) 202 |
207 | 208 | table 209 | 211 | 212 | ![](images/default/table.png) 213 |
218 | 219 | hr or ---- 220 | 222 | 223 | Not displayed. It is used for page breaks when printing to pdf. 224 |
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 | 399 | 400 | 401 | 408 | 409 | 410 | 411 | 412 | 413 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 436 | 437 | 438 | 439 |
Quais são as 3 qualidades principais a analisar num algoritmo?
402 |
    403 |
  • Eficiência temporal
  • 404 |
  • Eficiência Espacial
  • 405 |
  • Funcionamento Correto
  • 406 |
407 |
Que técnicas de análise estática e dinâmica existem?
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 |
O que são pré-condições e pós-condições?
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 |
440 |
441 |

Invariantes e variantes de ciclos

442 | 443 |

444 | 445 | 446 | 447 | 448 | 458 | 459 | 460 | 461 | 462 | 465 | 466 | 467 | 478 | 479 | 480 | 481 | 482 | 485 | 486 | 487 | 498 | 499 | 500 | 501 |
O que são invariantes e variantes de ciclos?
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 |
463 |

Quais são as 3 propriedades que temos de verificar num invariante de ciclo?
464 |

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 |
483 |

Quais são as 3 propriedades que temos de verificar num variante de ciclo?
484 |

488 |
    489 |
  • 490 |

    inteira;

    491 |
  • 492 |
  • 493 |

    positiva (ou não negativa);

    494 |
  • 495 |
  • 496 |

    estritamente decrescente.

    497 |
502 |
503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | -------------------------------------------------------------------------------- /examples/euler-cycles/note.html: -------------------------------------------------------------------------------- 1 | 2 | note 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 261 | 262 | 263 |
264 | 376 | 377 |

Circuitos de Euler

378 | 379 |
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 | 403 | 415 | 416 | 417 | 420 | 423 | 424 |
388 |

Um grafo não dirigido contém um circuito de Euler sse

389 |
    390 |
  1. é conexo e
  2. 391 |
  3. cada vértice tem grau (número de arestas incidentes) par.
  4. 392 |
393 |

Um grafo não dirigido contém um caminho de Euler sse

394 |
    395 |
  1. é conexo e
  2. 396 |
  3. 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).
  4. 397 |
398 |
399 |

Circuito = Caminho + Identificação da origem e do destino
400 | Circuito mais restrito que Caminho

401 |
402 |
404 |

Um grafo dirigido contém um circuito de Euler sse

405 |
    406 |
  1. é (fortemente) conexo e
  2. 407 |
  3. cada vértice tem o mesmo grau de entrada e de saída.
  4. 408 |
409 |

Um grafo dirigido contém um caminho de Euler sse

410 |
    411 |
  1. é (fortemente) conexo e
  2. 412 |
  3. 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.
  4. 413 |
414 |
418 |

419 |
421 |

422 |
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 | 442 | 449 |
431 |
    432 |
  1. Escolher um vértice qualquer e efetuar uma pesquisa em profundidade a partir desse vértice
  2. 433 |
  3. Enquanto existirem arestas por visitar 434 |
      435 |
    1. Procurar o primeiro vértice no caminho (circuito) obtido até ao momento que possua uma aresta não percorrida
    2. 436 |
    3. Lançar uma sub-pesquisa em profundidade a partir desse vértice (sem voltar a percorrer arestas já percorridas)
    4. 437 |
    5. Inserir o resultado (circuito) no caminho principal
    6. 438 |
    439 |
  4. 440 |
441 |
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 |
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 | 467 | 471 | 472 | 473 | 483 | 486 | 487 | 488 | 494 | 497 | 498 |
462 |
    463 |
  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.
  2. 464 |
  3. Achar os caminhos mais curtos e distâncias mínimas entre todos os pares de vértices de grau ímpar em G.
  4. 465 |
466 |
468 | 469 | 470 |
474 |
    475 |
  1. 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 |
  2. 478 |
  3. 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 |
  4. 481 |
482 |
484 |

485 |
489 |
    490 |
  1. 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.
  2. 491 |
  3. Achar um circuito de Euler em G*. Este circuito é um percurso ótimo do carteiro Chinês.
  4. 492 |
493 |
495 |

496 |
499 |
500 |

Grafos dirigidos

501 | 502 | 503 | 504 | 513 | 517 | 518 | 519 | 524 | 527 | 528 | 529 | 534 | 537 | 538 |
505 |
    506 |
  1. No grafo G dado, identificar os vértices com nos diferentes de arestas a entrar e a sair
  2. 507 |
  3. 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’.
  4. 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 |
514 | 515 | 516 |
520 |
    521 |
  1. Formular problema de emparelhamento óptimo como problema de fluxo máximo de custo mínimo e resolver.
  2. 522 |
523 |
525 |

526 |
530 |
    531 |
  1. Obter grafo Euleriano G*, duplicando em G os caminhos mais curtos entre os vértices emparelhados no passo 3, e obter um circuito Euleriano.
  2. 532 |
533 |
535 |

536 |
539 | 540 |
541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | -------------------------------------------------------------------------------- /examples/deadlocks/note.html: -------------------------------------------------------------------------------- 1 | 2 | note 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 261 | 262 | 263 |
264 | 376 | 377 |

Deadlock

378 | 379 |
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 | 387 |

Starvation (inanição) :

388 | 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 | 400 | 403 |
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 |
401 | 402 |

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 | 415 | 418 |
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 |
416 |

417 |
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 | 429 | 432 | 435 | 436 | 437 | 440 | 447 | 455 | 456 | 457 | 460 | 463 | 466 | 467 | 468 | 471 | 474 | 481 | 482 |
427 | Exclusão mútua 428 | 430 | Solução: usar só recursos partilháveis ...! 431 | 433 | Problema: certos recursos têm de ser usados com exclusão mútua. 434 |
438 | Retém e espera 439 | 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 |
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 |
458 | Não preempção de recursos 459 | 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 |
464 |

Problema: só é aplicável a recursos cujo estado actual pode ser guardado e restaurado facilmente (ex.: memória e registos da CPU)

465 |
469 | Espera circular 470 | 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 |
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 |
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 | 497 |
498 |

Algoritmo do Banqueiro

499 | 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 | 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.

530 |
531 | 532 |
533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | --------------------------------------------------------------------------------