init commit

This commit is contained in:
2025-04-13 21:48:15 +03:00
commit 23255e9121
192 changed files with 12200 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
#include <unistd.h>
typedef struct segment
{
unsigned int base;
unsigned int size;
} segment;
// 8-ми сегментная
unsigned int
VirtIntoPhys(segment *segTable, unsigned int VirtAdr)
{
unsigned int SegNum = VirtAdr >> 29;
unsigned int offset = (VirtAdr << 3) >> 3;
if (offset > segTable[SegNum].size) {
_exit(25);
}
return segTable[SegNum].base + offset;
}
+55
View File
@@ -0,0 +1,55 @@
#include <unistd.h>
#include <fcntl.h>
// Стоит добавить проверки на успешность системных вызовов
enum
{
BlockSize = 16,
}
int fds[4];
unsigned int sizes[4];
char **list = [ "Disk0", "Disk0", "Disk0", "Disk0" ];
void
Ini_Raid0(void)
{
struct stat st;
for (int i = 0; i < 4; ++i) {
fds[i] = open(list[i], O_RDWR);
lstat(list[i], &st);
sizes[i] = st.st_size;
if (i != 0) {
sizes[i] += sizes[i - 1];
}
}
return;
}
void
Read_Raid0(int num, char *buf)
{
unsigned int byte = num * BlockSize;
int now_disk = 0;
for (int i = 0; i < BlockSize; ++i) {
while (byte > sizes[now_disk]) {
now_disk++;
}
if (now_disk > 3) {
_exit(1);
}
if (now_disk != 0) {
lseek(fds[now_disk], byte - sizes[now_disk - 1]);
} else {
lseek(fds[now_disk], byte);
}
read(fds[now_disk], 1, buf + i);
}
return;
}
+43
View File
@@ -0,0 +1,43 @@
#include <unistd.h>
#include <fcntl.h>
enum
{
BlockSize = 16,
}
int fds[4];
unsigned int sizes[4];
char **list = [ "Disk0", "Disk0", "Disk0", "Disk0" ];
void
Ini_Raid0(void)
{
struct stat st;
for (int i = 0; i < 4; ++i) {
fds[i] = open(list[i], O_RDWR);
lstat(list[i], &st);
sizes[i] = st.st_size / BlockSize;
if (i != 0) {
sizes[i] += sizes[i - 1];
}
}
return;
}
void
Read_Raid0(int num, char *buf)
{
int now_disk = 0;
int now_block = 0;
while (now_block != num) {
if (sizes[now_disk]
now_disk++;
now_block++;
now_disk %= 4;
}
return;
}
+35
View File
@@ -0,0 +1,35 @@
Что будет выведено на экран? Прокомментировать, почему? Если возможны несколько вариантов – привести все. Предполагается, что
обращение к функции вывода на экран прорабатывает атомарно и без буферизации. Все системные вызовы прорабатывают успешно.
Подключение заголовочных файлов опущено.
int main() {
int pid;
int fd[2];
char c = 'a';
pipe(fd);
if( (pid = fork()) > 0 ) {
read(fd[0], &c, 1);
kill(pid, SIGKILL);
wait(NULL);
} else {
putchar(c);
c = 'b';
write(fd[1], &c, 1);
c = 'c';
}
putchar(c);
return 0;
}
(Вес задачи: 2 балла)
Answer:
1) начнётся с a т.к. отец заблокируется на считывании
2) сын записал б в канал, дальше либо отец может отправить его "на убийство", либо сын проработает быстрее. У сына с
3) только после смерти сына отец выведет б
aсб
aб
+42
View File
@@ -0,0 +1,42 @@
Сколько раз система обратится к содержимому индексных дескрипторов при вызове: open("/dir1/dir2/dir3/file", O_RDONLY)?
Прокомментировать, почему? Считаем, что ни один из элементов пути к файлу не является символической ссылкой. (Вес задачи: 1 балл)
$$ Answer:
1) система будет последовательно пробегать по каждому из каталогов.
1) будет искать, есть ли файл в каталоге.
2) будет проверять, является ли сам файл каталогом.
2) сначала корень. ищем в нём dir1.<#> Первое обращение. Проверяем dir1 на каталог.<#> Второе обращение
find dir2 in dir1.<#> dir2 is dir?<#>
find dir3 in dir2.<#> dir3 is dir?<#>
find file in dir3.<#>
=> всего нам надо 7 обращений к содержимому индексных дескрипторов
$$ Ответ GPT:
При вызове open("/dir1/dir2/dir3/file", O_RDONLY) система обращается к индексным дескрипторам (inode) для каждого элемента пути.
Основные этапы:
Корневая директория /:
Первое обращение к индексному дескриптору (inode) — система обращается к inode корневого каталога /.
Директория dir1:
Второе обращение — система читает содержимое inode корневого каталога и ищет запись для dir1, после чего обращается к inode для dir1.
Директория dir2:
Третье обращение — система читает inode для dir1, затем ищет в его содержимом запись о dir2 и обращается к соответствующему inode.
Директория dir3:
Четвёртое обращение — система аналогично читает inode для dir2, находит запись для dir3 и обращается к inode для dir3.
Файл file:
Пятое обращение — система читает inode для dir3, находит запись о файле file и обращается к inode для файла.
Итог:
Таким образом, система обращается к содержимому индексных дескрипторов 5 раз (по количеству элементов пути /, dir1, dir2, dir3, file).
Почему:
Каждая директория в Unix-подобных файловых системах представлена как файл каталога, содержащий список файлов и подкаталогов.
Чтобы найти нужный файл, система последовательно открывает каждый inode, пока не доберётся до конечного файла.