All streams
Search
Write a publication
Pull to refresh
10
0.3
Егор Воронцов @sdore

Типичный Python'ист

Send message

Pinned repositories.

Пи́ны в профиле для вас — шутка?

Ровно в этой статье оно и есть.

Да, в кино мы даём мозгу «дорисовывать» контент. В рабочем использовании этому места нет.

У меня вот наоборот глаза начинают уставать от яркости ниже 100% на мониторе (ноутбуки/телефоны — другая история). Везде OLED, обычно без HDR.

При этом я чувствителен к ШИМу, но его точно нет на моём нынешнем G80SD — проверено глазами и приборами. Так что дело в чём-то ином.

У сервисов это искусственное ограничение (пресеты битрейтов). К предмету обсуждения это прямого отношения не имеет.

А у цифрового сигнала subsampling не обойти никаким программным Super Resolution, поскольку в конечном итоге мы всё равно скейлим результат обратно и отправляем по кабелю в том же (нативном) разрешении и с тем же subsampling'ом.

А ещё есть кастомная прошивка для его родного железа на ESP32!

P.S. Авторство моё.

Вы противоречите здравому смыслу. Нельзя оценить общее по частному.

OOM-киллер такое решение, и ограничения cgroups (в т.ч. нативно средствами systemd).

Давайте полный обзор начиная с systemctl hibernate

Го!

Systemd v257.5 и Linux 6.14:

  1. $ systemctl hibernate (кликабельно, также тык, тык, тык, тык);

  2. shared/hibernate-util.c:find_suitable_hibernation_device_full():

    Attempt to find a suitable device for hibernation by parsing /proc/swaps, /sys/power/resume, and /sys/power/resume_offset.

…
FOREACH_ARRAY(swap, entries.swaps, entries.n_swaps) {
	…
	if (… swap->size - swap->used > entry->size - entry->used)
		entry = swap;
}

if (!entry) {
	…
	return log_debug_errno(SYNTHETIC_ERRNO(ENOSPC), "No swap space available for hibernation.");
}

- нашли своп-файл/раздел по размеру;

  1. sleep/sleep.c:execute() — пишет в /sys/power/state, запуская процесс гибернации в ядре:

…
/* Configure hibernation settings if we are supposed to hibernate */
if (SLEEP_OPERATION_IS_HIBERNATION(operation)) {
	…
	r = find_suitable_hibernation_device(&hibernation_device);
	…
}

…

if (!action)
	action = sleep_operation_to_string(operation);

…

… LOG_MESSAGE("Performing sleep operation '%s'...", sleep_operation_to_string(operation)) …

r = write_state(state_fd, sleep_config->states[operation]);
if (r < 0)
	… LOG_MESSAGE("Failed to put system to sleep. System resumed again: %m") …
  • записали disk в /sys/power/state;

  1. kernel/power/main.c:state_store():

…
state = decode_state(buf, n);
if (state < PM_SUSPEND_MAX) {
	if (state == PM_SUSPEND_MEM)
		state = mem_sleep_current;

	error = pm_suspend(state);
} else if (state == PM_SUSPEND_MAX) {
	error = hibernate();
} …
  • запустили процесс гибернации;

  1. kernel/power/hibernate.c:hibernation_snapshot():

    Quiesce devices and create a hibernation image.

…
error = hibernate_preallocate_memory();
…
if (… !error)
	error = create_image(platform_mode);

/*
 * In the case that we call create_image() above, the control
 * returns here (1) after the image has been created or the
 * image creation has failed and (2) after a successful restore.
 */

/* We may need to release the preallocated image pages here. */
if (error || !in_suspend)
	swsusp_free();

- аллоцировали память и сделали дамп (и вернёмся сюда второй раз после пробуждения);

  1. kernel/power/hibernate.c:hibernate():

    Carry out system hibernation, including saving the image.

…
error = freeze_processes();
…
error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM);
…
if (in_suspend) {
	…
	if (nocompress) {
		flags |= SF_NOCOMPRESS_MODE;
	} else {
	        flags |= SF_CRC32_MODE;

		/*
		 * By default, LZO compression is enabled. Use SF_COMPRESSION_ALG_LZ4
		 * to override this behaviour and use LZ4.
		 *
		 * Refer kernel/power/power.h for more details
		 */

		if (!strcmp(hib_comp_algo, COMPRESSION_ALGO_LZ4))
			flags |= SF_COMPRESSION_ALG_LZ4;
		else
			flags |= SF_COMPRESSION_ALG_LZO;
	}

	pm_pr_dbg("Writing hibernation image.\n");
	error = swsusp_write(flags);
	swsusp_free();
	if (!error) {
		…
		power_down();
	}
}
  • пережали и записали образ на диск и, наконец, выключили систему.

Ну а hibernate_preallocate_memory() мы с вами уже разбирали :))

P.S. А ещё более подробно можно почитать туть.

Я вам показываю, как гибернация реализована. Разумеется, она производится постранично — так, как содержимым памяти оперирует сам MMU, т.е. нативно. Выделяется место постранично, а копируются данные, ясное дело, побайтово. Страница из байтов состоит, а где противоречие-то?

Безусловно, в коде фигурируют страницы. Повторюсь: в каком месте я говорил про байты?

Страница не является байтом. Так что всё ваши утверждения можно поделить на ноль

Простите, что? Где я утверждал обратное, или вообще что-то про байты?

Ваша задача — пользоваться системой в меру её возможностей. Если вы хотите занимать больше, чем у вас RAM — будьте добры зарезервировать своп. Если нет — не занимайте.

Да как не является-то?

Смотрим kernel/power/snapshot.c:

To make this happen, we compute the total number of available page frames and allocate at least

([page frames total] - PAGES_FOR_IO - [metadata pages]) / 2 - 2 * DIV_ROUND_UP(reserved_size, PAGE_SIZE)

of them, which corresponds to the maximum size of a hibernation image.

If image_size is set below the number following from the above formula, the preallocation of memory is continued until the total number of saveable pages in the system is below the requested image size or the minimum acceptable image size returned by minimum_image_size(), whichever is greater.

Функция даже предварительно освобождает память, покуда возможно:

/*
 * Let the memory management subsystem know that we're going to need a
 * large number of page frames to allocate and make it free some memory.
 * NOTE: If this is not done, performance will be hurt badly in some
 * test cases.
 */
shrink_all_memory(saveable - size);

Затем пробует аллоцировать всё меньше и меньше, пока не получится:

/*
 * The number of saveable pages in memory was too high, so apply some
 * pressure to decrease it.  First, make room for the largest possible
 * image and fail if that doesn't work.  Next, try to decrease the size
 * of the image as much as indicated by 'size' using allocations from
 * highmem and non-highmem zones separately.
 */
pages_highmem = preallocate_image_highmem(highmem / 2);
pages = preallocate_image_memory(alloc, avail_normal);

могу продолжить разбор, надо?

Где данные о том, что у большинства работает всё хорошо?

Бритва Оккама. Где данные о том, что у большинства работает плохо? У кого хорошо, тот не идёт на форумы писать об этом.

Оно займёт его, только если вы сами запустите то, чем его занять. Боритесь не с симптомами, а с первопричиной.

Хочу как Windows и Macosx.. Что непонятного? Для меня Linux это винда.

Так вы не по адресу. Линукс — не винда. И не может быть ею, и рассматриваться как оная.

Information

Rating
2,321-st
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity