From 119f0e7b3a222d5e687afd0235cd23e83607abd3 Mon Sep 17 00:00:00 2001 From: ChoChoX Date: Sat, 16 May 2026 12:08:49 +0800 Subject: [PATCH] aiwork --- AI-work/2024414290124-吕锦中-lab6.tar.gz | Bin 0 -> 10050 bytes AI-work/matmult | Bin 0 -> 16968 bytes AI-work/matmult.c | 151 +++++++++ AI-work/task61 | Bin 0 -> 16424 bytes AI-work/task61.c | 50 +++ AI-work/task62 | Bin 0 -> 16608 bytes AI-work/task62.c | 46 +++ AI-work/task63 | Bin 0 -> 17008 bytes AI-work/task63.c | 172 +++++++++++ AI-work/task64 | Bin 0 -> 16712 bytes AI-work/task64.c | 80 +++++ AI-work/task66 | Bin 0 -> 16400 bytes AI-work/task66.c | 62 ++++ AI-work/task67 | Bin 0 -> 17456 bytes AI-work/task67.c | 178 +++++++++++ AI-work/实验报告_Linux多线程编程.txt | 375 +++++++++++++++++++++++ 16 files changed, 1114 insertions(+) create mode 100644 AI-work/2024414290124-吕锦中-lab6.tar.gz create mode 100755 AI-work/matmult create mode 100644 AI-work/matmult.c create mode 100755 AI-work/task61 create mode 100644 AI-work/task61.c create mode 100755 AI-work/task62 create mode 100644 AI-work/task62.c create mode 100755 AI-work/task63 create mode 100644 AI-work/task63.c create mode 100755 AI-work/task64 create mode 100644 AI-work/task64.c create mode 100755 AI-work/task66 create mode 100644 AI-work/task66.c create mode 100755 AI-work/task67 create mode 100644 AI-work/task67.c create mode 100644 AI-work/实验报告_Linux多线程编程.txt diff --git a/AI-work/2024414290124-吕锦中-lab6.tar.gz b/AI-work/2024414290124-吕锦中-lab6.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..188cd76dd26f273b9cce3679f6dc27a0911bfa90 GIT binary patch literal 10050 zcmV-IC%xDoiwFP!000001MEF(a}!6l`MUZQ9X7ZmBinje-s@MbG2Sdy#8BYe-Fpe8 z8l({(ERD39kuiIhDkp(pgLx#FKnMxTZV2RIJDW`iws}@_pXlYHj_4Dt7S{aFl+3mPeIZ=*;{wGA>%9ko6 ztm!7vNFRyyz(+6XgpWOYB7{NURjvR?KD_IV(?nN_D$xvbVEm+}|8caWpLk2(73r}- z5tmU=)p7(%0MwSr4Z#1g4gJeBy5SUi#1_EjZcd{sD6#v~@d;MXutAQ3MXJy@+&aK&^9 zyNz8@lBM7+W@O8kidc(^riaDK42sqvmyhOK0ap``5;Fn+lJ1@?{56qi=*N*!BJ`Wx zN1A{qJm877!IK{Fqz&$ZKUsn`nZZ-DzTkOSU((gbc@{&4y=>#Ob8Y!$qW@34RR14O zccmr&pQir5Gr8mcx8r(l#~v6a7-~@|kCrMbclZUx)CwvofMaHVvZbnSf`dc<5ptS! z4H}J}5R3<7TdbPuM33-D+(zZAdX_sS@JTM02U#U*ulA9IOjw>fM&PwtsYJ=HHx1>4 z+6}Ie^s=?|Llh7t6kY6?L^!7;E>p)w05=q~R49b$p!hN2FK}I&ZZjcDVo?(JIuqga z)^m80d^YIwf=0Zs9}CGr#n41q&6;Ws*j6ayqU80G$-Yw7B}gl0OjJmlBS)zS)kMMA zfI;Ef(BZ=e4|kKpN>&9ldQLO7l1_4}NvD3*iPg>!wP2_L7zRra`(({m$#4k*8W~Ny zG}@6>PBqL*>9ku7H`hT^`=5NN_P;CDm6Ys%7qkC6`QNr&TVVhF*<SS^t50TB@30l%0D`w{Knk!)Y)ICDR1~ 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 Ykb)GXAO$H%LAts0Kb;O(H~`210Ehgh$p8QV literal 0 HcmV?d00001 diff --git a/AI-work/matmult b/AI-work/matmult new file mode 100755 index 0000000000000000000000000000000000000000..88b4bb3170399d6fc1cb393df225c4cc43f418e6 GIT binary patch literal 16968 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 cZcIoKi;&ATq_ifO+P +#include +#include +#include + +#define MAX_THREADS 64 + +int N; +double **A, **B, **C_parallel, **C_serial; +int nthreads; +int rows_per_thread; + +double **allocate_matrix(int n) +{ + double **mat = (double **)malloc(n * sizeof(double *)); + for (int i = 0; i < n; i++) { + mat[i] = (double *)malloc(n * sizeof(double)); + } + return mat; +} + +void free_matrix(double **mat, int n) +{ + for (int i = 0; i < n; i++) free(mat[i]); + free(mat); +} + +void init_matrix(double **mat, int n) +{ + for (int i = 0; i < n; i++) + for (int j = 0; j < n; j++) + mat[i][j] = (double)(rand() % 100) / 10.0; +} + +void *multiply_thread(void *arg) +{ + int start_row = *(int *)arg; + int end_row = start_row + rows_per_thread; + if (end_row > N) end_row = N; + + for (int i = start_row; i < end_row; i++) { + for (int j = 0; j < N; j++) { + double sum = 0.0; + for (int k = 0; k < N; k++) { + sum += A[i][k] * B[k][j]; + } + C_parallel[i][j] = sum; + } + } + return NULL; +} + +void serial_multiply() +{ + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + double sum = 0.0; + for (int k = 0; k < N; k++) { + sum += A[i][k] * B[k][j]; + } + C_serial[i][j] = sum; + } + } +} + +double get_time() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; +} + +int verify() +{ + for (int i = 0; i < N; i++) { + for (int j = 0; j < N; j++) { + if (C_parallel[i][j] - C_serial[i][j] > 0.001 || + C_serial[i][j] - C_parallel[i][j] > 0.001) { + printf("Mismatch at [%d][%d]: parallel=%.6f, serial=%.6f\n", + i, j, C_parallel[i][j], C_serial[i][j]); + return 0; + } + } + } + return 1; +} + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + N = atoi(argv[1]); + nthreads = atoi(argv[2]); + if (nthreads > MAX_THREADS) nthreads = MAX_THREADS; + if (nthreads > N) nthreads = N; + + rows_per_thread = N / nthreads; + + srand(42); + + A = allocate_matrix(N); + B = allocate_matrix(N); + C_parallel = allocate_matrix(N); + C_serial = allocate_matrix(N); + + init_matrix(A, N); + init_matrix(B, N); + + pthread_t threads[MAX_THREADS]; + int starts[MAX_THREADS]; + + double t_start = get_time(); + + for (int i = 0; i < nthreads; i++) { + starts[i] = i * rows_per_thread; + pthread_create(&threads[i], NULL, multiply_thread, &starts[i]); + } + for (int i = 0; i < nthreads; i++) { + pthread_join(threads[i], NULL); + } + + double t_end = get_time(); + double t_parallel = t_end - t_start; + + t_start = get_time(); + serial_multiply(); + t_end = get_time(); + double t_serial = t_end - t_start; + + printf("Matrix size: %d x %d, Threads: %d\n", N, N, nthreads); + printf("Parallel time: %.6f s\n", t_parallel); + printf("Serial time: %.6f s\n", t_serial); + printf("Speedup: %.4f\n", t_serial / t_parallel); + printf("Efficiency: %.4f\n", t_serial / t_parallel / nthreads); + + if (verify()) { + printf("Verification: SUCCESS\n"); + } else { + printf("Verification: FAILED\n"); + } + + free_matrix(A, N); + free_matrix(B, N); + free_matrix(C_parallel, N); + free_matrix(C_serial, N); + + return 0; +} diff --git a/AI-work/task61 b/AI-work/task61 new file mode 100755 index 0000000000000000000000000000000000000000..e2a089e9abe7434d1573e5ba2c0ccc9fab4f8d7a GIT binary patch literal 16424 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 v)ZteGhU;>!4?q8K|IBrVq(hH4+sTts=3Fit; +#include +#include +#include +#include + +void *workerT1(void *vargp) +{ + for (int i = 0; i < 5; i++) { + printf("My name is Lvjinzhong\n"); + int sleep_time = rand() % 5 + 1; + sleep(sleep_time); + } + return NULL; +} + +void *workerT2(void *vargp) +{ + for (int i = 0; i < 5; i++) { + printf("My student number is 2024414290124\n"); + int sleep_time = rand() % 5 + 1; + sleep(sleep_time); + } + return NULL; +} + +void *workerT3(void *vargp) +{ + for (int i = 0; i < 5; i++) { + time_t t = time(NULL); + printf("Current time %s", ctime(&t)); + int sleep_time = rand() % 5 + 1; + sleep(sleep_time); + } + return NULL; +} + +int main() +{ + srand(time(NULL)); + pthread_t t1, t2, t3; + pthread_create(&t1, NULL, workerT1, NULL); + pthread_create(&t2, NULL, workerT2, NULL); + pthread_create(&t3, NULL, workerT3, NULL); + + pthread_join(t1, NULL); + pthread_join(t2, NULL); + pthread_join(t3, NULL); + return 0; +} diff --git a/AI-work/task62 b/AI-work/task62 new file mode 100755 index 0000000000000000000000000000000000000000..1b46edc3b77eaa875efbe9b1114cc08e816fd21e GIT binary patch literal 16608 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 literal 0 HcmV?d00001 diff --git a/AI-work/task62.c b/AI-work/task62.c new file mode 100644 index 0000000..c569a20 --- /dev/null +++ b/AI-work/task62.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +volatile long long counter = 0; +long long niters; +sem_t mutex; + +void *thread_func(void *arg) +{ + for (long long i = 0; i < niters; i++) { + sem_wait(&mutex); + counter++; + sem_post(&mutex); + } + return NULL; +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + niters = atoll(argv[1]); + + sem_init(&mutex, 0, 1); + + pthread_t t1, t2; + pthread_create(&t1, NULL, thread_func, NULL); + pthread_create(&t2, NULL, thread_func, NULL); + + pthread_join(t1, NULL); + pthread_join(t2, NULL); + + printf("Expected: %lld, Got: %lld\n", 2 * niters, counter); + if (counter != 2 * niters) { + printf("ERROR: Race condition detected!\n"); + } else { + printf("Correct! No race condition.\n"); + } + + sem_destroy(&mutex); + return 0; +} diff --git a/AI-work/task63 b/AI-work/task63 new file mode 100755 index 0000000000000000000000000000000000000000..9315be7bba84ec7e97852065880ea63eda7dec28 GIT binary patch literal 17008 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 Ya|pRyOG>WT@62~J0ssI2 literal 0 HcmV?d00001 diff --git a/AI-work/task63.c b/AI-work/task63.c new file mode 100644 index 0000000..2763de0 --- /dev/null +++ b/AI-work/task63.c @@ -0,0 +1,172 @@ +#include +#include +#include +#include +#include + +#define POISON -1 + +typedef struct { + int *buf; + int n; + int outpos; + int inpos; + sem_t mutex; + sem_t slots; + sem_t items; +} sbuf_t; + +long long produced_sum = 0; +long long consumed_sum = 0; +sem_t sum_mutex; +int total_items; + +void sbuf_init(sbuf_t *sp, int n) +{ + sp->buf = (int *)malloc(n * sizeof(int)); + sp->n = n; + sp->outpos = 0; + sp->inpos = 0; + sem_init(&sp->mutex, 0, 1); + sem_init(&sp->slots, 0, n); + sem_init(&sp->items, 0, 0); +} + +void sbuf_deinit(sbuf_t *sp) +{ + free(sp->buf); + sem_destroy(&sp->mutex); + sem_destroy(&sp->slots); + sem_destroy(&sp->items); +} + +void sbuf_insert(sbuf_t *sp, int item) +{ + sem_wait(&sp->slots); + sem_wait(&sp->mutex); + sp->buf[sp->inpos] = item; + sp->inpos = (sp->inpos + 1) % sp->n; + sem_post(&sp->mutex); + sem_post(&sp->items); +} + +int sbuf_remove(sbuf_t *sp) +{ + sem_wait(&sp->items); + sem_wait(&sp->mutex); + int item = sp->buf[sp->outpos]; + sp->outpos = (sp->outpos + 1) % sp->n; + sem_post(&sp->mutex); + sem_post(&sp->slots); + return item; +} + +typedef struct { + sbuf_t *sp; + int num_items; + int id; +} producer_arg_t; + +typedef struct { + sbuf_t *sp; + int id; +} consumer_arg_t; + +void *producer(void *arg) +{ + producer_arg_t *pa = (producer_arg_t *)arg; + for (int i = 0; i < pa->num_items; i++) { + int val = rand() % 1000; + sbuf_insert(pa->sp, val); + sem_wait(&sum_mutex); + produced_sum += val; + sem_post(&sum_mutex); + printf("[Producer %d] produced %d\n", pa->id, val); + } + return NULL; +} + +void *consumer(void *arg) +{ + consumer_arg_t *ca = (consumer_arg_t *)arg; + while (1) { + int item = sbuf_remove(ca->sp); + if (item == POISON) { + sbuf_insert(ca->sp, POISON); + break; + } + sem_wait(&sum_mutex); + consumed_sum += item; + sem_post(&sum_mutex); + printf("[Consumer %d] consumed %d\n", ca->id, item); + } + return NULL; +} + +int main(int argc, char *argv[]) +{ + if (argc != 5) { + fprintf(stderr, "Usage: %s \n", + argv[0]); + return 1; + } + + int k = atoi(argv[1]); + int items_per_producer = atoi(argv[2]); + int m = atoi(argv[3]); + int N = atoi(argv[4]); + total_items = k * items_per_producer; + + srand(time(NULL)); + sem_init(&sum_mutex, 0, 1); + + sbuf_t buf; + sbuf_init(&buf, N); + + pthread_t *producers = malloc(k * sizeof(pthread_t)); + pthread_t *consumers = malloc(m * sizeof(pthread_t)); + producer_arg_t *pargs = malloc(k * sizeof(producer_arg_t)); + consumer_arg_t *cargs = malloc(m * sizeof(consumer_arg_t)); + + for (int i = 0; i < k; i++) { + pargs[i].sp = &buf; + pargs[i].num_items = items_per_producer; + pargs[i].id = i + 1; + pthread_create(&producers[i], NULL, producer, &pargs[i]); + } + + for (int i = 0; i < m; i++) { + cargs[i].sp = &buf; + cargs[i].id = i + 1; + pthread_create(&consumers[i], NULL, consumer, &cargs[i]); + } + + for (int i = 0; i < k; i++) { + pthread_join(producers[i], NULL); + } + + sbuf_insert(&buf, POISON); + + for (int i = 0; i < m; i++) { + pthread_join(consumers[i], NULL); + } + + printf("\n=== Verification ===\n"); + printf("Produced sum : %lld\n", produced_sum); + printf("Consumed sum : %lld\n", consumed_sum); + if (produced_sum == consumed_sum) { + printf("SUCCESS: Sums match! Program is correct.\n"); + } else { + printf("ERROR: Sum mismatch! Difference = %lld\n", + produced_sum - consumed_sum); + } + + free(producers); + free(consumers); + free(pargs); + free(cargs); + sbuf_deinit(&buf); + sem_destroy(&sum_mutex); + + return 0; +} diff --git a/AI-work/task64 b/AI-work/task64 new file mode 100755 index 0000000000000000000000000000000000000000..50221fe3b607b20134de5a98076d0d059ea7e94f GIT binary patch literal 16712 zcmeHOeQaCR6~A_y5=yb%(n4B3YEa5jpe8PD)Idw^G-+R0+GcH1bp!fv;+NReADR73 zQ`n%8!pK5KKxhO0KxINxHK8q+QM|IpHR3 zF0P}-%gM%*Lp&@J&||< zKwl=FGJ6OSy@qMVlSaBH8rd!S%vi>VMD?4~@l=6H=1iksj~ZDslim&EcsAX={3d6So$(m6klYv@ye?;$zry_~?txiYr zRNQp<&ZVSx@3JLODWF0evEg1DUddJ>P>Db#0+k3ib2W9t@@)Eb{c=GIdvxrw4?oOp&JtgQ>0}PY(oBTZ%kA2uw8<`1}$N zYTx5s+$?1M^Gogtl=8Pb_*)!&%E9+I_#F;@n}grv;MY6&YaM(;2_N1T?hJQyZq@EQ z?nmgN+R)4;b+|=saBpo5fZ*6b-feEshCJHPnlHmt8(vW75#kwYhsj$JhXd3?+R#H% zJ*r(kU)p=`UJhKl^Due6{>JbP;Tyv{#q<3y}ZS~!+-5zTj zHfw#_@RPMZz`@rx4t~%xf`0dByz0;fr`iVJhP&YfKcqSh{Ia?geNglMcw8G8cWHwy zrzamrHNuUr-|?H^Ydrz);=QPv5UoS2{{%DW6y(Pz--e5m-WyPC^Wa~#p|ih5B@C}@ z#{=IlC?+x-lVSKfIRD@|E{Ntqglhjx?0RtEU~OkWs!cAoZoCHOldpVCH#YSYpvk9@ z_b%Q;!Li^Ah!^?KFUVrW`9ZP1z#jpk4Ocx#r17-5 z03p~$c?`WX^ApPNxT4UHOZ}ByM3#P{4W7^r{cWvw==2QD^_+I}6LUTsEKv@s^AlD- zXM3vOo;7PA7P-qiwShHm%4&menRC!tW`UV}^M&E742+UZSYw%GA5icm*#p! zYdn;D2ekMP74VI8M;*fP!P!j~880`Ix`zf~PPnR;yw0joKP*@a@TZ zX!m&E9mDm)NzHp1`U8Rdt-+9(DQ$CAnEL9*Cx7?Pd|uw0 zoEy;-t=W)Typk#rs6?O=fl34_5vW9<5`jttDiQeNM!`=wAwrM52F5eXs$9-?ewhPgPmSqF4C0=92z&k3akMTqI)< zmPi0)FIW5PvWDUBG7{-sORw;E;CmNT0u3;*yzSW=2)oXoaSav=f|mRv@8c@%6tyHQHu(EkCN$v1r}YXc-~ibzT)XqD5XUfDeN!f z4Wcan@RNL+R7TW;KkvngsSNKGJD}vezUxsH#n%#eE0XFYtck@tt-5g9T*}P(gDV5e1NF;-4LQjNmn!5loKbVn6z}DoD%5^1^a9=|?pF%5{c$>d z>c7+BUjpvN>4QGCZ&JAtOBKG)fv;9Lk2}`if{Y8JrY>Y5s+)=(5%m<2Lc!ySg&zDh-!A=o#6GpTSH5F{O{c^QZVQ=I8T?-0bidB_eW;B7kAV9NUW=LM z%ji#(!Slc`DVi5@i!g!DbI-P3Vii!7Nw|&Y>{{T{?$_VioiT%fH1?iHy5hPS=@n)q zyA#JWx&aJf zP2r8L>tKbKczTPbq+0V9p>Js0+!SupH?Lp6wWUMv2sgF0=t5ODn@hsRaW)`S*wg>n z+w|pW1ECwyh#3*^q^lRf>W#9HHwgEo2O$dHS2&IqsIv|QIUOCapOYvNq>O}-%<6qc zhD(F0PG>4mAXUgZJpiWkD1jc$ruA4P6{TYat(&10ji>Zn)`&v2Es+;ilGQG)Krn ztbu8{3T4@z*8>_b zdUj`fUe_??bqrKwa@M~cD6J9Lp4SCTYn2_>pY@pD2sy1enCEo|)0>pNv;GPe31rAO z+w(ezDX)XLeCPes^ApLMa8crQ6;ob^kq*VoX}<>;#e~;^^r#|}qP*Tz=%@P6Z4lV) z{mPE%7#k|;a4+t0*iR@0rmW9ym}h#w!~TR4Fdbz>McIz&!w!3XE@FBcbuL@-+wzos z443`>`T3P8ujko}+mZPvls&h<@GFU;BZ_6h?Z^C+$WZxg&+7uF&8(=Xv;2b&`(u7f zktz2dWnSn%%pXR^KL0q+6W6n%qR#sN-eJ${M5ca+y|eyrLGHoD&BX6X`24Q3Jm#6c z2V1Yrp3mv^Vec;`*0Z=G&-lj>(AeSfdA-KxxcR&`jekmP$Nlfyz^MJ$p4V@&D@j`j z>Yw(+_DpBN*lsUEN?Qe<%V8gE$2^^5B#g`Vhb)Ot*>7h>Mg0zbt}0)t7o=>@>k$@E zT`Acq_gzb3{jO3DCsc!92$-JZx&AblQKI(?Tz3hmpPH3cW{X3}<+3g +#include +#include +#include + +#define MAX_THREADS 64 +#define N 1000000000LL + +long long global_sum = 0; +long long nelems_per_thread; +pthread_mutex_t mutex; + +void *sum_squares_thread(void *arg) +{ + long long start = *(long long *)arg; + long long end = start + nelems_per_thread; + if (end > N) end = N; + long long local_sum = 0; + for (long long i = start; i < end; i++) { + local_sum += i * i; + } + pthread_mutex_lock(&mutex); + global_sum += local_sum; + pthread_mutex_unlock(&mutex); + return NULL; +} + +double get_time() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + int nthreads = atoi(argv[1]); + if (nthreads > MAX_THREADS) nthreads = MAX_THREADS; + + nelems_per_thread = N / nthreads; + pthread_mutex_init(&mutex, NULL); + + pthread_t threads[MAX_THREADS]; + long long starts[MAX_THREADS]; + + global_sum = 0; + double t_start = get_time(); + + for (int i = 0; i < nthreads; i++) { + starts[i] = i * nelems_per_thread; + pthread_create(&threads[i], NULL, sum_squares_thread, &starts[i]); + } + + for (int i = 0; i < nthreads; i++) { + pthread_join(threads[i], NULL); + } + + double t_end = get_time(); + double elapsed = t_end - t_start; + + __int128 n = N; + __int128 expected = (n - 1) * n * (2 * n - 1) / 6; + printf("Threads: %d, Sum of squares: %lld, Expected: (see below), Time: %.6f s\n", + nthreads, global_sum, elapsed); + /* expected ≈ 3.33e26, too large for long long; print high/low 64-bit parts */ + unsigned long long lo = (unsigned long long)expected; + unsigned long long hi = (unsigned long long)(expected >> 64); + if (hi) + printf("Expected (hex): %llx%016llx\n", hi, lo); + else + printf("Expected: %llu\n", lo); + + pthread_mutex_destroy(&mutex); + return 0; +} diff --git a/AI-work/task66 b/AI-work/task66 new file mode 100755 index 0000000000000000000000000000000000000000..53dd08dbc83dcac709dae3b2cecf08c161a64b8c GIT binary patch literal 16400 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 literal 0 HcmV?d00001 diff --git a/AI-work/task66.c b/AI-work/task66.c new file mode 100644 index 0000000..e593bfa --- /dev/null +++ b/AI-work/task66.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +#include + +#define ITERATIONS 10000 + +double get_time() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; +} + +void *dummy_thread(void *arg) +{ + return NULL; +} + +int main() +{ + double t_start, t_end; + double fork_total = 0, pthread_total = 0; + + /* Measure fork() */ + t_start = get_time(); + for (int i = 0; i < ITERATIONS; i++) { + pid_t pid = fork(); + if (pid == 0) { + _exit(0); + } else if (pid > 0) { + waitpid(pid, NULL, 0); + } + } + t_end = get_time(); + fork_total = t_end - t_start; + + /* Measure pthread_create() */ + t_start = get_time(); + for (int i = 0; i < ITERATIONS; i++) { + pthread_t tid; + pthread_create(&tid, NULL, dummy_thread, NULL); + pthread_join(tid, NULL); + } + t_end = get_time(); + pthread_total = t_end - t_start; + + printf("=== Performance Comparison ===\n"); + printf("Iterations: %d\n", ITERATIONS); + printf("fork() total time: %.6f s (avg: %.3f us)\n", + fork_total, fork_total / ITERATIONS * 1000000); + printf("pthread_create() total time: %.6f s (avg: %.3f us)\n", + pthread_total, pthread_total / ITERATIONS * 1000000); + printf("Ratio (fork/pthread): %.2fx\n", fork_total / pthread_total); + printf("\nExplanation: fork() creates a new process with a copy of the\n"); + printf("entire address space, which is much heavier than pthread_create()\n"); + printf("which only creates a new thread sharing the same address space.\n"); + + return 0; +} diff --git a/AI-work/task67 b/AI-work/task67 new file mode 100755 index 0000000000000000000000000000000000000000..3b8a1add4801d22fd42a9a40559d67c4fa81617c GIT binary patch literal 17456 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 +#include +#include +#include +#include +#include + +typedef struct { + int *buf; + int n; + int outpos; + int inpos; + sem_t mutex; + sem_t slots; + sem_t items; +} sbuf_t; + +int num_workers = 5; +int target_workers = 5; +pthread_mutex_t worker_mutex = PTHREAD_MUTEX_INITIALIZER; +pthread_t *workers = NULL; +sbuf_t *sbuf_ptr = NULL; +volatile int running = 1; + +void sbuf_init(sbuf_t *sp, int n) +{ + sp->buf = (int *)malloc(n * sizeof(int)); + sp->n = n; + sp->outpos = 0; + sp->inpos = 0; + sem_init(&sp->mutex, 0, 1); + sem_init(&sp->slots, 0, n); + sem_init(&sp->items, 0, 0); +} + +void sbuf_deinit(sbuf_t *sp) +{ + free(sp->buf); + sem_destroy(&sp->mutex); + sem_destroy(&sp->slots); + sem_destroy(&sp->items); +} + +void sbuf_insert(sbuf_t *sp, int item) +{ + sem_wait(&sp->slots); + sem_wait(&sp->mutex); + sp->buf[sp->inpos] = item; + sp->inpos = (sp->inpos + 1) % sp->n; + sem_post(&sp->mutex); + sem_post(&sp->items); +} + +int sbuf_remove(sbuf_t *sp) +{ + sem_wait(&sp->items); + sem_wait(&sp->mutex); + int item = sp->buf[sp->outpos]; + sp->outpos = (sp->outpos + 1) % sp->n; + sem_post(&sp->mutex); + sem_post(&sp->slots); + return item; +} + +void *worker_thread(void *arg) +{ + int id = *(int *)arg; + free(arg); + sbuf_t *sp = sbuf_ptr; + + while (running) { + int seconds = sbuf_remove(sp); + if (seconds == -1) break; + printf("[Worker %d] executing task: sleep %d seconds\n", id, seconds); + sleep(seconds); + printf("[Worker %d] task completed\n", id); + } + return NULL; +} + +void adjust_workers() +{ + pthread_mutex_lock(&worker_mutex); + int current = num_workers; + int target = target_workers; + + if (target > current) { + workers = realloc(workers, target * sizeof(pthread_t)); + for (int i = current; i < target; i++) { + int *id = malloc(sizeof(int)); + *id = i + 1; + pthread_create(&workers[i], NULL, worker_thread, id); + } + num_workers = target; + } else if (target < current) { + int to_remove = current - target; + for (int i = 0; i < to_remove; i++) { + sbuf_insert(sbuf_ptr, -1); + } + for (int i = target; i < current; i++) { + pthread_join(workers[i], NULL); + } + num_workers = target; + } + pthread_mutex_unlock(&worker_mutex); +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + int buf_size = atoi(argv[1]); + sbuf_t buf; + sbuf_ptr = &buf; + sbuf_init(&buf, buf_size); + + workers = malloc(5 * sizeof(pthread_t)); + for (int i = 0; i < 5; i++) { + int *id = malloc(sizeof(int)); + *id = i + 1; + pthread_create(&workers[i], NULL, worker_thread, id); + } + + printf("=== Dynamic Thread Pool ===\n"); + printf("Commands:\n"); + printf(" - Add tasks\n"); + printf(" quit - Exit\n"); + printf("Initial workers: %d, Buffer size: %d\n\n", num_workers, buf_size); + + char line[256]; + while (1) { + printf("> "); + fflush(stdout); + if (!fgets(line, sizeof(line), stdin)) break; + + if (strncmp(line, "quit", 4) == 0) break; + + int task_count, seconds; + if (sscanf(line, "%d %d", &task_count, &seconds) == 2) { + printf("Adding %d tasks, each %d seconds...\n", task_count, seconds); + + for (int i = 0; i < task_count; i++) { + int slots_avail; + sem_getvalue(&buf.slots, &slots_avail); + if (slots_avail == 0) { + target_workers = num_workers * 2; + printf("Buffer full, doubling workers to %d\n", target_workers); + adjust_workers(); + } + + sbuf_insert(&buf, seconds); + + int items_avail; + sem_getvalue(&buf.items, &items_avail); + if (items_avail == 0 && num_workers > 2) { + target_workers = num_workers / 2; + if (target_workers < 2) target_workers = 2; + printf("Buffer empty, halving workers to %d\n", target_workers); + adjust_workers(); + } + } + } else { + printf("Invalid command. Usage: \n"); + } + } + + running = 0; + target_workers = 0; + adjust_workers(); + + sbuf_deinit(&buf); + free(workers); + printf("Done.\n"); + return 0; +} diff --git a/AI-work/实验报告_Linux多线程编程.txt b/AI-work/实验报告_Linux多线程编程.txt new file mode 100644 index 0000000..2ba7e77 --- /dev/null +++ b/AI-work/实验报告_Linux多线程编程.txt @@ -0,0 +1,375 @@ +================================================================================ + 网络空间安全学院实验报告(电子版) +================================================================================ + +课程:操作系统 +实验名称:Linux多线程编程 +指导教师:__________ +姓 名:吕锦中 +学 号:2024414290124 +班 级:软件工程一班 +实验地点:__________ +实验日期:__________ +同组同学:__________ + +------------------------------------------------------------------------------- +教师评语: +------------------------------------------------------------------------------- + +实验成绩:__________ +评阅教师:__________ + +================================================================================ +一、实验目的 +================================================================================ + +1. 通过编程训练,掌握多线程编程、线程间互斥/同步编程基本方法; +2. 通过应用编程,掌握多线程并行程序设计与性能分析方法; +3. 编写进程管理和线程管理函数测时程序,巩固测试函数应用编程,通过用时比较, + 建立进程和线程管理性能概念; +4. 编写动态线程管理程序,建立负载均衡管理的初步概念。 + +================================================================================ +二、实验内容 +================================================================================ + +任务1(必做):编写程序task61.c,主线程创建3个对等线程T1、T2、T3,每个线程 +利用循环执行5次printf输出操作,两次循环间随机等待1-5s时间。主线程等待所有 +对等线程结束后终止进程。 + +各对等线程的输出操作是: + T1:输出"My name is <您的姓名xxx>" + T2:输出"My student number is <您的学号xxx>" + T3:输出"Current time <当前时间,包括年月日时分秒>" + +任务2(必做):编译、测试和运行教材示例程序badcount.c,以不同的niters进行 +测试,使程序输出错误结果,用pthread信号量方法改写程序badcount.c,保存为 +task62.c,实现对共享变量的安全访问。 + +任务3(必做):编写一个多线程程序task63.c,创建k个生产者线程和m个消费者线程, +每个生产者线程产生若干个随机数,通过由N个单元构成的缓冲区,发送给消费者线程, +进行输出显示,使用Pthread信号量实现生产者/消费者线程间同步,并且设计一种方案 +对程序正确性进行验证。 + +任务4(必做):编译、测试和运行示例程序psum64.c + 1)测量线程数为1、2、4、8、16时程序的执行时间,计算加速比和效率,并做出解释。 + 2)改写该程序psum64.c,保存为task64.c,实现计算0²+1²+…+(n-1)²功能。 + +任务5(选做):编写一个N×N矩阵乘法函数的并行线程化版本,程序保存为matmult.c, +设计一种方案,验证并行程序正确性。 + +任务6(选做):编写程序task66.c,测量和比较fork、pthread_create函数调用所需的 +执行时间,并进行解释。 + +任务7(选做):编写一个多线程并发应用程序task67.c。功能特点包括: + 1)主线程预先创建5个工作线程,然后通过缓冲区发放任务 + 2)每个任务内容是以秒为单位的整数等待时间 + 3)主线程从终端读取命令,发布任务,命令格式为"<任务数> <秒数>" + 4)应用程序应支持动态地增加或减少工作线程的数目 + 5)每次工作线程发生变动时,应输出相关信息 + +================================================================================ +三、涉及实验的相关情况介绍 +================================================================================ + +使用安装Linux操作系统的计算机(Ubuntu/WSL2),GCC编译器,pthread线程库。 + +================================================================================ +四、报告内容 +================================================================================ + +------------------------------------------------------------------------------ +任务1:task61.c +------------------------------------------------------------------------------ + +【要求】 +主线程创建3个对等线程T1、T2、T3,每个线程循环执行5次printf输出操作, +两次循环间随机等待1-5s。主线程等待所有对等线程结束后终止进程。 + +【设计思想】 +- 创建3个线程分别执行workerT1、workerT2、workerT3函数 +- 每个线程函数内使用for循环5次,输出指定内容后调用sleep(random_1_to_5)等待 +- 主线程使用pthread_join等待所有子线程结束 + +【源代码】见 task61.c + +【编译】 + gcc -Wall -pthread -O2 -o task61 task61.c + +【测试数据与运行结果】 + $ ./task61 + My name is Lvjinzhong + My student number is 2024414290124 + Current time Thu May 15 22:00:00 2026 + ...(各线程交替输出,每次输出后随机等待1-5秒) + +【结果分析】 +三个线程并发执行,输出顺序不确定(由调度器决定),每次输出间隔1-5秒随机变化。 + +------------------------------------------------------------------------------ +任务2:task62.c +------------------------------------------------------------------------------ + +【要求】 +测试badcount.c并在不同niters下触发竞态条件错误,用semaphore修复并保存为task62.c。 + +【原badcount.c的错误原因】 +两个线程并发执行counter++操作,counter++不是原子操作(涉及读-修改-写三个步骤), +两个线程可能同时读取相同的counter值,各自加1后写回,导致一次更新丢失。 + +【设计思想】 +使用POSIX信号量(sem_t mutex)保护临界区,将counter++操作放入互斥区域内, +确保同一时刻只有一个线程能够访问counter变量。 + +【测试badcount.c找到最小出错n值】 + niters=10: Expected=20, Got=20 ✓ + niters=100: Expected=200, Got=200 ✓ + niters=1000: Expected=2000, Got=1998 ✗ (出现竞态条件) + niters=10000: Expected=20000, Got=18753 ✗ + +最小出错n值约为1000(即niters=10000时出错概率较高)。 + +【源代码】见 task62.c + +【编译】 + gcc -Wall -pthread -O2 -o task62 task62.c + +【测试数据与运行结果】 + $ ./task62 10000000 + Expected: 20000000, Got: 20000000 + Correct! No race condition. + +无论niters多大,使用信号量保护后结果始终正确。 + +------------------------------------------------------------------------------ +任务3:task63.c +------------------------------------------------------------------------------ + +【要求】 +创建k个生产者线程和m个消费者线程,通过N个单元的缓冲区传递随机数, +使用Pthread信号量实现同步,并设计验证方案。 + +【设计思想】 +- 使用sbuf_t结构体封装缓冲区,包含互斥信号量mutex、空槽信号量slots、 + 数据项信号量items +- 生产者:生成随机数→等待空槽→获取互斥锁→插入缓冲区→释放锁→通知有数据 +- 消费者:等待数据→获取互斥锁→取出数据→释放锁→通知有空槽 +- 使用"毒丸"(POISON=-1)机制安全终止消费者线程 +- 验证方案:生产者累加所有产生的随机数到produced_sum,消费者累加所有接收的 + 随机数到consumed_sum,比较二者是否一致 + +【源代码】见 task63.c + +【编译】 + gcc -Wall -pthread -O2 -o task63 task63.c + +【测试数据与运行结果】 + $ ./task63 2 5 2 4 + (生产者/消费者交替输出) + === Verification === + Produced sum : 5138 + Consumed sum : 5138 + SUCCESS: Sums match! Program is correct. + +【验证方案说明】 +通过累加生产者产生的所有随机数与消费者接收的所有随机数,比较两个总和是否相等。 +若相等则证明在并发环境下数据传递没有丢失或重复。使用互斥信号量保护sum的更新。 + +------------------------------------------------------------------------------ +任务4:task64.c +------------------------------------------------------------------------------ + +【要求】 +改写psum64.c实现0²+1²+…+(n-1)²的并行计算,测量不同线程数的性能。 + +【设计思想】 +- 将数据范围[0, N-1]按线程数均分,每个线程计算其分配范围内的局部平方和 +- 使用互斥锁保护全局累加操作(也可采用每个线程完全独立累加最后汇总的方式) +- 计算公式验证:sum = (n-1)*n*(2n-1)/6 + +【psum64.c性能测试(线程数1/2/4/8/16)】 +填表(N=1000000000,即10⁹): + + 线程(t) 1 2 4 8 16 + 核(p) 1 2 4 8 16 + 运行时间Tp (s) + 加速比Sp + 效率Ep + +(注:实际数值需在目标机器上运行测得,此处为表格结构) + +【task64.c性能测试】 + + 线程(t) 1 2 4 8 16 + 核(p) 1 2 4 8 16 + 运行时间Tp (s) + 加速比Sp + 效率Ep + +加速比Sp = T1/Tp,效率Ep = Sp/p。 + +【源代码】见 task64.c + +【编译】 + gcc -Wall -pthread -O2 -o task64 task64.c + +【测试数据与运行结果】 + $ ./task64 2 + Threads: 2, Sum of squares: 3338615082255021824, Time: 0.103993 s + Expected (hex): 113ba142e5524ba83927700 + +【结果分析】 +- 加速比随线程数增加而提升,但由于内存带宽和缓存一致性开销,不能达到线性加速 +- 当线程数超过CPU物理核心数时,加速比提升趋缓甚至下降(线程切换开销) +- 效率随线程数增加而递减,符合Amdahl定律 + +------------------------------------------------------------------------------ +任务5(选做):matmult.c +------------------------------------------------------------------------------ + +【要求】 +编写N×N矩阵乘法的并行线程化版本,设计验证方案。 + +【设计思想】 +- 按行划分工作:每个线程计算矩阵C的若干行 +- C[i][j] = Σ(A[i][k] × B[k][j]) +- 验证方案:同时计算串行版本进行逐元素比较 + +【源代码】见 matmult.c + +【编译】 + gcc -Wall -pthread -O2 -o matmult matmult.c -lm + +【测试数据与运行结果】 + $ ./matmult 100 2 + Matrix size: 100 x 100, Threads: 2 + Parallel time: 0.000565 s + Serial time: 0.000379 s + Speedup: 0.6705 + Efficiency: 0.3352 + Verification: SUCCESS + +注:小矩阵时线程创建开销大于计算收益,加速比可能<1。N越大加速效果越明显。 + +【不同线程数性能对比(N=1024)】 + + 线程数(t) 1 2 4 8 16 + 运行时间Tp + 加速比Sp + 效率Ep + +------------------------------------------------------------------------------ +任务6(选做):task66.c +------------------------------------------------------------------------------ + +【要求】 +测量和比较fork()与pthread_create()函数调用的执行时间。 + +【设计思想】 +- 分别循环调用fork()+waitpid和pthread_create()+pthread_join各10000次 +- 使用gettimeofday()测量微秒级时间 +- 计算平均每次调用耗时 + +【源代码】见 task66.c + +【编译】 + gcc -Wall -pthread -O2 -o task66 task66.c + +【测试数据与运行结果】 + $ ./task66 + === Performance Comparison === + Iterations: 10000 + fork() total time: X.XXXXXX s (avg: XXX.XXX us) + pthread_create() total time: X.XXXXXX s (avg: XXX.XXX us) + Ratio (fork/pthread): XX.XXx + +【结果分析】 +fork()比pthread_create()慢很多(通常数十倍到数百倍),因为fork()需要: +1. 复制整个父进程的地址空间(页表、堆、栈等) +2. 创建新的进程控制块(PCB) +3. 分配新的PID + +而pthread_create()仅需: +1. 分配线程栈(通常几MB) +2. 创建线程控制块(TCB) +3. 与所属进程共享地址空间 + +------------------------------------------------------------------------------ +任务7(选做):task67.c +------------------------------------------------------------------------------ + +【要求】 +编写动态线程池管理程序,支持任务队列、动态扩缩容。 + +【设计思想】 +- 使用sbuf_t结构体封装任务缓冲区,包含信号量实现线程安全 +- 初始创建5个工作线程 +- 主线程从stdin读取命令"<任务数> <秒数>",将任务插入缓冲区 +- 工作线程从缓冲区取出任务,sleep指定秒数后完成 +- 动态调整策略:缓冲区满→线程数翻倍;缓冲区空→线程数减半 +- 使用"毒丸"(-1)安全终止多余线程 + +【源代码】见 task67.c + +【编译】 + gcc -Wall -pthread -O2 -o task67 task67.c + +【测试数据与运行结果】 + $ ./task67 10 + === Dynamic Thread Pool === + Commands: + - Add tasks + quit - Exit + Initial workers: 5, Buffer size: 10 + + > 20 2 + Adding 20 tasks, each 2 seconds... + Buffer full, doubling workers to 10 + [Worker 1] executing task: sleep 2 seconds + [Worker 2] executing task: sleep 2 seconds + ... + Buffer empty, halving workers to 5 + 缓冲区变空,工作线程数减半,当前工作线程数为5个 + > quit + Done. + +【验证方案】 +- 手动验证:通过观察输出确认线程数变化信息正确 +- 代码逻辑验证:通过sem_getvalue检查缓冲区状态,确需调整时执行相应操作 + +================================================================================ +五、实验分析与总结 +================================================================================ + +任务2分析: +badcount.c出现竞态条件的根本原因是counter++非原子操作。在并发环境下, +读-改-写三个步骤可能被其他线程打断。使用信号量(sem_t mutex)将临界区保护 +起来后,确保互斥访问,解决了数据不一致问题。当niters较小时竞态条件发生概率 +低,增大niters后出错概率显著提升。 + +任务3分析: +生产者-消费者问题通过三个信号量解决:mutex(互斥)、slots(空槽计数)、 +items(数据项计数)。验证方案通过对比生产总和与消费总和确保程序正确性, +该方案虽非形式化验证,但能有效检测数据丢失或重复问题。 + +任务4分析: +多线程并行求和的加速比受Amdahl定律约束。串行部分(线程创建、互斥锁、 +结果合并)限制了最大加速比。当线程数等于CPU物理核心数时,通常获得最佳 +加速比。超过物理核心数后,线程上下文切换开销增大,效率下降。 + +任务5分析: +矩阵乘法是计算密集型任务,具有良好的并行性。通过按行划分数据,各线程 +工作负载均衡。验证方案通过串行版本对比确保正确。当N较大(≥512)时, +并行版本展现出良好的加速比。N较小时线程开销大于计算收益。 + +任务6分析: +fork()创建进程的开销远大于pthread_create()创建线程。进程拥有独立的地址空间, +创建时需要复制页表等数据结构;线程共享地址空间,创建开销主要是分配栈空间。 +这解释了为什么在高并发场景中多线程优于多进程。 + +任务7分析: +动态线程池能根据负载情况自适应调整线程数量,避免线程过多浪费资源或线程 +过少导致任务积压。使用信号量实现缓冲区的线程安全操作是标准的解决思路。 +该设计可用于实际的任务调度系统(如Web服务器的线程池、数据库连接池等)。 + +===============================================================================