vez ver varios usuarios trabajen tiempo recuperar que pueden permitir online modifiquen mismo libro guardar guardado eliminado documentos como archivo abrir filesystems multiprocessing seek

filesystems - ver - ¿Es seguro tener múltiples procesos escribiendo en el mismo archivo al mismo tiempo?



permitir que varios usuarios trabajen en un mismo libro de excel 2016 (2)

Lo que está haciendo parece estar perfectamente bien, siempre que esté utilizando las llamadas a sis "en bruto" de POSIX, como read (), write (), lseek (), etc.

Si usa C stdio (fread (), fwrite () y amigos) o alguna otra biblioteca de idioma de ejecución que tenga su propio buffer de espacio de usuario, entonces la respuesta por "Tilo" es relevante, en eso debido al almacenamiento en búfer, que es para algunos medida fuera de su control, los diferentes procesos pueden sobreescribir los datos de los demás.

El bloqueo del sistema operativo Wrt, mientras que POSIX establece que las escrituras o lecturas menores que el tamaño PIPE_BUF son atómicas para algunos archivos especiales (tuberías y FIFO), no existe tal garantía para los archivos regulares. En la práctica, creo que es probable que las IO dentro de una página sean atómicas, pero no hay tal garantía. El sistema operativo solo se bloquea internamente en la medida necesaria para proteger sus propias estructuras internas de datos. Uno puede usar bloqueos de archivos, o algún otro mecanismo de comunicación entre procesos, para serializar el acceso a los archivos. Pero, todo esto es relevante solo para usted tiene varios procesos haciendo IO en la misma región de un archivo. En su caso, como sus procesos están haciendo IO para separar secciones del archivo, nada de esto importa, y usted debería estar bien.

Estoy construyendo un sistema donde múltiples procesos esclavos se están comunicando a través de sockets de dominio de Unix, y están escribiendo en el mismo archivo al mismo tiempo. Nunca estudié sistemas de archivos o este sistema de archivos específico (ext4), pero parece que podría haber algún peligro aquí.

Cada proceso escribe en un subconjunto disjunto del archivo de salida (es decir, no hay superposición en los bloques que se escriben). Por ejemplo, P1 escribe solo en el primer 50% del archivo y P2 solo escribe en el segundo 50%. O tal vez P1 solo escribe los bloques impares mientras que P2 escribe los bloques pares.

¿Es seguro tener P1 y P2 (ejecutándose simultáneamente en hilos separados) escribiendo en el mismo archivo sin usar ningún bloqueo? En otras palabras, ¿el sistema de archivos impone algún tipo de bloqueo implícitamente?

Nota: desafortunadamente no tengo la libertad de generar múltiples archivos y unirme más tarde.

Nota: Mi lectura desde la publicación de esta pregunta no concuerda con la única respuesta publicada a continuación. Todo lo que he leído sugiere que lo que quiero hacer está bien, mientras que el encuestado que está debajo insiste en que lo que estoy haciendo no es seguro, pero no puedo discernir el peligro descrito.


no, ¡generalmente no es seguro hacer esto!

necesita obtener un bloqueo de escritura exclusivo para cada proceso, lo que implica que todos los demás procesos deberán esperar mientras un proceso está escribiendo en el archivo. Cuantos más procesos intensivos de E / S tenga, mayor será el tiempo de espera.

es mejor tener un archivo de salida por proceso y formatear esos archivos con una marca de tiempo y un identificador de proceso al principio de la línea, para que luego pueda fusionar y ordenar los archivos de salida fuera de línea.

Consejo: verifique el formato de archivo de los archivos de registro del servidor web; estos se hacen con la marca de tiempo al comienzo de la línea, para que luego puedan combinarse y clasificarse.

EDITAR

Los procesos de UNIX utilizan un tamaño de búfer determinado / fijo cuando abren archivos (por ejemplo, 4096 bytes), para transferir datos hacia y desde el archivo en el disco. Una vez que el búfer de escritura está lleno, el proceso lo vacía al disco, es decir, ¡escribe el búfer completo en el disco! Tenga en cuenta aquí que está sucediendo cuando el buffer está lleno! - ¡No cuando hay un final de línea! Eso significa que incluso para un solo proceso que escribe datos de texto orientados a la línea en un archivo, esas líneas se cortan generalmente en algún lugar en el medio en el momento en que se vacía el búfer. Solo al final, cuando el archivo se cierra después de escribir, ¿puede suponer que el archivo contiene líneas completas?

Entonces, dependiendo de cuándo el proceso decida vaciar sus almacenamientos intermedios, escriben en diferentes momentos en el archivo - por ejemplo, el orden no es determinista / predecible Cuando un buffer se vacía a un archivo, no puede suponer que solo escribirá líneas completas - - Por ejemplo , generalmente escribirá líneas parciales , lo que estropea la salida si varios procesos descargan sus memorias intermedias sin sincronización.

Consulte este artículo en Wikipedia: http://en.wikipedia.org/wiki/File_locking#File_locking_in_UNIX

Citar:

Los sistemas operativos Unix (incluidos Linux y Mac OS X de Apple, a veces llamados Darwin) normalmente no bloquean automáticamente los archivos abiertos o ejecutan programas. Varios tipos de mecanismos de bloqueo de archivos están disponibles en diferentes sabores de Unix, y muchos sistemas operativos admiten más de un tipo para la compatibilidad. Los dos mecanismos más comunes son fcntl (2) y flock (2). Un tercer mecanismo de este tipo es lockf (3), que puede estar separado o puede implementarse utilizando cualquiera de las dos primeras primitivas.

Debería usar flock o Mutexes para sincronizar los procesos y asegurarse de que solo uno de ellos pueda escribir en el archivo a la vez.

Como mencioné antes, probablemente sea más rápido, más fácil y más simple tener un archivo de salida para cada proceso, y luego combinar esos archivos si es necesario (fuera de línea). Este enfoque es utilizado por algunos servidores web, por ejemplo, que necesitan iniciar sesión en múltiples archivos desde varios subprocesos, y deben asegurarse de que los diferentes subprocesos tengan un alto rendimiento (por ejemplo, no tener que esperar el uno al otro en un archivo). bloquear).

Aquí hay una publicación relacionada: (¡Marque la respuesta de Mark Byer! La respuesta aceptada no es correcta / relevante).

¿Es seguro canalizar la salida de varios procesos paralelos a un archivo utilizando >>?

EDICION 2:

en el comentario dijiste que deseas escribir bloques de datos binarios de tamaño fijo desde los diferentes procesos hasta el mismo archivo.

Solo en el caso de que su tamaño de bloque sea exactamente del tamaño del tamaño del búfer de archivo del sistema, ¡podría funcionar esto!

Asegúrese de que su longitud de bloque fija sea exactamente el tamaño del búfer de archivo del sistema . De lo contrario, te meterás en la misma situación que con las líneas no completadas. por ejemplo, si usa 16k bloques, y el sistema usa 4k bloques, entonces en general verá 4k bloques en el archivo en orden aparentemente aleatorio - no hay garantía de que siempre verá 4 bloques seguidos del mismo proceso