mirror of https://github.com/t1meshift/os_labs.git
Add 3rd lab
parent
d6b81153b5
commit
1de33e9192
|
@ -13,4 +13,5 @@ function(define_lab lab_name)
|
|||
message("${lab_name} defined.")
|
||||
endfunction()
|
||||
|
||||
define_lab(lab2)
|
||||
define_lab(lab2)
|
||||
define_lab(lab3)
|
|
@ -3,6 +3,7 @@
|
|||
## Список
|
||||
|
||||
- [Лабораторная работа 2](lab2/README.md)
|
||||
- [Лабораторная работа 3](lab3/README.md)
|
||||
|
||||
## Запуск
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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 ()
|
|
@ -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)
|
Binary file not shown.
After Width: | Height: | Size: 517 KiB |
Binary file not shown.
After Width: | Height: | Size: 542 KiB |
Binary file not shown.
After Width: | Height: | Size: 526 KiB |
Binary file not shown.
After Width: | Height: | Size: 537 KiB |
|
@ -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;
|
||||
}
|
|
@ -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..."
|
||||
|
|
Loading…
Reference in New Issue