Видимо стандартный алгоритм класса SystemSequence, который ведет буфер зарезервированных идентификаторов внутри AOS-а, работает следующим образом:
X++:
AOS getBufferSize , BufferSize
Для примера для bufferSize = 250 будет такая трассировка:
1. делаем flushCache() --> N = 0 (количество неиспользованных идентификаторов), SystemSequence.NextVal = 10000000
2. первое выделение nextVal()
2.1. т.к. N = 0 < 250, то выделяем очередной блок --> N = 250, SystemSequence.NextVal = 10000250
2.2. используем первый из полученных идентификаторов, в итоге N = N-1 = 249
3. второе выделение nextVal()
3.1. т.к. N=249 < 250, то выделяем очередной блок --> N = 249 + 250 = 499, SystemSequence.NextVal = 10000500
3.2. используем очередной из полученных идентификаторов, в итоге N = N-1 = 498
4. очередное выделение nextVal()
4.1. т.к. N=498 > 250, то больше новых блоков пока не выделяем --> N = 498, SystemSequence.NextVal = 10000500
4.2. используем очередной из полученных идентификаторов, в итоге N = N-1 = 497
При нескольких AOS-ах поведение каждого отдельного AOS-а подчиняется тому же самому алгоритму.