From fbcc758f4358561ab3768c4c6552ab7a4f694249 Mon Sep 17 00:00:00 2001 From: sherlock Date: Thu, 3 Apr 2025 19:02:05 +0530 Subject: [PATCH] added optimised OS codes --- OS/C/Week7/q2 | Bin 0 -> 34448 bytes OS/C/Week7/q2.c | 84 ++++++++++++++++++++++-------------------------- 2 files changed, 39 insertions(+), 45 deletions(-) create mode 100755 OS/C/Week7/q2 diff --git a/OS/C/Week7/q2 b/OS/C/Week7/q2 new file mode 100755 index 0000000000000000000000000000000000000000..7d6f5c42f5be08fcfe991c0a9c200e1f470808c0 GIT binary patch literal 34448 zcmeI5e{5S<701u>kHt=ZBn@TV3L{nvBg;w(8FZzjsoOMb3Z*S=(V|Uoo7hfc65FYN zC<(2EE3aax!1APMOlZ?OiHW4$MwuclmV%UlK%H1&*&iTas!9>yuG%yKlajI!zURJY z``K+*2_*jET;=$lbAOz7?&sc@|L%FezV_C?mJ=C-;(|0lraeR_DFBV=PDmF-sr}n` zbw1R2U>~=A4`{rPNvV5o~yp;S5`^Y*+iRyL83-@B~Duo!bv>R~`HI z9<+8NXdeR9x>VJSlZE%H9-`Edgku|S>Mx72x&*EHwneu=sVf?&E8}u>WUJzGbg}A; zi*4{v#A1m!>s+jLTDtztTK@Jpn(U*ZTl86U^p(&5p51%D(7AJW@$Al4#g(-tjq$=z z*pJiKr-`!6jZfbQI_|UWkrPDyXy!e;15$vk>l|u~TZXp%5NGkhVA1}Z9S*%8^BWy@ zQC$fo0O9kxF_TJe9E|pE437?mVRQKqgrDEqvhN?Sv~Qa|+hRsvj&`-RqAdVHNGRAj zSDn^1|C)zA&1iMT(}eZ0pUrJNzFhdZn<3n1ozq=-y^V4#i09yFDjkWn>}Ww;(Ozrr z-Kg0Ar4!cL@3C#>#pN!De*Q_KF)K*jE=C3d|h#1~NeW@o#=UuN0q+c=g&1%1`Qb_|N!nwg%r;^C`^ZHO!#qHB6x{ za11$S@10!iFianqg5v_%FHB$`d>CJFQ+{a~<%{eM%D(ELU=5-Y}Ne zTFm`7i{*}Xv%`)BSBh^Pi_HahsP!4;bx(i+jYj8r?Vr7YkH6hyJx(75#9s7)vw2+{ z?4!7c>vg==yRiZKB)@Ntz4saZtIWLLW{!)U;{?`=$2uo*Ud&my`VH=Ao~w5S7s%CU z>9r1hr9*FU=(jucwGRCw4t$=%bxf_QUXO%t-;o_|M4lUnt529w_`{`VQ`nUYU_jH%TOTG4_+lyD~Vbo{YKiBM! zYaY+FHK;zzcktP^t~b|bYit|)uiO20U2E5TZ<)vQeP6Cu*frljX4}5|oz zc)Aa@l}@+nPi42u!8H$kq!}&Rn4_DbZMit{3q;r0@%KmPZ{cM$;ud**x*?+3C->I^% zRoNaZn9}-?cc>yh&Xd8pF*q*<=fvQA7@P}(^I-6mm)=IZ>HR7<{_E*t9BrjT&-{JoA71y(4DIN8`GNDPw>SLg z;tOx&cHj1H-;bLfJDz*?`ENY;Vt3*fSNdi>znz;KaP8~%E*+mb{`Hf;|H-MYZ*BPD zt@<-NF5Vyi_+Ku6`SVRLJfBZ*Zv1)k!FJEy3qR=k{@KpM2i|_J>(${kr+&Kr_#2OZ z@7^yC{4>?~lKJ4K4fT5$-#d1$x2^3~{{P$lWv5@PAD{W=h1_@EUBB(Gb61 #include -#define NUM_READERS 3 -#define NUM_WRITERS 2 +#define NR 3 // NUM_READERS +#define NW 2 // NUM_WRITERS // shared data structure - simple integer -int shared_data = 0; +int sd = 0; // shared_data // sync variables -pthread_mutex_t mutex; // mutex for read_count protection -sem_t wrt; // semaphore for writer access control -int read_count = 0; // tracks active readers +pthread_mutex_t m; // mutex for rc protection +sem_t w; // semaphore for writer access control +int rc = 0; // read_count: tracks active readers -void* reader(void* arg) { +void* r(void* arg) { // reader int id = *((int*)arg); while (1) { // read delay sim sleep(1); // critical section entry - pthread_mutex_lock(&mutex); - read_count++; - if (read_count == 1) { + pthread_mutex_lock(&m); + rc++; + if (rc == 1) { // first reader blocks writers - sem_wait(&wrt); + sem_wait(&w); } - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&m); // critical section - printf("Reader %d is reading shared_data = %d\n", id, shared_data); + printf("Reader %d is reading sd = %d\n", id, sd); sleep(2); // read time sim // critical section exit - pthread_mutex_lock(&mutex); - read_count--; - if (read_count == 0) { + pthread_mutex_lock(&m); + rc--; + if (rc == 0) { // last reader unblocks writers - sem_post(&wrt); + sem_post(&w); } - pthread_mutex_unlock(&mutex); + pthread_mutex_unlock(&m); } pthread_exit(NULL); } -void* writer(void* arg) { +void* w_func(void* arg) { // writer int id = *((int*)arg); while (1) { // write delay sim sleep(3); // critical section entry - sem_wait(&wrt); // exclusive access control + sem_wait(&w); // exclusive access control // critical section - shared_data += 1; - printf("Writer %d is writing: shared_data becomes %d\n", id, shared_data); + sd++; // shared_data modification + printf("Writer %d is writing: sd becomes %d\n", id, sd); sleep(2); // write time sim // critical section exit - sem_post(&wrt); + sem_post(&w); } pthread_exit(NULL); } int main(void) { - pthread_t readers[NUM_READERS], writers[NUM_WRITERS]; - int reader_ids[NUM_READERS], writer_ids[NUM_WRITERS]; + pthread_t rts[NR], wts[NW]; // reader/writer threads + int rids[NR], wids[NW]; // reader/writer ids int i; // sync init - pthread_mutex_init(&mutex, NULL); - sem_init(&wrt, 0, 1); // binary semaphore init + pthread_mutex_init(&m, NULL); + sem_init(&w, 0, 1); // binary semaphore init // reader thread creation - for (i = 0; i < NUM_READERS; i++) { - reader_ids[i] = i + 1; - if (pthread_create(&readers[i], NULL, reader, &reader_ids[i]) != 0) { - perror("Failed to create reader thread"); - exit(EXIT_FAILURE); - } + for (i = 0; i < NR; i++) { + rids[i] = i + 1; + pthread_create(&rts[i], NULL, r, &rids[i]); } // writer thread creation - for (i = 0; i < NUM_WRITERS; i++) { - writer_ids[i] = i + 1; - if (pthread_create(&writers[i], NULL, writer, &writer_ids[i]) != 0) { - perror("Failed to create writer thread"); - exit(EXIT_FAILURE); - } + for (i = 0; i < NW; i++) { + wids[i] = i + 1; + pthread_create(&wts[i], NULL, w_func, &wids[i]); } // thread joining - for (i = 0; i < NUM_READERS; i++) { - pthread_join(readers[i], NULL); + for (i = 0; i < NR; i++) { + pthread_join(rts[i], NULL); } - for (i = 0; i < NUM_WRITERS; i++) { - pthread_join(writers[i], NULL); + for (i = 0; i < NW; i++) { + pthread_join(wts[i], NULL); } // cleanup - pthread_mutex_destroy(&mutex); - sem_destroy(&wrt); + pthread_mutex_destroy(&m); + sem_destroy(&w); return 0; }