Size: a a a

2021 September 29

SZ

Sergey Zhmylove in Modern::Perl
Как будешь проверять? :)
источник

AK

Andrey Konovalov in Modern::Perl
Интересно, как всё-таки Perl делает типа бесконечный стек
источник

GK

Grigoriy Koudrenko in Modern::Perl
gragory@Gragory-Work ~ $ perl -E 'sub vm{ open my $fh,"<","/proc/$$/status"; print for grep{/VmSize/} <$fh>;} sub bigstr { my $x = "x"x(1024*1024*1024) } vm; bigstr; vm'
VmSize:  1061608 kB
VmSize:  2110188 kB
источник

GK

Grigoriy Koudrenko in Modern::Perl
Насколько мне известно (я конечно могу ошибаться) perl только смещает точку останова для кучи и потом просто эффективно переиспользует полученную память
источник

GK

Grigoriy Koudrenko in Modern::Perl
о прикольно в моем примере он вообще выделил память через mmap
openat(AT_FDCWD, "/proc/16114/status", O_RDONLY|O_CLOEXEC) = 3
ioctl(3, TCGETS, 0x7ffd0bf1da30)        = -1 ENOTTY (Неприменимый к данному устройству ioctl)
lseek(3, 0, SEEK_CUR)                   = 0
newfstatat(3, "", {st_mode=S_IFREG|0444, st_size=0, ...}, AT_EMPTY_PATH) = 0
read(3, "Name:\tperl\nUmask:\t0022\nState:\tR "..., 8192) = 1120
read(3, "", 8192)                       = 0
write(1, "VmSize:\t 1061608 kB\n", 20VmSize:     1061608 kB
)  = 20
close(3)                                = 0
mmap(NULL, 1073745920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f046eb1c000
getpid()                                = 16114
openat(AT_FDCWD, "/proc/16114/status", O_RDONLY|O_CLOEXEC) = 3
ioctl(3, TCGETS, 0x7ffd0bf1da30)        = -1 ENOTTY (Неприменимый к данному устройству ioctl)
lseek(3, 0, SEEK_CUR)                   = 0
newfstatat(3, "", {st_mode=S_IFREG|0444, st_size=0, ...}, AT_EMPTY_PATH) = 0
read(3, "Name:\tperl\nUmask:\t0022\nState:\tR "..., 8192) = 1120
read(3, "", 8192)                       = 0
write(1, "VmSize:\t 2110188 kB\n", 20VmSize:     2110188 kB
)  = 20
close(3)
источник

GK

Grigoriy Koudrenko in Modern::Perl
Так что там походу под капотом вообще обычный malloc, так как именно malloc уже сам решает выделить память в куче или в отображении
источник

GK

Grigoriy Koudrenko in Modern::Perl
кстати по тому же strace perl не вызывает munmap
источник

GK

Grigoriy Koudrenko in Modern::Perl
А вот если написать такое:
#include <stdlib.h>
#include <unistd.h>

int main()
{
   write(STDOUT_FILENO, "1", 1);
   char *data = malloc(1 << 30);
   write(STDOUT_FILENO, "2", 1);
   char *data2 = malloc(10);
   write(STDOUT_FILENO, "3", 1);
   free(data);
   write(STDOUT_FILENO, "4", 1);
   free(data2);
   write(STDOUT_FILENO, "5", 1);
   return 0;
}

то как раз так free от куска выделенного через mmap вызывает munmap:
write(1, "1", 11)                        = 1
brk(NULL)                               = 0x55bf3afe6000
brk(0x55bf3b007000)                     = 0x55bf3b007000
mmap(NULL, 1073745920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc89c5d6000
write(1, "2", 12)                        = 1
write(1, "3", 13)                        = 1
munmap(0x7fc89c5d6000, 1073745920)      = 0
write(1, "4", 14)                        = 1
write(1, "5", 15)                        = 1
exit_group(0)                           = ?
+++ exited with 0 +++
источник

SZ

Sergey Zhmylove in Modern::Perl
@PerlBanjoBot $ perl -e ' print $$; sub mem {print $_[0] . (grep /$$/, qx( ps -eo pid,vss,comm))[0]} mem++$i; my $var = "xxx" x 10**8; mem++$i; push @arr, "$_ $var" for 1..10; mem++$i; undef @arr; mem++$i'
источник

SZ

Sergey Zhmylove in Modern::Perl
@bessarabov походу, я его тебе положил 🤣
источник

GK

Grigoriy Koudrenko in Modern::Perl
😂
источник

SZ

Sergey Zhmylove in Modern::Perl
Запусти мой код, пожалуйста :) я с мобилы писал
источник

GK

Grigoriy Koudrenko in Modern::Perl
ща
источник

GK

Grigoriy Koudrenko in Modern::Perl
error: unknown user-defined format specifier "vss"
источник

SZ

Sergey Zhmylove in Modern::Perl
vsz
источник

SZ

Sergey Zhmylove in Modern::Perl
😅
источник

AK

Andrey Konovalov in Modern::Perl
Итерироваться же можно тупо по индексу, старым добрым for(;;)
источник

AK

Andrey Konovalov in Modern::Perl
Возвращаюсь просто к началу
источник

GK

Grigoriy Koudrenko in Modern::Perl
gragory@Gragory-Work ~ $ perl -e ' print $$; sub mem {print $_[0] . (grep /$$/, qx( ps -eo pid,vsz,comm))[0]} mem++$i; my $var = "xxx" x 10**8; mem++$i; push @arr, "$_ $var" for 1..10; mem++$i; undef @arr; mem++$i'
16272116272 305868 perl
216272 598840 perl
316272 3528560 perl
416272 598840 perl
источник

SZ

Sergey Zhmylove in Modern::Perl
Он имеет ввиду, что даже для for нужен массив
источник