Когда я должен использовать mmap для доступа к файлу?

Ниже код делает то, что вы хотите, но на базовом уровне для закрытия соединения одного клиента. Вы должны реструктурировать свой код для обработки нескольких клиентов, если хотите. Лучшей идеей будет запуск нового потока для каждого соединения одного и того же сокетного соединения, чтобы вы могли обрабатывать их отдельно.

import socket
import _thread
import os

clear = lambda: os.system("cls")
port = 1026
try:
    Server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    Server.bind(("127.0.0.1",1026))
    Server.listen(2)
    print("--------------------------------------")
    print("Server running on port %s" % str(port))
    print("--------------------------------------")
except Exception:
    print("error while starting server")
    input()
    exit()

def control(sock):
    while True:
        command = input()
        if command == "exit()":
            sock.close()
            os._exit(0)
            #interrupt code here


while True:
    con,ip = Server.accept()
    _thread.start_new_thread(control,(con,))
    print(str(ip) + " Connected")

    try:
        cmd = str(con.recv(1024).decode())  #<-- interrupt this line
    except Exception:
        print("Error")
263
задан Peter Burns 2 November 2008 в 21:56
поделиться

2 ответа

Преимуществом, которое не перечислено еще, является способность mmap() для хранения отображения только для чтения как чистым страницы. Если Вы выделяете буфер в адресном пространстве процесса, то использование read() для заполнения буфера из файла, страницы памяти, соответствующие тому буферу, теперь грязно , так как они были записаны в.

Грязные страницы не могут быть отброшены от RAM ядром. Если существует область подкачки, то они могут быть разбиты на страницы для свопинга. Но это является дорогостоящим и в некоторых системах, таким как маленькие встроенные устройства только с флэш-памятью, нет никакой подкачки вообще. В этом случае буфер застрянет в RAM до выходов процесса или возможно отдает ее с madvise().

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

Это не требует больше чем одного процесса с помощью отображаемого файла, чтобы быть преимуществом.

0
ответ дан 23 November 2019 в 02:33
поделиться

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

Для чисто последовательного доступа к файлу это также не всегда лучшее решение, хотя соответствующий вызов madvise может смягчить проблему.

Вы должны быть осторожны с ограничениями выравнивания вашей архитектуры (SPARC, itanium), при чтении / записи ввода-вывода буферы часто правильно выровнены и не перехватываются при разыменовании приведенного указателя.

Вы также должны быть осторожны, чтобы не получить доступ за пределами карты. Это может легко произойти, если вы используете строковые функции на своей карте, а ваш файл не содержит \ 0 в конце. Он будет работать большую часть времени, когда размер вашего файла не кратен размеру страницы, поскольку последняя страница заполнена нулем (отображаемая область всегда имеет размер, кратный размеру вашей страницы).

44
ответ дан 23 November 2019 в 02:33
поделиться
Другие вопросы по тегам:

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