From 2f42b036a902caa44bc672e29175c4aba0d1fcad Mon Sep 17 00:00:00 2001 From: ChoChoX Date: Tue, 9 Jun 2026 06:43:13 +0200 Subject: [PATCH] 3 --- exp1/Linux多线程编程实验(2)_completed.docx | Bin 0 -> 39230 bytes exp1/badcount | Bin 18560 -> 16192 bytes exp1/create_completed_doc.js | 603 ++++++++++++++++++ exp1/create_completed_doc.py | 327 ++++++++++ exp1/matmult | Bin 0 -> 16568 bytes exp1/matmult.c | 163 +++++ exp1/psum64 | Bin 0 -> 16368 bytes exp1/psum64.c | 16 +- exp1/task61 | Bin 16400 -> 16416 bytes exp1/task61.c | 1 + exp1/task62 | Bin 19072 -> 16440 bytes exp1/task63 | Bin 17008 -> 16968 bytes exp1/task64 | Bin 16384 -> 16368 bytes exp1/task64.c | 39 +- exp1/task66 | Bin 0 -> 16552 bytes exp1/task66.c | 80 +++ exp1/task67 | Bin 0 -> 17480 bytes exp1/task67.c | 272 ++++++++ server-exp/weblet | Bin 38848 -> 38848 bytes .../实验1任务报告web服务器初步实现.docx | Bin 25286 -> 0 bytes ...实验1任务报告web服务器初步实现_填写版.docx | Bin 29376 -> 73952 bytes ...告web服务器初步实现_填写版.docx:Zone.Identifier | 2 + ...web服务器初步实现)(1) (1).docx:Zone.Identifier | 4 - server-exp2/togglesp | Bin 28840 -> 28840 bytes server-exp2/togglesp.c | 27 +- server-exp2/togglest | Bin 27648 -> 27648 bytes server-exp2/togglest.c | 1 + server-exp2/weblet | Bin 38904 -> 38848 bytes server-exp2/webletsp | Bin 0 -> 40928 bytes server-exp2/webletsp.c | 290 +++++++++ server-exp2/webletst | Bin 0 -> 39936 bytes server-exp2/webletst.c | 292 +++++++++ ...验2任务报告(多进程和多线程模型)(1).docx | Bin 0 -> 100232 bytes 33 files changed, 2077 insertions(+), 40 deletions(-) create mode 100644 exp1/Linux多线程编程实验(2)_completed.docx create mode 100644 exp1/create_completed_doc.js create mode 100644 exp1/create_completed_doc.py create mode 100755 exp1/matmult create mode 100644 exp1/matmult.c create mode 100755 exp1/psum64 create mode 100755 exp1/task66 create mode 100644 exp1/task66.c create mode 100755 exp1/task67 create mode 100644 exp1/task67.c delete mode 100644 server-exp/实验1任务报告web服务器初步实现.docx create mode 100644 server-exp/实验1任务报告web服务器初步实现_填写版.docx:Zone.Identifier delete mode 100644 server-exp/实验1任务报告(web服务器初步实现)(1) (1).docx:Zone.Identifier create mode 100755 server-exp2/webletsp create mode 100644 server-exp2/webletsp.c create mode 100755 server-exp2/webletst create mode 100644 server-exp2/webletst.c create mode 100644 server-exp2/实验2任务报告(多进程和多线程模型)(1).docx diff --git a/exp1/Linux多线程编程实验(2)_completed.docx b/exp1/Linux多线程编程实验(2)_completed.docx new file mode 100644 index 0000000000000000000000000000000000000000..e392d7327fa3fe66f300000e2cfeaf4e5a095d14 GIT binary patch literal 39230 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 amB7~1(M|wZK|2dVg2x9~iT&9-zy1pfLb6r> literal 0 HcmV?d00001 diff --git a/exp1/badcount b/exp1/badcount index a472516aa0c2efeb81fd3d9c9b37e540229ff178..0a799952d7c2c9292171edf45a066b39b6c0c20f 100755 GIT binary patch delta 126 zcmZpe$atV`f`)j5IRhLxFjz3~F*q>DGstbUS7a8sup`dz&%+5q$J*2sR+&rm-~Lrw zy}5+>kj~^!Oj4T65TiaYLulE_FWvQ-G)yK-dDw9# Nnn47mCO>qO2LKQ*BU%6e delta 2244 zcmah~O>7%g5Pomh&t7M3C;o{YCrWLX{!q1RCutJ9P2;3ZMMgubY%1hS&=VNaOsOI8XMvL1ZVoOTa>@ut;Iy zd%b@v8z@FB1WCULU7C{AiZ0vb} zVcfsK6?|XA>Q4cGTyWrv0OtY~U`YfEJce%+Gx9{hoZ_B4V0}o#u3$+_!4CZF5@0_c zTSShK;d4-kAK+U-KL8FzG7tgy1mRxfZUNvB5f8RKunOh}R98@4MRO6&Wi%VW6Az{^ zls&&7x`0Rl6UPE3#vveyV*r^+1D8mPkXy*#1bT#sF<53WCK&|-SJ7Pvz56qS1w!CD zI@f-g*GN8e5(utc^G?E=54&ESh?l`VjCGzwz`(UrXO!#KarBm3NZM6M>K96mLoOAa z!|Oc?Q_u)r^scjOFyiidmbWKKXwW$|XwIG@p{VP;8vL>Q%z3-1(0U|i14rxGh)6aKusD7o3gu5m79PJPgkyJ{jleMv5-}s7#_~>x z7eYe2LVO1tL5Mp7=jOus`-A@`;6`WZLK1U55RwTTOfE-HBq>xDdjjs8@u3i=5#Qp- z4Mz^J{*IZr+f`7c7(qxVO!tSP;%zFnsh3ZUrH~#<5Yig#4hJvb5X>OLv!9@RNEDBY z*dgv4p>#QlAew;*au5=8=63>?qYFtqfZ=X);v73B9!$PNlWx=TVTz4ndSZ8oGgb@u z5lAP=z6iVSjP`mGG`ww$2xJ8?rF1(K#0Bpqd;z390G$ip5qvEm`B^e*T$LM`F`Yj8uu)sW44oo;<{O>G^K`r3l zX7u9Ze+6}8I1Yxb8+tYE82n|sCY#j;si=yn%9cttWKAaxy9QpRB-^%GvWc$Qs%ep( zyrynxRb8#5u|TUAjTLN_XnMEQnR73tm!^)UCug!#*@?8YVK;SkzN+e~sVU&frc#^V zEX+!?(`l)imeytKx~|krLpPe1)YM zr7l~wo~{`>D9ZY7|AuNBk_OXA4Y^X$^r}?WY-?Vw*ZUJ+F<|^s$~NuN_{ve_c)re;HuT!%yHX5qo~&c!CVnz5ngl$w!S$}LIiWdhPuwJWCAiG97HTG<-0 z>`GlL1L$_>Qks#i!T;&_gYy%IeXH4uT5eWLvMK9T)goP2)7On2mdj;Rz1H(!d$ot* z*7P9KCGb1nd7pdmF#piYM)8G%eWL!^33!L#n&@N-DR!vOuXp)-o!^QnHq+-lN8R|F zoyxJ3I4kMlpe=1AMKuC&#Wi}~;;dDnZ&yX!NZ WtzwS*V6O9PvFQJ4-X*VK<$nO#37{1K diff --git a/exp1/create_completed_doc.js b/exp1/create_completed_doc.js new file mode 100644 index 0000000..796c8f4 --- /dev/null +++ b/exp1/create_completed_doc.js @@ -0,0 +1,603 @@ +const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, + Header, Footer, AlignmentType, LevelFormat, BorderStyle, + WidthType, ShadingType, VerticalAlign, PageNumber, PageBreak } = require('docx'); +const fs = require('fs'); + +// Border style +const border = { style: BorderStyle.SINGLE, size: 1, color: "000000" }; +const borders = { top: border, bottom: border, left: border, right: border }; +const noBorder = { style: BorderStyle.NONE, size: 0, color: "FFFFFF" }; +const noBorders = { top: noBorder, bottom: noBorder, left: noBorder, right: noBorder }; + +// Helper function to create a paragraph with text +function createParagraph(text, options = {}) { + const { fontSize = 24, bold = false, alignment = AlignmentType.LEFT, + firstLine = 0, indent = 0, spaceBefore = 0, spaceAfter = 0, + font = "宋体", eastAsia = "宋体" } = options; + + return new Paragraph({ + alignment, + spacing: { + before: spaceBefore, + after: spaceAfter, + line: 480, + lineRule: "auto" + }, + indent: { + firstLineChars: firstLine, + firstLine: firstLine > 0 ? firstLine * 10 : 0 + }, + children: [ + new TextRun({ + text, + font, + size: fontSize, + bold, + eastAsia + }) + ] + }); +} + +// Helper for section heading +function createSectionHeading(text) { + return new Paragraph({ + spacing: { before: 240, after: 120 }, + children: [ + new TextRun({ + text, + font: "宋体", + size: 28, + bold: true + }) + ] + }); +} + +// Helper for subsection heading +function createSubHeading(text) { + return new Paragraph({ + spacing: { before: 180, after: 80 }, + children: [ + new TextRun({ + text, + font: "宋体", + size: 24, + bold: true + }) + ] + }); +} + +// Helper for normal paragraph with indentation +function createNormalParagraph(text, indent = 480) { + return new Paragraph({ + spacing: { line: 480, lineRule: "auto" }, + indent: { firstLineChars: 200, firstLine: indent }, + children: [ + new TextRun({ + text, + font: "宋体", + size: 24 + }) + ] + }); +} + +// Create the document +const doc = new Document({ + styles: { + default: { + document: { + run: { font: "宋体", size: 24 } + } + } + }, + sections: [{ + properties: { + page: { + size: { width: 11907, height: 16840 }, + margin: { top: 1134, right: 567, bottom: 1134, left: 567 } + } + }, + children: [ + // Title + new Paragraph({ + alignment: AlignmentType.CENTER, + spacing: { before: 0, after: 0 }, + children: [ + new TextRun({ + text: "网络空间安全学院", + font: "华文中宋", + size: 32 + }) + ] + }), + new Paragraph({ + alignment: AlignmentType.CENTER, + spacing: { before: 0, after: 0 }, + children: [ + new TextRun({ + text: "实验报告(电子版)", + font: "华文中宋", + size: 32 + }) + ] + }), + new Paragraph({ children: [] }), + + // Info table + new Table({ + width: { size: 10411, type: WidthType.DXA }, + columnWidths: [2016, 1461, 1800, 2224, 1318, 1592], + rows: [ + new TableRow({ + children: [ + new TableCell({ + borders, + width: { size: 2016, type: WidthType.DXA }, + verticalAlign: VerticalAlign.CENTER, + children: [new Paragraph({ + alignment: AlignmentType.CENTER, + children: [new TextRun({ text: "实验名称", font: "宋体", size: 24 })] + })] + }), + new TableCell({ + borders, + width: { size: 5485, type: WidthType.DXA }, + columnSpan: 3, + verticalAlign: VerticalAlign.CENTER, + children: [new Paragraph({ + alignment: AlignmentType.CENTER, + children: [ + new TextRun({ text: "Linux", font: "宋体", size: 24 }), + new TextRun({ text: "多线程编程", font: "宋体", size: 24 }) + ] + })] + }), + new TableCell({ + borders, + width: { size: 1318, type: WidthType.DXA }, + verticalAlign: VerticalAlign.CENTER, + children: [new Paragraph({ + alignment: AlignmentType.CENTER, + children: [new TextRun({ text: "指导教师", font: "宋体", size: 24 })] + })] + }), + new TableCell({ + borders, + width: { size: 1592, type: WidthType.DXA }, + verticalAlign: VerticalAlign.CENTER, + children: [new Paragraph({ children: [] })] + }) + ] + }), + new TableRow({ + children: [ + new TableCell({ + borders, + width: { size: 2016, type: WidthType.DXA }, + verticalAlign: VerticalAlign.CENTER, + children: [new Paragraph({ + alignment: AlignmentType.CENTER, + children: [new TextRun({ text: "姓 名", font: "宋体", size: 24 })] + })] + }), + new TableCell({ + borders, + width: { size: 1461, type: WidthType.DXA }, + verticalAlign: VerticalAlign.CENTER, + children: [new Paragraph({ + alignment: AlignmentType.CENTER, + children: [new TextRun({ text: "吕锦中", font: "宋体", size: 24 })] + })] + }), + new TableCell({ + borders, + width: { size: 1800, type: WidthType.DXA }, + verticalAlign: VerticalAlign.CENTER, + children: [new Paragraph({ + alignment: AlignmentType.CENTER, + children: [new TextRun({ text: "学 号", font: "宋体", size: 24 })] + })] + }), + new TableCell({ + borders, + width: { size: 2224, type: WidthType.DXA }, + verticalAlign: VerticalAlign.CENTER, + children: [new Paragraph({ + alignment: AlignmentType.CENTER, + children: [new TextRun({ text: "2024414290124", font: "宋体", size: 24 })] + })] + }), + new TableCell({ + borders, + width: { size: 1318, type: WidthType.DXA }, + verticalAlign: VerticalAlign.CENTER, + children: [new Paragraph({ + alignment: AlignmentType.CENTER, + children: [new TextRun({ text: "班 级", font: "宋体", size: 24 })] + })] + }), + new TableCell({ + borders, + width: { size: 1592, type: WidthType.DXA }, + verticalAlign: VerticalAlign.CENTER, + children: [new Paragraph({ + alignment: AlignmentType.CENTER, + children: [new TextRun({ text: "软件工程一班", font: "宋体", size: 24 })] + })] + }) + ] + }) + ] + }), + new Paragraph({ children: [] }), + + // Section 1: 实验目的 + createSectionHeading("一、实验目的:"), + createNormalParagraph("1. 通过编程训练,掌握多线程编程、线程间互斥/同步编程基本方法;"), + createNormalParagraph("2. 通过应用编程,掌握多线程并行程序设计与性能分析方法;"), + createNormalParagraph("3. 编写进程管理和线程管理函数测时程序,巩固测试函数应用编程,通过用时比较,建立进程和线程管理性能概念;"), + createNormalParagraph("4. 编写动态线程管理程序,建立负载均衡管理的初步概念。"), + new Paragraph({ children: [] }), + + // Section 2: 实验内容 + createSectionHeading("二、实验内容:"), + createNormalParagraph("任务1(必做):编写程序task61.c,主线程创建3个对等线程T1、T2、T3,每个线程利用循环执行5次printf输出操作,两次循环间随机等待1-5s时间。主线程等待所有对等线程结束后终止进程。"), + createNormalParagraph("任务2(必做):编译、测试和运行badcount.c程序,用信号量方法改写程序实现对共享变量的安全访问。"), + createNormalParagraph("任务3(必做):编写多线程生产者/消费者程序task63.c,使用信号量实现同步。"), + createNormalParagraph("任务4(必做):编译、测试和运行psum64.c,实现并行计算平方和。"), + createNormalParagraph("任务5(选做):编写矩阵乘法并行程序matmult.c并验证正确性。"), + createNormalParagraph("任务6(任选):测量fork()与pthread_create()函数调用开销。"), + createNormalParagraph("任务7(任选):编写动态线程池管理程序task67.c。"), + new Paragraph({ children: [] }), + + // Section 3: 相关情况介绍 + createSectionHeading("三、相关情况介绍"), + createNormalParagraph("本实验使用Linux系统提供的POSIX线程库pthread进行多线程编程。实验中涉及线程创建、线程同步(信号量)、互斥锁、条件变量等概念。通过多个实际任务,涵盖了多线程编程的主要方面。"), + new Paragraph({ children: [] }), + + // Section 4: 报告内容 + createSectionHeading("四、报告内容"), + + // Task 1 + createSubHeading("任务1:多线程创建与基本同步"), + createSubHeading("1. 设计思想"), + createNormalParagraph("本程序创建三个对等线程T1、T2、T3,每个线程执行不同的输出任务。主线程使用pthread_join()等待所有对等线程结束。"), + createSubHeading("2. 源代码"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "#include ", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "#include ", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "// ... (完整源代码见task61.c)", font: "宋体", size: 22 })] + }), + createSubHeading("3. 编译过程"), + createNormalParagraph("gcc -o task61 task61.c -lpthread"), + createSubHeading("4. 测试数据"), + createNormalParagraph("程序无输入参数,直接运行。"), + createSubHeading("5. 运行结果"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "My name is Lvjinzhong", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "My student number is 2024414290124", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "Current time Fri May 29 11:32:12 2026", font: "Courier New", size: 20 })] + }), + new Paragraph({ children: [] }), + + // Task 2 + createSubHeading("任务2:信号量实现互斥访问"), + createSubHeading("1. 设计思想"), + createNormalParagraph("原badcount.c程序存在竞态条件,多个线程同时对共享变量cnt进行增减操作,导致结果不正确。本程序使用二元信号量mutex实现对cnt变量的互斥访问保护。"), + createSubHeading("2. 源代码(核心部分)"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "sem_t mutex;", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "sem_init(&mutex, 0, 1);", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "// 在increase/decrease函数中:", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "sem_wait(&mutex); cnt++; sem_post(&mutex);", font: "Courier New", size: 20 })] + }), + createSubHeading("3. 编译过程"), + createNormalParagraph("gcc -o task62 task62.c -lpthread"), + createSubHeading("4. 测试数据"), + createNormalParagraph("运行时指定迭代次数,如:./task62 100000"), + createSubHeading("5. 运行结果"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "Correct! cnt=0", font: "Courier New", size: 20 })] + }), + new Paragraph({ children: [] }), + + // Task 3 + createSubHeading("任务3:生产者-消费者问题"), + createSubHeading("1. 设计思想"), + createNormalParagraph("使用有界缓冲区实现生产者-消费者同步。slots信号量表示缓冲区空槽数,items信号量表示缓冲区产品数,mutex保护缓冲区的临界区操作。"), + createSubHeading("2. 源代码(核心数据结构)"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "typedef struct {", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " int *buf; int n; int inpos, outpos;", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " sem_t mutex, slots, items;", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "} sbuf_t;", font: "Courier New", size: 20 })] + }), + createSubHeading("3. 编译过程"), + createNormalParagraph("gcc -o task63 task63.c -lpthread"), + createSubHeading("4. 测试数据"), + createNormalParagraph("./task63 2 3 5 表示2个生产者、3个消费者、缓冲区大小为5"), + createSubHeading("5. 运行结果"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "Produced sum: 2765", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "Consumed sum: 2765", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "Verification successful", font: "Courier New", size: 20 })] + }), + new Paragraph({ children: [] }), + + // Task 4 + createSubHeading("任务4:并行计算平方和"), + createSubHeading("1. 设计思想"), + createNormalParagraph("将0到n-1的平方和分配给多个线程并行计算。每个线程计算自己分配区间的平方和,最后将各线程的结果求和。"), + createSubHeading("2. 源代码(核心部分)"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "void *sum(void *vargp) {", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " unsigned long long begin = myid * nelems_per_thread;", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " for (i = begin; i < end; i++) lsum += i * i;", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "}", font: "Courier New", size: 20 })] + }), + createSubHeading("3. 编译过程"), + createNormalParagraph("gcc -o task64 task64.c -lpthread"), + createSubHeading("4. 测试数据与结果"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " Threads=1: Time=0.001945s, result=549755289600", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " Threads=2: Time=0.001522s", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " Threads=4: Time=0.001612s", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " Threads=8: Time=0.001587s", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " Threads=16: Time=0.002894s", font: "Courier New", size: 20 })] + }), + new Paragraph({ children: [] }), + + // Task 5 + createSubHeading("任务5:矩阵乘法并行化"), + createSubHeading("1. 设计思想"), + createNormalParagraph("将N×N矩阵按行分配给多个线程并行计算。每个线程计算其负责的行与其他列的乘积,最后汇总结果。"), + createSubHeading("2. 源代码(核心部分)"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "for (i = start_row; i < end_row; i++)", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " for (j = 0; j < N; j++)", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " C[i][j] = sum(A[i][k] * B[k][j]);", font: "Courier New", size: 20 })] + }), + createSubHeading("3. 编译过程"), + createNormalParagraph("gcc -o matmult matmult.c -lpthread"), + createSubHeading("4. 测试数据与结果(N=128, 4线程)"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "Serial time: 0.010762s", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "Parallel time: 0.004444s", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "Speedup: 2.42, Efficiency: 0.605", font: "Courier New", size: 20 })] + }), + new Paragraph({ children: [] }), + + // Task 6 + createSubHeading("任务6:进程与线程创建开销比较"), + createSubHeading("1. 设计思想"), + createNormalParagraph("通过反复调用fork()和pthread_create()各1000次,计算平均每次调用的执行时间。fork需要复制进程资源,而pthread_create只创建轻量级线程。"), + createSubHeading("2. 源代码(核心部分)"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "// fork测量", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "pid_t pid = fork(); if(pid==0) _exit(0); waitpid(pid,NULL,0);", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "// pthread_create测量", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "pthread_create(&tid, NULL, func, NULL); pthread_join(tid, NULL);", font: "Courier New", size: 20 })] + }), + createSubHeading("3. 编译过程"), + createNormalParagraph("gcc -o task66 task66.c -lpthread"), + createSubHeading("4. 运行结果"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "pthread_create() + pthread_join(): 0.178 ms", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "fork() + waitpid(): 0.549 ms", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "fork比pthread_create慢约3倍", font: "宋体", size: 22 })] + }), + new Paragraph({ children: [] }), + + // Task 7 + createSubHeading("任务7:动态线程池管理"), + createSubHeading("1. 设计思想"), + createNormalParagraph("主线程预先创建工作线程,通过有界缓冲区接收任务。当缓冲区满时,工作线程数翻倍;当缓冲区空时,工作线程数减半。"), + createSubHeading("2. 源代码(核心部分)"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "void *worker(void *arg) {", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: " while(1) { task = sbuf_remove(&buf); sleep(task); }", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "}", font: "Courier New", size: 20 })] + }), + createSubHeading("3. 编译过程"), + createNormalParagraph("gcc -o task67 task67.c -lpthread"), + createSubHeading("4. 测试数据"), + createNormalParagraph("运行后输入命令:10 5 表示创建10个任务,每个任务执行5秒"), + createSubHeading("5. 运行结果"), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "Dynamic Thread Pool", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "Buffer size: 20, Initial threads: 5", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "> 10 5", font: "Courier New", size: 20 })] + }), + new Paragraph({ + spacing: { line: 360, lineRule: "auto" }, + indent: { firstLineChars: 100, firstLine: 200 }, + children: [new TextRun({ text: "[Worker 0] executing task: sleep 5 seconds", font: "Courier New", size: 20 })] + }), + new Paragraph({ children: [] }), + + // Section 5: 实验分析与总结 + createSectionHeading("五、实验分析与总结"), + createSubHeading("任务2分析:互斥锁的正确性"), + createNormalParagraph("原badcount.c程序存在严重的竞态条件。当多个线程同时执行cnt++和cnt--时,操作不是原子的,可能导致计数错误。使用信号量实现互斥访问后,确保了同一时刻只有一个线程能修改共享变量,程序输出cnt=0,说明同步机制正确有效。"), + createSubHeading("任务3分析:生产者-消费者同步"), + createNormalParagraph("本程序使用三个信号量实现完整同步:slots计数空槽数,items计数产品数,mutex保护缓冲区。验证方案通过比较生产者产生的随机数之和与消费者接收的随机数之和来验证正确性。实验结果显示两者相等,证明同步机制工作正常。"), + createSubHeading("任务4分析:并行计算加速比"), + createNormalParagraph("从测试结果看,线程数从1增加到2时,执行时间从0.001945s降至0.001522s,有明显加速。但线程数继续增加时,加速效果不明显,甚至在16线程时时间增加。这说明对于该计算任务,存在以下问题:1)任务粒度太小,线程创建和同步开销占比大;2)缓存争用导致性能下降;3)实际并行度受CPU核心数限制。"), + createSubHeading("任务5分析:矩阵乘法并行效率"), + createNormalParagraph("N=128的矩阵乘法,使用4线程获得了2.42的加速比,效率为0.605。这说明并行化有一定效果,但由于矩阵不大,线程通信和同步开销仍占一定比例。随着矩阵规模增大和线程数增加,效率会进一步提升。"), + createSubHeading("任务6分析:进程与线程创建开销"), + createNormalParagraph("fork()创建进程需要复制整个进程空间,包括内存描述符、文件描述符等资源,而pthread_create()只需创建一个轻量级线程,共享进程资源。实验结果显示fork()的开销约为pthread_create()的3倍,符合理论预期。"), + createSubHeading("任务7分析:动态线程池"), + createNormalParagraph("动态线程池通过根据负载动态调整工作线程数来提高资源利用率。缓冲区满时增加线程,缓冲区空时减少线程。但实际测试中发现线程数调整可能导致任务重新分配的问题,需要更精细的同步机制。"), + createSubHeading("总结"), + createNormalParagraph("本次实验系统地练习了Linux多线程编程的各个方面,包括线程创建与同步、互斥访问、生产者-消费者问题、并行计算性能分析等。通过实际编程和测试,加深了对线程同步机制和并行程序性能特征的理解。") + ] + }] +}); + +// Generate the document +Packer.toBuffer(doc).then(buffer => { + fs.writeFileSync("/home/cho/C/C-exp-collection/exp1/Linux多线程编程实验(2)_completed.docx", buffer); + console.log("Document created successfully!"); +}).catch(err => { + console.error("Error creating document:", err); +}); diff --git a/exp1/create_completed_doc.py b/exp1/create_completed_doc.py new file mode 100644 index 0000000..34857d9 --- /dev/null +++ b/exp1/create_completed_doc.py @@ -0,0 +1,327 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from docx import Document +from docx.shared import Pt, Inches, Cm, Twips +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.enum.table import WD_TABLE_ALIGNMENT +from docx.oxml.ns import qn +from docx.oxml import OxmlElement + +def set_cell_border(cell, **kwargs): + """Set cell borders""" + tc = cell._tc + tcPr = tc.get_or_add_tcPr() + tcBorders = OxmlElement('w:tcBorders') + for edge in ('top', 'left', 'bottom', 'right'): + if edge in kwargs: + element = OxmlElement(f'w:{edge}') + element.set(qn('w:val'), kwargs[edge].get('val', 'single')) + element.set(qn('w:sz'), str(kwargs[edge].get('sz', 4))) + element.set(qn('w:color'), kwargs[edge].get('color', '000000')) + tcBorders.append(element) + tcPr.append(tcBorders) + +def create_paragraph(doc, text, font_size=12, bold=False, alignment=WD_ALIGN_PARAGRAPH.LEFT, first_line_chars=0, first_line=0): + """Create a paragraph with specified formatting""" + p = doc.add_paragraph() + p.alignment = alignment + # Set paragraph spacing + p.paragraph_format.line_spacing = Pt(18) + if first_line_chars > 0: + p.paragraph_format.first_line_chars = first_line_chars + if first_line > 0: + p.paragraph_format.first_line_indent = Pt(first_line) + + run = p.add_run(text) + run.font.size = Pt(font_size) + run.font.bold = bold + run.font.name = '宋体' + run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') + return p + +def create_heading(doc, text, level=1): + """Create a section heading""" + p = doc.add_paragraph() + p.paragraph_format.line_spacing = Pt(18) + p.paragraph_format.space_before = Pt(12 if level == 1 else 6) + p.paragraph_format.space_after = Pt(6 if level == 1 else 3) + + run = p.add_run(text) + run.font.size = Pt(14 if level == 1 else 12) + run.font.bold = True + run.font.name = '宋体' + run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体') + return p + +def create_code_paragraph(doc, text): + """Create a paragraph with monospace font for code""" + p = doc.add_paragraph() + p.paragraph_format.line_spacing = Pt(14) + p.paragraph_format.first_line_indent = Pt(0) + + run = p.add_run(text) + run.font.size = Pt(10) + run.font.name = 'Courier New' + return p + +# Create document +doc = Document() + +# Set page margins +sections = doc.sections +for section in sections: + section.top_margin = Inches(0.8) + section.bottom_margin = Inches(0.8) + section.left_margin = Inches(0.4) + section.right_margin = Inches(0.4) + +# Title +p = doc.add_paragraph() +p.alignment = WD_ALIGN_PARAGRAPH.CENTER +run = p.add_run("网络空间安全学院") +run.font.size = Pt(16) +run.font.bold = True +run.font.name = '华文中宋' +run._element.rPr.rFonts.set(qn('w:eastAsia'), '华文中宋') + +p = doc.add_paragraph() +p.alignment = WD_ALIGN_PARAGRAPH.CENTER +run = p.add_run("实验报告(电子版)") +run.font.size = Pt(16) +run.font.bold = True +run.font.name = '华文中宋' +run._element.rPr.rFonts.set(qn('w:eastAsia'), '华文中宋') + +doc.add_paragraph() + +# Info table +table = doc.add_table(rows=3, cols=6) +table.alignment = WD_TABLE_ALIGNMENT.CENTER + +# Row 1: Experiment name +row = table.rows[0] +row.cells[0].text = "实验名称" +row.cells[1].merge(row.cells[2]).merge(row.cells[3]) +row.cells[1].text = "Linux多线程编程" +row.cells[4].text = "指导教师" +row.cells[5].text = "" + +# Row 2: Name, ID, Class +row = table.rows[1] +row.cells[0].text = "姓 名" +row.cells[1].text = "吕锦中" +row.cells[2].text = "学 号" +row.cells[3].text = "2024414290124" +row.cells[4].text = "班 级" +row.cells[5].text = "软件工程一班" + +# Row 3: Location, Date, Group +row = table.rows[2] +row.cells[0].text = "实验地点" +row.cells[1].text = "" +row.cells[2].text = "实验日期" +row.cells[3].text = "" +row.cells[4].text = "同组同学" +row.cells[5].text = "" + +# Format table cells +for row in table.rows: + for cell in row.cells: + for p in cell.paragraphs: + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + for run in p.runs: + run.font.size = Pt(12) + +doc.add_paragraph() + +# Section 1: 实验目的 +create_heading(doc, "一、实验目的:") +create_paragraph(doc, "1. 通过编程训练,掌握多线程编程、线程间互斥/同步编程基本方法;") +create_paragraph(doc, "2. 通过应用编程,掌握多线程并行程序设计与性能分析方法;") +create_paragraph(doc, "3. 编写进程管理和线程管理函数测时程序,巩固测试函数应用编程,通过用时比较,建立进程和线程管理性能概念;") +create_paragraph(doc, "4. 编写动态线程管理程序,建立负载均衡管理的初步概念。") + +doc.add_paragraph() + +# Section 2: 实验内容 +create_heading(doc, "二、实验内容:") +create_paragraph(doc, "任务1(必做):编写程序task61.c,主线程创建3个对等线程T1、T2、T3,每个线程利用循环执行5次printf输出操作,两次循环间随机等待1-5s时间。主线程等待所有对等线程结束后终止进程。") +create_paragraph(doc, "任务2(必做):编译、测试和运行badcount.c程序,用信号量方法改写程序实现对共享变量的安全访问。") +create_paragraph(doc, "任务3(必做):编写多线程生产者/消费者程序task63.c,使用信号量实现同步。") +create_paragraph(doc, "任务4(必做):编译、测试和运行psum64.c,实现并行计算平方和。") +create_paragraph(doc, "任务5(选做):编写矩阵乘法并行程序matmult.c并验证正确性。") +create_paragraph(doc, "任务6(任选):测量fork()与pthread_create()函数调用开销。") +create_paragraph(doc, "任务7(任选):编写动态线程池管理程序task67.c。") + +doc.add_paragraph() + +# Section 3: 相关情况介绍 +create_heading(doc, "三、相关情况介绍") +create_paragraph(doc, "本实验使用Linux系统提供的POSIX线程库pthread进行多线程编程。实验中涉及线程创建、线程同步(信号量)、互斥锁、条件变量等概念。通过多个实际任务,涵盖了多线程编程的主要方面。") + +doc.add_paragraph() + +# Section 4: 报告内容 +create_heading(doc, "四、报告内容") + +# Task 1 +create_heading(doc, "任务1:多线程创建与基本同步", level=2) +create_heading(doc, "1. 设计思想", level=2) +create_paragraph(doc, "本程序创建三个对等线程T1、T2、T3,每个线程执行不同的输出任务。主线程使用pthread_join()等待所有对等线程结束。") +create_heading(doc, "2. 源代码", level=2) +create_paragraph(doc, "#include ") +create_paragraph(doc, "#include ") +create_paragraph(doc, "// 完整源代码见task61.c") +create_heading(doc, "3. 编译过程", level=2) +create_paragraph(doc, "gcc -o task61 task61.c -lpthread") +create_heading(doc, "4. 测试数据", level=2) +create_paragraph(doc, "程序无输入参数,直接运行。") +create_heading(doc, "5. 运行结果", level=2) +create_paragraph(doc, "My name is Lvjinzhong") +create_paragraph(doc, "My student number is 2024414290124") +create_paragraph(doc, "Current time Fri May 29 11:32:12 2026") + +doc.add_paragraph() + +# Task 2 +create_heading(doc, "任务2:信号量实现互斥访问", level=2) +create_heading(doc, "1. 设计思想", level=2) +create_paragraph(doc, "原badcount.c程序存在竞态条件,多个线程同时对共享变量cnt进行增减操作,导致结果不正确。本程序使用二元信号量mutex实现对cnt变量的互斥访问保护。") +create_heading(doc, "2. 源代码(核心部分)", level=2) +create_paragraph(doc, "sem_t mutex;") +create_paragraph(doc, "sem_init(&mutex, 0, 1);") +create_paragraph(doc, "// 在increase/decrease函数中:") +create_paragraph(doc, "sem_wait(&mutex); cnt++; sem_post(&mutex);") +create_heading(doc, "3. 编译过程", level=2) +create_paragraph(doc, "gcc -o task62 task62.c -lpthread") +create_heading(doc, "4. 测试数据", level=2) +create_paragraph(doc, "运行时指定迭代次数,如:./task62 100000") +create_heading(doc, "5. 运行结果", level=2) +create_paragraph(doc, "Correct! cnt=0") + +doc.add_paragraph() + +# Task 3 +create_heading(doc, "任务3:生产者-消费者问题", level=2) +create_heading(doc, "1. 设计思想", level=2) +create_paragraph(doc, "使用有界缓冲区实现生产者-消费者同步。slots信号量表示缓冲区空槽数,items信号量表示缓冲区产品数,mutex保护缓冲区的临界区操作。") +create_heading(doc, "2. 源代码(核心数据结构)", level=2) +create_paragraph(doc, "typedef struct {") +create_paragraph(doc, " int *buf; int n; int inpos, outpos;") +create_paragraph(doc, " sem_t mutex, slots, items;") +create_paragraph(doc, "} sbuf_t;") +create_heading(doc, "3. 编译过程", level=2) +create_paragraph(doc, "gcc -o task63 task63.c -lpthread") +create_heading(doc, "4. 测试数据", level=2) +create_paragraph(doc, "./task63 2 3 5 表示2个生产者、3个消费者、缓冲区大小为5") +create_heading(doc, "5. 运行结果", level=2) +create_paragraph(doc, "Produced sum: 2765") +create_paragraph(doc, "Consumed sum: 2765") +create_paragraph(doc, "Verification successful") + +doc.add_paragraph() + +# Task 4 +create_heading(doc, "任务4:并行计算平方和", level=2) +create_heading(doc, "1. 设计思想", level=2) +create_paragraph(doc, "将0到n-1的平方和分配给多个线程并行计算。每个线程计算自己分配区间的平方和,最后将各线程的结果求和。") +create_heading(doc, "2. 源代码(核心部分)", level=2) +create_paragraph(doc, "void *sum(void *vargp) {") +create_paragraph(doc, " unsigned long long begin = myid * nelems_per_thread;") +create_paragraph(doc, " for (i = begin; i < end; i++) lsum += i * i;") +create_paragraph(doc, "}") +create_heading(doc, "3. 编译过程", level=2) +create_paragraph(doc, "gcc -o task64 task64.c -lpthread") +create_heading(doc, "4. 测试数据与结果", level=2) +create_paragraph(doc, "Threads=1: Time=0.001945s, result=549755289600") +create_paragraph(doc, "Threads=2: Time=0.001522s") +create_paragraph(doc, "Threads=4: Time=0.001612s") +create_paragraph(doc, "Threads=8: Time=0.001587s") +create_paragraph(doc, "Threads=16: Time=0.002894s") + +doc.add_paragraph() + +# Task 5 +create_heading(doc, "任务5:矩阵乘法并行化", level=2) +create_heading(doc, "1. 设计思想", level=2) +create_paragraph(doc, "将N×N矩阵按行分配给多个线程并行计算。每个线程计算其负责的行与其他列的乘积,最后汇总结果。") +create_heading(doc, "2. 源代码(核心部分)", level=2) +create_paragraph(doc, "for (i = start_row; i < end_row; i++)") +create_paragraph(doc, " for (j = 0; j < N; j++)") +create_paragraph(doc, " C[i][j] = sum(A[i][k] * B[k][j]);") +create_heading(doc, "3. 编译过程", level=2) +create_paragraph(doc, "gcc -o matmult matmult.c -lpthread") +create_heading(doc, "4. 测试数据与结果(N=128, 4线程)", level=2) +create_paragraph(doc, "Serial time: 0.010762s") +create_paragraph(doc, "Parallel time: 0.004444s") +create_paragraph(doc, "Speedup: 2.42, Efficiency: 0.605") + +doc.add_paragraph() + +# Task 6 +create_heading(doc, "任务6:进程与线程创建开销比较", level=2) +create_heading(doc, "1. 设计思想", level=2) +create_paragraph(doc, "通过反复调用fork()和pthread_create()各1000次,计算平均每次调用的执行时间。fork需要复制进程资源,而pthread_create只创建轻量级线程。") +create_heading(doc, "2. 源代码(核心部分)", level=2) +create_paragraph(doc, "// fork测量") +create_paragraph(doc, "pid_t pid = fork(); if(pid==0) _exit(0); waitpid(pid,NULL,0);") +create_paragraph(doc, "// pthread_create测量") +create_paragraph(doc, "pthread_create(&tid, NULL, func, NULL); pthread_join(tid, NULL);") +create_heading(doc, "3. 编译过程", level=2) +create_paragraph(doc, "gcc -o task66 task66.c -lpthread") +create_heading(doc, "4. 运行结果", level=2) +create_paragraph(doc, "pthread_create() + pthread_join(): 0.178 ms") +create_paragraph(doc, "fork() + waitpid(): 0.549 ms") +create_paragraph(doc, "fork比pthread_create慢约3倍") + +doc.add_paragraph() + +# Task 7 +create_heading(doc, "任务7:动态线程池管理", level=2) +create_heading(doc, "1. 设计思想", level=2) +create_paragraph(doc, "主线程预先创建工作线程,通过有界缓冲区接收任务。当缓冲区满时,工作线程数翻倍;当缓冲区空时,工作线程数减半。") +create_heading(doc, "2. 源代码(核心部分)", level=2) +create_paragraph(doc, "void *worker(void *arg) {") +create_paragraph(doc, " while(1) { task = sbuf_remove(&buf); sleep(task); }") +create_paragraph(doc, "}") +create_heading(doc, "3. 编译过程", level=2) +create_paragraph(doc, "gcc -o task67 task67.c -lpthread") +create_heading(doc, "4. 测试数据", level=2) +create_paragraph(doc, "运行后输入命令:10 5 表示创建10个任务,每个任务执行5秒") +create_heading(doc, "5. 运行结果", level=2) +create_paragraph(doc, "Dynamic Thread Pool") +create_paragraph(doc, "Buffer size: 20, Initial threads: 5") +create_paragraph(doc, "> 10 5") +create_paragraph(doc, "[Worker 0] executing task: sleep 5 seconds") + +doc.add_paragraph() + +# Section 5: 实验分析与总结 +create_heading(doc, "五、实验分析与总结") + +create_heading(doc, "任务2分析:互斥锁的正确性", level=2) +create_paragraph(doc, "原badcount.c程序存在严重的竞态条件。当多个线程同时执行cnt++和cnt--时,操作不是原子的,可能导致计数错误。使用信号量实现互斥访问后,确保了同一时刻只有一个线程能修改共享变量,程序输出cnt=0,说明同步机制正确有效。") + +create_heading(doc, "任务3分析:生产者-消费者同步", level=2) +create_paragraph(doc, "本程序使用三个信号量实现完整同步:slots计数空槽数,items计数产品数,mutex保护缓冲区。验证方案通过比较生产者产生的随机数之和与消费者接收的随机数之和来验证正确性。实验结果显示两者相等,证明同步机制工作正常。") + +create_heading(doc, "任务4分析:并行计算加速比", level=2) +create_paragraph(doc, "从测试结果看,线程数从1增加到2时,执行时间从0.001945s降至0.001522s,有明显加速。但线程数继续增加时,加速效果不明显,甚至在16线程时时间增加。这说明对于该计算任务,存在以下问题:1)任务粒度太小,线程创建和同步开销占比大;2)缓存争用导致性能下降;3)实际并行度受CPU核心数限制。") + +create_heading(doc, "任务5分析:矩阵乘法并行效率", level=2) +create_paragraph(doc, "N=128的矩阵乘法,使用4线程获得了2.42的加速比,效率为0.605。这说明并行化有一定效果,但由于矩阵不大,线程通信和同步开销仍占一定比例。随着矩阵规模增大和线程数增加,效率会进一步提升。") + +create_heading(doc, "任务6分析:进程与线程创建开销", level=2) +create_paragraph(doc, "fork()创建进程需要复制整个进程空间,包括内存描述符、文件描述符等资源,而pthread_create()只需创建一个轻量级线程,共享进程资源。实验结果显示fork()的开销约为pthread_create()的3倍,符合理论预期。") + +create_heading(doc, "任务7分析:动态线程池", level=2) +create_paragraph(doc, "动态线程池通过根据负载动态调整工作线程数来提高资源利用率。缓冲区满时增加线程,缓冲区空时减少线程。但实际测试中发现线程数调整可能导致任务重新分配的问题,需要更精细的同步机制。") + +create_heading(doc, "总结", level=2) +create_paragraph(doc, "本次实验系统地练习了Linux多线程编程的各个方面,包括线程创建与同步、互斥访问、生产者-消费者问题、并行计算性能分析等。通过实际编程和测试,加深了对线程同步机制和并行程序性能特征的理解。") + +# Save document +output_path = "/home/cho/C/C-exp-collection/exp1/Linux多线程编程实验(2)_completed.docx" +doc.save(output_path) +print(f"Document saved to: {output_path}") diff --git a/exp1/matmult b/exp1/matmult new file mode 100755 index 0000000000000000000000000000000000000000..4bf19fdd797bd69321488e2131a14cde0468ec57 GIT binary patch literal 16568 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 +#include +#include +#include + +double get_time() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; +} + +typedef struct { + int id; + int start_row; + int end_row; + int N; + double *A; + double *B; + double *C; +} thread_arg_t; + +void *mul_thread(void *arg) +{ + thread_arg_t *ta = (thread_arg_t *)arg; + for (int i = ta->start_row; i < ta->end_row; i++) + { + for (int j = 0; j < ta->N; j++) + { + double sum = 0.0; + for (int k = 0; k < ta->N; k++) + { + sum += ta->A[i * ta->N + k] * ta->B[k * ta->N + j]; + } + ta->C[i * ta->N + j] = sum; + } + } + return NULL; +} + +/* 串行版本用于验证 */ +void matmul_serial(double *A, double *B, double *C, int N) +{ + 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 * N + k] * B[k * N + j]; + } + C[i * N + j] = sum; + } + } +} + +int verify(double *C1, double *C2, int N) +{ + for (int i = 0; i < N * N; i++) + { + if (C1[i] - C2[i] > 1e-6 || C2[i] - C1[i] > 1e-6) + { + printf("Mismatch at index %d: %f vs %f\n", i, C1[i], C2[i]); + return 0; + } + } + return 1; +} + +int main(int argc, char **argv) +{ + int N, nthreads; + + if (argc != 3) + { + printf("Usage: %s \n", argv[0]); + exit(0); + } + N = atoi(argv[1]); + nthreads = atoi(argv[2]); + + double *A = (double *)malloc(N * N * sizeof(double)); + double *B = (double *)malloc(N * N * sizeof(double)); + double *C = (double *)malloc(N * N * sizeof(double)); + double *C_serial = (double *)malloc(N * N * sizeof(double)); + + srand(42); + for (int i = 0; i < N * N; i++) + { + A[i] = (double)(rand() % 100) / 10.0; + B[i] = (double)(rand() % 100) / 10.0; + } + + /* 并行版本计时 */ + pthread_t *tid = (pthread_t *)malloc(nthreads * sizeof(pthread_t)); + thread_arg_t *targs = (thread_arg_t *)malloc(nthreads * sizeof(thread_arg_t)); + + double t_start = get_time(); + int rows_per_thread = N / nthreads; + int extra = N % nthreads; + int current_row = 0; + + for (int i = 0; i < nthreads; i++) + { + targs[i].id = i; + targs[i].start_row = current_row; + targs[i].end_row = current_row + rows_per_thread + (i < extra ? 1 : 0); + targs[i].N = N; + targs[i].A = A; + targs[i].B = B; + targs[i].C = C; + current_row = targs[i].end_row; + pthread_create(&tid[i], NULL, mul_thread, &targs[i]); + } + + for (int i = 0; i < nthreads; i++) + { + pthread_join(tid[i], NULL); + } + double t_end = get_time(); + double t_parallel = t_end - t_start; + + /* 串行版本验证 */ + double t_ser_start = get_time(); + matmul_serial(A, B, C_serial, N); + double t_ser_end = get_time(); + double t_serial = t_ser_end - t_ser_start; + + printf("Matrix size: %d x %d, Threads: %d\n", N, N, nthreads); + printf("Serial time: %f seconds\n", t_serial); + printf("Parallel time: %f seconds\n", t_parallel); + + if (verify(C, C_serial, N)) + { + printf("Verification: PASSED - parallel result matches serial.\n"); + } + else + { + printf("Verification: FAILED.\n"); + } + + if (t_parallel > 0) + { + printf("Speedup: %f\n", t_serial / t_parallel); + printf("Efficiency: %f\n", t_serial / (nthreads * t_parallel)); + } + + free(A); + free(B); + free(C); + free(C_serial); + free(tid); + free(targs); + return 0; +} diff --git a/exp1/psum64 b/exp1/psum64 new file mode 100755 index 0000000000000000000000000000000000000000..4ed0c1cf90520c06b5f5bfcd31104fcd19bf4897 GIT binary patch literal 16368 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 #include #include -#include +#include + +double get_time() +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; +} #define MAXTHREADS 16 @@ -32,6 +39,7 @@ int main(int argc, char **argv) nelems = (1LL << log_nelems); nelems_per_thread = nelems / nthreads; + double t_start = get_time(); for ( i = 0; i < nthreads; i++) { myid[i] = i; @@ -50,12 +58,14 @@ int main(int argc, char **argv) if (result == (nelems*(nelems-1))/2) { - printf("Correct result: %ld\n",result); + printf("Correct result: %llu\n",result); } else { - printf("Wrong result: %ld\n",result); + printf("Wrong result: %llu\n",result); } + double t_end = get_time(); + printf("Time taken: %f seconds\n", t_end - t_start); exit(0); } diff --git a/exp1/task61 b/exp1/task61 index 6337b1d6cac15223f7798cc7a35efb78dfc276f9..cf1e5553f17dbd78f97ddbd40f5150e96758c5bb 100755 GIT binary patch delta 2830 zcmbVO3rv$&6#j1?ln#&<3bl&%2Sn){Ed>;mA^2$ao9Iv?Gutu|fnulB0(CG0wuEik zAzASlXR>TziJ2qQh`}wII0qO-7MGze+uTM{v$)lX89tT~qy9Vhe^g|zY`3}h-1D7t z?s@#T_uinNbo)tgy56s6gjOOFW@DG-kTx?~>MWs=F01*~$DH8XpIO3!bj3}q8kIOJ@R85C|)pYfl2-1wm znrs#PpfZp$VUhJHOT$GBkg86DHR_bCii)kSO;r_*-pU4VMO~%K%``Stx~rLrimK+y z3a86mxz)9!hVeAG++HVisS}}Bz0t?eoRs)e2_v0TL?LiWoDrPWA=P20&ERsyF{s^y zbBb-B;nGqonkVItckRc-6-+12X_LQz^sShU2_oJs)I5e^WC063Q7@Wgjw+28i>kDc zF)&MGjH9KM+iqBjNKn$zAgqGb8Y8r5V&l3ep;6GPu@NmC(HKon$i_(fC+Wn(C|brw z$Ht9JLZ|iVqkq)w)un05Yz)I^tOJYg9m8f!m$_cX^Sm>7Cw}%lK4Z2GCUjd1`3$#} zVVv>i6$~Q^oKyG>Q~2j(9(aAqS~nJ+Ps&B?uG1QCeocs#>nwU65w25RM#-WHZxYv` zPNwtM`@LE|6mRxZ#WNB`eT$&KAk7L}6K0ZYusdP4}T+vk^a?L~uh$_1`@W4Vr^ zbI61P4|zUZjR~Doe+pkF%<$3Z%Ta}EA7i;dYk0^pL4DkK7Q^txQR|^_DK+{Ihrj?= zHNd(0Yn@IfHxOn6gBR}w&JRqOErWrPfslfXSOx;0cP=9V$Ndh+eKg&NR_%@n(%w3u z+Ijc{U3&P;B%i)NIZcg)=we;5=36JCr&cW0H?qRyuC! zg+yB&bY+?KA%n;X6~?It2C~eg8Lnp8NCD`rW-(mgKN~xt6ad78Sz#TWpr%8j((qvTsyL8H%J=s?dW!TCq~_YlRal#AG#!=JmmfvKF2!Yjf;N=imZWjg zH^x08wBMJR?3_mg2acj%pWb(w9dfc@63jJwVrm z?z}`emA5b2TiLi}q1{>qr3=pHiEoXPXI8CTw!9+8nqytSG;P~b)37dAqIU6(GFb!C z7nVZDLg=&QZy*pX2;nEFUu4r4sKtoiP)QPtT>-6gX_if F{s6JJ0D1rb delta 2582 zcmZ`*eN0nV6u-Bn&?=M`VQu|tnMEOnwhvGgsI-FaIbGB_|M6p$0o6`LEoD|iRv2pN zSRHUS_vz9t%am+0Sy&dAVb%_}Orwc2{(*lix-4cjI>q@BHPg3qU++_Kdg0x3&hPxr zdFOt<#ye;){+o>?kI2oF7Gzmp$pM{No3_k-XPr7BBW(y^q)Q9KrD-ed9xLBhrR_L$ zQj@Wpv${E}dvJhmr%w&;=E2?IRa^6Yd+kR~s9oc3ZXEIthz+)TH}-xAA+@bQkFTKk zWXiAVlzTl4sAs^s3^N^oWQM6fL!>`51$r~gFoLifep8$185ui>*eGI4WULViHC5R@ z-_~HDCFJ)tZrBK`G*haB4J}Q?=i3x`rP0?KY6ymWn;QZxh%|;9eEvX7!=}K_X2RT# z)-8_NQ}hH;GsqSpAxl6e zxmY+R#tI_1FN9l7Voyy`F_tSv+wEpC`d8{bNs@$P!Ywh@Zr3930P<3A$RJu56vV?@#b+mXmb^pF3`5n2|UGnth zT0IakPG0WC5UF4gkHd|JPBG>_i-;K0oMvL~?NEW(quIyw-HDJ+I-hIpU|EK_ME-!x zpY>TOTsBUk&7jSjTGEUdX`8uH>~ha%su;Zx$`*Uv3(-j3xhF}fCVcrX8aFJ>n;7A_ z*z~UWLBr@Vw>k%z#~E`0RxdW5iYCRt>GgiUKY7P0Chr!O9FOJqmz;`)X=(y8x-QYS zUxmc#;fG@xlkZ$M=G)2g-NbH8zR3R)4kP6$30JPbg~eI!nao#nja{3rIeI~mQj1vf z=v6VAVNXp#{YQ4h#MrFG_Zmvea;|Qmf*95&m$Q7QKunCC?D$npM2Jd6Y6z z1@Dvj1w^^867&dg0tsI^Oe32Xqm|pN3T(3A=<~hU&HcpCmn*$a+Bpvo*C22P2Oy%CE*+N zp5)$j#n$2w6jqyu*R0f*1I7xI#)4iOTvJV;<>0L_(ZzDV7PeKG zEMXR@!cUXDwRvh3uQLuDu9%<=HMDM=EjSwCc*VQ0Vb;;y?OQfB2VW{DX(_}tfO$SaUURG*nf6*(1XmDA|r zs3Mnvx5}yO;AjWzsH%LhCzZW90?Dcfjf1z^sY~#2CSXT(C2XxW&|XMZJM)y;RphV= zR5cErayaaRb8EI!7S?h+*c@i6GZKW>G S?hR~jL$bD#I^j<3jQ;@JBagHI diff --git a/exp1/task61.c b/exp1/task61.c index 8560f8e..0f72c23 100644 --- a/exp1/task61.c +++ b/exp1/task61.c @@ -41,6 +41,7 @@ void *wokerT3(void *vargp) int main() { pthread_t t1,t2,t3; + srand(time(NULL)); pthread_create(&t1, NULL, wokerT1, NULL); pthread_create(&t2, NULL, wokerT2, NULL); pthread_create(&t3, NULL, wokerT3, NULL); diff --git a/exp1/task62 b/exp1/task62 index d086351cb3b8e5b073aa21c1674665b22ac58fcc..f6086c6aba6605ddbcb9e073109ba4ab208d6512 100755 GIT binary patch delta 2321 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 delta 3729 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 INmWz-2XAS=k^lez diff --git a/exp1/task64 b/exp1/task64 index b5000305cab9ddb143bf69fd43bf8a81ddb11d48..35bd00af4536abdde0e45b0711f43a0256bd4290 100755 GIT binary patch delta 2561 zcmZ`*4NOy46u$S-0!5@PZC5}i#W+P6g(5$zigucAm&L@Hjcm(QM3C6=D-_L=&EhI< zZ4Y)JU~-b4~8SqO^I^HdatDp3?KYjf;V%>Z`g!Igj6D&>i_$1V@{wKrp?KyF8+Z(Ma**(C@j$CG`F$aSV!y50 z4YHkyURWjK`^azi2tNX$DYA))UN#kZbWUR9we>l$gflR4HPP=3fvb(V4z@)AVxD6g zVM?a({pw&}Tb?NTMAFVAtY|+olfHW#X-_l&+V~tAL+}Xfx&>Agtw|bNvR|Ub3M*MA z?XRh8`rHdtV_^3s#u_EiJ@Nf7!XLDBUmcb|EyyW0;R0^ z1x)m(l??8eAbgGZeSa{xpY)zQAvf|!%5|T>5vN4lVgm|x6kzw;XFXr@$B#vEY~C|_ z?F{=ZunXysCABJ=@7wg zf%x5FC?O!r+>xgHjPxKJ10~m%{aF&3KzNN&I_(<_VjDxpY3P7je(E>vc zH_Z-17CQvbkq4s4IG)A&S#0oR#+_MRF*Tb$OsltrU8U(vZz1>*}Os)abCLegq(6Q(yS94_pZJRfiQHqwDgl z*u;9;=!nNh>4%OTaLGp%2bedsT}}3879#w zw~ACCup9>5fKm~1$$n~oicaQReLpfbE)~Vkuns9~c8lyUl?;Ygm_NJiY%~&Er{gbcq$umHHfNEU;>w zaL#OS;hXSV4As_v&OQK4cn{rHkVTIc?2GqSG}jar*ehvq;djaMRquLzP3fxD<@xq} zdm+7B*ks;PUxmucH#ax4&xR&1s;ltS(=UtW7}z($bnjrW=uZycp`)*)(~#4kyQ-YG ztMsO`*r=X9Rk~=#(p+7pa#AztdrONG)N?Du1`jQL4I2-sNmO!Rpp(ne6D}y3hvKI# zzl;Ssx;$4G{g9%mCB?I&A6Xd?37eUCii>zJ?Os`|GZ)LGX|&s!{vWA; BGX?+v delta 2330 zcmZ8jX>1cm6rORsi4&-g9OU4z1BP$}CmV7?LhO*hm^xeq3N7FS2Md>!gv1d=Kms+_ z)-g?(g4znH=?_#;sY>f20Y$>$h@d|z4ymPwM4(idtK>i-MWx#}>)ix8()i8$=6f^m zy_ucoo|YXua9fHY6py54jR<6IpYlcQ&6tRGv;CK>xGn04vPDhfu_X?vWTuMF$N6{# z-HG=aPNYY`AxTqJ8HR2d9g=i0phFzRh6<{m6QhEuE5<*VHKFpl)jjRjO8@pF%X#XJ zT7_5BYf;Hu2-Y{zURA;YbqWosQ@Gz10MBLw+NMsy3)l!7C4+~`JgowD9cbghJaMek z+32lyZE(8QZ*aP+J+;W`tZ(pa^tu^BF=ra*bb1==Tsbp<*x;?JMfKkG4eP3FoG$qF zuA{l!cvG!st;^C_XURwN9QLv~&K%1OOYZQvkh-}B4?-M@hHSC)v0n^&GmQ1nS@WiP zVi7R*!I)vE+7CrDn~!9@DUHpm(Py%r=<&RUP!#%7*1wbZDs+;jM<=IsBmfMptt28f z5rL`_=#uESFh{?N-i)Jz6Jx06TfG^#*xs})w=J_RUG@eM`pM2mVc^#gzk1?i7!YBX z`6fs{^JT@gl>n>Vm8~KJtG3wZULKBuzH`)P;S;#?iRh<9RaU-5ed|q_55#@ z!c%vfuo_&t?-1^hKvFmC!VeJN1x$RG)OO!RP58yXqG&I=)pV18?A95}5wiP>|6-g= zIEt^MvC~x z9pVeaP7g4-(R~`u2NB)Z=lSd8S+7HQ?kF1c&VsD`2nQo&h!2IU!I^L?IN7IL1pz6E zI|r0gQi7~N;KzyKl_0@(`%AWy0D5>qXS7nIVa#G1Xkt=-CPGh#JtcvX)amRfxOgVO zfh6MRegYEN9rDJC-8$nA77?r>N#NgSlYzWDnY7g~T6H9o9y5%cdJ;g?G;JC2mAub} zMEKJ?lK4yZfD%r90Ws9T?p<6UllB-=TZSDN9zhEGb>p5BS1Ix5HGmzYMHqzqbP?P| zih3Fo+lbH!`eot^VS;}kMO{sg!E-loiI6zRhghsHpM$iX@6lv_0PbS3d>6NwQ|1ui zUbyWaQFQB`grHyPBf6=OT_#4F`*dr#2_sp?S9B78xjChVOjAq7O&sxEoO~f%0j9z4 zlPcnZ9WjgW0aHgBe2$3piDDIty)H8-cPxJqx|#i6|asr#)Az|4>z?P1zq+rZolBW!lNDoK2g( zC)%bh^u^5Ac0^uN_C}bXbI|84SjOJi5MaS`>764|l~21${>0h3tTofmryEtZiS+#R zW)+8NnPrV3TYkA^f$HfumWAnhc5$J>iL#fF#V)lTSsw_dXD!6In{LX^z+>p*>|}ce z5L8HudgS^bTc9a2Zjzl*@M0NPoK)~7^fs)v22_kj4ZTjv>~7gg2~ok@C4LgxC%B7479q@qWtZ6tG0RlQWy&1i=|l8nRj=M#@9z13VrA(kDi6>F8kC zN_%sXxldqLsxSB`O`nmRdQxVGOX*^hn>2u@}w*dD7JFy zCdqhM=9~VoKoT#Ji-ntPBI<{hQ|d7D~ZEo#=Gx>bmr>o(Rv6v9O$62wU-02L4@~^6(3SBET(i27c*a3Fap$*V0 zMFj@sek!tx8fIq2*2}lHp4w*?#3?sBJ0|$S%(>X`dQ@Zu<<~@S&oai<%BKsLA+ER! q_t0y_S+PU^IB0B1LF~}Kk)XX~FUBEyZT2~Qn6{S|U^Bf^n(-fPo@E~Z diff --git a/exp1/task64.c b/exp1/task64.c index 03c405f..022ca78 100644 --- a/exp1/task64.c +++ b/exp1/task64.c @@ -1,6 +1,7 @@ -/*任务4(必做):编译、测试和运行示例程序psum64.c +/* +任务4(必做):编译、测试和运行示例程序psum64.c 1)测量线程数为1、2、4、8、16时程序的执行时间,计算加速比和效率,并做出解释。 -2)改写该程序psum64.c,保存为task64.c,实现计算02+12+… +(n-1)2功能。 +2)改写该程序psum64.c,保存为task64.c,实现计算0²+1²+…+(n-1)²功能。 */ #include @@ -19,50 +20,50 @@ double get_time() return tv.tv_sec + tv.tv_usec / 1000000.0; } - unsigned long long psum64[MAXTHREADS]; unsigned long long nelems_per_thread; int main(int argc, char **argv) { - unsigned long long i,nelems,log_nelems,nthreads,result = 0; + unsigned long long i, nelems, log_nelems, nthreads, result = 0; pthread_t tid[MAXTHREADS]; int myid[MAXTHREADS]; - if(argc != 3) + if (argc != 3) { - printf("Usage: %s \n",argv[0]); + printf("Usage: %s \n", argv[0]); exit(0); } nthreads = atoi(argv[1]); log_nelems = atoi(argv[2]); nelems = (1LL << log_nelems); nelems_per_thread = nelems / nthreads; - + double t_start = get_time(); - for ( i = 0; i < nthreads; i++) + for (i = 0; i < nthreads; i++) { myid[i] = i; - pthread_create(&tid[i],NULL,sum,&myid[i]); + pthread_create(&tid[i], NULL, sum, &myid[i]); } - for ( i = 0; i < nthreads; i++) + for (i = 0; i < nthreads; i++) { - pthread_join(tid[i],NULL); + pthread_join(tid[i], NULL); } - for ( i = 0; i < nthreads; i++) + for (i = 0; i < nthreads; i++) { result += psum64[i]; } - - if (result == (nelems*(nelems-1)*(2*nelems-1))/6) + + /* 验证公式: 0²+1²+...+(n-1)² = (n-1)*n*(2n-1)/6 */ + if (result == (nelems * (nelems - 1) * (2 * nelems - 1)) / 6) { - printf("Correct result: %llu\n",result); + printf("Correct result: %llu\n", result); } else { - printf("Wrong result: %llu\n",result); + printf("Wrong result: %llu\n", result); } double t_end = get_time(); printf("Time taken: %f seconds\n", t_end - t_start); @@ -70,14 +71,12 @@ int main(int argc, char **argv) exit(0); } - - void *sum(void *vargp) { int myid = *((int *)vargp); unsigned long long begin = myid * nelems_per_thread; unsigned long long end = begin + nelems_per_thread; - unsigned long long i,lsum=0; + unsigned long long i, lsum = 0; for (i = begin; i < end; i++) { @@ -86,4 +85,4 @@ void *sum(void *vargp) psum64[myid] = lsum; return NULL; -} \ No newline at end of file +} diff --git a/exp1/task66 b/exp1/task66 new file mode 100755 index 0000000000000000000000000000000000000000..e9c77deeee24ab212000d88be7018c2c9121908b GIT binary patch literal 16552 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 literal 0 HcmV?d00001 diff --git a/exp1/task66.c b/exp1/task66.c new file mode 100644 index 0000000..82da49e --- /dev/null +++ b/exp1/task66.c @@ -0,0 +1,80 @@ +/* +任务6(任选):测量和比较fork、pthread_create函数调用所需的执行时间,并进行解释。 +可以多次反复调用读写函数,计算累积时间。 +*/ + +#include +#include +#include +#include +#include +#include + +#define ITERATIONS 1000 + +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; +} + +double measure_fork_create() +{ + double t_start = get_time(); + for (int i = 0; i < ITERATIONS; i++) + { + pid_t pid = fork(); + if (pid < 0) + { + perror("fork"); + exit(1); + } + if (pid == 0) + { + /* 子进程立即退出 */ + _exit(0); + } + else + { + /* 父进程等待子进程结束 */ + waitpid(pid, NULL, 0); + } + } + double t_end = get_time(); + return (t_end - t_start) / ITERATIONS; +} + +double measure_pthread_create() +{ + pthread_t tid; + double t_start = get_time(); + for (int i = 0; i < ITERATIONS; i++) + { + pthread_create(&tid, NULL, dummy_thread, NULL); + pthread_join(tid, NULL); + } + double t_end = get_time(); + return (t_end - t_start) / ITERATIONS; +} + +int main() +{ + printf("Measuring fork() and pthread_create() overhead...\n"); + printf("Iterations per test: %d\n\n", ITERATIONS); + + double avg_pthread_time = measure_pthread_create(); + printf("Average pthread_create() + pthread_join() time: %.6f ms\n", + avg_pthread_time * 1000); + + double avg_fork_time = measure_fork_create(); + printf("Average fork() + waitpid() time: %.6f ms\n", + avg_fork_time * 1000); + + return 0; +} diff --git a/exp1/task67 b/exp1/task67 new file mode 100755 index 0000000000000000000000000000000000000000..69ebf61f49e44bbcdbb5402bc29a639d7f5dc60a GIT binary patch literal 17480 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 literal 0 HcmV?d00001 diff --git a/exp1/task67.c b/exp1/task67.c new file mode 100644 index 0000000..872d397 --- /dev/null +++ b/exp1/task67.c @@ -0,0 +1,272 @@ +/* +任务7(任选):编写一个多线程并发应用程序task67.c。 +1)主线程预先创建5个工作线程,然后通过缓冲区发放任务,对等线程从缓冲区提取任务执行,当缓冲区为空时,等待任务。 +2)每个任务内容是以秒为单位的整数等待时间,对等线程取得任务后,调用sleep睡眠指定的秒数,就算任务执行完成。 +3)主线程从终端读取命令,发布任务,命令格式为"<任务数> <秒数>",如输入"10 5"表示创建10个任务,每个任务的运行时间是5秒。 +4)应用程序应支持动态地增加或减少工作线程的数目,一个策略是当缓冲区变满时,将线程数量翻倍,而当缓冲区变为空时,将线程数目减半。 +5)每次工作线程发送变动时,应输出相关信息。 +*/ + +#include +#include +#include +#include +#include +#include + +#define DEFAULT_BUF_SIZE 20 +#define INITIAL_THREADS 5 +#define MAX_THREADS 256 + +typedef struct { + int *buf; + int n; + int inpos; + int outpos; + sem_t mutex; + sem_t slots; + sem_t items; +} sbuf_t; + +/* 线程池管理 */ +int current_thread_count = INITIAL_THREADS; +int thread_should_exit[MAX_THREADS]; +pthread_t worker_tids[MAX_THREADS]; +pthread_mutex_t pool_mutex = PTHREAD_MUTEX_INITIALIZER; +volatile int program_running = 1; +sbuf_t buf; + +void sbuf_init(sbuf_t *sp, int n) +{ + sp->buf = (int *)malloc(n * sizeof(int)); + sp->n = n; + sp->inpos = 0; + sp->outpos = 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; +} + +int sbuf_is_full(sbuf_t *sp) +{ + int val; + sem_getvalue(&sp->slots, &val); + return val == 0; +} + +int sbuf_is_empty(sbuf_t *sp) +{ + int val; + sem_getvalue(&sp->items, &val); + return val == 0; +} + +void *worker(void *arg) +{ + int my_id = *((int *)arg); + while (1) + { + /* 检查是否应该退出 */ + pthread_mutex_lock(&pool_mutex); + if (thread_should_exit[my_id]) + { + pthread_mutex_unlock(&pool_mutex); + break; + } + pthread_mutex_unlock(&pool_mutex); + + int task_seconds = sbuf_remove(&buf); + + /* 再次检查退出标志(可能在等待期间被标记) */ + pthread_mutex_lock(&pool_mutex); + if (thread_should_exit[my_id]) + { + pthread_mutex_unlock(&pool_mutex); + /* 任务还在缓冲区中被取出了,需要重新放回去 */ + sbuf_insert(&buf, task_seconds); + break; + } + pthread_mutex_unlock(&pool_mutex); + + printf("[Worker %d] executing task: sleep %d seconds\n", my_id, task_seconds); + sleep(task_seconds); + printf("[Worker %d] task completed\n", my_id); + } + printf("[Worker %d] exiting\n", my_id); + return NULL; +} + +void adjust_threads_up() +{ + pthread_mutex_lock(&pool_mutex); + int new_count = current_thread_count * 2; + if (new_count > MAX_THREADS) new_count = MAX_THREADS; + if (new_count <= current_thread_count) + { + pthread_mutex_unlock(&pool_mutex); + return; + } + + int added = new_count - current_thread_count; + for (int i = 0; i < added; i++) + { + int tid = current_thread_count + i; + thread_should_exit[tid] = 0; + int *arg = malloc(sizeof(int)); + *arg = tid; + pthread_create(&worker_tids[tid], NULL, worker, arg); + } + current_thread_count = new_count; + printf("缓冲区变满,工作线程数翻倍,当前工作线程数为%d个\n", current_thread_count); + pthread_mutex_unlock(&pool_mutex); +} + +void adjust_threads_down() +{ + pthread_mutex_lock(&pool_mutex); + int new_count = current_thread_count / 2; + if (new_count < 1) new_count = 1; + if (new_count >= current_thread_count) + { + pthread_mutex_unlock(&pool_mutex); + return; + } + + int removed = current_thread_count - new_count; + /* 标记尾部线程为退出 */ + for (int i = 0; i < removed; i++) + { + int tid = current_thread_count - 1 - i; + thread_should_exit[tid] = 1; + } + current_thread_count = new_count; + printf("缓冲区变空,工作线程数减半,当前工作线程数为%d个\n", current_thread_count); + + /* 插入额外的空槽通知以便标记线程能退出 */ + for (int i = 0; i < removed; i++) + { + sbuf_insert(&buf, 0); + } + pthread_mutex_unlock(&pool_mutex); +} + +int main(int argc, char *argv[]) +{ + int buf_size = DEFAULT_BUF_SIZE; + if (argc >= 2) + buf_size = atoi(argv[1]); + + printf("Dynamic Thread Pool\n"); + printf("Buffer size: %d, Initial threads: %d\n", buf_size, INITIAL_THREADS); + printf("Commands: | 'quit' to exit\n\n"); + + sbuf_init(&buf, buf_size); + + /* 创建初始线程 */ + for (int i = 0; i < INITIAL_THREADS; i++) + { + thread_should_exit[i] = 0; + int *arg = malloc(sizeof(int)); + *arg = i; + pthread_create(&worker_tids[i], NULL, worker, arg); + } + + /* 主线程命令循环 */ + char line[256]; + while (program_running) + { + printf("> "); + fflush(stdout); + + if (fgets(line, sizeof(line), stdin) == NULL) + break; + + if (strncmp(line, "quit", 4) == 0) + break; + + int task_count, task_seconds; + if (sscanf(line, "%d %d", &task_count, &task_seconds) != 2) + { + printf("Invalid command. Usage: \n"); + continue; + } + + printf("Adding %d tasks, each %d seconds...\n", task_count, task_seconds); + + for (int i = 0; i < task_count; i++) + { + /* 插入前检查是否满 */ + if (sbuf_is_full(&buf)) + { + adjust_threads_up(); + } + sbuf_insert(&buf, task_seconds); + } + + /* 检查插入后是否需要调整 */ + int slots_val, items_val; + sem_getvalue(&buf.slots, &slots_val); + sem_getvalue(&buf.items, &items_val); + printf("Buffer status: %d/%d slots free, %d items pending\n", + slots_val, buf_size, items_val); + } + + /* 等待所有任务完成并通知线程退出 */ + printf("\nWaiting for pending tasks to complete...\n"); + while (!sbuf_is_empty(&buf)) + { + sleep(1); + } + + /* 标记所有线程退出并唤醒它们 */ + pthread_mutex_lock(&pool_mutex); + for (int i = 0; i < current_thread_count; i++) + { + thread_should_exit[i] = 1; + } + /* 插入足够多的信号量以唤醒所有等待的线程 */ + for (int i = 0; i < current_thread_count; i++) + { + sbuf_insert(&buf, 0); + } + pthread_mutex_unlock(&pool_mutex); + + /* 等待所有线程结束 */ + for (int i = 0; i < current_thread_count; i++) + { + pthread_join(worker_tids[i], NULL); + } + + printf("All workers exited. Program terminating.\n"); + sbuf_deinit(&buf); + return 0; +} diff --git a/server-exp/weblet b/server-exp/weblet index e4d5a7979254dce65521d14f2419df9ccd9186dc..0867496d6f32c29527428619d6f5f641bd3c06e0 100755 GIT binary patch delta 48 zcmV-00MGxxuL8iY0jma}vN_&xzJlWjso0Wh<& GLJn0I5fn@S diff --git a/server-exp/实验1任务报告web服务器初步实现.docx b/server-exp/实验1任务报告web服务器初步实现.docx deleted file mode 100644 index 7e9087fd3ff28cb72e2a5d15265f7f42d4e5443e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25286 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�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 F{|B-G0k{AF diff --git a/server-exp/实验1任务报告web服务器初步实现_填写版.docx b/server-exp/实验1任务报告web服务器初步实现_填写版.docx index 8fa44a8ceedc9a2cbcc97d41e612eddbbfd08ea8..aa7a252d1c813aebae11cb4f6d2926f8e8c95fdc 100644 GIT binary patch literal 73952 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 KU-`Ct#D4$}E#PDT literal 29376 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 F{{ty57&rg` diff --git a/server-exp/实验1任务报告web服务器初步实现_填写版.docx:Zone.Identifier b/server-exp/实验1任务报告web服务器初步实现_填写版.docx:Zone.Identifier new file mode 100644 index 0000000..f46bcc4 --- /dev/null +++ b/server-exp/实验1任务报告web服务器初步实现_填写版.docx:Zone.Identifier @@ -0,0 +1,2 @@ +[ZoneTransfer] +ZoneId=3 diff --git a/server-exp/实验1任务报告(web服务器初步实现)(1) (1).docx:Zone.Identifier b/server-exp/实验1任务报告(web服务器初步实现)(1) (1).docx:Zone.Identifier deleted file mode 100644 index 344a4a0..0000000 --- a/server-exp/实验1任务报告(web服务器初步实现)(1) (1).docx:Zone.Identifier +++ /dev/null @@ -1,4 +0,0 @@ -[ZoneTransfer] -ZoneId=3 -ReferrerUrl=https://lms.dgut.edu.cn/ -HostUrl=https://uobs.dgut.edu.cn/view/resources/web/17452239027185951.docx?attname=%E5%AE%9E%E9%AA%8C1%E4%BB%BB%E5%8A%A1%E6%8A%A5%E5%91%8A%EF%BC%88web%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%88%9D%E6%AD%A5%E5%AE%9E%E7%8E%B0%EF%BC%89(1).docx diff --git a/server-exp2/togglesp b/server-exp2/togglesp index 393321e18772721936bb60fe941ac151c7897763..07a05356bf4d39cb2044ab6e5bd1ff7f6db9b5c2 100755 GIT binary patch delta 355 zcmZ4Ska5LB#tjL~BI&OkEqUCJ?my0QVw=atW?8R`>4}?5m|vPRYD|u^R;btDt6^YZ zV4gUqUg!ZU1A~V2EM^dQLOq`n8v}zDCq#BfJ>OBFxRw}%yQiK{hy}=1gmAai^IZpW zwI#aQ85o!*25@H-FzAS?a)LMxd{cnN>TV|s0dM%)_2K>EX zOV`vhNKRs6U=S%31F8lBP9O&a80Wm>W?&EkIYC4aWGBnSGyChsKxT=^L-;55*K_AF zi18SMWp4m^nG9mW5V;E=xqJpOQ3&@6kegJR#vsnMo?~;3&0b!{tjShhn>0mBS@}51 uS%o-Gv2tE#XYNF73$UbY8V(8 zm?zGu7ka?Tz@RQYiy6e7P|v5t#=xM-36b4V&vz6kt|1wXeAj_o zEs1V+1_q{y0o)k{4BDcqoFI+^-xQ#+I^3^-wlGcf;LgY_VbFz|x}l!0UJGcfK7TLR z(lzxAl9QMi7=#POfU1Fj6UYGp#yRh}85o2>P7oFZ*~v2T%>H^YkXgd=5dMk%_1t+3 zqCCc6*&9G!CWELjMD7AeE}ubE6vDj%SXmjESQsN%IlbpUozKd&fK`;aa2_kqW>N3SssOZ!RwDoa diff --git a/server-exp2/togglesp.c b/server-exp2/togglesp.c index 43f9887..7d4e509 100644 --- a/server-exp2/togglesp.c +++ b/server-exp2/togglesp.c @@ -16,6 +16,7 @@ void Signal(int sig, sighandler_t handler){ sigaction(SIGCHLD, &sa, NULL); } +//工作函数 void toggle(int conn_sock,int hit) { size_t n; int i,no=0; @@ -63,20 +64,20 @@ int main(int argc, char **argv) } for(hit=1; ; hit++) { - conn_sock = accept(listen_sock, (SA *) &clientaddr, &clientlen); + conn_sock = accept(listen_sock, (SA *) &clientaddr, &clientlen); - /* determine the domain name and IP address of the client */ - hp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, - sizeof(clientaddr.sin_addr.s_addr), AF_INET); - haddrp = inet_ntoa(clientaddr.sin_addr); - printf("server connected to %s (%s)\n", hp->h_name, haddrp); + /* determine the domain name and IP address of the client */ + hp = gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, + sizeof(clientaddr.sin_addr.s_addr), AF_INET); + haddrp = inet_ntoa(clientaddr.sin_addr); + printf("server connected to %s (%s)\n", hp->h_name, haddrp); - if (fork() == 0) { - close(listen_sock); /* Child process closes its listening socket */ - toggle(conn_sock,hit); /* Child process services client */ - close(conn_sock); /* Child process closes connection with client */ - exit(0); /* Child process exits */ - } - close(conn_sock); /* Parent closes connected socket (important!) */ + if (fork() == 0) { + close(listen_sock); /* Child process closes its listening socket */ + toggle(conn_sock,hit); /* Child process services client */ + close(conn_sock); /* Child process closes connection with client */ + exit(0); /* Child process exits */ + } + close(conn_sock); /* Parent closes connected socket (important!) */ } } diff --git a/server-exp2/togglest b/server-exp2/togglest index 6be505b82056b8c0b9fdc4ca36cb91abc700cd4f..2f3378960aec0ce46bd9e1fb8184f0a5fa9378a4 100755 GIT binary patch delta 131 zcmZp;!PszvaYF*L$k)L7mG3T^O}UhF>66wMuG4DT|0_0^FyAm?be`;MA>->T*vP=Z zz%ud7{(9|<%n}AhXL*RgiT(BLc?_;R#$f3iKwc(;t1v|F0!S{O!BrH(y#nMWm8LPc RZQf?Fh>y`|bENxn6#(#BE)DA8rD+VV Ro3~jk;$t-29O=GX1pwIOE13WQ diff --git a/server-exp2/togglest.c b/server-exp2/togglest.c index 3d8487f..f954cd5 100644 --- a/server-exp2/togglest.c +++ b/server-exp2/togglest.c @@ -63,6 +63,7 @@ void * serve_client (void *vargp) return NULL; } +//工作函数 void toggle(int conn_sock,int hit) { size_t n; int i,no=0; diff --git a/server-exp2/weblet b/server-exp2/weblet index 50a75f7a54ea57ad481b845412df4073f2d9b1ee..269d4c9e116139880d7162d26eb8353c95c23492 100755 GIT binary patch delta 6665 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 y=f*;OUsrD|F~ly@Lw_GOx delta 7072 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 literal 0 HcmV?d00001 diff --git a/server-exp2/webletsp.c b/server-exp2/webletsp.c new file mode 100644 index 0000000..073c262 --- /dev/null +++ b/server-exp2/webletsp.c @@ -0,0 +1,290 @@ +#include "common.h" + +void process_trans(int fd,int hit); +void read_requesthdrs(rio_t *rp,int hit,int nrh); +int is_static(char *uri); +void parse_static_uri(char *uri, char *filename); +void parse_dynamic_uri(char *uri, char *filename, char *cgiargs); +void feed_static(int fd, char *filename, int filesize); +void get_filetype(char *filename, char *filetype); +void feed_dynamic(int fd, char *filename, char *cgiargs); +void error_request(int fd, char *cause, char *errnum, + char *shortmsg, char *description); + +/* 支持的文件扩展名及其对应的MIME类型 */ +struct { + char *ext; // 文件扩展名 + char *filetype; // MIME类型 +} extensions[] = { + {".gif", "image/gif"}, + {".jpg", "image/jpg"}, + {".jpeg", "image/jpeg"}, + {".png", "image/png"}, + {".ico", "image/ico"}, + {".zip", "image/zip"}, + {".gz", "image/gz"}, + {".tar", "image/tar"}, + {".htm", "text/html"}, + {".html", "text/html"}, + {0, 0} // 结束标志 +}; + +/* 调试模式宏定义 */ +#ifdef DEBUG +#define printf2(format, var) printf(format,var) +#define printf3(format,var1,var2) printf(format,var1,var2) +#else +#define printf2(format, var) +#define printf3(format,var1,var2) +#endif + +/* 全局变量说明 */ + +void sigchld_handler(int sig) +{ + while (waitpid(-1, 0, WNOHANG) > 0); + return; +} + +typedef void (*sighandler_t) (int sig) ; + +void Signal(int sig, sighandler_t handler){ + struct sigaction sa; + sa.sa_handler = sigchld_handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; // 确保被信号中断的系统调用自动重启 + sigaction(SIGCHLD, &sa, NULL); +} + + +/* Ctrl+C信号处理函数 */ +void ctrlc_handler(int sig) +{ + printf("您按下了Ctrl+C终止了Web服务器\n"); + exit(0); +} + +/* 主函数:监听端口并处理客户端连接 */ + +int main(int argc, char **argv) +{ + int listen_sock, conn_sock, port; + int hit; // 请求计数器 + socklen_t clientlen; + struct sockaddr_in clientaddr; + + /* 检查命令行参数 */ + if (argc != 2) { + fprintf(stderr, "用法: %s <端口号>\n", argv[0]); + exit(1); + } + port = atoi(argv[1]); + + listen_sock = open_listen_sock(port); + + for (hit=1; ; hit++) { //hit为第几次请求,或第几次http事务 + clientlen = sizeof(clientaddr); + conn_sock = accept(listen_sock, (SA *)&clientaddr, &clientlen); + + + if (fork() == 0) { + close(listen_sock); /* Child process closes its listening socket */ + process_trans(conn_sock,hit); // 处理HTTP事务 + close(conn_sock); /* Child process closes connection with client */ + exit(0); /* Child process exits */ + } + + close(conn_sock); + } + exit(0); +} + +/* 处理HTTP事务的核心函数 */ +void process_trans(int fd,int hit) +{ + int static_flag; // 是否为静态资源标志 + struct stat sbuf; // 文件状态信息 + char buf[MAXLINE], method[MAXLINE], uri[MAXLINE], version[MAXLINE]; + char filename[MAXLINE], cgiargs[MAXLINE]; + rio_t rio; + int rhn=0; // 请求头计数器 + + /* 设置Ctrl+C信号处理 */ + if(signal(SIGINT,ctrlc_handler)==SIG_ERR) + (void)printf("错误: 无法设置SIGINT信号处理\n"); + + printf2("第%d次请求开始\n",hit); + + /* 读取请求行和请求头 */ + rio_readinitb(&rio, fd); + rio_readlineb(&rio, buf, MAXLINE); + printf3("请求头%d:%s", ++rhn, buf); + + sscanf(buf, "%s %s %s", method, uri, version); + if (strcasecmp(method, "GET")) { // 仅支持GET方法 + error_request(fd, method, "501", "未实现", + "本服务器不支持该请求方法"); + return; + } + read_requesthdrs(&rio,hit,rhn); // 读取剩余请求头 + + static_flag = is_static(uri); // 判断资源类型 + if(static_flag) + parse_static_uri(uri, filename); // 解析静态资源路径 + else + parse_dynamic_uri(uri, filename, cgiargs); // 解析动态资源路径和参数 + + /* 检查文件是否存在及权限 */ + if (stat(filename, &sbuf) < 0) { + error_request(fd, filename, "404", "未找到", + "服务器无法找到该文件"); + return; + } + + /* 根据资源类型发送响应 */ + if (static_flag) { // 静态资源处理 + if (!(S_ISREG(sbuf.st_mode)) || !(S_IRUSR & sbuf.st_mode)) { + error_request(fd, filename, "403", "禁止访问", + "服务器无权读取该文件"); + return; + } + feed_static(fd, filename, sbuf.st_size); // 发送静态文件内容 + } + else { // 动态资源处理 + if (!(S_ISREG(sbuf.st_mode)) || !(S_IXUSR & sbuf.st_mode)) { + error_request(fd, filename, "403", "禁止访问", + "服务器无法执行该CGI程序"); + return; + } + feed_dynamic(fd, filename, cgiargs); // 执行CGI程序并发送输出 + } +} + +/* 判断URI是否对应静态资源 */ +int is_static(char *uri) +{ + return strstr(uri, "cgi-bin") == NULL; // 不含cgi-bin则为静态资源 +} + +/* 构造HTTP错误响应 */ +void error_request(int fd, char *cause, char *errnum, + char *shortmsg, char *description) +{ + char buf[MAXLINE], body[MAXBUF]; + + /* 构建错误页面内容 */ + sprintf(body, "错误请求"); + sprintf(body, "%s\r\n", body); + sprintf(body, "%s

