Бесконечная печать на команде чтения символьного устройства (через команду cat) [дубликат]

По умолчанию для разработки JVM использует небольшие размеры и небольшую конфигурацию для других функций, связанных с производительностью. Но для производства вы можете настроить, например. (Кроме того, может существовать конкретная конфигурация сервера приложений) -> (Если памяти недостаточно, чтобы удовлетворить запрос, а куча уже достигла максимального размера, произойдет выход OutOfMemoryError)

-Xms        set initial Java heap size
-Xmx        set maximum Java heap size
-Xss        set java thread stack size

-XX:ParallelGCThreads=8
-XX:+CMSClassUnloadingEnabled
-XX:InitiatingHeapOccupancyPercent=70
-XX:+UnlockDiagnosticVMOptions
-XX:+UseConcMarkSweepGC
-Xms512m
-Xmx8192m
-XX:MaxPermSize=256m (in java 8 optional)

Например: В предпочтительной настройке для платформы Linux для режима производства.

После загрузки и настройки сервера таким образом http://www.ehowstuff.com/how-to-install-and-setup-apache-tomcat-8-on-centos-7- 1-rhel-7 /

1.create setenv.sh файл в папке / opt / tomcat / bin /

   touch /opt/tomcat/bin/setenv.sh

2.Откройте и напишите этот параметр для настройки предпочтительного режима.

nano  /opt/tomcat/bin/setenv.sh 

export CATALINA_OPTS="$CATALINA_OPTS -XX:ParallelGCThreads=8"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+CMSClassUnloadingEnabled"
export CATALINA_OPTS="$CATALINA_OPTS -XX:InitiatingHeapOccupancyPercent=70"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UnlockDiagnosticVMOptions"
export CATALINA_OPTS="$CATALINA_OPTS -XX:+UseConcMarkSweepGC"
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx8192m"
export CATALINA_OPTS="$CATALINA_OPTS -XX:MaxMetaspaceSize=256M"

3. service tomcat restart

Обратите внимание, что JVM использует больше памяти, чем только кучу. Например, методы Java, стеки потоков и собственные дескрипторы выделяются в памяти отдельно от кучи, а также внутренние структуры данных JVM.

0
задан red0ct 17 June 2016 в 08:23
поделиться

3 ответа

Эта проблема может быть решена путем правильной установки *off (четвертый параметр my_read()).

Вам нужно возвращать счет в первый раз и ноль со второго раза вперед.

if(*off == 0) {
    while (msg[count] != 0) {
        put_user(msg[count], buff++);
        count++;
        (*off)++;
    }
    return count;
}
else
return 0;
1
ответ дан pacholik 19 August 2018 в 13:35
поделиться

Вы не соблюдаете размер буфера, переданный в функцию dev_read, поэтому вы можете вызывать неопределенное поведение в cat. Попробуйте следующее:

static ssize_t dev_read( struct file *filp, char *buff, size_t len, loff_t  *off )
{
    size_t count = 0;
    printk( KERN_ALERT"inside read %d\n", *off );
    while( msg[count] != 0 && count < len )
    {
        put_user( msg[count], buff++ );
        count++;
    }
    return count;
}
1
ответ дан paddy 19 August 2018 в 13:35
поделиться
Функция

.read также должна правильно обрабатывать свои аргументы len и off. Самый простой способ реализовать чтение из файла с буферизацией памяти - использовать хелпер simple_read_from_buffer:

static ssize_t dev_read(struct file *filp, char *buff, size_t len, loff_t *off)
{
    return simple_read_from_buffer(buff, len, off, msg, 100);
}

Вы можете проверить код этого помощника (определенный в fs/libfs.c) для образовательных целей.

BTW, для вашего метода .write вы можете использовать помощник simple_write_to_buffer.

3
ответ дан Tsyvarev 19 August 2018 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: