# Introduction

Generically, a **resource** is something a process needs in order to proceed with its execution.

* **physical components of the computational system** (processor, memory, I/O devices, etc.).
* **common data** structures defined at the operating system level (PCT, communication channels, etc,) or among processes of a given application.

Resources can be:

* **preemptable** – if they can be withdraw from the processes that hold them.
  * ex: processor, memory regions used by a process address space.
* **non-preemptable** – if they can only be released by the processes that hold them.
  * ex: a file, a shared memory region that requires exclusive access for its manipulation.

For this topic, only non-preemptable resources are relevant.

## Illustrating deadlock

<figure><img src="/files/En409yXmkdGmyv2BE34m" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/AjPvLybYDrcjXlAH1AUq" alt=""><figcaption></figcaption></figure>

*P* needs *S* to proceed, which is on possession of *Q*.

*Q* needs *R* to proceed, which is on possession of *P*.

What are the conditions for the occurrence of deadlock?

## Necessary conditions for deadlock

It can be proved that when deadlock occurs 4 conditions are necessarily observed:

* It can be proved that when deadlock occurs 4 conditions are necessarily observed:
* **mutual exclusion** – only one process may use a resource at a time.
  * if another process requests it, it must wait until it is released.
* **hold and wait** – A process waits for some resources while holding others at the same time.
* **no preemption** – resources are non-preemptable.
  * only the process holding a resource can release it, after completing its task.
* **circular wait** – a set of waiting processes must exist such that each one is waiting for resources held by other processes in the set.
  * there are loops in the graph.

<figure><img src="/files/drX2wndP2P1S342L1bHm" alt=""><figcaption></figcaption></figure>

## IIlustrating with the philosopher dinner problem

<figure><img src="/files/49EBIHpFjltG9ySpono1" alt=""><figcaption></figcaption></figure>

5 philosophers are seated around a table, with food in from of them. To eat, every philosopher needs two forks, the ones at her/his left and right sides. Every philosopher alternates periods in which she/he medidates with periods in which she/he eats.

Modelling every philosopher as a **different process or thread** and the forks as resources, **design a solution for the problem**.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://davidjosearaujo.gitbook.io/notes-miect/sistemas-de-operacao/deadlock/introduction.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
