Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Aug 21, 2019 7:04 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 77 posts ]  Go to page Previous 1 2 3 4 5 6 Next
Author Message
PostPosted: Mon Oct 17, 2016 6:21 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
На самом деле и windows и linux делают точно так же. Разница в том, что у них есть файл подкачки, а у нас нет. А если файл подкачки отключить, то виндовые программы точно так же падают с ошибкой, если для них памяти не осталось.


Top
   
PostPosted: Mon Oct 17, 2016 6:23 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Pathoswithin, ну всё правильно, а раз у нас не так, значит и функции работы с памятью должны работать по-другому.


Top
   
PostPosted: Mon Oct 17, 2016 6:26 pm 
Offline

Joined: Tue Oct 04, 2016 10:05 pm
Posts: 44
0CodErr wrote:
Обсуждалось-то оно обсуждалось, а толку? Мне больше всего "понравился" 3-ий пункт алгоритма Serge viewtopic.php?f=2&t=3297&start=15#p65652
Ну разве кто-то будет использовать эту ОС для серьёзных вещей? Представьте, что от этого зависила бы работа дорогостоящего оборудования. Я уж не говорю про жизнь людей. А тут, понимаешь, Скрестить пальцы.
Так и представляю, пишет кто-то багрепорт, а Serge ему: "Пальцы скрещивали?" :)
Quote:
Нет, не может. У другого процесса другое адресное пространство.
А я и не про это вовсе. Если 2 приложения зарезервируют каждый всю свободную память, то при обращении к ней рано или поздно у кого-то будет pagefault.

Ну,в принципе, все верно: прикинь сам: вариантов два: либо всегда при выделении закреплять физическую память сразу, тогда ты уже на этом этапе получишь ошибку "аут оф мемори, сорян". Либо так, как есть - мы гипотетически можем чуть больше памяти зарезервировать надеясь на то, что она не всем сразу понадобится. И как использовали - сразу отдали. В "серьезных" системах файл подкачки всегда подставит плечо, когда не хватает физических страниц.
Тот же ReactOS не имея подкачки падает в синий экран смерти, исчерпав физическую память.


Top
   
PostPosted: Mon Oct 17, 2016 6:28 pm 
Offline

Joined: Tue Oct 04, 2016 10:05 pm
Posts: 44
0CodErr wrote:
Pathoswithin, ну всё правильно, а раз у нас не так, значит и функции работы с памятью должны работать по-другому.

Можно я еще раз спрошу о корифеев: есть ли у вас флаг по типу MEM_COMMIT, который сразу закрепляет за тобой запрошенную память? А не тогда, когда произошло обращение?
Если нет, то жаль - это как раз был бы выход. Ты бы получил отпор уже на этапе запроса памяти.


Top
   
PostPosted: Mon Oct 17, 2016 6:32 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1264
Только так viewtopic.php?f=2&t=3297&start=19

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


Top
   
PostPosted: Mon Oct 17, 2016 6:39 pm 
Offline

Joined: Tue Oct 04, 2016 10:05 pm
Posts: 44
Pathoswithin wrote:

Почему нельзя его(закрепление по запросу) реализовать?

Quote:
Да и не всегда есть варианты, кроме как покончить работу самоубийством.

Есть еще замечательный вариант: выдать милое сообщение "Недостаточно ресурсов, чтобы выполнить запрошенную операцию" и смотреть, как пользователь бесится. Фотошоп 32 любит так делать, когда виртуалка у него заканчивается.

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


Top
   
PostPosted: Mon Oct 17, 2016 6:50 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
0CodErr
Quote:
Ну разве кто-то будет использовать эту ОС для серьёзных вещей?
Если 2 приложения зарезервируют каждый всю свободную память, то при обращении к ней рано или поздно у кого-то будет pagefault.
В упор не вижу проблемы. Для серьёзных вещей нужные другие серьёзные вещи. Если я на своём рабочем компе захочу захочу выделить 128Гб в Win приложении, меня ждёт облом, потому что у меня нет 128Гб оперативки и своп маленький. Если программе не хватает памяти её можно прибить или перевести в зомби состояние. Сейчас работает первый вариант.

