Add 3rd lab

master
Yury Kurlykov 2020-04-20 00:48:01 +10:00
parent d6b81153b5
commit 1de33e9192
Signed by: t1meshift
GPG Key ID: B133F3167ABF94D8
11 changed files with 147 additions and 1 deletions

View File

@ -13,4 +13,5 @@ function(define_lab lab_name)
message("${lab_name} defined.")
endfunction()
define_lab(lab2)
define_lab(lab2)
define_lab(lab3)

View File

@ -3,6 +3,7 @@
## Список
- [Лабораторная работа 2](lab2/README.md)
- [Лабораторная работа 3](lab3/README.md)
## Запуск

29
lab3/.execme Executable file
View File

@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
echo "Task 4,3"
mem_allocs=(1 16 128 512)
for i in "${mem_allocs[@]}" ; do
echo "Running with $i Mb allocation..."
"$1/lab3_memory-user.c_run" "$i" &
JOB_PID=$!
sleep 3
echo "pmap -X $JOB_PID command:"
pmap -X $JOB_PID
echo
echo "Before termination:"
echo "free -m command:"
free -m
echo
kill $JOB_PID
sleep 3
echo "After termination:"
free -m
echo "------------------"
done

34
lab3/CMakeLists.txt Normal file
View File

@ -0,0 +1,34 @@
cmake_minimum_required(VERSION 3.16)
set(CMAKE_C_STANDARD 11)
# Lab name
set(LAB_NAME "lab3")
# Lab tasks
list(APPEND SOURCE_FILES
memory-user.c
)
list(APPEND NON_COMPILABLE_SRC
.execme
)
### Here goes the template
project("${LAB_NAME}" C)
add_custom_target("${LAB_NAME}")
foreach (file IN LISTS SOURCE_FILES)
add_executable("${LAB_NAME}_${file}_run" "${file}")
add_dependencies("${LAB_NAME}" "${LAB_NAME}_${file}_run")
endforeach ()
foreach (file IN LISTS NON_COMPILABLE_SRC)
add_custom_command(
TARGET "${LAB_NAME}" POST_BUILD
DEPENDS "${file}"
COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_SOURCE_DIR}/${file}"
"${CMAKE_CURRENT_BINARY_DIR}/${file}"
)
endforeach ()

27
lab3/README.md Normal file
View File

@ -0,0 +1,27 @@
# Лабораторная работа №3
Были рассмотрены аллокации памяти размером 1, 16, 128 и 512 Мб.
Для выполнения заданий 4 и 3 был использован скрипт для оболочки bash, запускаемый точно так же, как и остальные
лабораторные: `./run_lab.sh lab3` из директории со всеми работами.
Он запускает программу [memory-user.c](memory-user.c) из первого задания с заданным объёмом памяти на выделение.
Через 3 секунды запускается `pmap` для исследования распределения памяти, затем `free`. После этого исполняется
`kill`, memory-user завершает работу. Запускаются те же `pmap` и `free` для сравнения.
Задержка 3 секунды после вызова `kill` необходима для того, чтобы система успела освободить память. При выделении
2048 Мб память успевает высвобождаться лишь наполовину.
Ниже можно увидеть вывод скрипта для разных объёмов выделенной памяти:
**1 Mb:**
![1Mb](alloc_1mb.png)
**16 Mb:**
![16Mb](alloc_16mb.png)
**128 Mb:**
![128Mb](alloc_128mb.png)
**512 Mb:**
![512Mb](alloc_512mb.png)

BIN
lab3/alloc_128mb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 KiB

BIN
lab3/alloc_16mb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 KiB

BIN
lab3/alloc_1mb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 KiB

BIN
lab3/alloc_512mb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 KiB

39
lab3/memory-user.c Normal file
View File

@ -0,0 +1,39 @@
#include <assert.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
int main(int argc, char **argv) {
printf("Current PID: %d\n", getpid());
const unsigned long mb_size = 1 << 20; // NOLINT: pow(2, 20) won't even touch the significant bit
unsigned long alloc_size = 0;
if (argc > 1) {
alloc_size = atoi(argv[1]); // NOLINT: educational purpose only
} else {
scanf("%ld", &alloc_size); // NOLINT: educational purpose only
}
alloc_size *= mb_size;
int *array = malloc(alloc_size);
printf("Allocated %ldMb at %p\n", alloc_size / mb_size, array);
srand(alloc_size);
unsigned long arr_size = alloc_size / sizeof(*array);
#pragma clang diagnostic push
#pragma ide diagnostic ignored "EndlessLoop"
// Intentional endless loop
while (1) {
for (int i = 0; i < arr_size; ++i) {
array[i] = rand(); // NOLINT: randomness of rand() is unimportant in this case
}
}
#pragma clang diagnostic pop
return 0;
}

View File

@ -5,6 +5,21 @@ IFS=$'\n\t'
echo -e "\nTesting script started...\n"
if [ -f "$1/.execme" ]; then
echo "Found .execme file!"
if [ -x "$1/.execme" ]; then
echo "Executing..."
"$1/.execme" "$1"
exit $?
else
echo ".execme couldn't be executed!"
echo "Run chmod +x \"$1/.execme\" ."
exit 1
fi
fi
echo "Using default exec all policy..."
while IFS= read -r -d '' FILE
do
echo "Executing $FILE..."