@dlangru

Страница 455 из 719
Pavel
13.03.2018
15:26:16
Не знаю, а че падает то?

На стеке пытается выделить?

Denis
13.03.2018
15:26:35
ну там динамический в статический пытаются положить же?

Igor
13.03.2018
15:26:50
ulong[] b = new ulong[](1024*1024); вот так правильнее кажется

Google
Denis
13.03.2018
15:29:22
ну да, компилиться не должно

Evgeny
13.03.2018
15:29:36
На стеке пытается выделить?
да, именно это. ты пытаешься мегабайт на стеке взять. видимо твоя конфига не дает такой большой кусок на стеке зарезервировать

Pavel
13.03.2018
15:29:47
ulong[1024] buf = new ulong[1024]; вот так тоже работает, думаю тут все дело в размере. Походу при фиксированном размере это выделяется на стеке где-то

Denis
13.03.2018
15:30:05
и стека не хватает

Pavel
13.03.2018
15:30:25
Сегмент данных? Чето помню смутно

Из 1 курса универа :D

Evgeny
13.03.2018
15:31:20
ulong[1024] buf = new ulong[1024]; вот так тоже работает, думаю тут все дело в размере. Походу при фиксированном размере это выделяется на стеке где-то
важно понимать, что ulong[1024] - это статический массив, а ulong[] - это динамический массив. И это в D разные типы с существенно разной семантикой.

Dark
13.03.2018
15:31:26
Сегмент данных? Чето помню смутно
Нет, другой тип. Который выделяется при загрузке в память

Pavel
13.03.2018
15:32:35
Evgeny
13.03.2018
15:33:12
При объявлении локальной переменной с типом статического массива, вся память под этот массив выделяется на стеке

Pavel
13.03.2018
15:33:26
Ладно какая блин разница. Я то совсем другое хотел проверить

Google
Evgeny
13.03.2018
15:34:08
Ладно какая блин разница. Я то совсем другое хотел проверить
Нет это большая разница, советую почитать про разницу между статическим и динамическим, если не знаешь. Это реально важно в D.

Denis
13.03.2018
15:34:20
когда стек рекурсивно выедается тоже -11 код ошибки, кстати

Pavel
13.03.2018
15:37:12
Нет это большая разница, советую почитать про разницу между статическим и динамическим, если не знаешь. Это реально важно в D.
ulong[1024] buf = new ulong[1024]; тогда как работает такое? Получается ссылка на память в стеке теряется и замещается ссылкой на динамически выделенную?

Igor
13.03.2018
15:38:04
а ты компилишь с @safe?

Pavel
13.03.2018
15:38:18
нет

Igor
13.03.2018
15:39:22
ага, проверил - не влияет

судя по выводу асма - копирование

то есть како-то вариант присваивания срабатывает

Stanislav
13.03.2018
15:42:42
копирует просто массив походу

Evgeny
13.03.2018
15:43:20
А вообще это бессмыслица. Ты создаешь динамический массив в куче, копируешь его содержимое (нули) в статический массив на стеке, а потом GC приберет ставший ненужным выделенный на куче динамический массив

попробуй ulong[1024 * 1024] buf; скорее всего тоже упадет

Dark
13.03.2018
15:44:14
А где предупреждения компилятора?

Evgeny
13.03.2018
15:44:41
А где предупреждения компилятора?
о бессмысленном коде? видимо, ума у него не хватает на подобное.

А если глобально?
глобально проблем быть не должно, теоретически

Evgeny
13.03.2018
15:45:35
Pavel
13.03.2018
16:54:50
Вот что интересное я натворил

Dark
13.03.2018
16:56:19
Шо? Опять?

Google
Pavel
13.03.2018
16:56:42
Если создать буфер размером 128мб и потом создать 8 тредов, то в htop показывается в RES что процесс тратит примерно 135мб памяти. И при этом около 700-800мб VIRT. Если не создавать тредов то VIRT будет 250мб

Как-то странно он копирует в thread local storage

Dark
13.03.2018
17:03:25
По идее, у тредов только стек разный

Pavel
13.03.2018
17:04:29
Нет в D же весь контекст из переменных копируется в каждый тред

Автоматически все становится TLS, кроме того что объявлено как shared

Evgeny
13.03.2018
17:07:03
попробуй в тредах что-нибудь изменить в массиве, RES должен приблизиться к VIRT

Pavel
13.03.2018
17:11:04
Насколько помню, обращение к переменным не своего треда выдавало нули.

Evgeny
13.03.2018
17:23:41
что такое "переменные не своего треда"?

Dark
13.03.2018
17:24:52
Глобалки

Pavel
13.03.2018
17:26:08
Да

То есть память тредов изолирована и не инициализирована.

Pavel
13.03.2018
17:26:59
глобалки shared или обычные?

Pavel
13.03.2018
17:27:08
обычные

Ну, или инициализирована дефолтом - не уточнял.

Pavel
13.03.2018
17:28:01
обычные у каждого треда свои

Pavel
13.03.2018
17:28:44
с шаред-ом запарился и ляпнул __gshared

Dark
13.03.2018
17:29:30
обычные у каждого треда свои
Ну да, они же на стеке

Pavel
13.03.2018
17:29:55
да не

https://tour.dlang.org/tour/en/multithreading/thread-local-storage

Google
Pavel
13.03.2018
17:30:46
там адресное пространство мапится на разную физ память

Ну, или второе стоит на первом)

Evgeny
13.03.2018
17:35:02
но можно статическим конструктором инициализировать как угодно.

Dark
13.03.2018
17:37:02
Кроме структур

Evgeny
13.03.2018
17:39:39
полагаю, что изначально TLS переменные смаплены на страницу с дефолтным значением, а в случае записи в них, ремапятся на свободные. Но это не точно.

Pavel
13.03.2018
17:42:46
В общем чето я непонял пока. Выходит что все треды обращаются к этому выделенному буферу, у них нет своего.

Admin
ERROR: S client not available

Pavel
13.03.2018
18:29:23
Внутри main как писал выше

Через new

Evgeny
13.03.2018
18:30:06
Pavel
13.03.2018
18:31:33
ubyte[] buf = new ubyte[1024*1024*128]

Evgeny
13.03.2018
18:32:34
не я про main

впрочем пофиг

ты создал один раз или в каждом треде?

Pavel
13.03.2018
18:33:15
Один раз

Evgeny
13.03.2018
18:38:11
мде, действительно странно, но я тут дело явно не в TLS

Google
Evgeny
13.03.2018
18:38:26
скорее это как-то связано с тем, что GC у всех тредов общий

Pavel
13.03.2018
18:40:55
Да покопаю еще

Evgeny
13.03.2018
18:56:08
Нет, GC тут не причем. Больше похоже на какую-то особенность ОС. Я попробовал создавать массив обычным сишным маллоком core.stdc.stdlib.malloc, такая же фигня.

import core.thread; import core.time; import core.stdc.stdlib; void main() { auto var = (cast(ubyte*) malloc(128 * 1024 * 1024))[0..128 * 1024 * 1024]; foreach(size_t i, ref a; var) a = i % 256; // заполняем хламом foreach(i; 0..4) new Thread({ Thread.sleep(100.seconds); }).start(); }

Pavel
13.03.2018
19:01:56
А может только static переменные реально в tls? Тогда непонятно что с shared

Evgeny
13.03.2018
19:06:49
а причем тут TLS? в моем примере TLS не используется никак

Pavel
13.03.2018
20:00:25
А просто вывести адрес переменной годится?

Он везде один выводится

Igor
13.03.2018
20:36:57
А просто вывести адрес переменной годится?
годится для чего? для анализа заспределения памяти? нет

man pmap

Evgeny
13.03.2018
21:03:01
man pmap
прикольная штука

короче судя по всему на каждый вновь созданный тред GC резервирует около 64 Мб памяти, которая числится виртуальной, так как не используется

Так что тайна виртуальной памяти раскрыта

import core.thread; import core.time; void main() { foreach(i; 0..4) new Thread({ Thread.sleep(100.seconds); }).start(); }

Это кушает примерно 300Мб виртуальной

Pavel
13.03.2018
21:07:51
А я вот походу совсем неправильно думал про TLS. Я думал что любая переменная если она объявлена как не shared будет своя собственная в каждом треде.

Pavel
13.03.2018
21:08:13
Но тогда я еще меньше понимаю чем int a; отличается от shared int a;

Igor
13.03.2018
21:08:55
shared int воспринимается компилятором как тип, для него существуют ограничения

Evgeny
13.03.2018
21:08:56
Igor
13.03.2018
21:09:05
ты не можешь например сказать a++

Evgeny
13.03.2018
21:09:40
в глобальном и статическом shared переменные попадают не в TLS, а вобщую память процесса

Страница 455 из 719