//DG
Вот как раз MEM_COMMIT и есть
Quote:
MEM_COMMIT
0x00001000
Allocates memory charges (from the overall size of memory and the paging files on disk) for the specified reserved memory pages. The function also guarantees that when the caller later initially accesses the memory, the contents will be zero. Actual physical pages are not allocated unless/until the virtual addresses are actually accessed.


Top
   
PostPosted: Mon Oct 17, 2016 7:04 pm 
Offline

Joined: Tue Oct 04, 2016 10:05 pm
Posts: 44
Quote:
//DG
Вот как раз MEM_COMMIT и есть


Это кмк чуть-чуть другое: здесь идет речь о том, что выделяется кусок из теоретически возможного максимума (физическая + своп). Да, физическая не маппируется сразу - верно, но COMMIT гарантирует, что нам достается кусок из теоритически возможного: т.е. когда мы к нему обратимся, нам либо свободную физическую дадут, либо кого-нибудь в своп выкинут и нам отдадут его память.
Но суть та же: нам гарантируют, что запрошенный кусок будет. Нет? Если перевести в мир Колибри, то COMMIT не смапирует физическую память сразу НАМ, но и не даст кому-то другому ее себе смаппировать, потому мы COMMITом пообещали, что эта память будет и не будет никаких Fail'ов.
Т.е. если у нас есть, скажем, 100Мб свободной памяти, мы коммитим 30. Это значит, что никто больше не получит более 70ти. Когда мы к своей обратимся - получим ее. Или получим сразу. Я имел в виду именно эту гарантию, а не, маппируется ли она сразу, или же нам обещают кусок из свопа.


Top
   
PostPosted: Mon Oct 17, 2016 7:13 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
//DG
Quote:
но COMMIT гарантирует, что нам достается кусок из теоритически возможного

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


Top
   
PostPosted: Mon Oct 17, 2016 7:16 pm 
Offline

Joined: Tue Oct 04, 2016 10:05 pm
Posts: 44
Serge wrote:
//DG
Quote:
но COMMIT гарантирует, что нам достается кусок из теоритически возможного

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

Не, ну кто бы спорил - есть ситуации, когда это не получится. И тем не менее, это якобы "обещание" много более сильное, чем колибриевское (система не даст тебе закоммитить больше, чем есть физической+свопа, и обломаться можно только если некого выгрузить). Тем более, что в отсутствие свопа мы моем гарантировать вообще железно: вот она свободная физическая, держи свой кусок.


Top
   
PostPosted: Sat Oct 22, 2016 5:35 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Подо что используется более 40 мегабайтов?
Spoiler: Show
Image
Исходник
Spoiler: Show
Code:
Unit Unit1;
(* -------------------------------------------------------- *)
Interface
(* -------------------------------------------------------- *)
Type

  Dword = Cardinal;

Var
  hConsole: Pointer;
  ConsoleInit:       Procedure(WndWidth, WndHeight, ScrWidth, ScrHeight: Dword; Caption: PChar); StdCall;
  ConsoleExit:       Procedure(bCloseWindow: Cardinal); StdCall;
  printf:            Function(Const Format: PChar): Integer; CDecl VarArgs;
(* -------------------------------------------------------- *)
  Procedure Main; Forward;
  Procedure ThreadTerminate; Forward;
  Function  LoadLibrary(Path: PChar): Pointer; StdCall; Forward;
  Function  GetProcAddress(hLib: Pointer; ProcName: PChar): Pointer; StdCall; Forward;
  Function  HeapCreate: Cardinal; Forward;
  Function  HeapAllocate(Bytes: Cardinal): Pointer; StdCall; Forward;
  Function  HeapFree(MemPtr: Pointer): Cardinal; StdCall; Forward;
  Function  GetFreeMemory: Dword; Forward;
  Function  GetAvailableMemory: Dword; Forward;
(* -------------------------------------------------------- *)
Implementation
(* -------------------------------------------------------- *)
Procedure Main();
Var
   HeapSize: Dword;
   FreeMemory: Dword;
   AvailableMemory: Dword;
   MemPtr: Pointer;
