@ProCxx

Страница 2308 из 2477
Mikhail Voronov
29.08.2018
17:53:11
Слушайте, а виртуальные деструкторы медленнее обычных? В плане стоит ли любой абсолютно класс делать с вирт деструктором?..
Медленее из-за возможного сброса кэша и невозможности отследить indirect call в предсказателе переходов

Wrestler
29.08.2018
19:23:59
Кто разбирается в системном программировании помогите, хочу понять что происходит при передаче исполнения от одного процесса к другом, что происходит с контекстом ? Где она сохраняется ?

Mikhail Voronov
29.08.2018
19:28:25
в ядре

Google
Mikhail Voronov
29.08.2018
19:31:24
в Windows в структурах ETHREAD/KTHREAD/EPROCESS/KPROCESS

Max
29.08.2018
19:31:54
что происходит — ну, ядро сохраняет контекст, вычисляет, кому выполняться следующим и засовывает соотетствующий instruction counter в cpu

обзорно — https://github.com/torvalds/linux/blob/master/include/linux/sched.h .

Mikhail Voronov
29.08.2018
19:32:34
ну что происходит на Windows - это нужно что-нибудь типа Windows Internals почитать, чтобы понять

Wrestler
29.08.2018
19:35:31
дро помещает контекстный уровень в стек при возникновении прерывания, при обращении к системной функции или при переключении контекста процесса. Контекстный уровень выталкивается из стека после завершения обработки прерывания, при возврате процесса в режим задачи после выполнения системной функции, или при переключении контекста. Таким образом, переключение контекста влечет за собой как помещение контекстного уровня в стек, так и извлечение уровня из стека: ядро помещает в стек контекстный уровень старого процесса, а извлекает из стека контекстный уровень нового процесса. Информация, необходимая для восстановления текущего контекстного уровня, хранится в записи таблицы процессов.

В какой стек ?

Max
29.08.2018
19:37:08
стек един.

на x86, как минимум.

Eugene
29.08.2018
19:37:58
Стек непобедим(

Wrestler
29.08.2018
19:38:27
Стек у процесса один

Max
29.08.2018
19:38:31
в cpu есть регистр, в котором находится указатель на голову стека

Wrestler
29.08.2018
19:39:56
Я запутался

Max
29.08.2018
19:40:04
Стек у процесса один
зависит от системы.

Google
Wrestler
29.08.2018
19:41:18
Пользовательский контекст состоит из кода и данных в которую и входит стек, bss и прочее

Как я знаю

Max
29.08.2018
19:41:24
Стек у процесса один
есть инструкции push/pop. Процесс вообще один только может выполняться на одном ядре. Этот процесс — как правило — ядро, которое может внутри себя запускать какие-то внешние инструкции.

в начале выполнения сохраняется указатель на текущую голову стека — за неё процесс изнутри выйти не может (в общем случае, если нет уязвимостей)

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

обращение к данным в нём — это в общем случае загрузка из RAM, если, конечно, её нет в кеше.

Wrestler
29.08.2018
19:47:54
Как ты понимаешь контекстный уровень ?

Max
29.08.2018
19:49:33
в ядре есть список структур task_struct (точнее, двусвязный список), в task_struct находится вся информация о контексте конекретной таски: выделенная память, занятые дескрипторы, указать на текущую инструкцию, и всякие вспомогательные данные.

Как ты понимаешь контекстный уровень ?
я вообще не понимаю о чём ты.

судя по ссылкам из гугла, это как раз и есть task_struct в linux.

посмотри на struct task_struct в https://github.com/torvalds/linux/blob/master/include/linux/sched.h .

Wrestler
29.08.2018
19:52:01
Все я понял

Ядро имеет свой стек где хранит информацию о функциях и системных вызовах

Max
29.08.2018
19:53:53
Ядро имеет свой стек где хранит информацию о функциях и системных вызовах
ну, как-то так. Только он не свой, а общий. Стек каждого процесса, запущеного ядром, это просто отдельный стековый фрейм.

Wrestler
29.08.2018
19:54:53
Понятно, спасибо

Ilia
29.08.2018
20:14:59
Google
Wrestler
29.08.2018
20:20:45
Процесс имеет два стека, при исполнении в режиме ядра и в режиме задачи

Ilia
29.08.2018
20:20:58
На уровне ядра
На уровне ядра чего? Не всегда у ОС и ядро то есть...

Wrestler
29.08.2018
20:21:48
Операционная система без ядра это что то новое

Для меня

Max
29.08.2018
20:22:23
Нет, у кого процесса стек свой. Даже у каждого потока процесса
Свой стековый фрейм, выделенный ядром. Процессор когда делает push вообще ничего не знает про процессы и треды

Ilia
29.08.2018
20:22:37
Ну, о сколько нам открытий чудных...

Wrestler
29.08.2018
20:23:00
Как можно представить Linux без ядра ?

Wrestler
29.08.2018
20:24:22
Так это оболочка + дополнения

Pavel
29.08.2018
20:24:28
Нет, у кого процесса стек свой. Даже у каждого потока процесса
Так и представляю себе решение проблемы синхронизации стековых операций.

Wrestler
29.08.2018
20:24:51
Как запустить машину без мотора ?

Eugene
29.08.2018
20:25:24
Как можно представить Linux без ядра ?
Можно представить всю ту же фигню с другим мотором)

Ilia
29.08.2018
20:25:46
А почему машину? А если у тебя не машина, а танк, и там турбина?

Wrestler
29.08.2018
20:25:56
Интерфейс не подойдёт ))

Ilia
29.08.2018
20:26:05
Все разное...

Wrestler
29.08.2018
20:26:21
На танк колесо от мерседеса ?

Google
Eugene
29.08.2018
20:26:36
Max
29.08.2018
20:26:42
На танк колесо от мерседеса ?
добро пожаловать в мир POSIX

Eugene
29.08.2018
20:26:47
Есть и примитивные однопользовательские системы

Wrestler
29.08.2018
20:26:59
Так ядро и представляет интерфейс, как можно запустить программу в виндовс на линуксе не изменив системные вызовы ?

К ядру ?

При компиляции через сколько уровней проходит код программы ?

Matwey
29.08.2018
20:30:26
А как по вашему EFI приложения работают?

Wrestler
29.08.2018
20:31:32
А как по вашему EFI приложения работают?
Это другая тема для обсуждения

Прошивка

Ilia
29.08.2018
20:34:54
Ладно, главное не это, а то что к языку С++ (и С) это все не имеет никакого отношения

Компилятор и Линекер. Все, 2

Joy
30.08.2018
00:14:55
Короч такой вопрос. Хочу я, чтобы enum'ы были раскиданы по своим неймспейсам. Допустим есть у меня класс Powerup. И есть enum powerupType { ... } Я хочу перенести его под класс, чтобы было enum Powerup::Type, поскольку оно логически относится только к этому классу. Но это приведет к тому, что везде в других модулях, где используется это перечисление, мне придется инклудить заголовочник powerup.hpp Делать это ради одного перечисления мне кажется неправильным, потому что на ровном месте появляется лишняя связность Допустимо ли вынести такие перечисления в отдельный заголовочник? Там будет несколько разных перечислений, относящихся к разным классам, типа Input::Direction

Насколько это плохой тон - держать отдельно от файлов класса код, относящийся к классу

Constantine
30.08.2018
02:07:18
Насколько это плохой тон - держать отдельно от файлов класса код, относящийся к классу
Вложенные в классы имена в С++ содержат огромадный дефект - они не могут быть declared без definition класса, так что если определение класса надо развязывать, у вас и выбора нет, и вопроса нет

Joy
30.08.2018
02:10:53
Не понял про "развязывать", что имеется в виду? На данный момент решение уже принято - убрать все enum'ы в отдельный файл config.hpp, тот же где все настройки и константы проекта хранятся, и без привязки к классам. Получается убрать сопряжения между классами напрямую. Решил, что это важнее чем держать перечисления внутри подходящих классов.

Constantine
30.08.2018
02:12:16
в каком-то конвенционном виде, вроде namespace some { enum class special_enum {}; } class some_type { public: //some::special_enum это что-то мое на самом деле };

а как только они перестали быть внутри класса, вопроса больше нет - вы с ними как с (А зависит от Б) можете работать

(например, вас же не смущает предка некоторого класса убирать в другой файл)

Google
Joy
30.08.2018
02:18:15
спрошу лучше, как в этот вид переделать то, что у меня есть

Constantine
30.08.2018
02:19:02
уперся это вот, не хватает уровня понять, что это все значит
это конвенция, когда имена типов грубо говоря пишутся some_type, а для всего вспомогательно есть namespace some рядом

Joy
30.08.2018
02:19:47
Можно практический пример? я с трудом понимаю)) Или на моём примере как переделать

https://github.com/narical/asciidunge/blob/libtcod/include/config.hpp

https://github.com/narical/asciidunge/blob/libtcod/src/input.cpp

этот класс использует enum direction { ... } из config.hpp

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

Constantine
30.08.2018
02:23:28
этот класс использует enum direction { ... } из config.hpp
ну все-таки enum вместо enum class писать в С++11 моветон

Joy
30.08.2018
02:24:03
ох, надеюсь где-нить на хабре есть на эту тему почитайка

Constantine
30.08.2018
02:24:35
нет конечно, я совершенно внутреннюю вещь рассказываю сейчас

т.е. ваша проблема закрывается определенной конвенцией именования типов

Constantine
30.08.2018
02:30:16
аналогично этому, но менее абстрактный пример можно?
я совершенно не понимаю, что вы хотели сказать классом powerup, но если предположить, что это тип-значение, то enum class powerup_enum { health, mana, damage }; class powerup_type { explicit powerup_type(powerup_enum type) : type_(type) { } private: powerup_enum type_ /*m_type, etc...*/; };

вообще ваш Powerup выглядит, будто это std::variant

Joy
30.08.2018
02:33:59
у меня там большая часть кода заглушечная

теоретически она когда-то должна развиться в нечто совершенно другое, практически же - всё будет переписано с нуля с другим подходом совершенно

Это мой первый проект, который я начал решив выучить плюсы

Страница 2308 из 2477