путание о PSS в/proc/pid/maps

Этот сценарий Python просто сделал задание для меня. Я сделал три экранных сессии, и это разжигает три xterms с сессиями, повторно прикрепленными в каждом. Это немного ужасно, но это работает.

#! /usr/bin/env python                                                                                                                         

import os

if __name__ == '__main__':

    tempfile = '//tmp//screenList'

    # capture allthescreenIds                                                                                                                
    os.system('screen -ls | grep Det | cut -d . -f 1 > ' + tempfile)

    f = open(tempfile, 'r')
    screenIds = f.readlines()
    f.close()

    screenIds = [x.lstrip() for x in screenIds]

    for eachId in screenIds:
        cmdLine = 'xterm -e screen -r ' + eachId.strip() + ' &'
        os.system(cmdLine)
1
13.04.2017, 15:37
1 ответ

Прежде всего Ваш код показывает неопределенное поведение (cnt используется без того, чтобы быть инициализированным, то же для вершины 6M Вы читаете, не инициализируя), поэтому удостоверьтесь свой компилятор на самом деле выходные инструкции, которые соответствуют Вашему коду: это не имеет к. (Я предполагаю, что Вы проверили это.)

Страницы в 6M Вы только читаете, не может действительно считаться чистым. Чистая страница является той, которая синхронизируется с его запоминающим устройством (безотносительно то есть, подкачка, файл, и т.д.). Те страницы не имеют ничего, что поддерживает их.
Они не действительно грязны ни один в обычном смысле - в конце концов, они не были изменены.

Таким образом, что происходит здесь? Все страницы в 6M блок, который Вы только читаете, отображается на той же странице, и та страница является "нулевой страницей" (т.е. общее (на x86, по крайней мере) страница, которая содержит нулевые байты 4k).

Когда ядро получает отсутствие страницы на неотображенной анонимной странице, и тот отказ является чтением, это отображается на нулевой странице (та же страница каждый раз). (Это находится в do_anonymous_page в mm/memory.c)
Это не "нормальное" отображение (в vm_normal_page смысл), и не становится считавшим в smaps поля, как совместно использовано или частный что-либо (smaps_pte_entry в fs/proc/task_mmu.c пропуски "специальные" страницы полностью). Это действительно становится считавшим в RSS и Размере хотя: с точки зрения адресного пространства эти виртуальные страницы существуют и "использовались".
Если Вы начнете изменять (пишущий в) какая-либо страница в той области, то это получит надлежащее, нормальное отображение с анонимной страницей (инициализированный нулем в этом конкретном случае, интересно - она не будет инициализирована нулем, если предыдущее (non-normal/fake) отображение не было к нулевой странице). (См. do_wp_page в mm/memory.c.) В той точке Вы будете видеть smaps отобразите то, что Вы ожидаете.

Обратите внимание, что ничто или в C, POSIX или во что-либо еще гарантируют эти страницы для содержания нулей, Вы не можете полагаться на это. (Вы не можете на самом деле полагаться на это на Linux ни один - это - то, как он реализован прямо сейчас, но он мог очевидно измениться.)

3
27.01.2020, 23:29

Теги

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