Обновить
3
0

Пользователь

Отправить сообщение

Спасибо за реабилитацию. Всегда обидно за красивые математические формулы, которыми нельзя красиво воспользоваться на практике. Но в данном случае можно.

Единственное, что в реализации мозолит глаза, так это деление на 2^n. Его логично заменить на битовый сдвиг вправо, что явно быстрее.

Кроме того можно заметить что при каждом умножении числителей A и B возникает как минимум 1 множитель равный двум "2":

(1+sqrt(5))^2 = 2 * (3 + 1 * sqrt(5))

(1+sqrt(5))^3 = 4 * (4 + 2 * sqrt(5))

...

который можно сразу сократить с 2-кой из знаменателя. Т.е. эту 2-ку можно сокращать при каждом умножении с помощь того же двоичного сдвига (также реализуемо при быстром умножении). Тогда в конце деление на 2^n не потребуется. Такой подход как минимум сократит объём памяти для хранения больших чисел, хотя вероятно в ущерб производительности, т.к. сдвигать придётся каждой операции, а не в конце

Галуа был математиком. Ему нет дела до таким меркантильных вещей, как избыточное кодирование :). Так же как и Риман понятия не имел, что какой-то там Энштейн из патентного бюро будет делать с его работами в общей теории относительности.

Хорошая статья, но рассчитана видимо на тех, кто почти "шарит в теме". Скажем:

...то получается что мы включаем транзистор током с 3.3 В , а выключаем транзистор током через тот же резистор, но током с напряжения 0.7 В, то есть ток базы на выключение транзистора получится меньше.

затем

Это одна из причин почему выключается транзистор медленней. Для увеличения скорости выключения транзистора мы можем применить такую схему

Я конечно извиняюсь, но мне, как неспециалисту, этот момент совсем не ясен. Что такое вообще "выключение током"? На сколько я знаю задержки сигнала обусловлены наличием реактивного сопротивления, т.е. присутствием в цепи ёмкости или индуктивности. Видимо тут виновата ёмкость P-N перехода транзистора, которая похожа на RC-цепочку... мне кажется это звучит понятнее. А так для меня лично это звучит как магия

Не надо бросать кадровый аудит и противозаконное членовредительство в одну кучу. Я могу перефразировать свою мысль. Автор изложил ситуацию и, по всей видимости, пытается найти поддержку. А я говорю, что никто тут не поможет. Совесть пусть подсказывает, потому что ситуация не однозначная. С одной стороны так выглядит, что он «подлец» и страдают «невинные люди». А с другой «Наказаний без вины не бывает...» (с). Вы что большой специалист в аудите? Если есть какие-то грубые проступки и превышение полномочий, то ок, я соглашусь.
В качестве примера. Есть такая профессия: приводить смертный приговор в исполнение. Она не плохая и не хорошая. Это просто работа, как и все остальные.
А вот то, что человек сам думает о своей роли в ней, уже совсем другой вопрос. Один может наслаждаться процессом, снимая болезненное психического напряжение, другой другой абстрагироваться, понимая, что выполняет общественную роль, третий — примет близко к сердцу, переживать, в итоге уйдёт и займётся работой по-спокойнее. И тут нет правильного или неправильного решения.
Мой подход — не допускать намерений целенаправленного вредительства людям. А за поступки других я не отвечаю. Если в данном случае что-то было следствием моих действий, то я не виноват, т.к. не преследовал такой цели. И наоборот, если я хотел навредить, но ничего не вышло, то я всё равно виноват.
Для полноты картины стоит протестировать на саморазряд, т.е. деградацию ёмкости при отсутствии нагрузки вообще. Безусловно, такой тест займен на порядок больше времени. Но, думаю, что результаты могу кардинально измениться. Это как батарейки для часов. Одни проработают полгода, а другие — 5 лет. Отсюда и разница в цене.
Спасибо автору. Очень занятный курс, всегда было интересно пройти шаги разработки OS, приближенных к реальности

Однако с приведенной реализацией кучи есть определённые проблемы.

Во-первых в kmalloc есть большие куски лишнего кода, которые никогда не сработают. Дело в том, что в куче никогда не будет 2-х последовательных пустых участков памяти (благодаря функции kfree, которая освобождённый блок сразу же клеит к соседям). По сему ветки
/* try to ask contribution from free left sibling */
if (current->prev != null) { ... }
...
/* try to contribute free right sibling */
if (current->next != null) { ... }

можно спокойно выбрасывать.
В итоге достаточно обработать такие случаи:
1) Найден пустой блок размером <size — пробуем его занять, если он последний в списке
2) Найден пустой блок размером ==size — занимаем его и выходим
3) Найден пустой блок размером >size — занимаем его, а из остатка создаём пустой блок (!!! только если он не последний)
4) Подходящий пустой блок не найден — создаём новый в конце списка
Я проверял — все тесты проходятся без указанного кода, а kmalloc становится проще и читабельней.

Во-вторых, реализация kmalloc_a (в репозитории) выглядит стрёмно. Не похоже, что она будет работать для всех случаев. Например, align==4, а (ptr=kmalloc(size + align))==10, (ptr = ptr + align)==14, маскируем (aligned_ptr = ptr & ~(align — 1))==12 и ((void **) aligned_ptr)[-1]==8 (для 32bit-ого указателя). Т.е. мы вылезли за пределы выделенной памяти. По-моему нужно добавлять (align — 1 + sizeof(void*)) вместо align для гарантии безопасности.
Код не будет выявлять проблем, пока все size для kmalloc кратны 4, align не меньше 8.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность