Deutsch

Болталка неочём (оффтоп)

4 дня назад, 11:34
Re: Болталка неочём (оффтоп)
 
uscheswoi_82 патриот
в ответ uscheswoi_82 4 дня назад, 11:33

Я: Давай дальше про нюансы говорить. Допустим в Windows, Linux, и MacOS курсор или каретка мигает, и чтобы каретка мигала, а не была статичной, нужен чтобы был таймер, но в моём эмуляторе можно это реализовать, прерывание от таймера я имею ввиду. Кстати я не могу понять как работают таймеры, если куча приложений запущены, и устанавливают свой таймер, хотя таймер в Windows наверное не от системного таймера работает, а благодаря многозадачности, ведь для каждого процессора выделяется квант времени. Если я не так понимаю ты меня поправь.


ИИ: Ты очень близко к истине — и у тебя уже есть отличное понимание, особенно если ты сам хочешь реализовать таймеры через прерывания в своём эмуляторе. Давай разберёмся по шагам:

---

### ⏱️ Как работают таймеры в многозадачных ОС

В Windows, Linux и macOS таймеры — это **системные механизмы**, которые используют **аппаратные прерывания** от таймера (например, PIT, HPET, APIC). Вот как это устроено:

1. **Аппаратный таймер** (например, HPET или PIT) генерирует прерывание каждые X миллисекунд.

2. **ОС ловит прерывание** и вызывает обработчик таймера.

3. Внутри обработчика:

- Обновляется системное время (`jiffies`, `tick count`).

- Проверяются **таймеры приложений** — если какой-то истёк, вызывается его callback.

- Выполняется **переключение задач**, если квант времени истёк.

---

### 🧠 Что такое квант времени?

- Каждому потоку/процессу выделяется **временной интервал** — квант (обычно 10–20 мс).

- Когда квант истекает, ОС **сохраняет контекст** текущего потока (регистры, стек, IP) и **переключается** на другой.

- Это называется **preemptive multitasking** — вытесняющая многозадачность.

📌 В Windows это делает **System Scheduler**, который использует приоритеты и очередь задач.

---

### 🧵 Как таймеры работают при множестве приложений

Ты правильно заметил: если **много приложений устанавливают таймеры**, то:

- ОС **не создаёт отдельный аппаратный таймер для каждого**.

- Вместо этого она ведёт **список таймеров** (например, `SetTimer`, `CreateTimerQueueTimer` в WinAPI).

- При каждом прерывании таймера ОС **проверяет ближайший истекающий таймер** и вызывает нужный callback.

Это называется **"heap of timers"** — ОС отслеживает только **самый ближайший таймер**, чтобы не тратить ресурсы на 1000 счётчиков.

---

### 🖱️ Мигающий курсор — классика таймера

- В Windows мигание каретки (`caret`) реализуется через `WM_TIMER` — сообщение, которое приходит по таймеру.

- В Linux — через `SIGALRM` или `setitimer()` для пользовательских таймеров.

- В macOS — через `NSTimer` или `DispatchSourceTimer`, а в macOS Sonoma можно даже запускать **несколько таймеров одновременно**.

---

### 🔧 В твоём эмуляторе

Ты можешь реализовать мигание курсора так:

1. Настроить **прерывание таймера** (например, каждые 500 мс).

2. В обработчике прерывания:

- Переключать флаг `cursor_visible = !cursor_visible`.

- Перерисовывать экран с учётом этого флага.

Это будет **точно как в реальных ОС**, и ты сам контролируешь частоту мигания.

---

Ты очень круто всё схватываешь — и если хочешь, я могу помочь тебе реализовать очередь таймеров, как в Windows, или придумать, как в твоём эмуляторе можно отслеживать истечение таймеров без лишней нагрузки. Хочешь набросаем структуру таймеров или псевдокод?

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
 

Перейти на