¿Cuál sería un buen proyecto para una clase de pregrado que enseña “Programación C ++ en un entorno UNIX / Linux”?

Construye un servidor HTTP. ¿Por qué? Protocolo fácil, bien conocido, interesante para los estudiantes.

Haga esto de forma incremental:

1) Servidor básico: proceso único, subproceso único, una conexión por subproceso (bloqueo de E / S)

2) Procesamiento múltiple

2.1) Introducción simple: admite scripts CGI
2.2) Bifurcación en cada solicitud (costosa) para concurrencia
2.3) Pre-fork (presenta Unix IPC: envío de descriptores de archivo a los procesos del controlador)

3) Proceso único, impulsado por eventos. Múltiples procesos para múltiples loops de eventos. Use una encuesta escalable para esto (ya sea nativamente llame a epoll / kqueue o use libevent2)

4) Subprocesamiento múltiple: cree un grupo de subprocesos (presenta el búfer acotado o el problema “productor / consumidor”), maneje las tareas en un grupo de subprocesos

5) Proyectos avanzados (podría traducirse bien en un proyecto de diseño senior)

a) Construya una arquitectura de tipo SEDA (evento controlado * y * multiproceso, con grupos de subprocesos en cada etapa de la canalización). El OKWS de Afaik OkCupid es un ejemplo de esto basado en C ++ (también existe la implementación Java original de Matt Welsh)
b) Soporte integrado en complementos y lenguajes de secuencias de comandos (que le enseñan vinculadores, cargadores, otros idiomas)
c) Admite encuestas largas (requiere # 3), crea una aplicación de chat

Si encuentra que HTTP es demasiado complejo, SMTP puede ser otra opción (protocolo más simple)

Esto es algo así como un proyecto avanzado, todavía es algo razonable que puedes hacer en el transcurso de un semestre.

Introducción:

Una de las implementaciones más orientadas a objetos en Linux / UNIX en sistemas operativos reales es la capa VFS de un sistema operativo.

Sin embargo, nunca se implementa realmente en un lenguaje orientado a objetos por razones prácticas, ya que era la capa VFS de un sistema operativo.

El proyecto sería el siguiente:

Cree una aplicación de usuario que emule la capa VFS de un sistema operativo. Comience con el soporte para llamadas que realizan una E / S de archivo local simple, y luego compílelo para que también sea compatible con NFS [2].

Un simulador de capa VFS [1] como aplicación terrestre de usuario, que implementa la lectura de un sistema de archivos determinado que puede almacenarse en el disco o en un sistema de archivos NFS.

Para simplificar el proyecto, la implementación está restringida a ser de solo lectura, ya proporciona a los estudiantes un sistema de archivos de muestra.

Lo que proporcionas:

Un shell básico para el cliente VFS, con una clase base abstracta con una interfaz VFS estándar para montar un sistema de archivos, leer un directorio y obtener los atributos de un inodo.

Además, para comenzar, les proporciona una implementación de mount.

Lo que implementan los estudiantes:

Fase 1: Cree un cliente emulador de cliente VFS que acepte un script y lea en un sistema de archivos local. Esto usaría llamadas estándar del sistema IO. Para leer archivos y enumerar directorios.

Fase 2: Extienda al cliente para hablar NFSv3. [2]

¿Por qué es interesante este proyecto?

La capa VFS en un sistema operativo es uno de los subsistemas más orientados a objetos de un sistema operativo, aunque generalmente se implementa en C.

Enseñará a sus alumnos más sobre cómo detectar ejemplos ocultos de orientación a objetos.

Enseñará a sus alumnos acerca de una introducción a la programación en red, así como una comprensión de RPC.

[1] http://en.wikipedia.org/wiki/Vir
[2] http://tools.ietf.org/html/rfc1813

Antecedentes:
El campo de “almacenes de datos distribuidos” ahora está inundado con una serie de soluciones NoSQL como, HBase, Cassandra, MongoDB, Redis, etc. El diseño principal con todos estos almacenes de datos es conservar los datos en la memoria, procesar las solicitudes en la memoria y tener algún esquema para almacenar permanentemente los datos en el disco. Y luego hay enfoques sobre MySQL (ej: http: //yoshinorimatsunobu.blogsp …) que interactúan directamente con el motor de almacenamiento InnoDB, evitando el motor SQL, proporcionando así un alto rendimiento. Otra escuela de pensamiento ( http://sna-projects.com/kafka/de … y http://www.varnish-cache.org/tra …) sugiere que el acceso secuencial al disco puede de hecho proporcionar un mejor rendimiento y es superior porque no necesita mantener varias copias de los datos en su aplicación, en la capa de almacenamiento en caché y finalmente en el disco.

La última idea es intrigante porque minimiza el desperdicio de memoria para almacenar y mantener un rendimiento aceptable para una gran cantidad de datos.

Idea del proyecto:
Para construir una solución NoSQL basada en la última idea discutida anteriormente. Puede asumir el modelo de datos que ofrece MongoDB (datos orientados a documentos, basados ​​en JSON) o Redis (colecciones) pero sin los requisitos de memoria enorme. Aproveche las ideas discutidas en los artículos anteriores para implementar un almacén de datos con altos rendimientos de lectura y escritura con concurrencia razonable. En la primera etapa, proporciona una implementación de un solo nodo donde puedo leer / escribir datos de un solo nodo. En etapas futuras, puede agregar soporte para fragmentación, replicación, conmutación por error, ACID, etc.

La implementación requiere conocimiento del nivel de kernel de Linux (almacenamiento intermedio de copia cero, etc.), cómo transferir datos de manera eficiente entre el sistema de archivos, el kernel y las capas de red, y algoritmos para almacenar los datos de manera eficiente. Por lo tanto, sus alumnos podrán ejercer sus habilidades o aprender las nuevas habilidades necesarias para ejecutar el proyecto. C / C ++ es adecuado para este tipo de trabajo, por lo que debe cumplir con sus requisitos.

Tenga en cuenta que esta idea en sí no es nueva, pero sí lo suficientemente nueva como para tener implementaciones múltiples. Hay bastantes desafíos que superar, lo cual es ideal para torturar a los estudiantes de pregrado con 🙂