mirror of https://github.com/t1meshift/os_labs.git
Compare commits
2 Commits
37ef98b7c7
...
1de33e9192
Author | SHA1 | Date |
---|---|---|
Yury Kurlykov | 1de33e9192 | |
Yury Kurlykov | d6b81153b5 |
|
@ -14,3 +14,4 @@ function(define_lab lab_name)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
define_lab(lab2)
|
define_lab(lab2)
|
||||||
|
define_lab(lab3)
|
|
@ -3,6 +3,7 @@
|
||||||
## Список
|
## Список
|
||||||
|
|
||||||
- [Лабораторная работа 2](lab2/README.md)
|
- [Лабораторная работа 2](lab2/README.md)
|
||||||
|
- [Лабораторная работа 3](lab3/README.md)
|
||||||
|
|
||||||
## Запуск
|
## Запуск
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,5 @@ int main() {
|
||||||
assert(x == 20);
|
assert(x == 20);
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
alarm(2);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
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
|
while IFS= read -r -d '' FILE
|
||||||
do
|
do
|
||||||
echo "Executing $FILE..."
|
echo "Executing $FILE..."
|
||||||
|
|
Loading…
Reference in New Issue