You are on page 1of 5

‫מערכות הפעלה ‪ 10010‬סמסטר ב' – תשפ"ג‬

‫תרגיל בית מס' ‪3‬‬


‫נושא התרגיל‪ :‬עימוד וסינכרון‬

‫תרגיל ‪) 30 ( 1‬‬

‫במערכת המאפשרת ‪ , on-demand-paging‬גודל כל פקודה הוא ‪ 4‬בתים בדיוק‪ ,‬וגודל כל עמוד הוא ‪4096‬‬
‫בתים‪ .‬כמה לכל היותר ‪ PAGE FAULTS‬יקרו בתכנית הבאה‪ ,‬ברגע בו ה‪ PC -‬קפץ מכתובת ‪ 6144‬אל כתובת‬
‫‪ ,10240‬וכמה לכל הפחות‪.‬‬

‫‪Decimal‬‬

‫‪Address:‬‬ ‫‪Content‬‬

‫‪...‬‬

‫‪6144:‬‬ ‫‪jmp pc+4092 // jump PC-relative‬‬

‫‪...‬‬

‫‪...‬‬

‫‪10240:‬‬ ‫‪mov R2, R1 // move the contents of register R1 to R2‬‬

‫‪...‬‬
‫תרגיל ‪) 30 ( 2‬‬

‫בהינתן כי הכתובת של הטבלא החיצונית היא ‪ ,737D1000‬מצא את מיקום העמוד הפיזי מהכתובת‬
‫הוירטואלית הבאה ‪ 400BA90D :‬‬

‫הראה את התהליך‪.‬‬

‫תרגיל ‪) 40 ( 3‬‬

‫קראו את התכנית הבאה‪ .‬וענה על השאלות הבאות‪:‬‬

‫אם ‪ threads‬הוא ‪ , 0‬האם התכנית תסיים ?‬ ‫‪.1‬‬


‫אם ‪ threads‬הוא ‪ , 2‬האם התכנית תסיים ?‬ ‫‪.2‬‬
‫אם ‪ threads‬הוא ‪ , 1‬האם התכנית תסיים ?‬ ‫‪.3‬‬
‫אם ‪ threads‬גדול מ ‪ ,3‬האם התכנית תסיים ?‬ ‫‪.4‬‬
‫עבור ‪, threads > 2‬מה מבין הקביעות הבאות נכונות‪:‬‬ ‫‪.5‬‬
‫מניעה הדדית ללא התקדמות‬ ‫‪.a‬‬
‫התקדמות ללא מניעה הדדית‬ .b
‫אין מניעה הדדית ואין התקדמות‬ .c
‫מניעה הדדית והתקדמות‬ .d

‫ תפקיד מחסום זיכרון הוא‬. ) memory barrier ( ‫ הוא מחסום זיכרון‬sync_synchronize :‫הערה‬
‫ יהיה זהה בכל המעבדים בעת‬x ‫הערך של‬,‫ למשל‬.‫ של מעבדים‬CACHE ‫למנוע מצב של אי אחידות‬
.‫ אין קשר לתרגיל‬.‫הפעלת מחסום הזיכרון‬

#define _GNU_SOURCE 1

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

int S1 = 0;
int S2 = 0;
int x = 0;
int run = 1;

void Producer(void) {
while(run) {
while (S1 == S2);
x++;
__sync_synchronize();
S1 = S2;
__sync_synchronize();
}
}

void Consumer(void) {
while(run) {
while (S1 != S2);
x--;
__sync_synchronize();
S1 = !S2;
__sync_synchronize();
}
}

void* Worker(void *func) {


long func_id = (long)func & 0x1;

switch (func_id) {
case 0:
Producer();
break;
case 1:
Consumer();
break;
}
return NULL;
}

int main(int argc, char *argv[]) {

Int threads;
int i;

threads = argc > 1 ? atoi(argv[1]) : 1;


pthread_t t[threads];

for (i = 0;i < threads; i++){


if (pthread_create(&t[i], NULL , Worker, (void *) (long)i) ) {
perror("pthread create 1 error\n");
}
}

do {
sleep(1);
} while(x < 0);

run = 0;
void *val;

// Force an exit
sleep(1);
S1 = S2 = 0;
sleep(1);
S2 = !S2;

for(i = 0; i < threads; i++)


pthread_join(t[i], &val);

printf("x=%d\n", x);
}

You might also like