Рейтинг@Mail.ru

Наши друзья и партнеры

UnixForum




Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Linux-инструменты для Windows-программистов
Назад Библиотеки API POSIX Вперед

Время клонирования

Интересно проследить скорость (измеряем в периодах частоты процессора) создания нового экземпляра процесса (позже сравнить её со скоростью создания потока):

p2-1.c :

#include <stdlib.h> 
#include <stdio.h> 
#include <inttypes.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include "libdiag.h" 

static uint64_t tim; 
//#define data_size 1 // размер области данных в пространстве процесса: 1, 10, ... MB
#define data_size 10 
#define KB       1024 
#define data_byte KB*KB*data_size 
static struct mbyte { 
#pragma pack( 1 ) 
   uint8_t array[ data_byte ]; 
#pragma pack( 4 ) 
} data; 
int main( int argc, char *argv[] ) { 
   tim = rdtsc(); 
   pid_t pid = fork(); 
   if( pid == -1 ) perror( "fork" ), exit( EXIT_FAILURE ); 
   if( pid == 0 ) { 
      tim = rdtsc() - tim; 
      printf( "process create time : %llu\n", tim ); 
      if( argc > 1 ) { 
         long i; 
         tim = rdtsc(); 
         for( i = 0; i < data_byte; i += KB * 4 ) 
            data.array[ i ] = 0; 
         tim = rdtsc() - tim; 
         printf( "process write time : %llu\n", tim ); 
      } 
      exit( EXIT_SUCCESS ); 
   } 
   if( pid > 0 ) { 
      int status; 
      wait( &status ); 
   }; 
   exit( EXIT_SUCCESS ); 
}; 

Выполнение программы (разброс значений будет очень значителен, из-за загрузки системы и из-за кеширования областей памяти, повторяем выполнение по несколько раз):

$ ./p2-1 

process create time : 348140 

$ ./p2-1 

process create time : 326090 

$ ./p2-1 

process create time : 216020 

$ ./p2-1 

process create time : 327290 

Позже мы увидим, что время создания клона процесса практически не отличается от времени создания нового потока в процессе.

А теперь выполнение той же программы, но с модификацией страниц памяти, когда значительная область данных процесса прописывается значением (только 1-й байт каждой 4KB страницы):

- размер области данных 1 MB:

$ ./p2-1 w

process create time : 490670 
process write time : 1877010 

$ ./p2-1 w 

process create time : 320200 
process write time : 3956830 

$ ./p2-1 w 

process create time : 1558240 
process write time : 2294780 

$ ./p2-1 w 

process create time : 291210 
process write time : 2468000 

- время записи 250 байт потребовало времени на порядок больше, чем запуск процесса — это иллюстрация работа механизма COW (copy on write).

- размер области данных 10 MB (требуется перекомпиляция задачи):

$ ./p2-1 w

process create time : 426220 
process write time : 26742080 

$ ./p2-1 w 

process create time : 166930 
process write time : 18489920 

$ ./p2-1 w

process create time : 479890 
process write time : 31890280 

- возросло на порядок число переразмещаемых (посредством MMU) страниц адресного пространства процесса — возросло на порядок время записи.


Предыдущий раздел: Оглавление Следующий раздел:
Параллельные процессы   Загрузка нового экземпляра (процесса)

Поделиться: