Skip to content

Commit 25de474

Browse files
authored
Setup Basic Lab 2: Page cache (#8) (#11)
* Draft test framework (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Fix issues (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Add convinience (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Add seq test (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Add random test (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Add GitHub Flow (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Fix build (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Format (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Fix build (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Fix build (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Fix style (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * What? (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> * Style (#8) Signed-off-by: vityaman <vityaman.dev@yandex.ru> --------- Signed-off-by: vityaman <vityaman.dev@yandex.ru>
1 parent 805b435 commit 25de474

24 files changed

Lines changed: 788 additions & 4 deletions

.github/workflows/vtpc.yml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
name: Test VT Page Cache
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
paths:
9+
- 'lab/vtpc/**'
10+
11+
jobs:
12+
build:
13+
strategy:
14+
matrix:
15+
cmake_build_type:
16+
- Asan
17+
- Release
18+
runs-on: ubuntu-latest
19+
container:
20+
image: silkeh/clang:latest
21+
defaults:
22+
run:
23+
working-directory: ./lab/vtpc
24+
steps:
25+
- name: Checkout
26+
uses: actions/checkout@v4
27+
28+
- name: Clang Format
29+
run: |
30+
find . -path ./build -prune -o \
31+
\( -iname '*.c' -o -iname '*.h' -o -iname '*.cpp' -o -iname '*.hpp' \) \
32+
-exec clang-format --style=file --dry-run --verbose {} \;
33+
34+
- name: Configure
35+
run: cmake -B build -DCMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }}
36+
37+
- name: Build
38+
run: cmake --build build
39+
40+
- name: Clang Tidy
41+
if: matrix.cmake_build_type == 'Release'
42+
run: |
43+
find . -path ./build -prune -o \
44+
\( -iname '*.c' -o -iname '*.h' -o -iname '*.cpp' -o -iname '*.hpp' \) -exec \
45+
clang-tidy -p ./build {} \;
46+
47+
- name: Test Basic
48+
run: ./build/test/test_basic
49+
50+
- name: Test Sequential
51+
run: ./build/test/test_seq
52+
53+
- name: Test Random
54+
run: ./build/test/test_random

.github/workflows/vtsh.yml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ jobs:
2727

2828
- name: Clang Format
2929
run: |
30-
find . -path ./build -prune -o \( -iname '*.c' -o -iname '*.h' \) -exec \
31-
clang-format --style=file --dry-run --verbose {} \;
30+
find . -path ./build -prune -o \
31+
\( -iname '*.c' -o -iname '*.h' -o -iname '*.cpp' -o -iname '*.hpp' \) \
32+
-exec clang-format --style=file --dry-run --verbose {} \;
3233
3334
- name: Configure
3435
run: cmake -B build -DCMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }}
@@ -37,9 +38,11 @@ jobs:
3738
run: cmake --build build
3839

3940
- name: Clang Tidy
41+
if: matrix.cmake_build_type == 'Release'
4042
run: |
41-
find . -path ./build -prune -o \( -iname '*.c' -o -iname '*.h' \) -exec \
42-
clang-tidy -p . {} \;
43+
find . -path ./build -prune -o \
44+
\( -iname '*.c' -o -iname '*.h' -o -iname '*.cpp' -o -iname '*.hpp' \) -exec \
45+
clang-tidy -p ./build {} \;
4346
4447
- name: Test
4548
working-directory: ./lab/vtsh/test

lab/vtpc/.clang-format

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
BasedOnStyle: Google
2+
3+
AccessModifierOffset: -2
4+
5+
AllowShortFunctionsOnASingleLine: None
6+
AllowShortIfStatementsOnASingleLine: false
7+
AllowShortLoopsOnASingleLine: false
8+
9+
DerivePointerAlignment: false
10+
BreakConstructorInitializers: BeforeComma
11+
AlignAfterOpenBracket: BlockIndent
12+
13+
BinPackArguments: false
14+
BinPackParameters: false
15+
16+
AlignArrayOfStructures: Right

lab/vtpc/.clang-tidy

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
Checks: |
2+
-*,
3+
bugprone-*,
4+
-bugprone-easily-swappable-parameters,
5+
cert-*,
6+
clang-analyzer-*,
7+
concurrency-*,
8+
cppcoreguidelines-*,
9+
-cppcoreguidelines-avoid-non-const-global-variables,
10+
-cppcoreguidelines-special-member-functions,
11+
google-*,
12+
hicpp-*,
13+
-hicpp-special-member-functions,
14+
misc-*,
15+
modernize-*,
16+
performance-*,
17+
portability-*,
18+
-portability-avoid-pragma-once,
19+
readability-*
20+
-readability-identifier-length
21+
WarningsAsErrors: '*'
22+
FormatStyle: file

lab/vtpc/.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# CMake
2+
build/
3+
4+
# Clangd
5+
.cache/
6+
7+
# Python
8+
__pycache__/

lab/vtpc/.vscode/settings.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"clangd.arguments": [
3+
"-compile-commands-dir=./build",
4+
"-header-insertion=never",
5+
],
6+
"files.eol": "\n",
7+
}

lab/vtpc/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
cmake_minimum_required(VERSION 3.12)
2+
3+
project(
4+
vtpc
5+
VERSION 0.1
6+
DESCRIPTION "VT Page Cache"
7+
)
8+
9+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
10+
11+
add_subdirectory(lib)
12+
add_subdirectory(test)

lab/vtpc/README.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Базовый трек. Лабораторная работа 2
2+
3+
## Задание
4+
5+
Для оптимизации работы с блочными устройствами в ОС существует кэш страниц с данными, которыми мы производим операции чтения и записи на диск. Такой кэш позволяет избежать высоких задержек при повторном доступе к данным, так как операция будет выполнена с данными в RAM, а не на диске (вспомним пирамиду памяти).
6+
7+
В данной лабораторной работе необходимо реализовать блочный кэш в пространстве пользователя в виде динамической библиотеки. Политику вытеснения страниц и другие элементы задания необходимо получить у преподавателя.
8+
9+
При выполнении работы необходимо реализовать простой API для работы с файлами, предоставляющий пользователю следующие возможности:
10+
11+
1. Открытие файла по заданному пути файла, доступного для чтения. Процедура возвращает некоторый хэндл на файл. Пример: `int lab2_open(const char *path)`.
12+
13+
2. Закрытие файла по хэндлу. Пример: `int lab2_close(int fd)`.
14+
15+
3. Чтение данных из файла. Пример: `ssize_t lab2_read(int fd, void buf[.count], size_t count)`.
16+
17+
4. Запись данных в файл. Пример: `ssize_t lab2_write(int fd, const void buf[.count], size_t count)`.
18+
19+
5. Перестановка позиции указателя на данные файла. Достаточно поддержать только абсолютные координаты. Пример: `​​​​​​​off_t lab2_lseek(int fd, off_t offset, int whence)`.
20+
21+
6. Синхронизация данных из кэша с диском. Пример: `int lab2_fsync(int fd)`.
22+
23+
Операции с диском разработанного блочного кеша должны производиться в обход page cache ОС.
24+
25+
В рамках проверки работоспособности разработанного блочного кэша необходимо адаптировать указанную преподавателем программу-загрузчик из ЛР 1, добавив использование кэша. Запустите программу и убедитесь, что она корректно работает. Сравните производительность до и после.
26+
27+
## Ограничения
28+
29+
1. Программа (комплекс программ) должна быть реализован на языке C.
30+
31+
2. Если по выданному варианту задана политика вытеснения Optimal, то необходимо предоставить пользователю возможность подсказать page cache, когда будет совершен следующий доступ к данным. Это можно сделать либо добавив параметр в процедуры `read` и `write` (например, `ssize_t lab2_read(int fd, void buf[.count], size_t count, access_hint_t hint)`), либо добавив еще одну функцию в API (например, `int lab2_advice(int fd, off_t offset, access_hint_t hint)`). `access_hint_t` в данном случае – это абсолютное время или временной интервал, по которому разработанное API будет определять время последующего доступа к данным.
32+
33+
3. Запрещено использовать высокоуровневые абстракции над системными вызовами.
34+
35+
## Требования к отчету и защите
36+
37+
Отчет должен содержать:
38+
39+
1. титульный лист с указанием номера и названия ЛР, вашего ФИО, ФИО преподавателя практики, номера вашей группы, варианта ЛР;
40+
41+
2. текст задания в соответствии с вариантом;
42+
43+
3. краткий обзор кода;
44+
45+
4. данные о работе программы-нагрузчика до и после внедрения своего page cache;
46+
47+
5. заключение с анализом результатов и выводом.

lab/vtpc/lib/CMakeLists.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
add_library(
2+
vtpc
3+
STATIC
4+
vtpc.c
5+
)
6+
7+
target_include_directories(
8+
vtpc
9+
PUBLIC
10+
.
11+
)

lab/vtpc/lib/vtpc.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include "vtpc.h"
2+
3+
#include <fcntl.h>
4+
#include <stddef.h>
5+
#include <sys/types.h>
6+
#include <unistd.h>
7+
8+
int vtpc_open(const char* path, int mode, int access) {
9+
return open(path, mode, access);
10+
}
11+
12+
int vtpc_close(int fd) {
13+
return close(fd);
14+
}
15+
16+
ssize_t vtpc_read(int fd, void* buf, size_t count) {
17+
return read(fd, buf, count);
18+
}
19+
20+
ssize_t vtpc_write(int fd, const void* buf, size_t count) {
21+
return write(fd, buf, count);
22+
}
23+
24+
off_t vtpc_lseek(int fd, off_t offset, int whence) {
25+
return lseek(fd, offset, whence);
26+
}
27+
28+
int vtpc_fsync(int fd) {
29+
return fsync(fd);
30+
}

0 commit comments

Comments
 (0)