Advertisement
amarek

OS LV6

Nov 29th, 2019
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.00 KB | None | 0 0
  1. 1. Koristeći POSIX Threads biblioteku kreirajte program koji kreira i pokreće 3 neovisne niti: jednu nit za ispis najvećeg elementa polja, drugu za ispis najmanjeg elementa polja i treću za ispis cijelog polja. Polje inicijalizirajte kao globalnu varijablu.
  2.  
  3. Naredba za kreiranje direktorija: mkdir LV6
  4. Naredba za pozicioniranje unutar tog direktorija: cd LV6/
  5. Naredba za kreiranje datoteke: touch zad1.c
  6. Naredba za pokretanje uređivača teksta: nano zad1.c
  7. Naredba za izlistanje sadržaja datoteke: cat zad1.c
  8. Kod:
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <pthread.h>
  13.  
  14. void* print_message_function(void* ptr);
  15.  
  16. int polje[] = { 5, -7, 3, 1, 9, 6, 3, 8, 2, 5, 3, -2 };
  17.  
  18. void* najmanji_element(){
  19. int i;
  20. int n = sizeof(polje) / sizeof(polje[0]);
  21. int najmanj_element = polje[0];
  22. for (i = 1; i < n; i++){
  23. if (polje[i] < najmanji_element){
  24. najmanji_element = polje[i];
  25. }
  26. }
  27. printf("Najmanji element je: %d\n", najmanji_element);
  28. }
  29.  
  30. void* najveci_element(){
  31. int i;
  32. int n = sizeof(polje) / sizeof(polje[0]);
  33. int najveci_element = polje[0];
  34. for (i = 1; i < n; i++){
  35. if (polje[i] > najveci_element){
  36. najveci_element = polje[i];
  37. }
  38. }
  39. printf("Najveci element je: %d\n", najveci_element);
  40. }
  41.  
  42. void* cijelo_polje(){
  43. int i;
  44. int n = sizeof(polje) / sizeof(polje[0]);
  45. for (i = 0; i < n; i++){
  46. printf("%d ", polje[i]);
  47. }
  48. printf("\n");
  49. }
  50.  
  51. main() {
  52. pthread_t thread1, thread2, thread3;
  53. int iret1, iret2, iret3;
  54. iret1 = pthread_create(&thread1, NULL, najmanji_element, NULL);
  55. iret2 = pthread_create(&thread2, NULL, najveci_element, NULL);
  56. iret3 = pthread_create(&thread3, NULL, cijelo_polje, NULL);
  57. pthread_join(thread1, NULL);
  58. pthread_join(thread2, NULL);
  59. pthread_join(thread3, NULL);
  60. exit(0);
  61. }
  62. //////////////////////////////////////////////////////////////////////////////////////////////////
  63. Naredba za prevođenje datoteke: gcc zad1.c -pthread -o zad1
  64. Naredba za pokretanje datoteke: ./zad1
  65. Izlaz:
  66.  
  67. Najmanji element je: -7
  68. Najveci element je: 9
  69. 5 -7 3 1 9 6 3 8 2 5 3 -2
  70.  
  71.  
  72. 2. Na dnu je dan primjer višenitnog programa implementiranog u programskom jeziku C, u kojem jedna nit izvodi funkciju firstFunction, a druga nit funkciju secondFunction. Prva funkcija povećava vrijednost varijable1, a smanjuje vrijednost varijable2, dok druga nit radi obrnuto. Ukoliko vrijednost varijable1 postane veća od vrijednosti varijable2, može se izvoditi samo druga nit. Također, ako vrijednost varijable2 postane veća od vrijednosti varijable1, može se izvoditi samo prva nit. Vaš zadatak je dovršiti programski kod tako da omogućite sinkronizaciju među nitima koristeći mutekse i uvjetne varijable iz biblioteke pthreads. Kopirajte programski kod i objasnite svoje rješenje. Kod kompajliranja dodajte opciju -lm zbog matematičke biblioteke.
  73.  
  74. Naredba za kreiranje datoteke: touch zad2.c
  75. Naredba za pokretanje uređivača teksta: nano zad2.c
  76. Naredba za izlistanje sadržaja datoteke: cat zad2.c
  77. Kod:
  78.  
  79. #include <stdio.h>
  80. #include <pthread.h>
  81. #include <math.h>
  82. #include <stdlib.h>
  83.  
  84.  
  85. float variable1 = 10;
  86. float variable2 = 9;
  87. pthread_mutex_t lock;
  88. pthread_cond_t cond1, cond2;
  89.  
  90. void* firstFunction() {
  91. while (1) {
  92. pthread_mutex_lock(&lock);
  93. while (variable2 < variable1)
  94. {
  95. pthread_cond_wait(&cond1, &lock);
  96. }
  97. while (variable2 >= variable1)
  98. {
  99. variable1 = 3 * variable1 * variable1 + 4 * variable1 - 3;
  100. variable2 = sqrt(abs(variable2)) - 4;
  101. printf("Thread1: %.2f %.2f\n", variable1, variable2);
  102. }
  103. pthread_cond_signal(&cond2);
  104. pthread_mutex_unlock(&lock);
  105. }
  106. pthread_exit(0);
  107. }
  108. void* secondFunction() {
  109. while (1) {
  110. pthread_mutex_lock(&lock);
  111. while (variable1 < variable2)
  112. {
  113. pthread_cond_wait(&cond2, &lock);
  114. }
  115. while (variable1 >= variable2)
  116. {
  117. variable1 = sqrt(abs(variable1)) - 4;
  118. variable2 = 3 * variable2 * variable2 + 4 * variable2 - 3;
  119. printf("Thread2: %.2f %.2f\n", variable1, variable2);
  120. }
  121. pthread_cond_signal(&cond1);
  122. pthread_mutex_unlock(&lock);
  123. }
  124. pthread_exit(0);
  125. }
  126. int main(void) {
  127. pthread_t thread1, thread2;
  128. pthread_mutex_init(&lock, NULL);
  129. pthread_cond_init(&cond1, NULL);
  130. pthread_cond_init(&cond2, NULL);
  131. pthread_create(&thread1, NULL, firstFunction, NULL);
  132. pthread_create(&thread2, NULL, secondFunction, NULL);
  133. pthread_join(thread1, NULL);
  134. pthread_join(thread2, NULL);
  135. pthread_mutex_destroy(&lock);
  136. pthread_cond_destroy(&cond1);
  137. pthread_cond_destroy(&cond2);
  138. return 0;
  139. }
  140.  
  141. ///////////////////////////////////////////////////////////////////////////////////////
  142. Naredba za prevođenje datoteke: gcc zad2.c -lm -pthread -o zad2
  143. Naredba za pokretanje datoteke: ./zad2
  144. Izlaz:
  145.  
  146. Thread1: 1.00 1.83
  147. Thread1: 4.00 -3.00
  148. Thread2: -2.00 12.00
  149. Thread1: 1.00 -0.54
  150. Thread2: -3.00 -4.28
  151. Thread2: -2.27 34.88
  152. Thread1: 3.36 1.83
  153. Thread2: -2.27 14.38
  154. Thread1: 3.36 -0.26
  155. Thread2: -2.27 -3.83
  156. Thread2: -2.59 25.75
  157. Thread1: 6.72 1.00
  158. Thread2: -1.55 4.00
  159. Thread1: -1.99 -2.00
  160. Thread2: -3.00 1.00
  161. Thread1: 12.00 -3.00
  162. Thread2: -0.54 12.00
  163. Thread1: -4.28 -0.54
  164. Thread1: 34.88 -4.00
  165. Thread2: 1.83 29.00
  166. Thread1: 14.38 1.39
  167. Thread2: -0.26 8.30
  168.  
  169. /////////////////////////////////////////////////////////////////////////////////////////////////
  170.  
  171.  
  172. 3. Zadan je sustav sa 4 resursa čiji je broj instanci definiran vektorom E = [6 5 8 7]. Pretpostavimo da je u memoriji u nekom trenutku 4 procesa (A, B, C, D) sa sljedećom tablicom alociranih resursa C te tablicom potrebnih resursa R.
  173.  
  174. 𝐂 = (𝐷𝐵𝐴 𝐶 1 2 2 0 1 0 3 0 1 1 4 2 1 3 1 0) 𝐑 = (𝐷𝐵𝐴 𝐶 1 2 3 2 0 1 2 2 0 1 3 2 2 2 5 2)
  175.  
  176. Naredba za kreiranje datoteke: touch zad3.c
  177. Naredba za pokretanje uređivača teksta: nano zad3.c
  178. Naredba za izlistanje sadržaja datoteke: cat zad3.c
  179. Kod:
  180.  
  181. #include<stdio.h>
  182.  
  183. int main(){
  184. int i,j;
  185. int E[4] = { 6, 5, 8, 7 };
  186. int C[4][4] =
  187. {
  188. {1, 1, 1, 1},
  189. {2, 0, 1, 3},
  190. {2, 3, 4, 1},
  191. {0, 0, 2, 0}
  192. };
  193. int R[4][4] =
  194. {
  195. { 1, 0, 0, 2 },
  196. { 2, 1, 1, 2 },
  197. { 3, 2, 3, 5 },
  198. { 2, 2, 2, 2 }
  199. };
  200.  
  201. int A[4] = { 0 };
  202. for (i = 0; i < 4; i++){
  203. int zbroj = 0;
  204. for (j = 0; j < 4; j++){
  205. zbroj += C[j][i];
  206. }
  207. A[i] = E[i] - zbroj;
  208. }
  209. int n = 0;
  210. int broken[4] = { -1, -1, -1, -1 };
  211.  
  212. for (i = 0; i < 4; i++){
  213. for (j = 0; j < 4; j++){
  214. if (i == broken[j]){
  215. i++;
  216. j = -1;
  217. }
  218. }
  219. int manji = 0;
  220. for (j = 0; j < 4; j++){
  221. if (R[i][j] > A[j]){
  222. manji = 1;
  223. break;
  224. }
  225. }
  226. if (manji == 0){
  227. for (j = 0; j < 4; j++){
  228. A[j] += C[i][j];
  229. }
  230. broken[n] = i;
  231. i = -1;
  232. n++;
  233. if (n == 4){
  234. break;
  235. }
  236. }
  237. }
  238. if (n == 4){
  239. printf("Sustav je rjesiv!");
  240. }
  241. else{
  242. printf("Sustav nije rjesiv!");
  243. }
  244. printf("\n");
  245. }
  246. //////////////////////////////////////////////////////////////////////////////////////////////////
  247. Naredba za prevođenje datoteke: gcc zad3.c -lm -pthread -o zad3
  248. Naredba za pokretanje datoteke: ./zad3
  249. Izlaz:
  250.  
  251. Sustav je rjesiv!
  252.  
  253. //////////////////////////////////////////////////////////////////////////////////////////////////
  254.  
  255. Prvo računamo ukupnu zauzetost svakog resursa po svim procesima, zbrajajući retke matrice C:
  256.  
  257. 𝐴 1 1 1 1
  258. 𝐵 2 0 1 3
  259. 𝐶 2 3 4 1
  260. 𝐷 0 0 2 0 +
  261. ------------
  262. 5 4 8 5
  263.  
  264. Zatim oduzimamo od broj instanci resursa ukupnu zauzetost svakog resursa:
  265.  
  266. E = (6 5 8 7)
  267. - (5 4 8 5)
  268. ________________
  269. A = (1 1 0 2)
  270.  
  271. Nadalje, redom se dodjeljuju resursi onim procesima čiji je zahtjeve moguće ispuniti. Promatramo redak u matrici
  272. R koji ima sve elemente manje ili jednake vektoru A. Po pronalasku takvog reda, uzimamo ekvivalentni red iz
  273. matrice C i nadodajemo vektoru A. Ukoliko nije moguće naći odgovarajući red u matrici R kojemu su elementi
  274. manji ili jednaki od elemenata vektora A, zaustavljamo algoritam i pišemo da je došlo do zastoja!
  275.  
  276. (1 1 0 2)
  277. + (1 1 1 1) Gledamo 1. redak matrice R, a dodajemo 1. redak matrice C
  278. _______________
  279. (2 2 1 3)
  280. + (2 0 1 3) Gledamo 2. redak matrice R, a dodajemo 2. redak matrice C
  281. _______________
  282. (4 2 2 6)
  283. + (0 0 2 0) Gledamo 4. redak matrice R, a dodajemo 4. redak matrice C
  284. _______________
  285. (4 2 4 6)
  286. + (2 3 4 1) Gledamo 3. redak matrice R, a dodajemo 3. redak matrice C
  287. _______________
  288. (6 5 8 7)
  289.  
  290.  
  291. Dobiveni rezultat je jednak početnom vektoru E, što znači da je sustav rješiv i neće doći do zastoja.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement