consolidate all repos to one for archive
This commit is contained in:
9
semester_2/uvod_v_operacijske_sisteme/naloga_05/Makefile
Normal file
9
semester_2/uvod_v_operacijske_sisteme/naloga_05/Makefile
Normal file
@@ -0,0 +1,9 @@
|
||||
all: naloga_1 naloga_2
|
||||
naloga_1: naloga_1.c
|
||||
gcc naloga_1.c -pthread -o naloga_1
|
||||
rm naloga_1.c
|
||||
naloga_2: naloga_2.c
|
||||
gcc naloga_2.c -pthread -o naloga_2
|
||||
rm naloga_2.c
|
||||
clean:
|
||||
rm -f naloga_1 naloga_2
|
67
semester_2/uvod_v_operacijske_sisteme/naloga_05/README.md
Normal file
67
semester_2/uvod_v_operacijske_sisteme/naloga_05/README.md
Normal file
@@ -0,0 +1,67 @@
|
||||
Niti (sprotna naloga)
|
||||
|
||||
V sklopu te naloge demonstrirajte uporabo knjižnice pthread za niti. Pripravite 3 programe, ki izvedejo v nadaljevanju opisane naloge. Pripravite tudi Makefile, ki bo vašo kodo prevedel v izvedljive programe.
|
||||
|
||||
Posamezni naslov podnaloge v nadaljevanu so sestavljeni iz pričakovanega imena programa in pričakovanega imena izvorne zbirke.
|
||||
|
||||
Na sistem oddajte .zip paket z Makefile skripto in izvornimi zbirkami. Bodite pozorni na poimenovanja. Pred oddajo preverite delovanje z avtomatskim preizkusom.
|
||||
naloga_1 (naloga_1.c)
|
||||
|
||||
Vaš program bo prejel parametre preko ukazne vrstice v obliki:
|
||||
|
||||
$ ./naloga_1 <milisekunde> <sporocilo> <milisekunde> <sporocilo> ...
|
||||
|
||||
Milisekunde so vedno cela števila.
|
||||
|
||||
Za vsak par argumentov milisekunde in sporočilo naj program ustvari novo nit. Nit naj najprej počaka podano število milisekund nato pa izpiše svojo zaporedno število in sporočilo. Glavna nit mora seveda počakati vse ustvarjene niti. Niti bo največ 10.
|
||||
|
||||
Primer zagona in izpisa:
|
||||
|
||||
$ ./naloga_1 300 konec 100 zacetek 200 jedro
|
||||
nit 2: zacetek
|
||||
nit 3: jedro
|
||||
nit 1: konec
|
||||
|
||||
naloga_2 (naloga_2.c)
|
||||
|
||||
Vaš program bo prejel poti do 3 zbirk (pravzaprav bodo to imenovane cevi). Te zbirke odprite samo za branje. Za vsako pot ustvarite svojo nit, ki bo iz podanega vira prebrala 10 znakov dolgo sporočilo. Vsaka nit naj izpiše prebrano sporočilo skupaj s svojim zaporednim številom. Sporočilo naj vrne glavni niti.
|
||||
|
||||
Glavna nit naj po zaključku vseh ustvarjenih niti izpiše vsa tri sporočila kot eno sporočilo.
|
||||
|
||||
Primer zagona in izpisa:
|
||||
|
||||
$ ./naloga_2 ./zbirka_1 ./zbira_2 ./zbirka_3
|
||||
nit 3: ih_______
|
||||
nit 1: sporocilo_
|
||||
nit 2: v_treh_kos
|
||||
|
||||
glavna nit: sporocilo_v_treh_kosih_______
|
||||
|
||||
naloga_3 (naloga_3.c)
|
||||
|
||||
Implementiranje program, ki pospeši seštevanje vrednosti s pomočjo niti. Kot parametri ukazne vrstice bo programu podano število vrednosti, pot do zbirke s podatki in število niti, ki jih želimo uporabiti za seštevanje.
|
||||
|
||||
Za odpiranje uporabite funkcijo fopen, ali pa kombinacijo open in fdopen. Nato lahko podatke preberete s funkcijo fscanf, po vzoru:
|
||||
|
||||
int val;
|
||||
fscanf(in_file_obj, "%d", &val);
|
||||
|
||||
ki prebere eno vrednost in jo hrani v spremenljivko val. V zbirki bo vsaj toliko vrednosti, kot jih potrebujete, morda več. Vrednosti preberete v dovolj veliko tabelo.
|
||||
|
||||
Nato naj glavna nit ustvari podano število niti, vsaka nit pa naj sešteje svoj del tabele. Glavna nit mora ustvariti vse niti preden začne čakati na njihove rezultate.
|
||||
|
||||
Problem seštevanja rešite s prepletanjem. Za N niti, prva nit sešteva vrednost 0, N, 2*N, ... druga nit 1, N+1, 2*N+1, ... in tako dalje (vsaka nit začne na svojem mestu tabele, nato pa skačejo po N mest).
|
||||
|
||||
Vsaka nit naj izpiše svoj delni seštevek, glavna nit pa naj nato rezultate posameznih niti sešteje in izpiše celotno vsoto.
|
||||
|
||||
Primer zagona in izpisa (prebere 11 števil iz zbirke podatki.txt in jih sešteje s 3-mi nitmi):
|
||||
|
||||
$ ./naloga_3 11 ./podatki.txt 3
|
||||
nit 1: 7
|
||||
nit 3: 5
|
||||
nit 2: 0
|
||||
vsota: 12
|
||||
|
||||
Vsebina testne zbirke podatki.txt:
|
||||
|
||||
1 -3 7 0 2 -1 4 5 -1 2 -4 1 -3 5 12 8
|
47
semester_2/uvod_v_operacijske_sisteme/naloga_05/naloga_1.c
Normal file
47
semester_2/uvod_v_operacijske_sisteme/naloga_05/naloga_1.c
Normal file
@@ -0,0 +1,47 @@
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <stdbool.h>
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
|
||||
struct thread_args{
|
||||
int post, num;
|
||||
char* mesg;
|
||||
};
|
||||
|
||||
typedef struct thread_args thread_args;
|
||||
|
||||
void* thread_main(void* args)
|
||||
{
|
||||
thread_args *object_argument = (thread_args*)args;
|
||||
|
||||
usleep(object_argument[0].num*1000);
|
||||
printf("nit %d: %s\n", object_argument[0].post, object_argument[0].mesg);
|
||||
return args;
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int post = 0, value;
|
||||
thread_args args[(argc-1)/2];
|
||||
pthread_t tid[(argc-1)/2];
|
||||
|
||||
for(int i = 1; i < argc; i++)
|
||||
if(i%2 == 1)
|
||||
{
|
||||
args[post].post = post + 1;
|
||||
args[post].num = atoi (argv[i]);
|
||||
args[post].mesg = argv[i+1];
|
||||
value = pthread_create(&tid[post], NULL, thread_main, &args[post]);
|
||||
post++;
|
||||
}
|
||||
|
||||
for(int i = 0; i < post; i++)
|
||||
pthread_join(tid[i], NULL);
|
||||
|
||||
return 0;
|
||||
}
|
54
semester_2/uvod_v_operacijske_sisteme/naloga_05/naloga_2.c
Normal file
54
semester_2/uvod_v_operacijske_sisteme/naloga_05/naloga_2.c
Normal file
@@ -0,0 +1,54 @@
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <stdbool.h>
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
|
||||
struct thread_args{
|
||||
char *sporocilo;
|
||||
char mes[5];
|
||||
int pozicija;
|
||||
};
|
||||
|
||||
typedef struct thread_args thread_args;
|
||||
|
||||
void *thread_main(void *argument){
|
||||
char buffer[10];
|
||||
thread_args *object_argument = (thread_args*) argument;
|
||||
int file = open(object_argument[0].sporocilo, O_RDONLY, 0);
|
||||
read(file, buffer, sizeof(buffer));
|
||||
printf("nit %d: %s\n", object_argument[0].pozicija, buffer);
|
||||
for(int i = 0; i<10; i++){
|
||||
object_argument[0].mes[i] = buffer[i];
|
||||
}
|
||||
return argument;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv){
|
||||
int pozicija = 0;
|
||||
thread_args arg[3];
|
||||
pthread_t tid[3];
|
||||
|
||||
for(int i = 0; i<3; i++){
|
||||
arg[i].pozicija = pozicija +1;
|
||||
arg[i].sporocilo = argv[i+1];
|
||||
pthread_create(&tid[i], NULL, thread_main, &arg[i]);
|
||||
pozicija += 1;
|
||||
}
|
||||
|
||||
for(int i = 0; i<3; i++){
|
||||
pthread_join(tid[i], NULL);
|
||||
}
|
||||
|
||||
printf("\nglavna nit: ");
|
||||
for(int i = 0; i<3; i++){
|
||||
printf("%s", arg[i].mes);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user