
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

Pavel
13.03.2018
15:29:00

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
и стека не хватает

Dark
13.03.2018
15:30:13

Pavel
13.03.2018
15:30:25
Сегмент данных? Чето помню смутно
Из 1 курса универа :D

Evgeny
13.03.2018
15:31:20

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

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

Pavel
13.03.2018
15:37:12

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

Pavel
13.03.2018
15:38:18
нет

Igor
13.03.2018
15:39:22
ага, проверил - не влияет
судя по выводу асма - копирование
то есть како-то вариант присваивания срабатывает

Evgeny
13.03.2018
15:41:57

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

Stanislav
13.03.2018
15:45:16

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
Кроме структур

Pavel
13.03.2018
17:37:19

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

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

Evgeny
13.03.2018
18:28:57

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 не используется никак

Igor
13.03.2018
19:59:53

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

Igor
13.03.2018
20:36:57
man pmap

Evgeny
13.03.2018
21:03:01
короче судя по всему на каждый вновь созданный тред 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 будет своя собственная в каждом треде.

Evgeny
13.03.2018
21:08:07

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, а вобщую память процесса