Что такое сток в компьютере

Обновлено: 07.07.2024

Привет, я студент второго курса технического университета. После пропуска нескольких пар программирования по состоянию здоровья, я столкнулся с непониманием таких тем, как «Стек» и «Очередь». Путем проб и ошибок, спустя несколько дней, до меня наконец дошло, что это такое и с чем это едят. Чтобы у вас понимание не заняло столько времени, в данной статье я расскажу о том что такое «Стек», каким образом и на каких примерах я понял что это такое. Если вам понравится, я напишу вторую часть, которая будет затрагивать уже такое понятие, как «Очередь»

На Википедии определение стека звучит так:

Стек (англ. stack — стопка; читается стэк) — абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»).

Достаточно полное определение, но возможно для новичков оно будет немного трудным для понимания.

Поэтому первое, на чем бы я хотел заострить внимание, это представление стека в виде вещей из жизни. Первой на ум мне пришла интерпретация в виде стопки книг, где верхняя книга — это вершина.


На самом деле стек можно представить в виде стопки любых предметов будь то стопка листов, тетрадей, рубашек и тому подобное, но пример с книгами я думаю будет самым оптимальным.

Итак, из чего же состоит стек.

Стек состоит из ячеек(в примере — это книги), которые представлены в виде структуры, содержащей какие-либо данные и указатель типа данной структуры на следующий элемент.
Сложно? Не беда, давайте разбираться.


На данной картинке схематично изображен стек. Блок вида «Данные/*next» и есть наша ячейка. *next, как мы видим, указывает на следующий элемент, другими словами указатель *next хранит адрес следующей ячейки. Указатель *TOP указывает на вершину стек, то есть хранит её адрес.

С теорией закончили, перейдем к практике.

Для начала нам нужно создать структуру, которая будет являться нашей «ячейкой»

Новичкам возможно будет не понятно, зачем наш указатель — типа comp, точнее сказать указатель типа структуры comp. Объясню, для того чтобы указатель *next мог хранить структуру comp, ей нужно обозначить тип этой структуры. Другими словами указать, что будет хранить указатель.

После того как у нас задана «Ячейка», перейдем к созданию функций.

Функции

Функция создания «Стека»/добавления элемента в «Стек»

При добавлении элемента у нас возникнет две ситуации:

  • Стек пуст, и нужно создать его
  • Стек уже есть и нужно лишь добавить в него новый элемент

Разберем чуть чуть по-подробнее.
Во-первых, почему функция принимает **top, то есть указатель на указатель, для того чтобы вам было наиболее понятно, я оставлю рассмотрение этого вопроса на потом. Во-вторых, по-подробнее поговорим о q->next = *top и о том, что же означает ->.

-> означает то, что грубо говоря, мы заходим в нашу структуру и достаем оттуда элемент этой структуры. В строчке q->next = *top мы из нашей ячейки достаем указатель на следующий элемент *next и заменяем его на указатель, который указывает на вершину стека *top. Другими словами мы проводим связь, от нового элемента к вершине стека. Тут ничего сложного, все как с книгами. Новую книгу мы кладем ровно на вершину стопки, то есть проводим связь от новой книги к вершине стопки книг. После этого новая книга автоматически становится вершиной, так как стек не стопка книг, нам нужно указать, что новый элемент — вершина, для этого пишется: *top = q;.

Функция удаления элемента из «Стека» по данным

Данная функция будет удалять элемент из стека, если число Data ячейки(q->Data) будет равна числу, которое мы сами обозначим.

Здесь могут быть такие варианты:

  • Ячейка, которую нам нужно удалить является вершиной стека
  • Ячейка, которую нам нужно удалить находится в конце, либо между двумя ячейками

Указатель q в данном случае играет такую же роль, что и указатель в блокноте, он бегает по всему стеку, пока не станет равным NULL(while(q != NULL)), другими словами, пока стек не закончится.

Для лучшего понимания удаления элемента проведем аналогии с уже привычной стопкой книг. Если нам нужно убрать книгу сверху, мы её убираем, а книга под ней становится верхней. Тут то же самое, только в начале мы должны определить, что следующий элемент станет вершиной *top = q->next; и только потом удалить элемент free(q);

Если книга, которую нужно убрать находится между двумя книгами или между книгой и столом, предыдущая книга ляжет на следующую или на стол. Как мы уже поняли, книга у нас-это ячейка, а стол получается это NULL, то есть следующего элемента нет. Получается так же как с книгами, мы обозначаем, что предыдущая ячейка будет связана с последующей prev->next = q->next;, стоит отметить что prev->next может равняться как ячейке, так и нулю, в случае если q->next = NULL, то есть ячейки нет(книга ляжет на стол), после этого мы очищаем ячейку free(q).

Так же стоит отметить, что если не провести данную связь, участок ячеек, который лежит после удаленной ячейки станет недоступным, так как потеряется та самая связь, которая соединяет одну ячейку с другой и данный участок просто затеряется в памяти

Функция вывода данных стека на экран

Самая простая функция:

Здесь я думаю все понятно, хочу сказать лишь то, что q нужно воспринимать как бегунок, он бегает по всем ячейкам от вершины, куда мы его установили вначале: *q = top;, до последнего элемента.

Главная функция

Хорошо, основные функции по работе со стеком мы записали, вызываем.
Посмотрим код:

Вернемся к тому, почему же в функцию мы передавали указатель на указатель вершины. Дело в том, что если бы мы ввели в функцию только указатель на вершину, то «Стек» создавался и изменялся только внутри функции, в главной функции вершина бы как была, так и оставалась NULL. Передавая указатель на указатель мы изменяем вершину *top в главной функции. Получается если функция изменяет стек, нужно передавать в нее вершину указателем на указатель, так у нас было в функции s_push,s_delete_key. В функции s_print «Стек» не должен изменяться, поэтому мы передаем просто указатель на вершину.
Вместо цифр 1,2,3,4,5 можно так-же использовать переменные типа int.

Полный код программы:

Так как в стек элементы постоянно добавляются на вершину, выводиться элементы будут в обратном порядке

В заключение хотелось бы поблагодарить за уделенное моей статье время, я очень надеюсь что данный материал помог некоторым начинающим программистам понять, что такое «Стек», как им пользоваться и в дальнейшем у них больше не возникнет проблем. Пишите в комментариях свое мнение, а так же о том, как мне улучшить свои статьи в будущем. Спасибо за внимание.

На Intel так можно получить лишь сущие копейки производительности, а на AMD так и вовсе результат в разгоне в играх может быть ниже, чем в стоке.


Мой чиллер на модулях Пельтье

Когда есть желание получить какие-то высокие частоты с целью просто получить их ради любопытства или чувств соревновательности.

Но это не значит, что увеличить производительность купленного железа вовсе нельзя.

И в этой статье я расскажу о том методе, который ещё хоть как-то работает для повседневной работы компьютера.

Что требуется для повседневного разгона?

Настройка вентиляторов и выбор будущей максимальной температуры

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


Настройка скорости вентиляторов

В качестве примера посмотрим на то что можно получить с i9 9900k на тонкой башне на 4 тепловые трубки и 120 мм вентилятором.

У меня на башне стоит очень тихий вентилятор от арктик, и даже без корпуса шум для меня приемлем при скорости его вращения примерно в полторы тысячи оборотов.


Далее используя intel Extreme Tuning Utility или райзен мастер надо постепенно увеличивать поверлимит процессору, разрешая ему потреблять всё больше и больше энергии при сформированном управлении вентилятором и дойти до такого потребления, при котором вы считаете, что температура ещё приемлемая.

Получил я эту температуру на TDP 145 Ватт.

Оптимизация питания процессора

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


А в стоке в играх отдельные ядра хоть иногда, но прыгают до 4,9 ГГц, в таком случае я от разгона до 4,7 ГГц только потеряю производительность. Ну и по превью вы наверное уже видели, что в итоге после всех манипуляций будет получена частота 5,2 ГГц.

И получена она будет за счёт штатных возможностей авторазгона процессора. Кроме того в работе останутся все штатные функции энергосбережения. То есть процессор в простое будет потреблять 5-10 Ватт.

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

Логика работы процессора при выборе частоты

Частоту процессор динамически выбирает исходя из текущей потребности в производительности, доступного лимита энергопотребления и ограничений по току.

С заявленными максимальными частота дела обстоят не лучше.

У меня было на YouTube канале видео про то как процессоры выбирают частоты и что такое турбо буст.

И тут надо вообще остановиться на том, что же производители указывают в частотах и TDP.


Естественно и те и другие не правы.

А бывают нагрузки задействующие предельно транзисторные возможности процессора. Допустим нагружалки процессора. В таких условиях процессору приходится снижать частоту ещё сильнее.

Тут то и кроется главная проблема классического разгона с локом частоты и напряжения. Надо подстраивать систему именно под самые высокие нагрузки, при том, что пользоваться вы будите потом этим всем в самых простых нагрузках, то есть в играх.

Разрешаем процессору, самому выбирать для себя частоты

В общем я веду к тому, что современные проблемы требуют современных решений. И если раньше для разгона надо было отключать все оптимизации, чтобы повысить стабильность работы только на самой высокой частоте, то теперь надо делать всё наоборот, то есть оставлять все оптимизации, просто расширяя компетенции этих оптимизаций на большие диапазоны частот.

И разгон сводиться именно к тому, чтобы дать процессору новый, бОльший лимит по потреблению, снять заводские лимиты по формуле турбобуста на intel и научить материнскую плату работе с вашим экземпляром процессора, чтобы плата подавала оптимальные напряжения на всех диапазонах частот работы процессора.

Ну и на самом деле и на intel и на AMD производители материнских плат и так выставляют лимиты по мощности выше заводских для процессоров.


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


На деле рассказать плате о том, что она ставит неправильное напряжение довольно просто, и делается это в пару кликов, но я бы хотел чтобы вы не бездумно это делали, а с пониманием происходящего.

Поэтому для начала расскажу очень важную вещь.

Корректировка напряжения Offset.

Благо есть ещё такой режим, который называется offset.


Суть этого режима в смещении вольт частотных таблиц питания.

Я задал процессору нагрузку и при помощи интеловской утилиты я изменял частоту ядер, замеряя VID и напряжения питания процессора для разных частот (вам это при разгоне делать не надо, я просто показываю что изменится).

На основе полученных данных я составил для вас график.


Нажмите для увеличения

И это один из методов коррекции напряжения для процессора. Классический offset предполагает, что вы указываете материнской плате, что ей надо либо сдвинуть эту характеристику выше,


либо то, что ей надо сдвинуть её ниже.



Либо вы можете задать настройки так, чтобы материнская плата держала напряжение на нужном уровне или даже задирала его в период высокой нагрузки. Собственно так вы можете обойтись без корректировки offset, допустим позволяя напряжению просаживаться в высокой нагрузке из-за чего естественным образом будет снижаться и энергопотребление, а значит в рамках ограниченного TDP процессор сможет выставлять более высокие частоты.

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

И для наглядности я сделал для вас сравнения напряжений в нагрузке для автоматической настройки в плате ASUS Maximus Gene XI, на значении LLC4 и на значении LLC8.


Нажмите для увеличения. График напряжения и VID процессора с LLC4 и LLC8

Тут кстати, так же можно увидеть, что плата способна сохранять устойчивую работу на частоте 5,1 ГГц без вмешательств в управление питанием, то есть я просто разрешил брать 5,1 ГГц, и процессор взял их. Но на 5,2 Плата уже ставить не рабочее напряжение для процессора.

Ну и для LLC8 видно, что результаты прерываются на частоте 4,9 ГГц потому что начался троттлинг из-за перегрева процессора выше 100 градусов.

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

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

Начиная с напряжения на ядра 1,15 Вольта. Это напряжение позволяет процессору взять частоту 4,9 ГГц.

В штатных режимах работы напряжение на 4,9 Ггц было 1,26 Вольта.



То есть по дефолту набрасывалось на целую десятую часть вольта больше, чем нужно.

5 ГГц мой процессор без нагрузки с AVX берет на напряжении 1,23 Вольта. 5,1 ГГц на 1,27 Вольта, а 5,2 ГГц на напряжении 1,38 Вольта. 5,3 ГГц мой процессор к сожалению не берёт даже на полутора вольтах. И это мы говорим не про перегрев или ещё что-то.


Можно мысленно продлить практический график в сторону низких частот.

Если судить по 4,9 ГГц то может показаться, что к стоковым напряжениям можно снять офсетом целых 0,09 Вольта, то есть почти одну десятую вольта, но если это сделать, то на низких частотах процессор будет недостаточно стабилен, так что так много снизить не удалось.


Как на практике вводить offset корректировку?


У меня же это получилось -0,05 для дальнейших тестов.


Повышение частоты выше заводских лимитов


В добавок ещё и офсет вмешивается в работу, усложняя задачу для платы.


Adaptive mode


Суть в том, что на штатном участке частот напряжения подаются штатные для процессора,


а на заштатном участке вы сами задаёте максимальное напряжение для выставленной частоты.


То есть в моём случае это 5,2 ГГц.

Я с небольшим запасом для стабильности поставил 1,41 Вольта,



Adaptiv mode + offset mode

Тут материнская плата заботливо пересчитывает заданное напряжение с учётом офсета, чтобы пользователи сами не считали в уме циферки.

Не забывайте про разгон кеша L3 на Intel

Кроме того не надо ещё забывать про разгон кеша L3 и кольцевой шины процессора.

Единственная ожидающая меня неприятность заключалась в том, что почему-то при активации адаптив мода перестала работать LLC. То есть в нагрузке напряжения начали дико просаживаться. Так что в итоге пришлось сильно задрать напряжения. В целом не до критических значений, учитывая, что на высоких токах напряжения будут ниже. Просто это усложняет контроль. И если бы у меня лимит был бы не 145, а, допустим, 200 Ватт, то падения напряжений были бы уже очень большими.

Тесты и прирост от разгона

Сенбенч R15. В разгоне естественно не хватает 145 Ватт TDP и процессор начинает сбрасывать частоты, но естественно, не так сильно как в стоке.


Прирост чуть более 8%.

Результат без разгона Результат после разгона

Сенбенч 20. Более тяжёлая нагрузка. Естественно и тут 145 Ватт не хватает чтобы не сбрасывать частоты.

Результат без разгона Результат после разгона

Но прирост уже составил примерно 12%.

Win-rar. Этот тест ещё очень сильно любит разгон кеша.


Без разгона


С разгоном

Тесты в играх

Начнём с CPU тестов 3D Mark TS.

Без разгона С разгоном

В обычном CPU тесте прирост около 10% и тут уже процессор в разгоне может похвастаться высокими частотами.

В экстрим тесте прирост от разгона процессора составил уже 11%.

Без разгона С разгоном

А так же старался использовать игры, которые хоть как-то умеют работать с большим количеством потоков процессора.


Общее число кадров в бенчмарке


Общее число кадров в бенчмарке


Общее число кадров в бенчмарке

WWZ прирост составил около 5%.


Общее число кадров в бенчмарке

Выводы

Чем отличается написанное выше для Ryzen?

в принципе не существует и в рамках разгона на райзенах вы останетесь в тех пределах, где хорошо работают штатные механизмы задания напряжений. И доступна только задание offset напряжения. Ну или иными словами нужно сделать андервольт процессора и расширить для него лимиты по току и мощности и он сам разгонится.

А как же память?


Следующей статье будет продолжением этой, где эти посредственные планки сменяться на нечто более интересное.



У меня есть новый комплект памяти, который тоже очень ждет чтобы его разогнали. И мы посмотрим что важнее, пыжиться с частотами и выжимать последние капли из процессора, или гнать память. Посмотрим память на родном XMP профиле на 4400 МГц, а также в лучшей конфигурации памяти, что мне удасться получить в ручном разгоне.

Видео на YouTube канале "Этот компьютер"


Вы знаете, у нас, у людей, так всегда. Сперва один человек себе придумает что-либо и начнет нести в массы. А потом, закономерно, толпа это подхватывает и начинает разносить между собой. Проверять поступающую на вход информацию не обязательно, важно громче отстоять свою позицию, в которую человек, уже сам не успев понять как, искренне верит и думает что так было всегда.

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

Примерно между 2003 и 2005 годами, благодаря одной известной гоночной аркаде, появилась грубая неточность, которую подхватило абсолютное большинство людей. Этой неточностью намеренно либо по недосмотру пользуются авто журналисты, тюнеры, чтобы не отпугнуть клиента, и прочие достаточно приближенные к автомобилям люди.
"Сделаю стейж 1, не хочу сидеть на стоке" — часто слышали? Либо: "только забрал машину с салона, пока что унылый сток". Дело в том, что ни у одного из таких водителей машина в стоке никогда не была, да и вероятность, что когда-либо будет, крайне мала. В нашем регионе принято считать: машина, выпущенная на заводе, — сток, и точка. Этот логический вывод вполне легко сделать, когда покупаешь автомобиль в любой игре про уличные гонки, где базовое состояние агрегатов либо внешний вид именуют стоком.
Но слово "сток" — англицизм. Потому и проверять его значение нужно у носителей языка. Я приведу пример из кембриджского толкового словаря.


Стоковый автомобиль — обычный автомобиль, которому усилили конструкцию и подняли производительность для участия в гонках.

Обычно, под определением Stock Car Racing имеется ввиду один из регламентов гонок по овалу. И ездят там совсем не автомобили, только сошедшие с завода.


Заглавное фото ФБ группы ассоциации Saloon Stock Car

Регламент у этих "стоковых автомобилей" — Ford Sierra/Mondeo/BMW/Audi с мотором Ford Pinto либо Zetex объёмом 2 литра. А так же — обязательные силовые бампера и каркас безопасности.

Поскольку чемпионаты стоковых автомобилей далеки от обычного человека, приведу еще один пример, более близкий к восточноевропейским реалиям. Самой популярной и "народной" дисциплиной в нашем регионе является нелегальный драг-стрип. Светофорные гонки по прямой, попытка утереть нос вот тому водителю маршрутного такси и прочие упражнения, подразумевающие езду по прямой и распугивание пешеходов.
Снова обратимся к регламенту, на сей раз NHRA
Категория "Сток". Кузов не должен быть изменен, так же необходимо сохранить заводской интерьер. Покрышки ограниченны шириной в 9 дюймов, допускаются слики. Двигатель должен стоять с завода в определенной модели определенного модельного года.Заводскими должны оставаться головки цилиндров, впускной коллектор и карбюратор.

Можно сделать вывод, что автомобили для драг рейсинга категории "сток" наиболее близки к нашим дорожным автомобилям, но ни разу не являются заводскими и целиком состоят с тюнинговых запчастей. У таких автомобилей могут быть изменены подвеска, тормоза, топливный бак, КПП, моторные потроха и они все еще будут стоком. Так же как и автомобили в одной известной гоночной игре — мы покупали их далеко не в заводском исполнении.

Завершить хотелось бы коротко: делая "стейжи" и прочие модификации вы скорее приближаетесь к тому, чтобы назвать ваш автомобиль стоковым, а не отдаляетесь от этого.

Читайте также: