Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
 Тяпничный Новогодний mmap  [new]
mayton
Member

Откуда: loopback
Сообщений: 39268
Привет.

С Наступающим ВСех.

В продолжение 18155192, 21299029

Итак коллеги. Системный вызов mmap. . Я не буду давать ссылок. Их полно. Приведу шапку
мануала чтоб было понятно всем прочим кто не в теме.

man
NAME
       mmap, munmap - map or unmap files or devices into memory

SYNOPSIS
       #include <sys/mman.h>

       void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);
       int munmap(void *addr, size_t length);

       See NOTES for information on feature test macro requirements.


Я решил оставить 4 базовых вопроса. И не по самой функции ядра а по практическому применению.

1) Ограничения. Сколько можно выделить практически с учотом диска.
2) Реализации в Windows/Unix
3) Практическое применение кроме традиционного (загрузка кода). SQLite? Другие DBMS?

Поделитесь где и как вы использовали mmap? Какие цели были достигнуты?
Какие были недостатки? Как фиксили. Или как оптимизировали.[/i]

(Спасибо колобку. Он уже отписал в топиках ранее)
28 дек 18, 22:11    [21776084]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный Новогодний mmap  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6067
mayton,

mmap использует механизмы вытеснения страниц - и будет эффективен на чтение 4к-страниц.

в остальном это выглядит как костыль, нужны тесты
28 дек 18, 22:43    [21776092]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный Новогодний mmap  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6067
За исключением случая собственного кэширования на запись.
28 дек 18, 22:44    [21776093]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный Новогодний mmap  [new]
mayton
Member

Откуда: loopback
Сообщений: 39268
Вот с тестами вопрос. Я пока прикидываю так и эдак и не нахожу постановки.
Что была в тренде. И использовала mmap.
29 дек 18, 12:59    [21776340]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный Новогодний mmap  [new]
mayton
Member

Откуда: loopback
Сообщений: 39268
Up. ПОциент не жив и не мёртв а где-то в лимбе. Но я выкину кусок тестового кода который
я начал писать до нового года и забросил.

#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h> 

#include "zlog.h"

typedef unsigned char byte;

zlog_category_t *c;

int app_init_zlog() {	    
	    int rc = zlog_init("zlog.conf");
		if (rc) {
			printf("init failed\n");
			return -1;
		}

		c = zlog_get_category("my_cat");
		if (!c) {
			printf("get cat fail\n");
			zlog_fini();
			return -2;
		}
		return 0;
}


int main(int argc, char **argv, char **env) {
	
		long length = 1024 * 1024;

		if (app_init_zlog()!=0) return -1;
	
		zlog_info(c, ":: Begin");

		int pageSize = getpagesize();

		int fd = open("~/fias_xml.rar", O_RDWR);

		if (fd == -1) {
			zlog_error(c, ":: Error");
			return -1;
		}

		zlog_info(c, ":: pagesize = %d", pageSize);

		zlog_info(c, ":: mmap(...) begin ");

		// void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
		// 
		void * p = mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

        if (p == MAP_FAILED) {
			zlog_error(c, ":: MAP_FAILED!");
			return -1;
		}

		zlog_info(c, ":: mmap(...) end ");

		for(int i=0; i < 100 ; i++) {
			printf("%02X ", ((byte*)p)[i]);
			if ((i + 1) % 16 == 0) {
				printf("\n");
			}
		}
		printf("\n");

		zlog_info(c, ":: OK!");

		zlog_fini();

		close(fd);


	return 0;
}
11 янв 19, 22:51    [21783356]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный Новогодний mmap  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6340
mayton,

А какой смысл мерять printf("%02X ", ((byte*)p)[i]) если printf("%02X "), на несколько порядков медленнее чем ((byte*)p)[i] ?

Лучше суммируйте байты переменую, а потом в конце выводите.

Siemargl
mmap использует механизмы вытеснения страниц - и будет эффективен на чтение 4к-страниц.

в остальном это выглядит как костыль, нужны тесты

Ну, память выделенную в mmap можно тюнить под разные задачи. См. http://man7.org/linux/man-pages/man2/madvise.2.html
12 янв 19, 00:16    [21783385]     Ответить | Цитировать Сообщить модератору
 Re: Тяпничный Новогодний mmap  [new]
mayton
Member

Откуда: loopback
Сообщений: 39268
Anatoly Moskovsky
А какой смысл мерять printf("%02X ", ((byte*)p)[i]) если printf("%02X "), на несколько порядков медленнее чем ((byte*)p)[i] ?

Сюда не смотрите. Это вообще не бенчмарк а просто тест на корректность. Я хотел убедится что
содержимое соотвествует шапке архива.

По поводу бенчмарка. Я сижу как медведь в зоопарке и раскачиваюсь взад-вперед. Не знаю какую
постановку для теста взять. Пару лет назад у нас была унификация записей (sort -u) в толстых терабайтных
файлах. Може ее приспособить. Здесь должна быть работа с диском и памятью. Но я не знаю как.

Либо какой-то key-value механизм наподобие дисковой хеш-таблички.
12 янв 19, 00:57    [21783410]     Ответить | Цитировать Сообщить модератору
Все форумы / Программирование Ответить