consolidate all repos to one for archive
This commit is contained in:
7
semester_2/uvod_v_operacijske_sisteme/dodatna/Makefile
Normal file
7
semester_2/uvod_v_operacijske_sisteme/dodatna/Makefile
Normal file
@@ -0,0 +1,7 @@
|
||||
all: clean streznik odjemalnik
|
||||
streznik: streznik.cpp
|
||||
g++ -pthread -lrt streznik.cpp -o streznik
|
||||
odjemalnik: odjemalnik.cpp
|
||||
g++ -pthread -lrt odjemalnik.cpp -o odjemalnik
|
||||
clean:
|
||||
rm -f odjemalnik streznik vhod izhod izklop
|
21
semester_2/uvod_v_operacijske_sisteme/dodatna/README.md
Normal file
21
semester_2/uvod_v_operacijske_sisteme/dodatna/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
Nadzornik pomnilnika (samostojna naloga)
|
||||
|
||||
Pripravite program nadzornikPomnilnika, ki bo spremljal porabo pomnilnika v sistemu. Program naj deluje kot sistemski servis. Program naj spremlja in beleži trenutno stanje pomnilnika, drugim programom pa preko poljubne medprocesne komunikacije omogoča dostop do meritev in konfiguracijo zajemanja.
|
||||
|
||||
Trenutno stanje pomnilnika lahko preberete iz zbirke /proc/meminfo (poiščite meminfo v dokumentaciji man 5 proc za podroben opis vsebine). V njen je zapisanih precej podrobnosti, vaš servis naj spremlja in beleži vsaj:
|
||||
|
||||
količino celotnega pomnilnika
|
||||
količino prostega pomnilnika
|
||||
količino pomnilnika na voljo procesom
|
||||
količino celotnega swap prostora
|
||||
količino prostega swap prostora
|
||||
|
||||
Servis ima dva parametra zajemanja: čas med branji in število hranjenih meritev. Čas med branji določa koliko časa sevis počaka med branji /proc/meminfo. Število hranjenih meritev pa določa koliko zadnjih prebranih vrednosti si servis zapomne.
|
||||
|
||||
Servis naj preko poljubne tehnike medprocesne komunikacije omogoča komunikacijo z različnimi odjemalci. Odjemalci lahko spreminjajo oba parametra, pridobijo trenutno hranjeno zgodovino in ustavijo servis. Servis mora omogočati komunikacijo z več odjemalci hkrati in ostati odziven. Priporočamo, da uporabite vsaj dve niti. Eno za branje /proc/meminfo in eno ali več za komunikacijo z odjemalci.
|
||||
|
||||
Za komunikacijo boste potrebovali en kanal (cev, vrsto za sporočila, itd. ), na katerem se odjemalci povežejo na servis. Za vsakega odjemalca mora nato servis ustvariti nov kanal preko katerega komunicira s tistim odjemalcem.
|
||||
|
||||
Pripravite tudi primer odjemalca. Le ta naj omogoča pošiljanje zahtev servisu in izpis vrnjenih vrednosti (na primer zgodovine porabe pomnilnika).
|
||||
|
||||
Servis lahko poženete v enem terminalu, odjemalce pa v drugih. Ne rabite pripravljati resničnega sistemskega servisa
|
69
semester_2/uvod_v_operacijske_sisteme/dodatna/odjemalnik.cpp
Normal file
69
semester_2/uvod_v_operacijske_sisteme/dodatna/odjemalnik.cpp
Normal file
@@ -0,0 +1,69 @@
|
||||
#include <pthread.h>
|
||||
#include <sys/sysinfo.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <list>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
void menu(){
|
||||
std::cout << "1. Zamenjaj argumente\n";
|
||||
std::cout << "2. Pridobi stanje\n";
|
||||
std::cout << "3. Izklopi streznik\n";
|
||||
std::cout << "4. konec\n";
|
||||
std::cout << "Izbira: ";
|
||||
}
|
||||
|
||||
int main(){
|
||||
int izbira, l;
|
||||
int runn = 1;
|
||||
int arry[2];
|
||||
int cev1, cev2, cev3;
|
||||
int closep = 6;
|
||||
unsigned long array[100];
|
||||
while (runn == 1)
|
||||
{
|
||||
menu();
|
||||
std::cin >> izbira;
|
||||
switch (izbira){
|
||||
case 1:
|
||||
std::cout << "Vspisi dely v sekundah: ";
|
||||
std::cin >> arry[0];
|
||||
std::cout << "Vspisi stevilo branj: ";
|
||||
std::cin >> arry[1];
|
||||
cev1 = open("vhod", O_WRONLY);
|
||||
write(cev1, &arry, sizeof(arry));
|
||||
close(cev1);
|
||||
break;
|
||||
case 2:
|
||||
cev2 = open("izhod", O_RDONLY);
|
||||
if(cev2 < 0) std::cout << "tezava pri odpiranju cevi 0\n";
|
||||
l = read(cev2, &array, sizeof(array));
|
||||
if(l<0) std::cout << "tezava pri branju cevi \n";
|
||||
for (int i = 0; i < 100; i += 5){
|
||||
if(array[i] != 0)
|
||||
std::cout << array[i] << " " << array[i+1] << " " << array[i+2] << " " << array[i+3] << " " << array[i+4] << "\n";
|
||||
}
|
||||
std::cout << "\n";
|
||||
if(close(cev2) != 0) std::cout << "tezava pri zapiranju cevi 0\n";
|
||||
break;
|
||||
case 3:
|
||||
cev3 = open("izklop", O_WRONLY);
|
||||
write(cev3, &closep, sizeof(closep));
|
||||
close(cev3);
|
||||
runn = 0;
|
||||
break;
|
||||
default:
|
||||
runn = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
180
semester_2/uvod_v_operacijske_sisteme/dodatna/streznik.cpp
Normal file
180
semester_2/uvod_v_operacijske_sisteme/dodatna/streznik.cpp
Normal file
@@ -0,0 +1,180 @@
|
||||
#include <pthread.h>
|
||||
#include <sys/sysinfo.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <cstring>
|
||||
|
||||
|
||||
struct SystemInfo{
|
||||
unsigned long memTotal;
|
||||
unsigned long memFree;
|
||||
long upTime;
|
||||
unsigned long swapTotal;
|
||||
unsigned long swapFree;
|
||||
};
|
||||
|
||||
struct MesData{
|
||||
unsigned int size, delay;
|
||||
};
|
||||
|
||||
struct MesData mezureData;
|
||||
std::list<SystemInfo> listSI;
|
||||
int running = 1;
|
||||
int icev1, icev2, icev3;
|
||||
pthread_t tid[4];
|
||||
|
||||
void* glavna(void* arg){
|
||||
int i, l;
|
||||
while (running == 1){
|
||||
icev3 = open("izklop",O_RDONLY);
|
||||
if(icev3 < 0) std::cout << "tezava pri odpiranju cevi 2\n";
|
||||
|
||||
l = read(icev3, &i, sizeof(i));
|
||||
if(l<0) std::cout << "tezava pri branju cevi 2\n";
|
||||
|
||||
if(i > 2){
|
||||
pthread_cancel(tid[2]);
|
||||
pthread_cancel(tid[3]);
|
||||
running = 0;
|
||||
}
|
||||
|
||||
if(close(icev3) != 0) std::cout << "tezava pri zapiranju cevi 0\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void* mezuringNode(void* arg){
|
||||
struct sysinfo si;
|
||||
struct SystemInfo info;
|
||||
unsigned int microsecond = 1000000;
|
||||
while (running == 1)
|
||||
{
|
||||
sysinfo (&si);
|
||||
info.memTotal = si.totalram;
|
||||
info.memFree = si.freeram;
|
||||
info.upTime = si.uptime;
|
||||
info.swapFree = si.freeswap;
|
||||
info.swapTotal = si.totalswap;
|
||||
listSI.push_front(info);
|
||||
while(listSI.size() > mezureData.size){
|
||||
listSI.pop_back();
|
||||
}
|
||||
usleep(mezureData.delay * microsecond);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void* input(void* arg){
|
||||
int tmp[2];
|
||||
int l;
|
||||
while(running == 1){
|
||||
|
||||
icev1 = open("vhod",O_RDONLY);
|
||||
if(icev1 < 0) std::cout << "tezava pri odpiranju cevi 0\n";
|
||||
|
||||
l = read(icev1, &tmp, sizeof(tmp));
|
||||
if(l<0) std::cout << "tezava pri branju cevi 0\n";
|
||||
|
||||
std::cout << tmp[0] << " " << tmp[1] << "\n";
|
||||
mezureData.delay = tmp[0];
|
||||
mezureData.size = tmp[1];
|
||||
|
||||
if(close(icev1) != 0) std::cout << "tezava pri zapiranju cevi 0\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void* output(void* arg){
|
||||
unsigned long array[100];
|
||||
int l, i = 0;
|
||||
|
||||
while(running == 1){
|
||||
icev2 = open("izhod",O_WRONLY);
|
||||
if(icev2 < 0)
|
||||
std::cout << "Napaka pri odprtju cevi 1\n";
|
||||
else
|
||||
std::cout << "Odprta cevi 1\n";
|
||||
|
||||
i = 0;
|
||||
for (auto& elm : listSI){
|
||||
array[i] = elm.memTotal;
|
||||
i++;
|
||||
array[i] = elm.memFree;
|
||||
i++;
|
||||
array[i] = elm.upTime;
|
||||
i++;
|
||||
array[i] = elm.swapFree;
|
||||
i++;
|
||||
array[i] = elm.swapTotal;
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
l = write(icev2, &array, sizeof(array));
|
||||
if(l < 0)
|
||||
std::cout << "tezave pri pisanju v cev\n";
|
||||
else
|
||||
std::cout << "Vpisano v cevi 1\n";
|
||||
|
||||
if(close(icev2) != 0)
|
||||
std::cout << "tezava pri zapiranju cevi 1\n";
|
||||
else
|
||||
std::cout << "Zaprta cevi 1\n";
|
||||
|
||||
usleep(10000);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main(){
|
||||
std::cout << "Hello World\n";
|
||||
|
||||
mezureData.delay = 1;
|
||||
mezureData.size = 4;
|
||||
|
||||
mkfifo("vhod", S_IRUSR|S_IWUSR);
|
||||
mkfifo("izhod", S_IRUSR|S_IWUSR);
|
||||
mkfifo("izklop", S_IRUSR|S_IWUSR);
|
||||
|
||||
pthread_create(&tid[0], NULL, glavna, NULL);
|
||||
pthread_create(&tid[1], NULL, mezuringNode, NULL);
|
||||
pthread_create(&tid[2], NULL, input, NULL);
|
||||
pthread_create(&tid[3], NULL, output, NULL);
|
||||
|
||||
pthread_join(tid[0], NULL);
|
||||
pthread_join(tid[1], NULL);
|
||||
pthread_join(tid[2], NULL);
|
||||
pthread_join(tid[3], NULL);
|
||||
|
||||
std::string str;
|
||||
char* strc;
|
||||
for (auto& elm : listSI){
|
||||
str += "TotalMemory: " + std::to_string(elm.memTotal) + " ";
|
||||
str += "FreeMemory: " + std::to_string(elm.memFree) + " ";
|
||||
str += "UpTime: " + std::to_string(elm.upTime) + " ";
|
||||
str += "FreeSwap: " + std::to_string(elm.swapFree) + " ";
|
||||
str += "TotalSwap: " + std::to_string(elm.swapTotal) + "\n";
|
||||
}
|
||||
strc = &str[0];
|
||||
|
||||
printf("%s",strc);
|
||||
|
||||
close(icev1);
|
||||
close(icev2);
|
||||
close(icev3);
|
||||
|
||||
unlink("vhod");
|
||||
unlink("izhod");
|
||||
unlink("izklop");
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user