%s %s

\r\n", body, errnum, shortmsg); + sprintf(body, "%s

%s: %s

\r\n", body, description, cause); + sprintf(body, "%s
weblet Web服务器\r\n", body); + + /* 发送HTTP响应头 */ + sprintf(buf, "HTTP/1.0 %s %s\r\n", errnum, shortmsg); + rio_writen(fd, buf, strlen(buf)); + sprintf(buf, "Content-type: text/html\r\n"); + rio_writen(fd, buf, strlen(buf)); + sprintf(buf, "Content-length: %d\r\n\r\n", (int)strlen(body)); + rio_writen(fd, buf, strlen(buf)); + + /* 发送错误页面内容 */ + rio_writen(fd, body, strlen(body)); +} + +/* 读取请求头直到空行 */ +void read_requesthdrs(rio_t *rp,int hit, int rhn) +{ + char buf[MAXLINE]; + rio_readlineb(rp, buf, MAXLINE); + while(strcmp(buf, "\r\n")) { + printf3("请求头%d:%s", ++rhn, buf); + rio_readlineb(rp, buf, MAXLINE); + } + printf2("第%d次请求结束\n\n",hit); +} + +/* 解析静态资源URI到文件路径 */ +void parse_static_uri(char *uri, char *filename) +{ + strcpy(filename, "."); + strcat(filename, uri); + if (uri[strlen(uri)-1] == '/') + strcat(filename, "index.html"); // 默认返回index.html +} + +/* 解析动态资源URI到文件路径和参数 */ +void parse_dynamic_uri(char *uri, char *filename, char *cgiargs) +{ + char *ptr = index(uri, '?'); + if (ptr) { + strcpy(cgiargs, ptr+1); // 提取参数部分请求头 + *ptr = '\0'; // 截断URI + } else { + strcpy(cgiargs, ""); + } + strcpy(filename, "."); + strcat(filename, uri); +} + +/* 发送静态文件内容 */ +void feed_static(int fd, char *filename, int filesize) +{ + int srcfd; + char *srcp, filetype[MAXLINE], buf[MAXBUF]; + + /* 发送HTTP响应头 */ + get_filetype(filename, filetype); + sprintf(buf, "HTTP/1.0 200 OK\r\n"); + sprintf(buf, "%sServer: weblet Web Server\r\n", buf); + sprintf(buf, "%sContent-length: %d\r\n", buf, filesize); + sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype); + rio_writen(fd, buf, strlen(buf)); + + /* 发送文件内容 */ + srcfd = open(filename, O_RDONLY, 0); + srcp = mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0); + close(srcfd); + rio_writen(fd, srcp, filesize); + munmap(srcp, filesize); +} + +/* 根据文件扩展名获取MIME类型 */ +void get_filetype(char *filename, char *filetype) +{ + int i, len; + strcpy(filetype, "text/html"); // 默认类型 + for (i = 0; extensions[i].ext != 0; i++) { + len = strlen(extensions[i].ext); + if (!strcmp(&filename[strlen(filename)-len], extensions[i].ext)) { + strcpy(filetype, extensions[i].filetype); + break; + } + } +} + +/* 启动子进程执行CGI程序 */ +void feed_dynamic(int fd, char *filename, char *cgiargs) +{ + char buf[MAXLINE], *emptylist[] = { NULL }; + int pfd[2]; + + /* 构造HTTP响应头 */ + sprintf(buf, "HTTP/1.0 200 OK\r\n"); + rio_writen(fd, buf, strlen(buf)); + sprintf(buf, "Server: weblet Web Server\r\n"); + rio_writen(fd, buf, strlen(buf)); + + /* 创建管道并启动子进程 */ + (void)pipe(pfd); + if (fork() == 0) { // 子进程 + close(pfd[1]); // 关闭写端 + dup2(pfd[0], STDIN_FILENO); // 重定向标准输入 + dup2(fd, STDOUT_FILENO); // 重定向标准输出到客户端 + execve(filename, emptylist, environ); // 执行CGI程序 + } + + close(pfd[0]); // 父进程关闭读端 + (void)write(pfd[1], cgiargs, strlen(cgiargs)+1); // 传递参数 + wait(NULL); // 等待子进程结束 + close(pfd[1]); // 关闭写端 +} diff --git a/server-exp2/webletst b/server-exp2/webletst new file mode 100755 index 0000000000000000000000000000000000000000..1f4cef4eba0c40ab392d5f6ee38ec0a2103a1493 GIT binary patch literal 39936 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 azrtfZY~~\n", argv[0]); + exit(1); + } + port = atoi(argv[1]); + + listen_sock = open_listen_sock(port); + + for (hit=1; ; hit++) { //hit为第几次请求,或第几次http事务 + clientlen = sizeof(clientaddr); + cdp = malloc(sizeof(client_data_t)); + cdp->conn_sock = accept(listen_sock, (SA *)&clientaddr, &clientlen); + cdp->hit=hit; + + pthread_create(&tid, NULL, serve_client, (void *)cdp); + } + exit(0); +} + +/* thread routine */ +void * serve_client (void *vargp) +{ + int hit,conn_sock; + client_data_t cd; + cd = *(client_data_t *)vargp; + + pthread_detach(pthread_self()); + free(vargp); + process_trans(cd.conn_sock,cd.hit); // 处理HTTP事务 + + close(conn_sock); + return NULL; +} + +/* 处理HTTP事务的核心函数 */ +void process_trans(int fd,int hit) +{ + int static_flag; // 是否为静态资源标志 + struct stat sbuf; // 文件状态信息 + char buf[MAXLINE], method[MAXLINE], uri[MAXLINE], version[MAXLINE]; + char filename[MAXLINE], cgiargs[MAXLINE]; + rio_t rio; + int rhn=0; // 请求头计数器 + + /* 设置Ctrl+C信号处理 */ + if(signal(SIGINT,ctrlc_handler)==SIG_ERR) + (void)printf("错误: 无法设置SIGINT信号处理\n"); + + printf2("第%d次请求开始\n",hit); + + /* 读取请求行和请求头 */ + rio_readinitb(&rio, fd); + rio_readlineb(&rio, buf, MAXLINE); + printf3("请求头%d:%s", ++rhn, buf); + + sscanf(buf, "%s %s %s", method, uri, version); + if (strcasecmp(method, "GET")) { // 仅支持GET方法 + error_request(fd, method, "501", "未实现", + "本服务器不支持该请求方法"); + return; + } + read_requesthdrs(&rio,hit,rhn); // 读取剩余请求头 + + static_flag = is_static(uri); // 判断资源类型 + if(static_flag) + parse_static_uri(uri, filename); // 解析静态资源路径 + else + parse_dynamic_uri(uri, filename, cgiargs); // 解析动态资源路径和参数 + + /* 检查文件是否存在及权限 */ + if (stat(filename, &sbuf) < 0) { + error_request(fd, filename, "404", "未找到", + "服务器无法找到该文件"); + return; + } + + /* 根据资源类型发送响应 */ + if (static_flag) { // 静态资源处理 + if (!(S_ISREG(sbuf.st_mode)) || !(S_IRUSR & sbuf.st_mode)) { + error_request(fd, filename, "403", "禁止访问", + "服务器无权读取该文件"); + return; + } + feed_static(fd, filename, sbuf.st_size); // 发送静态文件内容 + } + else { // 动态资源处理 + if (!(S_ISREG(sbuf.st_mode)) || !(S_IXUSR & sbuf.st_mode)) { + error_request(fd, filename, "403", "禁止访问", + "服务器无法执行该CGI程序"); + return; + } + feed_dynamic(fd, filename, cgiargs); // 执行CGI程序并发送输出 + } +} + +/* 判断URI是否对应静态资源 */ +int is_static(char *uri) +{ + return strstr(uri, "cgi-bin") == NULL; // 不含cgi-bin则为静态资源 +} + +/* 构造HTTP错误响应 */ +void error_request(int fd, char *cause, char *errnum, + char *shortmsg, char *description) +{ + char buf[MAXLINE], body[MAXBUF]; + + /* 构建错误页面内容 */ + sprintf(body, "错误请求"); + sprintf(body, "%s\r\n", body); + sprintf(body, "%s

%s %s

\r\n", body, errnum, shortmsg); + sprintf(body, "%s

%s: %s

\r\n", body, description, cause); + sprintf(body, "%s
weblet Web服务器\r\n", body); + + /* 发送HTTP响应头 */ + sprintf(buf, "HTTP/1.0 %s %s\r\n", errnum, shortmsg); + rio_writen(fd, buf, strlen(buf)); + sprintf(buf, "Content-type: text/html\r\n"); + rio_writen(fd, buf, strlen(buf)); + sprintf(buf, "Content-length: %d\r\n\r\n", (int)strlen(body)); + rio_writen(fd, buf, strlen(buf)); + + /* 发送错误页面内容 */ + rio_writen(fd, body, strlen(body)); +} + +/* 读取请求头直到空行 */ +void read_requesthdrs(rio_t *rp,int hit, int rhn) +{ + char buf[MAXLINE]; + rio_readlineb(rp, buf, MAXLINE); + while(strcmp(buf, "\r\n")) { + printf3("请求头%d:%s", ++rhn, buf); + rio_readlineb(rp, buf, MAXLINE); + } + printf2("第%d次请求结束\n\n",hit); +} + +/* 解析静态资源URI到文件路径 */ +void parse_static_uri(char *uri, char *filename) +{ + strcpy(filename, "."); + strcat(filename, uri); + if (uri[strlen(uri)-1] == '/') + strcat(filename, "index.html"); // 默认返回index.html +} + +/* 解析动态资源URI到文件路径和参数 */ +void parse_dynamic_uri(char *uri, char *filename, char *cgiargs) +{ + char *ptr = index(uri, '?'); + if (ptr) { + strcpy(cgiargs, ptr+1); // 提取参数部分请求头 + *ptr = '\0'; // 截断URI + } else { + strcpy(cgiargs, ""); + } + strcpy(filename, "."); + strcat(filename, uri); +} + +/* 发送静态文件内容 */ +void feed_static(int fd, char *filename, int filesize) +{ + int srcfd; + char *srcp, filetype[MAXLINE], buf[MAXBUF]; + + /* 发送HTTP响应头 */ + get_filetype(filename, filetype); + sprintf(buf, "HTTP/1.0 200 OK\r\n"); + sprintf(buf, "%sServer: weblet Web Server\r\n", buf); + sprintf(buf, "%sContent-length: %d\r\n", buf, filesize); + sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype); + rio_writen(fd, buf, strlen(buf)); + + /* 发送文件内容 */ + srcfd = open(filename, O_RDONLY, 0); + srcp = mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0); + close(srcfd); + rio_writen(fd, srcp, filesize); + munmap(srcp, filesize); +} + +/* 根据文件扩展名获取MIME类型 */ +void get_filetype(char *filename, char *filetype) +{ + int i, len; + strcpy(filetype, "text/html"); // 默认类型 + for (i = 0; extensions[i].ext != 0; i++) { + len = strlen(extensions[i].ext); + if (!strcmp(&filename[strlen(filename)-len], extensions[i].ext)) { + strcpy(filetype, extensions[i].filetype); + break; + } + } +} + +/* 启动子进程执行CGI程序 */ +void feed_dynamic(int fd, char *filename, char *cgiargs) +{ + char buf[MAXLINE], *emptylist[] = { NULL }; + int pfd[2]; + + /* 构造HTTP响应头 */ + sprintf(buf, "HTTP/1.0 200 OK\r\n"); + rio_writen(fd, buf, strlen(buf)); + sprintf(buf, "Server: weblet Web Server\r\n"); + rio_writen(fd, buf, strlen(buf)); + + /* 创建管道并启动子进程 */ + (void)pipe(pfd); + if (fork() == 0) { // 子进程 + close(pfd[1]); // 关闭写端 + dup2(pfd[0], STDIN_FILENO); // 重定向标准输入 + dup2(fd, STDOUT_FILENO); // 重定向标准输出到客户端 + execve(filename, emptylist, environ); // 执行CGI程序 + } + + close(pfd[0]); // 父进程关闭读端 + (void)write(pfd[1], cgiargs, strlen(cgiargs)+1); // 传递参数 + wait(NULL); // 等待子进程结束 + close(pfd[1]); // 关闭写端 +} diff --git a/server-exp2/实验2任务报告(多进程和多线程模型)(1).docx b/server-exp2/实验2任务报告(多进程和多线程模型)(1).docx new file mode 100644 index 0000000000000000000000000000000000000000..21b6958ead51fd8f157f7618b8e12855e7977757 GIT binary patch literal 100232 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 KAm!SE2K*1EZxa>( literal 0 HcmV?d00001