Begin

   hConsole          := LoadLibrary('/sys/lib/console.obj');
   ConsoleInit       := GetProcAddress(hConsole, 'con_init');
   ConsoleExit       := GetProcAddress(hConsole, 'con_exit');
   printf            := GetProcAddress(hConsole, 'con_printf');

   ConsoleInit($FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF, 'Test');

   FreeMemory      := GetFreeMemory();
   AvailableMemory := GetAvailableMemory();
   HeapSize        := HeapCreate();

   printf('Free memory            = %d kilobytes.'#10, FreeMemory);
   printf('Available memory       = %d kilobytes.'#10, AvailableMemory);

   If HeapSize = 0 Then
     printf('HeapCreate Error!'#10)
   Else Begin
     printf('Heap created. HeapSize = %d bytes.'#10, HeapSize);

     MemPtr := HeapAllocate(FreeMemory * 1024);

     If MemPtr = nil Then
       printf('HeapAllocate Error!'#10)
     Else
       printf('Allocated %d kilobytes. Pointer to memory = %#x'#10, FreeMemory, MemPtr);

     If HeapFree(MemPtr) = 0 Then
       printf('HeapFree Error!'#10)
     Else
       printf('Memory freed.'#10);

   End;

   ConsoleExit(0);
   ThreadTerminate;
End;
(* -------------------------------------------------------- *)
Function  HeapCreate: Cardinal;
Asm
        push   ebx
        mov    eax, 68
        mov    ebx, 11
        int    64
        pop    ebx
End;
(* -------------------------------------------------------- *)
Function  HeapAllocate(Bytes: Cardinal): Pointer;
Asm
        push   ebx
        mov    eax, 68
        mov    ebx, 12
        mov    ecx, Bytes
        int    64
        pop    ebx
End;
(* -------------------------------------------------------- *)
Function  HeapFree(MemPtr: Pointer): Cardinal;
Asm
        push   ebx
        mov    eax, 68
        mov    ebx, 13
        mov    ecx, MemPtr
        int    64
        pop    ebx
End;
(* -------------------------------------------------------- *)
Function  GetFreeMemory: Dword;
Asm
        push   ebx
        mov    eax, 18
        mov    ebx, 16
        int    64
        pop    ebx
End;
(* -------------------------------------------------------- *)
Function  GetAvailableMemory: Dword;
Asm
        push   ebx
        mov    eax, 18
        mov    ebx, 17
        int    64
        pop    ebx
End;
(* -------------------------------------------------------- *)
Procedure ThreadTerminate();
Asm
        mov    eax, $FFFFFFFF
        int    64
End;
(* -------------------------------------------------------- *)
Function GetProcAddress(hLib: Pointer; ProcName: PChar): Pointer;
Asm
        push   esi
        push   edi
        push   ebx
        mov    edx, hLib
        xor    eax, eax
        test   edx, edx
        jz     @end
        mov    edi, ProcName
        mov    ecx, $FFFFFFFF
        repne scasb
        mov    ebx, ecx
        not    ebx
@next:
        mov    esi, [edx]
        test   esi, esi
        jz     @end
        mov    ecx, ebx
        mov    edi, ProcName
        add    edx, 8
        repe cmpsb
        jne    @next
        mov    eax, [edx - 4]
@end:
        pop    ebx
        pop    edi
        pop    esi
End;
(* -------------------------------------------------------- *)
Function LoadLibrary(Path: PChar): Pointer;
Asm
        push   ebx
        mov    eax, 68
        mov    ebx, 19
        mov    ecx, Path
        int    64
        pop    ebx
End;
(* -------------------------------------------------------- *)
End.
Приложение
Attachment:
Unit1.kex [928 Bytes]
Downloaded 97 times


Top
   
PostPosted: Sat Oct 22, 2016 6:08 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
А что у тебя в автозагрузке ?


Top
   
PostPosted: Sat Oct 22, 2016 6:15 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Serge, а, так это на tmp-диск уходит.
Тогда ещё.
В документации сказано "Heap size is equal to total amount of free application memory."
А, получается, что на самом деле это не так?


Top
   
PostPosted: Sat Oct 22, 2016 7:56 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Почему не так ? Почти 2 Гб свободных адресов.


Top
   
PostPosted: Sat Oct 22, 2016 8:50 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Serge, ну это же размер кучи 2 Гб, а памяти-то 256 Мб. Или в документации неточность?


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 77 posts ]  Go to page Previous 1 2 3 4 5 6 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited