From 3e64bfa4f86cede09a6c2fb89dff76aa3e6f9f62 Mon Sep 17 00:00:00 2001 From: hypox64 Date: Thu, 28 Nov 2019 19:11:45 +0800 Subject: [PATCH] unit5 finished --- .../record/HelloWorld" | Bin .../report.md" | 14 +- .../homework/code/1_topology_1" | Bin .../homework/code/1_topology_2" | Bin .../homework/code/1_topology_3" | Bin .../homework/code/3_pthread" | Bin .../homework/code/Mycshell" | Bin .../homework/pic/1_topology_1.png" | Bin .../homework/pic/1_topology_3.png" | Bin .../record/code/daemon-demo" | Bin .../record/code/fork-100-demo" | Bin .../record/code/fork-demo" | Bin .../record/code/fork-exec-demo" | Bin .../record/code/fork-twice-demo" | Bin .../record/code/orphan-demo" | Bin .../record/code/pthread-100-demo" | Bin .../record/code/pthread-demo" | Bin .../record/code/shell-script" | 0 .../record/code/zombie-demo" | Bin ...7\344\273\266\344\277\241\346\201\257.png" | Bin .../2-3 pstree \350\276\223\345\207\272.png" | Bin ...7\347\232\204\344\276\213\345\255\220.png" | Bin ...4\347\232\204\346\211\247\350\241\214.png" | Bin ... \347\232\204\350\276\223\345\207\272.png" | Bin .../report.md" | 304 +-- .../record/code/RR-FIFO-sched" | Bin .../record/code/RR-FIFO.sh" | 0 .../report.md" | 459 ++--- .../record/code/msgtool" | Bin .../record/code/mutex-demo" | Bin .../record/code/no-mutex-demo" | Bin .../record/code/pipe-demo" | Bin .../record/code/psem-named-open" | Bin .../record/code/psem-named-post-demo" | Bin .../record/code/psem-named-wait-demo" | Bin .../record/code/shmatt-read-demo" | Bin .../record/code/shmatt-write-demo" | Bin .../record/code/shmget-demo" | Bin .../report.md" | 515 ++--- .../homework/problem1" | Bin 0 -> 8576 bytes .../homework/problem1.c" | 17 + .../homework/problem1.png" | Bin 0 -> 14972 bytes .../homework/problem2" | Bin 0 -> 8688 bytes .../homework/problem2.c" | 42 + .../homework/problem2.png" | Bin 0 -> 31162 bytes .../homework/problem3_A.png" | Bin 0 -> 16477 bytes .../homework/problem3_a" | Bin 0 -> 8704 bytes .../homework/problem3_a.c" | 38 + .../homework/problem3_b" | Bin 0 -> 8496 bytes .../homework/problem3_b.c" | 21 + .../homework/problem3_crash.png" | Bin 0 -> 94667 bytes .../homework/problem3_free.png" | Bin 0 -> 47122 bytes .../note.md" | 212 -- .../record/code/maps-check" | 21 + .../record/code/meminfo-check" | 46 + .../record/code/pages-blackhole-demo" | Bin 0 -> 8512 bytes .../record/code/pages-blackhole-demo.c" | 21 + .../record/code/process-pages-demo" | Bin 0 -> 8816 bytes .../record/code/process-pages-demo.c" | 51 + .../record/code/reclaim-swap-writeback-demo" | Bin 0 -> 8912 bytes .../code/reclaim-swap-writeback-demo.c" | 75 + .../record/code/show-virt-addr" | Bin 8360 -> 8504 bytes .../record/code/smaps-check" | 357 ++++ .../record/code/status-check" | 47 + .../record/pic/5-19.png" | Bin 21130 -> 6036 bytes .../record/pic/5-21.png" | Bin 0 -> 13953 bytes .../record/pic/5-22.png" | Bin 0 -> 9916 bytes .../record/pic/5-23.png" | Bin 0 -> 27495 bytes .../record/pic/5-28.png" | Bin 0 -> 31532 bytes .../record/pic/5-30.png" | Bin 0 -> 11768 bytes .../record/pic/biao5-6.png" | Bin 0 -> 18756 bytes .../record/pic/pic5-11.png" | Bin 0 -> 12262 bytes .../report.md" | 1746 +++++++++++++++++ 73 files changed, 3145 insertions(+), 841 deletions(-) mode change 100755 => 100644 "1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/record/HelloWorld" rename "1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/note.md" => "1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/report.md" (58%) mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/1_topology_1" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/1_topology_2" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/1_topology_3" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/3_pthread" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/Mycshell" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/pic/1_topology_1.png" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/pic/1_topology_3.png" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/daemon-demo" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-100-demo" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-demo" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-exec-demo" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-twice-demo" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/orphan-demo" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/pthread-100-demo" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/pthread-demo" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/shell-script" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/zombie-demo" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-2 \345\261\217\346\230\276 HelloWorld \345\217\257\346\211\247\350\241\214\346\226\207\344\273\266\344\277\241\346\201\257.png" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-3 pstree \350\276\223\345\207\272.png" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-4 \346\237\245\347\234\213\344\274\232\350\257\235\343\200\201\350\277\233\347\250\213\347\273\204\345\222\214\346\216\247\345\210\266\347\273\210\347\253\257\347\232\204\344\276\213\345\255\220.png" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-5 shell-script \350\204\232\346\234\254\347\232\204\346\211\247\350\241\214.png" mode change 100755 => 100644 "2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-7 fork-demo \347\232\204\350\276\223\345\207\272.png" rename "2.\350\277\233\347\250\213\346\216\247\345\210\266/note.md" => "2.\350\277\233\347\250\213\346\216\247\345\210\266/report.md" (91%) mode change 100755 => 100644 "3.\350\277\233\347\250\213\350\260\203\345\272\246/record/code/RR-FIFO-sched" mode change 100755 => 100644 "3.\350\277\233\347\250\213\350\260\203\345\272\246/record/code/RR-FIFO.sh" rename "3.\350\277\233\347\250\213\350\260\203\345\272\246/note.md" => "3.\350\277\233\347\250\213\350\260\203\345\272\246/report.md" (86%) mode change 100755 => 100644 "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/msgtool" mode change 100755 => 100644 "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/mutex-demo" mode change 100755 => 100644 "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/no-mutex-demo" mode change 100755 => 100644 "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/pipe-demo" mode change 100755 => 100644 "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/psem-named-open" mode change 100755 => 100644 "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/psem-named-post-demo" mode change 100755 => 100644 "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/psem-named-wait-demo" mode change 100755 => 100644 "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/shmatt-read-demo" mode change 100755 => 100644 "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/shmatt-write-demo" mode change 100755 => 100644 "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/shmget-demo" rename "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/note.md" => "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/report.md" (94%) create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem1" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem1.c" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem1.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem2" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem2.c" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem2.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_A.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_a" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_a.c" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_b" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_b.c" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_crash.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_free.png" delete mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/note.md" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/maps-check" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/meminfo-check" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/pages-blackhole-demo" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/pages-blackhole-demo.c" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/process-pages-demo" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/process-pages-demo.c" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/reclaim-swap-writeback-demo" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/reclaim-swap-writeback-demo.c" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/smaps-check" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/status-check" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/5-21.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/5-22.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/5-23.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/5-28.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/5-30.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/biao5-6.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/pic5-11.png" create mode 100644 "5.\345\206\205\345\255\230\347\256\241\347\220\206/report.md" diff --git "a/1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/record/HelloWorld" "b/1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/record/HelloWorld" old mode 100755 new mode 100644 diff --git "a/1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/note.md" "b/1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/report.md" similarity index 58% rename from "1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/note.md" rename to "1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/report.md" index 2085b37..a4cc032 100644 --- "a/1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/note.md" +++ "b/1.Linux\345\256\211\350\243\205\344\270\216\350\256\277\351\227\256/report.md" @@ -1,7 +1,7 @@ -# Linux修改时区的正确方法 -ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime -# centOS 7 gcc install -yum install gcc -y -# 编译和运行HelloWorld -gcc HelloWorld.c -o HelloWorld-getchar -HelloWorld-getchar +## Linux修改时区的正确方法 +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +## centOS 7 gcc install +yum install gcc -y +## 编译和运行HelloWorld +gcc HelloWorld.c -o HelloWorld-getchar +HelloWorld-getchar diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/1_topology_1" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/1_topology_1" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/1_topology_2" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/1_topology_2" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/1_topology_3" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/1_topology_3" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/3_pthread" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/3_pthread" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/Mycshell" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/code/Mycshell" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/pic/1_topology_1.png" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/pic/1_topology_1.png" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/pic/1_topology_3.png" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/homework/pic/1_topology_3.png" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/daemon-demo" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/daemon-demo" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-100-demo" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-100-demo" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-demo" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-demo" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-exec-demo" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-exec-demo" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-twice-demo" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/fork-twice-demo" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/orphan-demo" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/orphan-demo" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/pthread-100-demo" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/pthread-100-demo" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/pthread-demo" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/pthread-demo" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/shell-script" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/shell-script" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/zombie-demo" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/code/zombie-demo" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-2 \345\261\217\346\230\276 HelloWorld \345\217\257\346\211\247\350\241\214\346\226\207\344\273\266\344\277\241\346\201\257.png" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-2 \345\261\217\346\230\276 HelloWorld \345\217\257\346\211\247\350\241\214\346\226\207\344\273\266\344\277\241\346\201\257.png" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-3 pstree \350\276\223\345\207\272.png" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-3 pstree \350\276\223\345\207\272.png" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-4 \346\237\245\347\234\213\344\274\232\350\257\235\343\200\201\350\277\233\347\250\213\347\273\204\345\222\214\346\216\247\345\210\266\347\273\210\347\253\257\347\232\204\344\276\213\345\255\220.png" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-4 \346\237\245\347\234\213\344\274\232\350\257\235\343\200\201\350\277\233\347\250\213\347\273\204\345\222\214\346\216\247\345\210\266\347\273\210\347\253\257\347\232\204\344\276\213\345\255\220.png" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-5 shell-script \350\204\232\346\234\254\347\232\204\346\211\247\350\241\214.png" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-5 shell-script \350\204\232\346\234\254\347\232\204\346\211\247\350\241\214.png" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-7 fork-demo \347\232\204\350\276\223\345\207\272.png" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/record/pic/2-7 fork-demo \347\232\204\350\276\223\345\207\272.png" old mode 100755 new mode 100644 diff --git "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/note.md" "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/report.md" similarity index 91% rename from "2.\350\277\233\347\250\213\346\216\247\345\210\266/note.md" rename to "2.\350\277\233\347\250\213\346\216\247\345\210\266/report.md" index 3efb0a4..05d29cb 100644 --- "a/2.\350\277\233\347\250\213\346\216\247\345\210\266/note.md" +++ "b/2.\350\277\233\347\250\213\346\216\247\345\210\266/report.md" @@ -1,146 +1,158 @@ -# 实验记录 -### 2-1 察看HelloWorld-gechar 的三个进程
-```bash -ps -aux | grep HelloWorld -``` -3个进程的PID分别是26608 26649 26689
-![image](./record/pic/2-1.jpg) - -### 2-2 屏显 HelloWorld 可执行文件信息
-```bash -file HelloWorld -``` -![image](./record/pic/2-2.png) -x86-64 平台上的ELF 格式可执行文件。 -一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。 -ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。 -由于ELF 文件内部包含了足够的信息,操作系统可以根据ELF 可执行文件创建出进程映像,进程映像以及各种管理数据结构构成了进程实体,另外进程还可能向系统申请各种资源——共同组成了进程实体的全部内涵。进程实体被调度运行就构成了进程的活动,如果系统中有多个活动的进程,那么它们各自有独立的进程空间(各自独立地使用自己的0~0xFFFFFFFF 虚存空间)。
-在Linux 中进程PCB 是task_struct 结构体,
- -### 进程间组织关系
-Linux 系统中所有进程通过进程控制块PCB(struct task_struct)形成多种组织关系。根据 -进程创建过程可以有亲缘关系,通过进程间的父子关系组织成一个进程树
-一个进程通过创建一个子进程则形成父子关系,如果创建多个子进程,那么这些新创建的 -进程间属于兄弟关系
-### 2-3 pstree 输出 -![image](./record/pic/2-3.png) -### 2-4 查看会话、进程组和控制终端的例子 -![image](./record/pic/2-4.png) -### PPID(PPID,Parent PID) PID(进程ID) PGID(Process Group ID 进程组 ID号) SID(Session ID 会话ID) TTY TPGID(tty process group ID for the process group leader) STAT() UID TIME COMMAND
-STAT:D 无法中断的休眠状态(通常 IO 的进程);R 正在运行可中在队列中可过行的;S 处于休眠状态;T 停止或被追踪;W 进入内存交换(从内核2.6开始无效);X 死掉的进程(从来没见过);Z 僵尸进程;+ 位于后台的进程组
-“会话/进程组/线程组”几个概念呈现层级关系,Linux 系统中可以有多个会话(session), -每个会话可以包含多个进程组(process group),每个进程组可以包含多个进程,每个进程构 -成一个线程组——一个线程组由一个进程内的一个或多个线程组成,这些对象都有各自的ID。会话是从用户登录系统到退出前的全部活动,不同帐户的登录属于不同会话,而同一帐户的多次登录也构成不同的会话。而进程组主要出于作业控制的目的,有些shell 没有作用控制能力,就将整个会话的所有进程构成一个进程组。 -### 2-5 创建进程的命令 -```bash -chmod a+x shell-script -shell-script -``` -![image](./record/pic/2-5.png) -第一行用于指出该脚本需要用/usr/bin/bash 来解 -释执行,第二行shell 内部命令echo 用来显示,第三行HelloWorld 是外部命令(磁盘上的可执 -行文件)。 -### 2-6 通过ps 查找进程的PID -1.查找进程的PID
-2.kill PID
-```bash -ps -ef | grep HelloWorld-getchar -``` -![image](./record/pic/2-6.png) -### 2-7 fork-demo 的输出 -![image](./record/pic/2-7.png) -fork 函数被成功调用后将按照父进程的样子复制出一个完全相同的子进程。父进程fork() -函数结束时的返回值是子进程的PID 编号。新创建的子进程则也是从fork()返回处开始执行, -但不同的是它获得的返回值是0。也就是说父子进程执行上几乎相同,
-* 唯一区别是子进程中返回0 值而父进程中返回子进程PID。
-* 如果fork()出错则只有父进程获得返回值-1 而子进程未能创建。
-### 2-8 fork-demo 的输出 -![image](./record/pic/2-8.png) -### 2-9 fork-twice-demo 执行后的 输出 -![image](./record/pic/2-9.png) -### 孤儿进程和僵尸进程 -(1) 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init 进程(进程号为1)所收养,并由init 进程对它们完成状态收集工作。 -(2) 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。 - 子进程结束后大部分资源都将直接回收,但是还将在PCB(struct task_struct 和内核堆栈)中记录一些退出时的状态等信息,这些信息供父进程检查后才能销毁回收。因此,僵尸进程因相应的数据没有父进程处理并回收,将会导致资源浪费,而孤儿则不会有这样的问题。 -* 孤儿进程 -![image](./record/pic/孤儿进程.png) -* 僵尸进程 -![image](./record/pic/僵尸进程.png) -### 2-10 fork-exec-demo 的执行结果 -![image](./record/pic/2-10.png) -* 这里可以看到子进程通过execve()将自己变身为“/usr/bin/ls”,因此不再执行与父进程里的代——即后面的“printf("this printf()will not be executed, because …”是没有机会得到执行的。 -* fork()和exec 函数族构成了创建新进程的完整操作,如果父子进程功能相同则只用fork(),如果父子进程不同则利用exec 函数族的来实现。 -### 2-11 用ps –ajx 查看daemon-demo 守护进程 -![image](./record/pic/2-11.png) -关闭daemon-demo运行终端后仍能找到daemon-demo进程,且PID为1 -### 2-12 /etc/rsyslog.conf 中的内容 -![image](./record/pic/2-12.png) -日志信息写入了/var/log/messages 文件中。 -### 2-13 查看/var/log/messages -![image](./record/pic/2-13.png) -由于前后运行了多次,所以出现了3个。 -### 2-14&2-15 pthread-demo 的输出及ps –aLf 的输出 -![image](./record/pic/2-14&2-15.png) -两个线程公用一个PID号19392,但是LWP却不一样。 - -### 2-16&2-17 PCB 开销 -```bash -cat /proc/slabinfo | grep task_struct -``` -比较两者在进程控制块上的开销(包括 struct task_struct 和内核栈) -2-16 fork-100-demo 运行前后的/proc/slabinfo 中关于 task_struct 数量 -![image](./record/pic/2-16.png) -2-17 pthread-100-demo 运行前后的/proc/slabinfo 中关于 task_struct 数量 -![image](./record/pic/2-17.png) -两者在运行后的task_struct数量均增加100,说明线程作为调度执行单位,进程控制块PCB(task_struct)还是需要的,这是最小资源的一部分。因此这方面资源开销对进程和线程都是一样的。 -### 2-18&2-19&2-20&2-21内存描述符开销 -* 查看mm_struct数量 -```bash -cat /proc/slabinfo | grep mm_struct -``` -2-18 fork-100-demo 运行前后的/proc/slabinfo 中关于 mm_struct 数量 -![image](./record/pic/2-18.png) -2-19 pthread-100-demo 运行前后的/proc/slabinfo 中关于 mm_struct 数量 -![image](./record/pic/2-19.png) -前者运行时mm_struct数量增加了100,而后者没有变化,说明,pthread-100-demo 虽然创建了 100 个线程,但是用于共享进程空间,并没有增加一个 mm_struct -* 查看vm_area_struct数量 -```bash -cat /proc/slabinfo | grep vm_area_struct -``` -2-20 fork-100-demo 运行前后的/proc/slabinfo 中关于 vm_area_struct 数量 -![image](./record/pic/2-20.png) -2-21 pthread-100-demo 运行前后的/proc/slabinfo 中关于 vm_area_struct 数量 -![image](./record/pic/2-21.png) -可以发现pthread-100-demo需要新增大约 150 左右的使用量,而fork-100-demo需要约 1300 左右的使用量,故线程的开销确实比进程要小。 - -# 课后作业 -### 1.编写 C 语言程序,利用 fork()创建子进程,形成以下父子关系:并通过 ps 命令检查进程的进程号 PID 和父进程号 PPID 证明你成功创建相应的父子关系,同时也用 pstree 输出进程树结构来验证其关系。 -![image](./homework/pic/problem_1.png) -* 解答: -* (1).[code](./homework/code/1_topology_1.c) - ![image](./homework/pic/1_topology_1.png) -可以看到父进程12232拥有10个子进程且满足题目的要求 -* (2).[code](./homework/code/1_topology_2.c) - ![image](./homework/pic/1_topology_2.png) -可以看到父进程13738拥有10个子进程且满足题目的要求 -* (3).[code](./homework/code/1_topology_3.c) - ![image](./homework/pic/1_topology_3.png) -可以看子进程结构满足题目要求。 -### 3.创建多个线程,在各个线程中打印出堆栈变量的地址,大致标记出其位置,注意区分主线程的堆栈和其他线程堆栈位置的差异。 -* 解答:[code](./homework/code/3_pthread.c) -注意:编译时需要链接文件-lpthread -rdynamic -```bash -gcc ./3_pthread.c -lpthread -rdynamic -o 3_pthread -``` - ![image](./homework/pic/3_pthread.png) - 程序中有一个父线程以及3个子线程,可以发现子线程的偏移地址以及返回地址都是一样的,且斗与父线程不一样。 - - ### 4.尝试自行设计一个 C 语言小程序,完成最基本的 shell 角色:给出命令行提示符、能够接受命令;对于命令分成三种,内部命令(例如 help 命令、exit 命令等)、外部命令(常见的 ls、cp 等,以及其他磁盘上的可执行程序 HelloWrold 等)以及无效命令(不是上述两种命令)。 - * 解答:[code](./homework/code/shell.c) -![image](./homework/pic/4_shell.png) - -捕获键盘输入->判断是那种命令-> -* 1.内部命令:打印help文件或exit(0);退出
-* 2.外部命令,fork出新的进程并使用execvp函数执行 -* 3.可执行程序,与外部命令方法相同 -* 4.无效命令:打印无效警告 +[toc] +## 实验目的 +* 通过编程实践、观察,学习内存管理的方式。 +## 实验环境 +* 硬件 +1.Intel(R) Xeon(R) Bronze 3104 CPU @ 1.70GHz +2.DDR4 16G +* 软件 +1.CentOS 7 +2.ubuntu 18.04 +3.VMware Workstation Pro 15 +## 实验记录 +### 2-1 察看HelloWorld-gechar 的三个进程
+```bash +ps -aux | grep HelloWorld +``` +3个进程的PID分别是26608 26649 26689
+![image](./record/pic/2-1.jpg) + +### 2-2 屏显 HelloWorld 可执行文件信息
+```bash +file HelloWorld +``` +![image](./record/pic/2-2.png) +x86-64 平台上的ELF 格式可执行文件。 +一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。 +ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。 +由于ELF 文件内部包含了足够的信息,操作系统可以根据ELF 可执行文件创建出进程映像,进程映像以及各种管理数据结构构成了进程实体,另外进程还可能向系统申请各种资源——共同组成了进程实体的全部内涵。进程实体被调度运行就构成了进程的活动,如果系统中有多个活动的进程,那么它们各自有独立的进程空间(各自独立地使用自己的0~0xFFFFFFFF 虚存空间)。
+在Linux 中进程PCB 是task_struct 结构体,
+ +### 进程间组织关系
+Linux 系统中所有进程通过进程控制块PCB(struct task_struct)形成多种组织关系。根据 +进程创建过程可以有亲缘关系,通过进程间的父子关系组织成一个进程树
+一个进程通过创建一个子进程则形成父子关系,如果创建多个子进程,那么这些新创建的 +进程间属于兄弟关系
+### 2-3 pstree 输出 +![image](./record/pic/2-3.png) +### 2-4 查看会话、进程组和控制终端的例子 +![image](./record/pic/2-4.png) +### PPID +PPID(PPID,Parent PID) PID(进程ID) PGID(Process Group ID 进程组 ID号) SID(Session ID 会话ID) TTY TPGID(tty process group ID for the process group leader) STAT() UID TIME COMMAND
+STAT:D 无法中断的休眠状态(通常 IO 的进程);R 正在运行可中在队列中可过行的;S 处于休眠状态;T 停止或被追踪;W 进入内存交换(从内核2.6开始无效);X 死掉的进程(从来没见过);Z 僵尸进程;+ 位于后台的进程组
+“会话/进程组/线程组”几个概念呈现层级关系,Linux 系统中可以有多个会话(session), +每个会话可以包含多个进程组(process group),每个进程组可以包含多个进程,每个进程构 +成一个线程组——一个线程组由一个进程内的一个或多个线程组成,这些对象都有各自的ID。会话是从用户登录系统到退出前的全部活动,不同帐户的登录属于不同会话,而同一帐户的多次登录也构成不同的会话。而进程组主要出于作业控制的目的,有些shell 没有作用控制能力,就将整个会话的所有进程构成一个进程组。 +### 2-5 创建进程的命令 +```bash +chmod a+x shell-script +shell-script +``` +![image](./record/pic/2-5.png) +第一行用于指出该脚本需要用/usr/bin/bash 来解 +释执行,第二行shell 内部命令echo 用来显示,第三行HelloWorld 是外部命令(磁盘上的可执 +行文件)。 +### 2-6 通过ps 查找进程的PID +1.查找进程的PID
+2.kill PID
+```bash +ps -ef | grep HelloWorld-getchar +``` +![image](./record/pic/2-6.png) +### 2-7 fork-demo 的输出 +![image](./record/pic/2-7.png) +fork 函数被成功调用后将按照父进程的样子复制出一个完全相同的子进程。父进程fork() +函数结束时的返回值是子进程的PID 编号。新创建的子进程则也是从fork()返回处开始执行, +但不同的是它获得的返回值是0。也就是说父子进程执行上几乎相同,
+* 唯一区别是子进程中返回0 值而父进程中返回子进程PID。
+* 如果fork()出错则只有父进程获得返回值-1 而子进程未能创建。
+### 2-8 fork-demo 的输出 +![image](./record/pic/2-8.png) +### 2-9 fork-twice-demo 执行后的 输出 +![image](./record/pic/2-9.png) +### 孤儿进程和僵尸进程 +(1) 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init 进程(进程号为1)所收养,并由init 进程对它们完成状态收集工作。 +(2) 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。 + 子进程结束后大部分资源都将直接回收,但是还将在PCB(struct task_struct 和内核堆栈)中记录一些退出时的状态等信息,这些信息供父进程检查后才能销毁回收。因此,僵尸进程因相应的数据没有父进程处理并回收,将会导致资源浪费,而孤儿则不会有这样的问题。 +* 孤儿进程 +![image](./record/pic/孤儿进程.png) +* 僵尸进程 +![image](./record/pic/僵尸进程.png) +### 2-10 fork-exec-demo 的执行结果 +![image](./record/pic/2-10.png) +* 这里可以看到子进程通过execve()将自己变身为“/usr/bin/ls”,因此不再执行与父进程里的代——即后面的“printf("this printf()will not be executed, because …”是没有机会得到执行的。 +* fork()和exec 函数族构成了创建新进程的完整操作,如果父子进程功能相同则只用fork(),如果父子进程不同则利用exec 函数族的来实现。 +### 2-11 用ps –ajx 查看daemon-demo 守护进程 +![image](./record/pic/2-11.png) +关闭daemon-demo运行终端后仍能找到daemon-demo进程,且PID为1 +### 2-12 /etc/rsyslog.conf 中的内容 +![image](./record/pic/2-12.png) +日志信息写入了/var/log/messages 文件中。 +### 2-13 查看/var/log/messages +![image](./record/pic/2-13.png) +由于前后运行了多次,所以出现了3个。 +### 2-14&2-15 pthread-demo 的输出及ps –aLf 的输出 +![image](./record/pic/2-14&2-15.png) +两个线程公用一个PID号19392,但是LWP却不一样。 + +### 2-16&2-17 PCB 开销 +```bash +cat /proc/slabinfo | grep task_struct +``` +比较两者在进程控制块上的开销(包括 struct task_struct 和内核栈) +2-16 fork-100-demo 运行前后的/proc/slabinfo 中关于 task_struct 数量 +![image](./record/pic/2-16.png) +2-17 pthread-100-demo 运行前后的/proc/slabinfo 中关于 task_struct 数量 +![image](./record/pic/2-17.png) +两者在运行后的task_struct数量均增加100,说明线程作为调度执行单位,进程控制块PCB(task_struct)还是需要的,这是最小资源的一部分。因此这方面资源开销对进程和线程都是一样的。 +### 2-18&2-19&2-20&2-21内存描述符开销 +* 查看mm_struct数量 +```bash +cat /proc/slabinfo | grep mm_struct +``` +2-18 fork-100-demo 运行前后的/proc/slabinfo 中关于 mm_struct 数量 +![image](./record/pic/2-18.png) +2-19 pthread-100-demo 运行前后的/proc/slabinfo 中关于 mm_struct 数量 +![image](./record/pic/2-19.png) +前者运行时mm_struct数量增加了100,而后者没有变化,说明,pthread-100-demo 虽然创建了 100 个线程,但是用于共享进程空间,并没有增加一个 mm_struct +* 查看vm_area_struct数量 +```bash +cat /proc/slabinfo | grep vm_area_struct +``` +2-20 fork-100-demo 运行前后的/proc/slabinfo 中关于 vm_area_struct 数量 +![image](./record/pic/2-20.png) +2-21 pthread-100-demo 运行前后的/proc/slabinfo 中关于 vm_area_struct 数量 +![image](./record/pic/2-21.png) +可以发现pthread-100-demo需要新增大约 150 左右的使用量,而fork-100-demo需要约 1300 左右的使用量,故线程的开销确实比进程要小。 + +## 课后作业 +### 1.编写 C 语言程序,利用 fork()创建子进程,形成以下父子关系:并通过 ps 命令检查进程的进程号 PID 和父进程号 PPID 证明你成功创建相应的父子关系,同时也用 pstree 输出进程树结构来验证其关系。 +![image](./homework/pic/problem_1.png) +* 解答: +* (1).[code](./homework/code/1_topology_1.c) + ![image](./homework/pic/1_topology_1.png) +可以看到父进程12232拥有10个子进程且满足题目的要求 +* (2).[code](./homework/code/1_topology_2.c) + ![image](./homework/pic/1_topology_2.png) +可以看到父进程13738拥有10个子进程且满足题目的要求 +* (3).[code](./homework/code/1_topology_3.c) + ![image](./homework/pic/1_topology_3.png) +可以看子进程结构满足题目要求。 +### 3.创建多个线程,在各个线程中打印出堆栈变量的地址,大致标记出其位置,注意区分主线程的堆栈和其他线程堆栈位置的差异。 +* 解答:[code](./homework/code/3_pthread.c) +注意:编译时需要链接文件-lpthread -rdynamic +```bash +gcc ./3_pthread.c -lpthread -rdynamic -o 3_pthread +``` + ![image](./homework/pic/3_pthread.png) + 程序中有一个父线程以及3个子线程,可以发现子线程的偏移地址以及返回地址都是一样的,且斗与父线程不一样。 + +### 4.尝试自行设计一个 C 语言小程序,完成最基本的 shell 角色:给出命令行提示符、能够接受命令;对于命令分成三种,内部命令(例如 help 命令、exit 命令等)、外部命令(常见的 ls、cp 等,以及其他磁盘上的可执行程序 HelloWrold 等)以及无效命令(不是上述两种命令)。 + * 解答:[code](./homework/code/shell.c) +![image](./homework/pic/4_shell.png) + +捕获键盘输入->判断是那种命令-> +* 1.内部命令:打印help文件或exit(0);退出
+* 2.外部命令,fork出新的进程并使用execvp函数执行 +* 3.可执行程序,与外部命令方法相同 +* 4.无效命令:打印无效警告 diff --git "a/3.\350\277\233\347\250\213\350\260\203\345\272\246/record/code/RR-FIFO-sched" "b/3.\350\277\233\347\250\213\350\260\203\345\272\246/record/code/RR-FIFO-sched" old mode 100755 new mode 100644 diff --git "a/3.\350\277\233\347\250\213\350\260\203\345\272\246/record/code/RR-FIFO.sh" "b/3.\350\277\233\347\250\213\350\260\203\345\272\246/record/code/RR-FIFO.sh" old mode 100755 new mode 100644 diff --git "a/3.\350\277\233\347\250\213\350\260\203\345\272\246/note.md" "b/3.\350\277\233\347\250\213\350\260\203\345\272\246/report.md" similarity index 86% rename from "3.\350\277\233\347\250\213\350\260\203\345\272\246/note.md" rename to "3.\350\277\233\347\250\213\350\260\203\345\272\246/report.md" index 3a7b66e..5630153 100644 --- "a/3.\350\277\233\347\250\213\350\260\203\345\272\246/note.md" +++ "b/3.\350\277\233\347\250\213\350\260\203\345\272\246/report.md" @@ -1,225 +1,236 @@ -# 实验记录 -#### 3-1 /proc/cpuinfo 信息 -```bash -cat /proc/cpuinfo -``` -![image](./record/pic/3-1.png) -CPU型号为Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz,拥有四核心八线程 -#### 3-2 top 命令的输出 -```bash -top -``` -![image](./record/pic/3-2.png) -其中 7.7 us 表示 7.7%的时间用于运行用户空间的代码,相应地有 sy 对应运行内核代码占用 CPU 时间的百分比、ni 表示低优先级用户态代码占用 CPU时间的百分比、id 表示空闲(运行 idle 任务进程)CPU 时间的百分比、wa 表示 IO 等待占用CPU 时间的百分比、hi 表示硬件中断(Hardware IRQ)占用 CPU 时间的百分比、si 表示软中断(Software Interrupts)占用 CPU 时间的百分比以及和虚拟化有关的 st(steal time)占用 CPU时间的百分比。 -#### 3-3 top 命令的输出(展开 CPU 利用率) -![image](./record/pic/3-3.png) -#### 3-4&3-5 全系统的调度统计 -```bash -cat /proc/sched_debug -cat /proc/schedstat -``` -![image](./record/pic/3-4.png) -![image](./record/pic/3-5.png) -#### 3-6 ps –aux 查看进程状态 -```bash -ps -aux -``` -![image](./record/pic/3-6.png) -* R:TASK_RUNNING 可执行状态,包括就绪和正在 CPU 上执行 -* S:TASK_INTERRUPTIBLE 可中断的睡眠状态,也是操作系统课程中所谓的阻塞状态 -* D:TASK_UNINTERRUPTIBLE 不可中断的睡眠状态 -* T:TASK_STOPPED 或 TASK_TRACED 暂停状态或跟踪状态 -* Z:TASK_DEAD(-EXIT_ZOMBIE) 退出状态,且成为僵尸进程 -* X:TASK_DEAD(-EXIT_DEAD) 退出状态,且进程即将被销毁 -#### 3-7&3-8 就绪与阻塞 -3-7 HelloWorld-loop-getchar 的运行输出 -![image](./record/pic/3-7.png)
-3-8 用 ps 观察 HelloWorld-loop-getchar 进程调度状态变化 -```bash -ps aux|grep HelloWorld-loop-getchar -``` -![image](./record/pic/3-8.png) - -#### 3-9&3-10 进程的调度统计 -```bash -cat /proc/15366/status -``` -![image](./record/pic/3-9.png) -进程主动切换的次数8,进程主动切换的次数213
- -```bash -cat /proc/15363/stat -``` -![image](./record/pic/3-10.png) - -#### 3-11&3-12&3-13&3-14普通进程的 CFS 调度 -* nice 命令可以用-xx 给出调整的数值(降低优先级 xx),也可以用“-n xx”方式直接设定 NICE 值(- -20~19) -* taskset -c 0 在命令前加上这条语句可以绑定进程运行在制定CPU
- -3-11 执行 Run-NICE.sh 脚本并用 ps –a 查看 -![image](./record/pic/3-11.png)
- -3-12 用 top 观察优先权不同的两个进程 -![image](./record/pic/3-12.png) -16460 号进程占用了 CPU 的 90.4%的时间,16461 号进程仅占用了 CPU 的 9.6%的时间。
- -3-13 /proc/PID/sched -![image](./record/pic/3-13_1.png) -![image](./record/pic/3-13_2.png)
-3-14 /proc/PID/schedstat -![image](./record/pic/3-14.png) - -#### 3-15&3-16创建实时进程 -* 以 root 身份运行 RT-process-demo 进程,如果以普通用户运行 RT-process-demo 则会报告不允许创建实时进程。
-* 实时任务的均衡原则很简单,对于 N 个处理器的系统,保证优先级最高的 N 个实时任务各自在一个处理器上运行。如果实时任务少于 N 个,则多出来的处理器可以运行普通 CFS 任务。 - -3-15 用 ps –al 观察 RT-process-demo 的四个观测点 -![image](./record/pic/3-15a.png) -![image](./record/pic/3-15b.png) -![image](./record/pic/3-15c.png) -![image](./record/pic/3-15d.png)
-3-16 用/proc/PID/sched 观察 RT-process-demo 的四个观测点 -![image](./record/pic/3-16a.png)
- -![image](./record/pic/3-16b.png)
- -![image](./record/pic/3-16c.png)
- -![image](./record/pic/3-16d.png)
- -#### 3-17 创建实时进程 -```bash -sudo taskset -c 0 ./RR-FIFO.sh -``` -经过多次测试发现实验结果无法在ubuntu18.04 多核处理(非虚拟机)器下复现,故改用centOS7进行实验
-top 命令查看高优先级实时进程10047 抢占 CPU -![image](./record/pic/3-17a.png) -![image](./record/pic/3-17b.png) -![image](./record/pic/3-17c.png) - -3-17 运行脚本并查看三个实时进程的调度信息 -```bash -# cat ./sched-10044; cat ./sched-10045; cat ./sched-10047 -RR-FIFO-sched (10044, #threads: 1) -------------------------------------------------------------------- -nr_involuntary_switches : 198 -se.load.weight : 1024 -policy : 2实时任务的均衡原则很简单,对于 N 个处理器的系统,保证优先级最高的 N 个实时任务 -各自在一个处理器上运行。如果实时任务少于 N 个,则多出来的处理器可以运行普通 CFS 任 -务。 -prio : 9 -------------------------------------------------------------------- -nr_involuntary_switches : 199 -se.load.weight : 1024 -policy : 2 -prio : 9 -------------------------------------------------------------------- -nr_involuntary_switches : 25 -se.load.weight : 1024 -policy : 1 -prio : 4 -``` -#### 3-20 ~ 3-26 CFS 进程的负载均衡 -执行 HelloWorld-loop-nice+5/+15 并查看它们的负载权重. -![image](./record/pic/3-18.png) -可以发现负载权重相差了3*3=9倍 - -3-20 显示进程所在处理器编号的 top 输出 -top命令后按 f 进入管理界面根据提示操作打开Last Used Cpu -![image](./record/pic/3-20.png) - -3-21 空闲系统上的即时负载情况 -![image](./record/pic/3-21.png) - -3-22 用 top 查看四个 NICE=-5 的进程所在 CPU -![image](./record/pic/3-22.png) -可以发现4个进程被分配在4个不同的CPU核心上运行 - -FIFO 任务执 -行时不被打断一直到运行结束(除非更高优先级的实时任务来抢占),而后者的 RR 任务在执 -行一个时间片之后将让出 CPU 给其他相同优先级的 RR 任务实现轮转执行。3-23 察看运行-5/0/+5/+10 四个进程后各处理器负载 -![image](./record/pic/3-23.png) - -3-24 从/proc/PID/sched 中查看进程的迁移次数 -处理的进程数小于等于处理器核心数,基本不会进行调度 -![image](./record/pic/3-24.png) - -3-25 用 top 查看五个进程的处理器编号 -在这个情况下处理的进程数大于处理器核心数,故会不断进行调度 -![image](./record/pic/3-25a.png) -![image](./record/pic/3-25b.png) -![image](./record/pic/3-25c.png) - -3-26 用/proc/PID/sched 查看进程迁移次数 -![image](./record/pic/3-26.png) - -#### 3-27&3-28实时进程负载均衡 -进程在八个处理器上运行 -![image](./record/pic/3-27.png) - -高优先级实时进程抢占低优先级实时进程的示例,开启一个优先级更高的进程 -![image](./record/pic/3-28.png) - -# 课后作业 -#### 1.在一个空闲的单核 Linux 系统上用 nice 命令调整两个进程的优先级,使得它们各自使用 1/5 和 4/5 的 CPU 资源。 -```bash -cat Run-NICE.sh -taskset -c 0 ./HelloWorld-loop & -taskset -c 0 nice -6 ./HelloWorld-loop & -``` -运行结果如下: -![image](./homework/1/1.png) - -#### 2.P1/P3 在第一个处理器上运行各占 50%的 CPU 资源,P2/P4 在另一个处理器上运行,各自 30%和 70%的 CPU 资源。 -```bash -cat Run-NICE.sh -taskset -c 0 ./HelloWorld-loop & -taskset -c 0 nice -4 ./HelloWorld-loop & -taskset -c 1 ./HelloWorld-loop & -taskset -c 1 ./HelloWorld-loop & -``` -运行结果如下: -![image](./homework/2/2.png) - -#### 3.请预测 Linux 对于相同优先级的 FIFO 实时进程的调度情况,并通过实验给出实测数据以证明。 -教材中提到: -* FIFO 任务执行时不被打断一直到运行结束(除非更高优先级的实时任务来抢占),而后者的 RR 任务在执行一个时间片之后将让出 CPU 给其他相同优先级的 RR 任务实现轮转执行。 -* FIFO 由于避免了调度切换的时间开销,因此更有利于本任务的快速完成。但是同时由于FIFO 也会造成同级 FIFO 任务的明显延迟. - -故可以猜测 Linux 对于相同优先级的 FIFO 实时进程会安装先进先出的原则执行完一个进程后再执行另外一个。 -实验结果如下: -1.启动两个相同优先级的FIFO 实时进程 -![image](./homework/3/3_homework_3_1.png) -2.观察top结合1的打印结果,发现只有一个成功执行 -![image](./homework/3/3_homework_3_2.png) -3.一段时间后第一个进程执行完毕,第二进程PID号才打印了出来,说明两者运行互斥 -![image](./homework/3/3_homework_3_3.png) -![image](./homework/3/3_homework_3_4.png) - -#### 4.在一个空载的系统上,如果将代码 3-8 的最后一行替换成两个“RR-FIFO-sched 2 80”,请预测其负载均衡后进程的运行情况,并说明是否只有一种处理器分配方案? - -```bash -cat RT-Balance.sh -./RR-FIFO-sched 1 5& -./RR-FIFO-sched 1 10& -./RR-FIFO-sched 1 15& -./RR-FIFO-sched 1 20& -./RR-FIFO-sched 1 25& -./RR-FIFO-sched 1 30& -./RR-FIFO-sched 1 35& -./RR-FIFO-sched 2 80& -./RR-FIFO-sched 2 80 -``` -知识点: -* 以 O(1)调度器方式调度——本处理器上的实时进程按照优先级不同挂入不同的子队列中,高优先级的队列先执行完再执行低优先级的队列上的进程。 -* 实时进程可以进一步分为两种调度模式:SCHED_FIFO 和 SCHED_RR。前者的 FIFO 任务执行时不被打断一直到运行结束(除非更高优先级的实时任务来抢占),而后者的 RR 任务在执行一个时间片之后将让出 CPU 给其他相同优先级的 RR 任务实现轮转执行。 - -预测:后面运行的RR-FIFO-sched 2 80拥有高的优先级故会挂载进队列并开始运行,最低优先级的./RR-FIFO-sched 1 5 被挤出队列,待其他进程完成后再运行 - -实际结果(一开始运行就卡炸了): -首先,8个优先级较高的开始运行,最高占用不超过95% -此时可以观察到8个进程所占用的CPU核心会发生跳动 -![image](./homework/4/4-1.png) -待8个优先级较高的进程执行完成后,优先级较低的进程开始执行 +[toc] +## 实验目的 +* 通过编程实践、观察,学习内存管理的方式。 +## 实验环境 +* 硬件 +1.Intel(R) Xeon(R) Bronze 3104 CPU @ 1.70GHz +2.DDR4 16G +* 软件 +1.CentOS 7 +2.ubuntu 18.04 +3.VMware Workstation Pro 15 +## 实验记录 +### 3-1 /proc/cpuinfo 信息 +```bash +cat /proc/cpuinfo +``` +![image](./record/pic/3-1.png) +CPU型号为Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz,拥有四核心八线程 +### 3-2 top 命令的输出 +```bash +top +``` +![image](./record/pic/3-2.png) +其中 7.7 us 表示 7.7%的时间用于运行用户空间的代码,相应地有 sy 对应运行内核代码占用 CPU 时间的百分比、ni 表示低优先级用户态代码占用 CPU时间的百分比、id 表示空闲(运行 idle 任务进程)CPU 时间的百分比、wa 表示 IO 等待占用CPU 时间的百分比、hi 表示硬件中断(Hardware IRQ)占用 CPU 时间的百分比、si 表示软中断(Software Interrupts)占用 CPU 时间的百分比以及和虚拟化有关的 st(steal time)占用 CPU时间的百分比。 +### 3-3 top 命令的输出(展开 CPU 利用率) +![image](./record/pic/3-3.png) +### 3-4&3-5 全系统的调度统计 +```bash +cat /proc/sched_debug +cat /proc/schedstat +``` +![image](./record/pic/3-4.png) +![image](./record/pic/3-5.png) +### 3-6 ps –aux 查看进程状态 +```bash +ps -aux +``` +![image](./record/pic/3-6.png) +* R:TASK_RUNNING 可执行状态,包括就绪和正在 CPU 上执行 +* S:TASK_INTERRUPTIBLE 可中断的睡眠状态,也是操作系统课程中所谓的阻塞状态 +* D:TASK_UNINTERRUPTIBLE 不可中断的睡眠状态 +* T:TASK_STOPPED 或 TASK_TRACED 暂停状态或跟踪状态 +* Z:TASK_DEAD(-EXIT_ZOMBIE) 退出状态,且成为僵尸进程 +* X:TASK_DEAD(-EXIT_DEAD) 退出状态,且进程即将被销毁 +### 3-7&3-8 就绪与阻塞 +3-7 HelloWorld-loop-getchar 的运行输出 +![image](./record/pic/3-7.png)
+3-8 用 ps 观察 HelloWorld-loop-getchar 进程调度状态变化 +```bash +ps aux|grep HelloWorld-loop-getchar +``` +![image](./record/pic/3-8.png) + +### 3-9&3-10 进程的调度统计 +```bash +cat /proc/15366/status +``` +![image](./record/pic/3-9.png) +进程主动切换的次数8,进程主动切换的次数213
+ +```bash +cat /proc/15363/stat +``` +![image](./record/pic/3-10.png) + +### 3-11&3-12&3-13&3-14普通进程的 CFS 调度 +* nice 命令可以用-xx 给出调整的数值(降低优先级 xx),也可以用“-n xx”方式直接设定 NICE 值(- +20~19) +* taskset -c 0 在命令前加上这条语句可以绑定进程运行在制定CPU
+ +3-11 执行 Run-NICE.sh 脚本并用 ps –a 查看 +![image](./record/pic/3-11.png)
+ +3-12 用 top 观察优先权不同的两个进程 +![image](./record/pic/3-12.png) +16460 号进程占用了 CPU 的 90.4%的时间,16461 号进程仅占用了 CPU 的 9.6%的时间。
+ +3-13 /proc/PID/sched +![image](./record/pic/3-13_1.png) +![image](./record/pic/3-13_2.png)
+3-14 /proc/PID/schedstat +![image](./record/pic/3-14.png) + +### 3-15&3-16创建实时进程 +* 以 root 身份运行 RT-process-demo 进程,如果以普通用户运行 RT-process-demo 则会报告不允许创建实时进程。
+* 实时任务的均衡原则很简单,对于 N 个处理器的系统,保证优先级最高的 N 个实时任务各自在一个处理器上运行。如果实时任务少于 N 个,则多出来的处理器可以运行普通 CFS 任务。 + +3-15 用 ps –al 观察 RT-process-demo 的四个观测点 +![image](./record/pic/3-15a.png) +![image](./record/pic/3-15b.png) +![image](./record/pic/3-15c.png) +![image](./record/pic/3-15d.png)
+3-16 用/proc/PID/sched 观察 RT-process-demo 的四个观测点 +![image](./record/pic/3-16a.png)
+ +![image](./record/pic/3-16b.png)
+ +![image](./record/pic/3-16c.png)
+ +![image](./record/pic/3-16d.png)
+ +### 3-17 创建实时进程 +```bash +sudo taskset -c 0 ./RR-FIFO.sh +``` +经过多次测试发现实验结果无法在ubuntu18.04 多核处理(非虚拟机)器下复现,故改用centOS7进行实验
+top 命令查看高优先级实时进程10047 抢占 CPU +![image](./record/pic/3-17a.png) +![image](./record/pic/3-17b.png) +![image](./record/pic/3-17c.png) + +3-17 运行脚本并查看三个实时进程的调度信息 +```bash +# cat ./sched-10044; cat ./sched-10045; cat ./sched-10047 +RR-FIFO-sched (10044, #threads: 1) +------------------------------------------------------------------- +nr_involuntary_switches : 198 +se.load.weight : 1024 +policy : 2实时任务的均衡原则很简单,对于 N 个处理器的系统,保证优先级最高的 N 个实时任务 +各自在一个处理器上运行。如果实时任务少于 N 个,则多出来的处理器可以运行普通 CFS 任 +务。 +prio : 9 +------------------------------------------------------------------- +nr_involuntary_switches : 199 +se.load.weight : 1024 +policy : 2 +prio : 9 +------------------------------------------------------------------- +nr_involuntary_switches : 25 +se.load.weight : 1024 +policy : 1 +prio : 4 +``` +### 3-20 ~ 3-26 CFS 进程的负载均衡 +执行 HelloWorld-loop-nice+5/+15 并查看它们的负载权重. +![image](./record/pic/3-18.png) +可以发现负载权重相差了3*3=9倍 + +3-20 显示进程所在处理器编号的 top 输出 +top命令后按 f 进入管理界面根据提示操作打开Last Used Cpu +![image](./record/pic/3-20.png) + +3-21 空闲系统上的即时负载情况 +![image](./record/pic/3-21.png) + +3-22 用 top 查看四个 NICE=-5 的进程所在 CPU +![image](./record/pic/3-22.png) +可以发现4个进程被分配在4个不同的CPU核心上运行 + +FIFO 任务执 +行时不被打断一直到运行结束(除非更高优先级的实时任务来抢占),而后者的 RR 任务在执 +行一个时间片之后将让出 CPU 给其他相同优先级的 RR 任务实现轮转执行。3-23 察看运行-5/0/+5/+10 四个进程后各处理器负载 +![image](./record/pic/3-23.png) + +3-24 从/proc/PID/sched 中查看进程的迁移次数 +处理的进程数小于等于处理器核心数,基本不会进行调度 +![image](./record/pic/3-24.png) + +3-25 用 top 查看五个进程的处理器编号 +在这个情况下处理的进程数大于处理器核心数,故会不断进行调度 +![image](./record/pic/3-25a.png) +![image](./record/pic/3-25b.png) +![image](./record/pic/3-25c.png) + +3-26 用/proc/PID/sched 查看进程迁移次数 +![image](./record/pic/3-26.png) + +### 3-27&3-28实时进程负载均衡 +进程在八个处理器上运行 +![image](./record/pic/3-27.png) + +高优先级实时进程抢占低优先级实时进程的示例,开启一个优先级更高的进程 +![image](./record/pic/3-28.png) + +## 课后作业 +### 1.在一个空闲的单核 Linux 系统上用 nice 命令调整两个进程的优先级,使得它们各自使用 1/5 和 4/5 的 CPU 资源。 +```bash +cat Run-NICE.sh +taskset -c 0 ./HelloWorld-loop & +taskset -c 0 nice -6 ./HelloWorld-loop & +``` +运行结果如下: +![image](./homework/1/1.png) + +### 2.P1/P3 在第一个处理器上运行各占 50%的 CPU 资源,P2/P4 在另一个处理器上运行,各自 30%和 70%的 CPU 资源。 +```bash +cat Run-NICE.sh +taskset -c 0 ./HelloWorld-loop & +taskset -c 0 nice -4 ./HelloWorld-loop & +taskset -c 1 ./HelloWorld-loop & +taskset -c 1 ./HelloWorld-loop & +``` +运行结果如下: +![image](./homework/2/2.png) + +### 3.请预测 Linux 对于相同优先级的 FIFO 实时进程的调度情况,并通过实验给出实测数据以证明。 +教材中提到: +* FIFO 任务执行时不被打断一直到运行结束(除非更高优先级的实时任务来抢占),而后者的 RR 任务在执行一个时间片之后将让出 CPU 给其他相同优先级的 RR 任务实现轮转执行。 +* FIFO 由于避免了调度切换的时间开销,因此更有利于本任务的快速完成。但是同时由于FIFO 也会造成同级 FIFO 任务的明显延迟. + +故可以猜测 Linux 对于相同优先级的 FIFO 实时进程会安装先进先出的原则执行完一个进程后再执行另外一个。 +实验结果如下: +1.启动两个相同优先级的FIFO 实时进程 +![image](./homework/3/3_homework_3_1.png) +2.观察top结合1的打印结果,发现只有一个成功执行 +![image](./homework/3/3_homework_3_2.png) +3.一段时间后第一个进程执行完毕,第二进程PID号才打印了出来,说明两者运行互斥 +![image](./homework/3/3_homework_3_3.png) +![image](./homework/3/3_homework_3_4.png) + +### 4.在一个空载的系统上,如果将代码 3-8 的最后一行替换成两个“RR-FIFO-sched 2 80”,请预测其负载均衡后进程的运行情况,并说明是否只有一种处理器分配方案? + +```bash +cat RT-Balance.sh +./RR-FIFO-sched 1 5& +./RR-FIFO-sched 1 10& +./RR-FIFO-sched 1 15& +./RR-FIFO-sched 1 20& +./RR-FIFO-sched 1 25& +./RR-FIFO-sched 1 30& +./RR-FIFO-sched 1 35& +./RR-FIFO-sched 2 80& +./RR-FIFO-sched 2 80 +``` +知识点: +* 以 O(1)调度器方式调度——本处理器上的实时进程按照优先级不同挂入不同的子队列中,高优先级的队列先执行完再执行低优先级的队列上的进程。 +* 实时进程可以进一步分为两种调度模式:SCHED_FIFO 和 SCHED_RR。前者的 FIFO 任务执行时不被打断一直到运行结束(除非更高优先级的实时任务来抢占),而后者的 RR 任务在执行一个时间片之后将让出 CPU 给其他相同优先级的 RR 任务实现轮转执行。 + +预测:后面运行的RR-FIFO-sched 2 80拥有高的优先级故会挂载进队列并开始运行,最低优先级的./RR-FIFO-sched 1 5 被挤出队列,待其他进程完成后再运行 + +实际结果(一开始运行就卡炸了): +首先,8个优先级较高的开始运行,最高占用不超过95% +此时可以观察到8个进程所占用的CPU核心会发生跳动 +![image](./homework/4/4-1.png) +待8个优先级较高的进程执行完成后,优先级较低的进程开始执行 ![image](./homework/4/4-2.png) \ No newline at end of file diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/msgtool" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/msgtool" old mode 100755 new mode 100644 diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/mutex-demo" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/mutex-demo" old mode 100755 new mode 100644 diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/no-mutex-demo" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/no-mutex-demo" old mode 100755 new mode 100644 diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/pipe-demo" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/pipe-demo" old mode 100755 new mode 100644 diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/psem-named-open" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/psem-named-open" old mode 100755 new mode 100644 diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/psem-named-post-demo" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/psem-named-post-demo" old mode 100755 new mode 100644 diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/psem-named-wait-demo" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/psem-named-wait-demo" old mode 100755 new mode 100644 diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/shmatt-read-demo" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/shmatt-read-demo" old mode 100755 new mode 100644 diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/shmatt-write-demo" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/shmatt-write-demo" old mode 100755 new mode 100644 diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/shmget-demo" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/record/code/shmget-demo" old mode 100755 new mode 100644 diff --git "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/note.md" "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/report.md" similarity index 94% rename from "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/note.md" rename to "4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/report.md" index a0f06f0..da956ce 100644 --- "a/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/note.md" +++ "b/4.\350\277\233\347\250\213\351\227\264\351\200\232\344\277\241\344\270\216\345\220\214\346\255\245/report.md" @@ -1,253 +1,264 @@ -# 实验记录 -### 4-1 无名管道 -* 管道(pipe),或称无名管道,是所有 Unix 都提供的一种进程间通信机制。 -* Unix 命令中使用“|”来连接两个命令时使用的就是管道,例如“ls | more” -* 无名管道有一个主要缺点,只能通过父子进程之间(及其后代)使用文件描述符的继承来访问,无法在任意的进程之间使用。 - -屏显 4-1 pipe-demo 的输出 -![image](./record/pic/4-1.png) - -### 4-2&4-3&4-4 命名管道(FIFO) -* FIFO 就是无名管道的升级版——有可访问的磁盘索引节点,即 FIFO 文件将出现在目录树中(不像无名管道那样只存在于 pipefs 特殊文件系统中) - -4-2 mkfifo 创建命名管道 -4-3 用 cat 尝试读取空的管道文件(阻塞) -![image](./record/pic/4-2.png) - -4-4 用 echo 向管道写入数据(cat 被唤醒并显示管道文件的内容) -![image](./record/pic/4-4.png) - -### System V IPC -System V IPC 指的是 AT&T 在 System V.2 发行版中引入的三种进程间通信工具: -* (1)信号量,用来管理对共享资源的访问 -* (2)共享内存,用来高效地实现进程间的数据共享 -* (3)消息队列,用来实现进程间数据的传递。 -### ipcs -* 在 Linux 中执行 ipcs 命令可以查看到当前系统中所有的 System V IPC 对象 -* ipcs -a 是默认的输出全部信息、ipcs -m 显示共享内存的信息、ipcs -q 显示消息队列的信息、ipcs -s 显示信号量集的信息。另外用还有一些格式控制的参数,–t 将会输出带时间信息、-p 将输出进程 PID 信息、-c 将输出创建者/拥有者的 PID、-l 输出相关的限制条件。例如用 ipcs -ql 将显示消息队列的限制条件 -```bash -ipcs ---------- 消息队列 ----------- -键 msqid 拥有者 权限 已用字节数 消息 - ------------- 共享内存段 -------------- -键 shmid 拥有者 权限 字节 连接数 状态 -0x00000000 65536 hypo 600 524288 2 目标 -0x00000000 229377 hypo 600 134217728 2 目标 -................................. - ---------- 信号量数组 ----------- -键 semid 拥有者 权限 nsems -``` -```bash -ipcs -ql - ----------- 消息限制 ----------- -系统最大队列数量 = 32000 -最大消息尺寸 (字节) = 8192 -默认的队列最大尺寸 (字节) = 16384 -``` -### 4-5 消息队列 -屏显 4-5 msgtool 的执行结果 -```bash -(base) $ ./msgtool s 1 Hello,my_msq_queue! -Sending a message -(base)$ ipcs -q - ---------- 消息队列 ----------- -键 msqid 拥有者 权限 已用字节数 消息 -0x6d060ca4 0 hypo 660 20 1 - -(base) $ ./msgtool r 1 -Reading a message -Type: 1 Text: Hello,my_msq_queue! -(base)$ ipcs -q - ---------- 消息队列 ----------- -键 msqid 拥有者 权限 已用字节数 消息 -0x6d060ca4 0 hypo 660 0 0 - -``` -### 4-6 ~ 4-10共享内存 -屏显 4-6 shmget-demo 的输出 -```bash -$./shmget-demo -Successfully created segment : 7634968 ------------- 共享内存段 -------------- -键 shmid 拥有者 权限 字节 连接数 状态 - -0x00000000 7241751 hypo 600 524288 2 目标 -0x00000000 7634968 hypo 666 4096 0 - -Successfully created segment : 7438361 -``` -屏显 4-7 shmatt-write-demo 运行时的输出(1) -```bash -$./shmatt-write-demo 7634968 - segment attached at 0x7f24a55f6000 - ------------- 共享内存段 -------------- -键 shmid 拥有者 权限 字节shmatt-write-demo 映射共享内存时的进程布局 - -击键回车后 shmat-write-demo 将解除共享内存的映射,此时 ipcs –m 显示对应的共享内存区没有人使用(nattch 列为 0) - -屏显 4-9 shmatt-demo 运行时的输出(2) - - -$. ipcs -m -​ ------------- 共享内存段 -------------- -键       shmid     拥有者 权限     字节     连接数 状态       -​ -0x00000000 7667735   hypo       600        524288     2         目标       -0x00000000 7634968   hypo       666        4096       0                       -​ -屏显 4-10 shmatt-read-demo 的部分输出 - - -$ ./shmatt-read-demo 7634968 - segment attached at 0x7f19a5aee000 -​ ------------- 共享内存段 -------------- -键       shmid     拥有者 权限     字节     连接数 状态       -0x00000000 7634968   hypo       666        4096       1                       - -The string in SHM is :Hello shared memory! -虽然创建该共享内存的进程已经结束了,可是 shmatt-read-demo 映射 ID 为的共享内存后,仍读出了原来写入的字符串,如所示。 连接数 状态 -0x00000000 7634968 hypo 666 4096 1 -0x00000000 6881306 hypo 600 2738960 2 目标 -``` -屏显 4-8 shmatt-write-demo 映射共享内存时的进程布局 -![image](./record/pic/4-8.png) -击键回车后 shmat-write-demo 将解除共享内存的映射,此时 ipcs –m 显示对应的共享内存区没有人使用(nattch 列为 0) - -屏显 4-9 shmatt-demo 运行时的输出(2) - -```bash -$. ipcs -m - ------------- 共享内存段 -------------- -键 shmid 拥有者 权限 字节 连接数 状态 - -0x00000000 7667735 hypo 600 524288 2 目标 -0x00000000 7634968 hypo 666 4096 0 - -``` -屏显 4-10 shmatt-read-demo 的部分输出 -```bash -$ ./shmatt-read-demo 7634968 - segment attached at 0x7f19a5aee000 - ------------- 共享内存段 -------------- -键 shmid 拥有者 权限 字节 连接数 状态 -0x00000000 7634968 hypo 666 4096 1 - -The string in SHM is :Hello shared memory! -``` -虽然创建该共享内存的进程已经结束了,可是 shmatt-read-demo 映射 ID 为的共享内存后,仍读出了原来写入的字符串,如所示。 -### POSIX 有名信号量 -屏显 4-11 psem-named-open-demo 的输出 -```bash -$ gcc psem-named-open.c -lpthread -o psem-named-open -$ ./psem-named-open -please input a file name to act as the ID of the sem! -$ ./psem-named-open HelloWorld.c -``` -屏显 4-12 ps 查看 psem-named-wait-demo 的运行状态 -![image](./record/pic/4-12.png) - -该信量进行 P 操作(增 1 操作),使得前面的 psem-named-wait-demo 进程从原来的阻塞状态唤醒并执行结束。 -图 4-6 psem-named-post-demo 的运行输出(并唤醒阻塞的 psem-named-wait-demo 进程) -![image](./record/pic/pic4-6.png) - -### POSIX 无名信号量 -POSIX 无名信号量适用于线程间通信,如果无名信号量要用于进程间同步,信号量要放在共享内存中(只要该共享内存区存在,该信号灯就可用)。 -### 互斥量 -屏显 4-13 mutex-demo 的输出 -![image](./record/pic/4-13.png) - -屏显 4-14 mutex-demo 的输出 -(在新版本gcc中mutex m;应改为pthread_mutex_t m;) -![image](./record/pic/4-14.png) - -# 课后作业 -#### 1.设计编写以下程序,着重考虑其通信和同步问题: -* a)一个程序(进程)从命令行读入按键信息,一次将“一整行”按键信息保存到一个共享存储的缓冲区内并等待读取进程将数据读走,不断重复上面的操作; -* b)另一个程序(进程)生成两个进程/线程用于显示缓冲区内的信息,这两个线程并发读取缓冲区信息后将缓冲区清空(一个线程的两次“读取+ 显示”操作之间可以加入适当的时延以便于观察)。 -* c)在两个独立的终端窗口上分别运行上述两个程序,展示其同步与通信功能,要求一次 -只有一个任务在操作缓冲区。 -* d) 运行程序,记录操作过程的截屏并给出文字说明。 -* 要求使用 posix 信号量来完成这里的生产者和消费者的同步关系。 - -解答: -对于本题,编写了两个程序,分别是Comsumer.c与Producer.c -Comsumer.c将创建共享内存区与一个信号量并不断的检测键盘输入,当有键盘输入且信号量为0的时候将键入内容复制到共享内存区,并对信号量加1 -Producer.c被fork为两个线程,不断的检测信号量,若为1则读取内存缓存区并显示,然后对信号量减1 -![image](./homework/Producer_Comsumer.png) - -#### 2.将 2.6 的练习 3 进行扩展,使得你编写的 shell 程序具有支持管道的功能,也就是说你的shell 中输入“dir | more”能够执行 dir 命令并通过管道将其输入传送给 more -解答: -1.创建pipe -2.fork两个子进程执行dir和more命令 -3.把dir子进程的标准输出、标准错误重定向到管道数据入口 -4.把more子进程的标准输入重定向到管道数据出口 - -![image](./homework/shell_with_pipe.png) -[参考资料1](https://blog.csdn.net/weixin_34197488/article/details/93652978) -[参考资料2](http://www.it1352.com/485628.html) -[参考资料3](https://blog.csdn.net/tiandc/article/details/81489447) -实现函数: - -```c -int pipe_shell(char **args1, char **args2) -{ - int pfds[2]; - pid_t pid1, pid2, wpid; - pipe(pfds); - char buf[1024]; - int nwr = 0; - int status; - pid1 = fork(); - if (pid1 < 0) - { - printf("fork error!\n"); - } - else if (pid1 == 0) - { - // STDIN_FILENO:接收键盘的输入 - // STDOUT_FILENO:向屏幕输出 - // dup2 把 pfds[1](管道数据入口描述符) 复制到 文件描述符1&2 - // 实现把pid1的标准输出和标准错误 输送到管道 - dup2(pfds[1], STDOUT_FILENO); - dup2(pfds[1], STDERR_FILENO); - close(pfds[0]); - close(pfds[1]); - char *args[]={"ls",NULL}; - execvp(args1[0], args1); - exit(0); - } - pid2 = fork(); - if (pid2< 0) - { - printf("error!\n"); - } - else if (pid2 == 0){ - //dup2 把 pfds[0](管道数据出口描述符) 复制到 文件描述符0 - //实现pid2从管道中读取(pid1的输出)数据 - dup2(pfds[0], STDIN_FILENO); - close(pfds[0]); - close(pfds[1]); - char *args[]={"more",NULL}; - execvp(args2[0], args2); - exit(0); - } - close(pfds[0]); - close(pfds[1]); - do - { - wpid = waitpid(pid2,&status,WUNTRACED); - } - while (!WIFEXITED(status) && !WIFSIGNALED(status)); - return 1; -} +[toc] +## 实验目的 +* 通过编程实践、观察,学习进程间通信与同步的方法。 +## 实验环境 +* 硬件 +1.Intel(R) Xeon(R) Bronze 3104 CPU @ 1.70GHz +2.DDR4 16G +* 软件 +1.CentOS 7 +2.ubuntu 18.04 +3.VMware Workstation Pro 15 +## 实验记录 +### 4-1 无名管道 +* 管道(pipe),或称无名管道,是所有 Unix 都提供的一种进程间通信机制。 +* Unix 命令中使用“|”来连接两个命令时使用的就是管道,例如“ls | more” +* 无名管道有一个主要缺点,只能通过父子进程之间(及其后代)使用文件描述符的继承来访问,无法在任意的进程之间使用。 + +屏显 4-1 pipe-demo 的输出 +![image](./record/pic/4-1.png) + +### 4-2&4-3&4-4 命名管道(FIFO) +* FIFO 就是无名管道的升级版——有可访问的磁盘索引节点,即 FIFO 文件将出现在目录树中(不像无名管道那样只存在于 pipefs 特殊文件系统中) + +4-2 mkfifo 创建命名管道 +4-3 用 cat 尝试读取空的管道文件(阻塞) +![image](./record/pic/4-2.png) + +4-4 用 echo 向管道写入数据(cat 被唤醒并显示管道文件的内容) +![image](./record/pic/4-4.png) + +### System V IPC +System V IPC 指的是 AT&T 在 System V.2 发行版中引入的三种进程间通信工具: +* (1)信号量,用来管理对共享资源的访问 +* (2)共享内存,用来高效地实现进程间的数据共享 +* (3)消息队列,用来实现进程间数据的传递。 +### ipcs +* 在 Linux 中执行 ipcs 命令可以查看到当前系统中所有的 System V IPC 对象 +* ipcs -a 是默认的输出全部信息、ipcs -m 显示共享内存的信息、ipcs -q 显示消息队列的信息、ipcs -s 显示信号量集的信息。另外用还有一些格式控制的参数,–t 将会输出带时间信息、-p 将输出进程 PID 信息、-c 将输出创建者/拥有者的 PID、-l 输出相关的限制条件。例如用 ipcs -ql 将显示消息队列的限制条件 +```bash +ipcs +--------- 消息队列 ----------- +键 msqid 拥有者 权限 已用字节数 消息 + +------------ 共享内存段 -------------- +键 shmid 拥有者 权限 字节 连接数 状态 +0x00000000 65536 hypo 600 524288 2 目标 +0x00000000 229377 hypo 600 134217728 2 目标 +................................. + +--------- 信号量数组 ----------- +键 semid 拥有者 权限 nsems +``` +```bash +ipcs -ql + +---------- 消息限制 ----------- +系统最大队列数量 = 32000 +最大消息尺寸 (字节) = 8192 +默认的队列最大尺寸 (字节) = 16384 +``` +### 4-5 消息队列 +屏显 4-5 msgtool 的执行结果 +```bash +(base) $ ./msgtool s 1 Hello,my_msq_queue! +Sending a message +(base)$ ipcs -q + +--------- 消息队列 ----------- +键 msqid 拥有者 权限 已用字节数 消息 +0x6d060ca4 0 hypo 660 20 1 + +(base) $ ./msgtool r 1 +Reading a message +Type: 1 Text: Hello,my_msq_queue! +(base)$ ipcs -q + +--------- 消息队列 ----------- +键 msqid 拥有者 权限 已用字节数 消息 +0x6d060ca4 0 hypo 660 0 0 + +``` +### 4-6 ~ 4-10共享内存 +屏显 4-6 shmget-demo 的输出 +```bash +$./shmget-demo +Successfully created segment : 7634968 +------------ 共享内存段 -------------- +键 shmid 拥有者 权限 字节 连接数 状态 + +0x00000000 7241751 hypo 600 524288 2 目标 +0x00000000 7634968 hypo 666 4096 0 + +Successfully created segment : 7438361 +``` +屏显 4-7 shmatt-write-demo 运行时的输出(1) +```bash +$./shmatt-write-demo 7634968 + segment attached at 0x7f24a55f6000 + +------------ 共享内存段 -------------- +键 shmid 拥有者 权限 字节shmatt-write-demo 映射共享内存时的进程布局 + +击键回车后 shmat-write-demo 将解除共享内存的映射,此时 ipcs –m 显示对应的共享内存区没有人使用(nattch 列为 0) + +屏显 4-9 shmatt-demo 运行时的输出(2) + + +$. ipcs -m +​ +------------ 共享内存段 -------------- +键       shmid     拥有者 权限     字节     连接数 状态       +​ +0x00000000 7667735   hypo       600        524288     2         目标       +0x00000000 7634968   hypo       666        4096       0                       +​ +屏显 4-10 shmatt-read-demo 的部分输出 + + +$ ./shmatt-read-demo 7634968 + segment attached at 0x7f19a5aee000 +​ +------------ 共享内存段 -------------- +键       shmid     拥有者 权限     字节     连接数 状态       +0x00000000 7634968   hypo       666        4096       1                       + +The string in SHM is :Hello shared memory! +虽然创建该共享内存的进程已经结束了,可是 shmatt-read-demo 映射 ID 为的共享内存后,仍读出了原来写入的字符串,如所示。 连接数 状态 +0x00000000 7634968 hypo 666 4096 1 +0x00000000 6881306 hypo 600 2738960 2 目标 +``` +屏显 4-8 shmatt-write-demo 映射共享内存时的进程布局 +![image](./record/pic/4-8.png) +击键回车后 shmat-write-demo 将解除共享内存的映射,此时 ipcs –m 显示对应的共享内存区没有人使用(nattch 列为 0) + +屏显 4-9 shmatt-demo 运行时的输出(2) + +```bash +$. ipcs -m + +------------ 共享内存段 -------------- +键 shmid 拥有者 权限 字节 连接数 状态 + +0x00000000 7667735 hypo 600 524288 2 目标 +0x00000000 7634968 hypo 666 4096 0 + +``` +屏显 4-10 shmatt-read-demo 的部分输出 +```bash +$ ./shmatt-read-demo 7634968 + segment attached at 0x7f19a5aee000 + +------------ 共享内存段 -------------- +键 shmid 拥有者 权限 字节 连接数 状态 +0x00000000 7634968 hypo 666 4096 1 + +The string in SHM is :Hello shared memory! +``` +虽然创建该共享内存的进程已经结束了,可是 shmatt-read-demo 映射 ID 为的共享内存后,仍读出了原来写入的字符串,如所示。 +### POSIX 有名信号量 +屏显 4-11 psem-named-open-demo 的输出 +```bash +$ gcc psem-named-open.c -lpthread -o psem-named-open +$ ./psem-named-open +please input a file name to act as the ID of the sem! +$ ./psem-named-open HelloWorld.c +``` +屏显 4-12 ps 查看 psem-named-wait-demo 的运行状态 +![image](./record/pic/4-12.png) + +该信量进行 P 操作(增 1 操作),使得前面的 psem-named-wait-demo 进程从原来的阻塞状态唤醒并执行结束。 +图 4-6 psem-named-post-demo 的运行输出(并唤醒阻塞的 psem-named-wait-demo 进程) +![image](./record/pic/pic4-6.png) + +### POSIX 无名信号量 +POSIX 无名信号量适用于线程间通信,如果无名信号量要用于进程间同步,信号量要放在共享内存中(只要该共享内存区存在,该信号灯就可用)。 +### 互斥量 +屏显 4-13 mutex-demo 的输出 +![image](./record/pic/4-13.png) + +屏显 4-14 mutex-demo 的输出 +(在新版本gcc中mutex m;应改为pthread_mutex_t m;) +![image](./record/pic/4-14.png) + +## 课后作业 +### 1.设计编写以下程序,着重考虑其通信和同步问题: +* a)一个程序(进程)从命令行读入按键信息,一次将“一整行”按键信息保存到一个共享存储的缓冲区内并等待读取进程将数据读走,不断重复上面的操作; +* b)另一个程序(进程)生成两个进程/线程用于显示缓冲区内的信息,这两个线程并发读取缓冲区信息后将缓冲区清空(一个线程的两次“读取+ 显示”操作之间可以加入适当的时延以便于观察)。 +* c)在两个独立的终端窗口上分别运行上述两个程序,展示其同步与通信功能,要求一次 +只有一个任务在操作缓冲区。 +* d) 运行程序,记录操作过程的截屏并给出文字说明。 +* 要求使用 posix 信号量来完成这里的生产者和消费者的同步关系。 + +解答: +对于本题,编写了两个程序,分别是Comsumer.c与Producer.c +Comsumer.c将创建共享内存区与一个信号量并不断的检测键盘输入,当有键盘输入且信号量为0的时候将键入内容复制到共享内存区,并对信号量加1 +Producer.c被fork为两个线程,不断的检测信号量,若为1则读取内存缓存区并显示,然后对信号量减1 +![image](./homework/Producer_Comsumer.png) + +### 2.将 2.6 的练习 3 进行扩展,使得你编写的 shell 程序具有支持管道的功能,也就是说你的shell 中输入“dir | more”能够执行 dir 命令并通过管道将其输入传送给 more +解答: +1.创建pipe +2.fork两个子进程执行dir和more命令 +3.把dir子进程的标准输出、标准错误重定向到管道数据入口 +4.把more子进程的标准输入重定向到管道数据出口 + +![image](./homework/shell_with_pipe.png) +[参考资料1](https://blog.csdn.net/weixin_34197488/article/details/93652978) +[参考资料2](http://www.it1352.com/485628.html) +[参考资料3](https://blog.csdn.net/tiandc/article/details/81489447) +实现函数: + +```c +int pipe_shell(char **args1, char **args2) +{ + int pfds[2]; + pid_t pid1, pid2, wpid; + pipe(pfds); + char buf[1024]; + int nwr = 0; + int status; + pid1 = fork(); + if (pid1 < 0) + { + printf("fork error!\n"); + } + else if (pid1 == 0) + { + // STDIN_FILENO:接收键盘的输入 + // STDOUT_FILENO:向屏幕输出 + // dup2 把 pfds[1](管道数据入口描述符) 复制到 文件描述符1&2 + // 实现把pid1的标准输出和标准错误 输送到管道 + dup2(pfds[1], STDOUT_FILENO); + dup2(pfds[1], STDERR_FILENO); + close(pfds[0]); + close(pfds[1]); + char *args[]={"ls",NULL}; + execvp(args1[0], args1); + exit(0); + } + pid2 = fork(); + if (pid2< 0) + { + printf("error!\n"); + } + else if (pid2 == 0){ + //dup2 把 pfds[0](管道数据出口描述符) 复制到 文件描述符0 + //实现pid2从管道中读取(pid1的输出)数据 + dup2(pfds[0], STDIN_FILENO); + close(pfds[0]); + close(pfds[1]); + char *args[]={"more",NULL}; + execvp(args2[0], args2); + exit(0); + } + close(pfds[0]); + close(pfds[1]); + do + { + wpid = waitpid(pid2,&status,WUNTRACED); + } + while (!WIFEXITED(status) && !WIFSIGNALED(status)); + return 1; +} ``` \ No newline at end of file diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem1" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem1" new file mode 100644 index 0000000000000000000000000000000000000000..5ce560bbeb11379e2ec0db3e4f344221052a965e GIT binary patch literal 8576 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 +#include + +#define kB 1024 +void *p; +int main() +{ + int i = 8; + while(1) + { + p = malloc(i*kB); + free(p); + printf("%d,succeed,%s\n",i,p); + i++; + } + return 0; +} diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem1.png" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem1.png" new file mode 100644 index 0000000000000000000000000000000000000000..5bbb0dd9d04e2611804e743d4d6eb1545c77c352 GIT binary patch literal 14972 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 BrnCS6 literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem2" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem2" new file mode 100644 index 0000000000000000000000000000000000000000..8303c21ac5f229d9a41bf9c9508173a27fa76fde GIT binary patch literal 8688 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 literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem2.c" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem2.c" new file mode 100644 index 0000000..29422aa --- /dev/null +++ "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem2.c" @@ -0,0 +1,42 @@ +#include +#include +#define kb 1024 + +void *bufs[134]; //1+1+1+2+1+4+1+8+1+16+1+32+1+64 = 134 +// int list[]={0,2,5,10,19,36,69}; + +int main(){ + int i; + for (i = 0; i < 134; ++i){ + bufs[i] = malloc(1*kb); + } + + for (i = 0; i < 134; ++i){ + if (i==0) + printf("<1kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 2) + printf("1~2kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 5) + printf("2~4kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 10) + printf("4-8kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 19) + printf("8-16kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 36) + printf("16-32kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 69) + printf("32-64kb pre-addr:%p\n",bufs[i+1] ); + else + free(bufs[i]); + } + + while(1){ + int size; + printf("input size(<64kb):\n"); + scanf("%d",&size); + void *ptr; + ptr = malloc(size*kb); + printf("true:addr:%p\n",ptr ); + } + return 0; +} \ No newline at end of file diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem2.png" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem2.png" new file mode 100644 index 0000000000000000000000000000000000000000..140a94775f154de829d502a8ba013403b32a635c GIT binary patch literal 31162 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 literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_A.png" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_A.png" new file mode 100644 index 0000000000000000000000000000000000000000..64417878fadc2d2a8fe34e317e0be132827b4549 GIT binary patch literal 16477 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 CiMTTW literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_a" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_a" new file mode 100644 index 0000000000000000000000000000000000000000..232178db5a43432118c368ab0824d029db0fea17 GIT binary patch literal 8704 zcmeHMeQXrR6`#BF7hmTyF^z#1Z&FN6R3FCJmP?efXZy@LGT<0PTcu`w_O0y;_u<~{ z5ku9~l>^F&IJMMBMU^U1^@~LPqp4KM>OVk;psD(Y6N##yDy5}5lSXwK7db8A`rhn& z=e_k=L8_|$!?SMRyx+X{=FQug*_rWIgFRhtmrF3Y#b*Ud=Sx)ySx+IE8_a8hWTjD$_AYsha@WU~H^^>Rib{vm3eelRr z9iCUF^{0RMn?DYtE&rf+-?R@jHx|)ew+fDN7Sn%t6}({;eA_B`C*TVFoU{XgV(kjZ z>oBIVRg9<2lo&P4@km&VCnIrl1f}7zP*TJ~(P&~==sIfaDKnHb^;jqp7b8i-0C+T( zh!d=f{XO079eR_$$=`xexNUzZS>%FjW4?J@q_;$1Cb`97s$Z%clqDQv<%A)t@eN7| zF|=n=Y&f@pb@etJ-#=5M4d*e9b!|4>KJQfDGkOyLq+ZM+hD9^u3Gjt$$s*Q4G^zL zR~-S%>~j#vz}3=!tx<&Q{VSM1ZR&~Ha!@e0X!l z6b>h?6=ZMSIEh9)ECp-zQBsjp2IwAWUkj$=Q6rQxlw>-tjE6>zRKrj-G<;1<3s*@HXg7FYr1@)CJ%*@JfCT`~~1XT1@aef#f>XCtMRg*Vgsr z6*I1KAL6(-xBD$^xFZ~cpgGF3LK z66Y9rZ^wK+Rb)#n{S729!nOoyvwY%tYfzT9k_=0zBtA~oP(7}@NL>HVd$|P4=iDl? z{F!gYW68Ydn{`_f2?``*yicyPASd@jT{i{7I67SUf6=hbT23(nIL z@m_8ju}ZiOy2Q%(as6`(ub6YZ7xav{aICL>!kz1Gr}V!ZC$ATWCB8DBr^wHs!~Yqn zzw*6&AMj%RTCKl7k$yIcnKdeumgy1{i{$||iuwN~R)~jIjE6q}>MHWy|4RD&J&__j zK9Gf#<8wW9z*S^CJPPc68Nhwu$2s0U zE%jH<$1kno=kzN0_sG99&evAazY4fg&{Ipe4tSN@Cn_BC`X=IdJ4AR1*}exj<`b_Y zkPP{R+(TlE-EaLG>V0C1z-tFPy-I%g-kIw*fgjX&=Is&b-z)I`1L>B03b6z5D);6U z{{Jog7g<+_lV-|HkBs>7I_=4hKE0>=aKEmLu#q%IBPr8J>SjzIjwa$p3N*qAeKeXF z3Pts>nMkJePnVul`0$6_bJ z#3t#WX%?uCClfG96XUdrW6FT3WXed~(Va5HJ~F)qO+t&toT{&>PP{DJoF1~W8D z(r7&GA4*5y!W^!1{V0uvQe(m&J{bpp7B`bt%?Tr!iX`F%f(~^_BN{>jDvd`?;g_B8 zL(xB)0MRri;E96`loB%Ieq)S=*H{>wuw?+5w+E(+nyc->-o zHx%slyl*tg;dWLe?zHa&{0{8hx&3o)Rcf9ifa5Qf=<@l7L~#%bcvfNiS+@!j+{+Sx z>m^bd{IKuNbH-7?@GQgjykDK60}h{uKt+->f5!mDvk2SszIK7^c@5|IS&#W~u*b6v z%e?=sphPLM)s^uREO5Vqs%+2uxCz*xTpx$a!jLF|TPAobA5}Fzm+V96}A=U-JJ$o%$>@zYaE)HhVtb z)Sy!!*0ZE#nejhC1;$U)Eq@MDKEj^;;l3EhF5B~YiT__cht7d`d~>@z4$eWHy?s7c zEn%mCSl^PCWyb#w6?Xgl`HLFpWkcd@$9&0Q&->S2vUk33>Q3J4Jt(0s?mzDn`|s1< z0}jz=W8R}xVEYCK&h6WIe(c+HU!e9UDDj_wx?S+&e)GD9^NVA*nF~P|PE8Ky+%D@@ RtzzFq7jSqEvXes;{{aV($kYG; literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_a.c" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_a.c" new file mode 100644 index 0000000..9f5fe4b --- /dev/null +++ "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_a.c" @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include + + +#define MB (1024*1024) + +int main() +{ + int pid,i; + char *buf; + + pid = getpid(); + printf("PID:%d\n",pid ); + + buf=(char*)malloc(1024*MB); + printf("addr_start:%p\n",buf); + + for(i=0;i<1024*MB;i++) + { + buf[i]=0xaa; + } + + printf("addr_end:%p\n",&buf[i]); + + long size = &buf[i]-&buf[0]; + printf("malloc size:%dMB\n", size/MB); + + + printf("please run pages-blackhole-demo\n"); + + getchar(); + + free(buf); + return 0; +} \ No newline at end of file diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_b" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_b" new file mode 100644 index 0000000000000000000000000000000000000000..30e0dafcad821ea70d800f7e8f8c77d873ae6165 GIT binary patch literal 8496 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 literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_b.c" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_b.c" new file mode 100644 index 0000000..f2a53c6 --- /dev/null +++ "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_b.c" @@ -0,0 +1,21 @@ +#include +#include +#include +#include +#define MB 1024*1024 +int main() +{ + int i,j; + char temp; + int fd= -1; + char * filemap_buf; + char * anon_buf; + anon_buf=(char *)malloc(1000*MB); + while(1) + { + for(i=0;i<1000*MB;i+=4096) + anon_buf[i]=0xaa; + sleep(1); + } + return 0; +} \ No newline at end of file diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_crash.png" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_crash.png" new file mode 100644 index 0000000000000000000000000000000000000000..f6307ff664f1963a6e3b5c831bab26fc4a25586b GIT binary patch literal 94667 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�r*!UaYaHC<$ny*x&z5Npv55%D_ zm$$23Y5G#y7{(X30s<};sNaX;iGBBXzt&{W;h4qMIDvy}mtd;y<~$JVr;7qz;n7uE z6DOhT0JHy{WGobU1cUNZ^xUR#3iryrjNF6tz5h;#ka7OEoN}DDATsU_)y}G+m8ilk z5&J5kHcJ8|M>fiWv!;Qn^h zNV*5WNX<)aoK7CFG<}M1e+wbw3=5&rY(s4-o|1FpRBs+e&7RjhVE-Ha@BTuynkgJq zOZZgvp~f_G2As)--pLgKm&NWC?Bnq!4^Ex!sL!$D4_J zo)TdzH-F6X&v^C}NBag=j=fQhwCS0TPJRK*QM-mO0bQThL*mx@|3+QL@HF6^@7-Em z^{5uZY3D#-A_K|bHwN56HDI1=w$Ar4nnEA6Fh8`PeY;8=q6?(-PnVwmntut{5n7WJ zx{7CfKY;eeZ*?(X(K!sbN)G_nr|auK0LC(%O8<_EZSzj>(8SipI1@ICl<(HBdAKI0 zV_;Y*&R_43kf$pxByt6p$~9gH={po;>L9Mjxw8OXt6T$=ez3)51hlJ zfvKIM0|m#TQSD$iZmM#8W@^`axS2hV(bX0?v`%Nk7=h?}$+UV;gUf*-E{@{exq0s0 zXIe6jpY|pHd>J4?eSTU4^Xso}tYp6&@Yj?=QEg0Wu;=N>{Kjg zF?6zd!790v56JB`MSgJ$t)hw*05igts#nb4^&I=8IZ@gg9j>eDMC+1qF6IDJW%oY= z!A>p^U~oR!eH3sx;UDJ!oRpzqxT~TlHwC-C!gJJ1t$pVy)KjPo|NXT1lo{S`_aX3b zVI*8MqnnED!+*^7Gt8R@Gcv~~QT{X5FZ=|h3Ufg?5N=HY5u*b8PeTkX;(jA*wH9HV zNLR;Chi^a{QX;)hc}pTFR}~_Ldg_*cWaEWi<&=NP#)d5LigG!V7$ESg$L_USGHTwy zhESTyw&iK#1EwgyPa&#_ud>VCbRtLc5~9T?NLH>p*H2?t z6(|hElZ{jrb2VRq@D-FIsZ&09tbQlO03$!c3q?q`4LAD0`3 z8URT*kkVlEjS^s}07VCSnjUbJh;W0WjDz4Wes22#@#|Jrq;jf>cSAck!T}C^qXFU= z9#k^}k)$4tK4}0@Tb2I;pSP=GkIhxE2)mSI$*93oBJveC%&!|<4+cg!ZqM0OiOI2V zi7@vI0x`A$5tNn<$6Xo`vv0FC&nLS7%CP-e8f_)PK-wZALyh?qh@y)uZMU5?kO^Lb z(`brPUn8mtt;+)q>jwuO-~k8v8ZZKb{F)IK2Y_?cLScKSb3j`~xd8YlT=6r2M#rd` z#q^C-TU9s=%cxsD=Hqk9e~@qybD>E(S(D|oN)w5(ZDhPHZ47Mkk9iyyA|U{lWv*Dt z2Yi}A2VRbI`p!;20qQOEk6ju>vtFyj|Fw?YjvjU^15jX5Vz|T8Hf7(wtL!!%xpC z1=7`VcT;_^xIU8&r0?r=4&p_g1zKdKGE6miJ-?Jm=g!Yg%wyQD1wZaL4`e#0Hs^5y z83yef&Ep^gaqGWtt60zTT1|B3)2&QX`1GWG%HL{&ea*(Pi5o_u)e49AvhZSk%;ws| zYUeoS@B#Jn^VRF}TxQom?bl`UBJ-L_sM}A^NI%J5ElUFlU+SOS80OA$8sJ+FR`8&7 z%btBeJO`>k#vjCZz0A2p5$bie=HAF)wi5Ne@Lxh`ts#17T>FN>W$#~QoO(AeuV+|KuYZ%<}&jN`Nm90^QC zhkv>|_Qrdhl;$3^4IFJTHUmXil3A3(tGxlU3_;}^tAW!luY%vxGtWKdfqyx}Wr!h$ zK>RF|AVt08L_s^uDT-B29d(@vYw|B-M<>f9w7BO9ey{-&77#M@=HzQ?oo7CeX%_z#VBJ-DkbOOi(jPEt z0IBR;r1c+|df9;-eD7awSV{kR-4IZ`W)~%sDl4D$&*lt1_#y+uBv+U##2Y!Ur}p?Z z5g|-;xiFNYOpO5et_IV~Q8}B4Iz3L2o`1fpAxepRxr^corz-TI#43APg{v+U+j93s~um`uD=03b-AkO)cXu1WLopGNu5N~&rOH_&t zg!uRgw=%6?v1%a&D>JUuE&z%l6UzSE(>TF(Vm3Q6Afwl-xf~-0j$~|la0R&R(oSGZ z_Y;*BPBXl2C2A`BHioz<=6~>=+mT6aLU)c6Pgh6iXkBsr7*EAlm<^ba#JQDW6PU~| z5Qu0O7X?BH++oRJsFNm-DIFgY+ZvXPH@${%=!j(Jq^Z_atW{sqt=IBmC81XO;yhcY z10=a{-}k_Q92ovT%)NOy)qDH?O~yhN%8)XX26Le-V@OdXBB4x~Ba&rEX3G>wp+ORg zOqoJtS_ny|2pN_nB+ERdp6jzvy7#{Cdw;*r?|7cyKldN^v5&p2>GOVH=XIX1Gbm@! z9Tj0y%R6{vQ)`@?B}c^-8ohpl5$$4sah)^@iQFU-yv^$vuL^x+VynC1J#=^bP)jprEE zrPE2tuP`G~SaWmRuG=qOs=YRP$86!YKzQW-*udqWLxoZ)e^LM8o3A>(^9t3jqmgy` z(JfzZj2P)Wzre;R&P9DeT(L#OdGFkJ{B-}I%p=L^Uytwid$f4W3?{R~Dod2Fmep+PxtJ-)jEtS4FKuAbzSONQsdnh|L zBT$syz)*34497~jthn>Vv2iYL0e}t7Y&XMl2d*H#opZ_-zYDZoNO{S2#uNE-b|D0)Z08IpviZctpP ziDcllDEs4Gm01;LzKjONOg%h5|Nfl%Yta3Q=R^#{t|eSZtdgv;1Z)xmlK9YIB`Jx= z($yUG+4XZL9ae_ciVRNpTeelTDyZ0lnDpW3qW%%)5clo<;}pU}n}p{N{rXZWOw#rzt9WM8QMx{QCg01($hf_L)bYWC zV$Z}59gfv@~v zxTcM)>O&DoOxO`OP8lirL1hQx-@;0mhgj8dx1xcSfS7KqCF+cDztck|izCRes~rc} z1}s%gc^TYb#gCAgUT%GP&7gjomLa6V0vl04AyRTzgiK|ldY7>k*182Ci0*d!}_={H% z*BqB)XIy(<&rZ^HQ`d{C5fz2kV;XI-YkoMj&9BxedD_hX$v5{awMMFIjOLtMsUcV61$e?QN+ zMR95T8Wmo1o9`z{wM$M@Z4Oa})gq;C;&$<}9swd6YfXe}G2q$i z?6^J|-5ATrs;p!mg(zO6`9Wb$GGy?t?5g>k(fw&h3C(D=H=nc@GPAZaBhT7kmXKj5 zR0KwHPui2l`^gA65A4Lu&)FP8MvGK7ZD(6fyh(fS`QYxSuA^vioF;eC$8KyZAbr*z+@Cs(Ufr&=z-5z`eH^JHFC|HrgQRPi#zy`x&#IC7AP zECjgge>|?ep&nQny+mhme(mhYX`blh6#*RsCV2+KaxyG*fhs3 zsq^oret21s^c>gdNBYS---%6=}(AA2Z^9D3IQuQIwO1*DT< zTu!lETc&S2$1`7x**0Fy>|K}VqnA7HdTqvlJc)@D?dfkEinWa99BF4G&3F-S9PX|-%*j<788zim5}H-gYFro=A8z6SAfMRP*{Xu=N3@(L+| zrM(Se;$sJs!8V4f2om-bMcYQZXPr1#Bp@PvJyz>@;EB2D)HLH;Db>A=klwCe@t0~R znGEv?JY0PZFoO@UC-T^;0CAXnl3Q+I{3C>GIrT#C>~Cjg@PdG?T)g+ggz)@ViNV9! z&P91{F-}E!bi`lZry;mlHJAQ?XJq25Xi{YXxED>*VoLTVf3CHL@ttX_Pb4op_Xs z9Poz_X<*v`W8n8|%gI7$&jqdbE9Ca+v)hS_mY^4nLAM+7?O7+k8aYnTEy#OGVvp@c zKK?~mG7%`5R=nl3cB0J59{ohd?m}l| z?Dn%k#_rN)7`u-MQ{z5A4yrJ2X?YnUSld^~jIzD9NSw9{7PFm5V+vN`TP23bbe%46 z@qT&vZp^o}={i`0*6xVwL1hXYg%UlNfgLv~skfpo2|XlA2NuBX%BXOWG7A z7FR9mWBXxOL-wwp`)G&M+n9qF)3LGe8vNsK*wuVJ#Mmo}+%-(QT5l?1O}ZVPXf_ zeuQjm2r^j5ELC1*YVj`UlNda=$UaO5O9Ns1-emY6$QvvN*mKbmXN951`e?E%Qb+pB zZK8B^%m6zYBe@oMU>~D-J^7 z7hY1YGBuz7ZiVQ9!&-7+&C2<;{W#l0PbOy|T6)*@4wJ?NrO!O@pi23b;B)4_ONaNm zd|gy@t3A~`wZzj-yTH$Q5e0?pqnHU|KXg#eu5W~q2d`$betgHtqXsI9$}RHdpz&o{8RN#fb7(FMbFUbpu+7$Nr!|B|iI3{7ewzI;H9sE8_t8oyj@o{&6563FM+Nt|;WF5U_Eg=xwBy(zLvpMA!yz#}y3d9V z-@HP0%wcYq;Dakw{o3bmZ;o+l4wO_xMme<-_-_#H8u!=j8npg!iAV*naw>9-s5eWx zCdp@jKL66o$ha8DS~dLfG{T0_ZEs%lQIYOCfv$DW#E6c>Z@8P>p=Xf!m|KzjYA=oO zP$HeZFVW301?W}o8A8jXZ~=)%$_Yqu>P$>5eaWX*yN67YV37F6mip{Ov1Q4D(sfN9 zbB5by_|17PlP!{Jyer7iDtt)r<1}(bIL!WtPEB@vdy^yq^I_=uW|@u+3x|;T^fmM^ zWQnq!270+D@<@kOwv0f)b4=)x3#s8ZZVV`Jo?p?|<}@6Rp^1N|_d}wKfTJE0&rQj_ znNaz*10eKjof!uV=}bz=?j zb;?2KnQ&rPzqT;u8^V>eWdO_iW4Tq*R)(Pp8EqUc|MrH7i_)!U^EzKv4CT@J-uieZb{Uq{nc540-*;aULAT) zxo8)8#d8plJ6Pwwrw=^h8l00kD3;!%Br)Ds}8cq|i15C-zBN&~v#eWn31Ovs5TG zO|p4YNM;x_UKzf%@Q(T6Zt^HPKhY8SL&(0{QKyC!qCL)AvV%aMJd3`Lcrt4UbEbFq zXq*aqMm z((cQi`@aZ$i<`{&9zIPu;F<|2ncKkCqW9g=+V^O6nI2bQiyTl(;>ZEzxO}2}dxo%S zQBWPL=$EyxP-GgmA$Q)TfSd0ol0q&#Ppw9KrV5>b%8cdM8qWudDf9`9;@#9yLd%S= zTZ}y9lUGI2P;0y|fhmvh1MiMH>1$ijUn(Hf7bDI}m<{F3cCFavfsDoYZM_oy5Bqnb zQo&DM5{;o09x{Lo+?&3zh%K1$>G|c|Vbsq=Iy_?2gJRW-td88{VpmGrar;F28A;^* zVq4>9Qcni0kD-4DYyX?m;Mf0^1Ybh);i{c)Z?nA#wQHLGF0R0H`^}>&^KTY!oJSgM zsEI(WhVcijhvRetmyT~6${;Siaa7gLhp>8KLzxCbKUt3LjI8nK^I5nh{k8MHG@FBxVe3zu*>gXFB zgfH5O7SQhXXCGoK0Pn84tugEBZ{z$DHr^f=aBP^2QB!(eg7A-h&11w(o>jqdntdeh@9e?1evR_gE$85*>(ay=iQGBv`&h^31jri>{ zmq(+E-N)}508O~`R7Np1Em?8m!0nzAmwUx7%LRvLyR8|dBvE7z$!*$IN5g@3@IViq znG81_K_B~YeP~p-{km34+D%wNHp647dXP=TWJu}TcVwwsi(6ajY6t39OO)gSk9;Jb z`qv6MdM~nY<}4uYBCAb*D}FR`T2Xj1Cu+i3dcxJXoCmN1bc=h zb3PJzkUj?+_v+NyHe0DwTFr^o!0Hd)bb%1ifrFP!3ye?iMG&50E4TzwB}Ao7F0nxH z^YnM=Ol3QOUurBv{k*B{`*Gz%=)&iq>0!!tpRN21sxnWcFD{m|P~g7V`iXZ3m3tRX zJkP?;ul3zRy=SB6fhsgbI&gF~ck=WJ@$6NR@pTNGZ>^cJDSvFE5aB1Z_0%wu@w8?5 zy+N*A+aT8%oCiYkkf9f*+f%>D)S8{kzzDKN$VCu$^f@L_>fHqYI0X+A&%viO2)zM! zxb4p2A znf&45@$_pX2+eFX6_r^NmsRygcYg$#id>k++Za~ z2eb08Jk85s#~pv>X?l`9j_GeI7h||ff&gcSX3sh9cl`O|+Vi6m*ou8tgB$0w?Y7<2 zX*4m;h+mq|>p0H&yU%&Of@i^GnAry`rl7=)ghS>^qvg!Vxt&)@MGoWr&A1JU`d$1N2sPJ_?57NV&eeZv z=folj9J~|aM$>{Ucsqt%8$h}S3s}+BWh-L+rMwP3)|3zKlZ1brse8qnM6(@}VN12w zkQ-I{vQH!@C_}O9M?UWKc`xMi;Yx3O8BJ4IK!?&{$s9&F&1#;}o4ZAQxv*9|OvdMS zR?RISBf3X*ZX+;5lp`-F+~L+h4;~H*e-mZvBUm{H^w5S^80uv~1y=7}Kk0k|ZMVWu zoS?BPQ~On-`ogSx?GQsB$I&;%|IX0oN;LFo{WA1ekE8=WSYc|t*`VL>3Y_aI#QHp(yE0?^YcSJ|QkZXn{v6`6? zd#olQ4cQ#*-}{*?kVMRHS|JvrdS8O_^rKK2L4Q8x%K89OD?(%+*!GA6CuYGHr;oaL zI0uXfYM817?jzNq)|y8txdZK2b0v|1A2d%sl-)NbImA#ZIh4Pc*wMig)_hTm*)xp$ zO2rMCtvf`qKBcA_umXukiGUf%zw61A_Fr?lkAu(Vplu)JYgJR8ULtp^CQT_ zs3TH_dbgvRVx+YsDuM1LtXtCSh4i^K#7cVGJW9 zb;pu_Nk$d@qW%;93QCww%50frL%G$l`w%+MA$RVb198_sE8y1Zb@&vbKdi|%QNHf72>5T0qcjrk%^ z&rdE1VHj2IZG2~>VbOJrXA&woN}u?fccMM!G+G#??A|Nw{-2GT1kK`s|8vvkH_CrI zZI)eW5}wsPOT5c6nIlV>=pYC#J_?Gt;rjefKfXfOCnAh7>PnNEk$sEoVDgAXWAW^$ zU%_~F?v_~|uYf1PC$nK9VH;1p{3Ca6 zP!guJYNlz$s86wmn|GRP#-#!6FirS;(cZD32oBx$UN=3oI{1Pyj{zQ?0f6Zwp!x4M zb%q1JO9^47r|sC2ui{zR{Ssog$X#dEg0%pJChZR83X9#E?@q=`8nr_Ncl=Gm>0z2J zIz$lSAOmc9D`%^iJU4(3kwr5@J7tVhh4Vv*a~p?3l#+cGi2`T%Te%Fl)02KaNDOId#{dg%6Y6#QOf%w66N<_r7@Kav)>n;8J>s6 z2jL)(S0g|?B#)>7MeVny;RbvJHe+*)l-N@uF4+3y4gZUu{?^)L zoZ>}ugW?+is^^yJIig+qx971c1pUl)S-uJgxXQhba`HsQv>Xw6U5i2F)rG64?h_NU z$)|`vYYxr=69N76U_yYk{keQ7A=n~ps6|}BGAgnQ8#{tj@NSeAAz8-_3ikMRO<*O!C?Ezy&QNhT}!tU2W9K`8wYoi}8&rUd$ zW~4OT&47tojk4reU_v%sH#=R^I5-4>!HujpfPuX~|Ccv>;|^4$zJGNBuhd1Qn0gcq zobp>+f|4-wuF9pDEq=SiC=z05^{K5b_6a&nox8-czR5?t$BK$2B_a5lKDe(76P=n?y%%)Ack@B zONe3orV1Nv=Z!%#MXAfgl9&5Z)Md`4Nac-HKL*tn`(x`+UUjZ|(VILYiHl7)-^GA= zJS3>wp)1qMg`q)KqsCit{VSxSVi;eVl}iWqEtt!2D@qEc**iX42RK&GI1>2SxZ($_ zD`{FZbc142Sl+z+ZW453iZOs?OT4iL6N~@Dgn)UL4nIdmLmJA7gVu|$qAR?!&VTnV zrCIY;KOw|(Bfe_2aVXSE#z{Et=?J;~%>2hiPn~kxhh=^8Cd&HPih8TeWpV2|g?9T> zJJbA}4~Pp3ySDVi%KxvySD?l4%5Z*m%zSgf*xVz2IEIul6i4};4+#)(vQA;c!6w+P#aX{BlsVto2Kg&CfjVY}oNOHV(EM@qy#f;S+; zAoq-R2yaF)nl` zapM$f_iv}rT;x&k52jG__sA4_37JAk{@E1DSm6CXnnLX+9-ps3f&%+5L<^QJ^qP4S{~dH`Bv?!#$E8d)QQP5gb(7J z%BL;`^E1%g#-NV6bA4qt=J3_;g~ecJ`U(nSE=KTQHO);`-ooY>ekq5KDKLR#oLsqT zfD5PduR6CUzYUR9KR6G!LtBt?_AYSV&z&!F*G1efh{O5R0f2K(VrtZ3XqPD?Ed1oDJYpgtr$pAEb2f%)D7pz1EZQ()e^5p@xpZ^NTxGRjz6(B0bqo`A$Fn-mLa( z_t|o(eBklXA+Jgr8*faF?2!lfS0KNh#0hkT4aD@^)_#Io3#COo`z7THa%z@qzJrO4 zm`XG3DzPo1UG3yay4F8P)`6czzswU`AKg^vm*7~`f@dJq%W#Qvn}#2KA8>V7D-pDE zBK7|HGg#3%CO=B*AZX!{S=4;>63P3AY~#Bq@!B@ zaUeBqCk~_~>P2?GnN*jDtz@j8AOH?%1xnua5uUwswJkNs-IP%V+|0cSF){m;1(a>H zT#>{b_Q_VG25OJ;3j+UkCFl0}dq{wG5i_+UB+ZPN zo;n}9;^4fWY>RoQ?*c(*+iBsUDaJ;oOVi+bX$aclZmf{L`XG9KiYGo-^;nnJq=ZR2KJ zLEurWhtR$ktcK7oGVf}|TDHl5n}*An#YcMo@8y*9)oZtf=REOCQ%ui3y*c1|hWz@@FJsK{N@ zI*L1tPEiuI1QlE3rV~#{x!DMwJA5l8?HmrEUo1q@YB?@tJA07flcIGjE?JJ>nf(;l`zb=6%cNm+6ptg_6Tj5&HPvctv7m3hWiI09(lZ>o zDmTIh%j$3CXl;fJe!&qixz~#&4aZ-4_y1zDExI(in|Y+(oIb?pAW&Nbk)K2_nT7x+YLkRs4af+%z3+T zX9md_r;m69zh8YQ$iwvpIXFP;Vf{zGtlzfa-&QSgJX`P%Vou9StTz4pom_yIkxf&2 z4ELN6h@I|?mx@LH1O7Vp$Zl0dkueDA(o3S#d??rMaa=915d!Xf4;-PU=t@iY`>5b| zDQf|&*DsL()=lx9BPlndtA@svMXoH(-H+H@G>`JT z5H1jJCaVXR9(vp~7*F?|qzNB_Js|A6lRV-jo$nlWp1Z#z@{qoqmGPNk%b2l8f2>f` zi7V9ptj88=C| zljQu%R@HmipZ*cxr$&W>Ylqx7PED}B^xI-W<+B8)CS~cWRvTz)t)QBSA{Bcz7n<|; zmftiYR{vo_Mtj1|yXK|Qkn`H(D|rSntH^h`Xq*P3=h(p)P9MmP=<#nm9D0&qhE82; zH4P;x0;vC2#O{V2fD=A+*BrO1taGPhd!jD;^XI9sUj6-b)HVjDa3Bj?ybf)e3_?!5 zdyDrG+gkP-j=!W(=Kk0(DHO=@7n9oOYvzN{pH={9X0Z!HAw(&G|B0miKnc#?a=(dQ z{`shrFrn6u3jaV=S_Kk)<|LfI;@BHb$a>fdSnL|uEBy^FYi*e&AJcx@l|HL8@CkPu zVek5%uUYBtt!b`jeyv$+d61A1>cwVy0+g@uc`ZOKaN3dKE0YPNF-~rmw>R|z4Gpo# zxeK*ym;06J7RlJx^XJF7KKvSeT{!@Zo?gBqTAhL8;eo?fG4BOS&)k7*`BNGekvj&z z3_IT0;ftZn4SgiOI})Xsky__vm>PQDTbT+FPSq-@{lPyXn_vvoIKaoD(J6~=h2I(^NG4@I}G zI(_3Emak<&P21BOe;hlat=AiY2B2g`NyoM~-l=S)3=%x=kavx^=HwA>>h1Ut7^#eO zfua*ok*usiZU)?jVzN8Y#}H}iF2VP}>Gpx-5sK-Z*E=6QE>Ru`@O{G4ilZ3VZ8fk` zJf;|II&zaJePXZw3tGpfGU`-6TTBr&Nbnb=+#uFr)q{8c&qbEo;0iws_{yZfz@T&>E|22sZsq)hO7PKEj`L6d^!#2#idt3sWskU9 zt$BW*!c%Z3y>;3K({CweQpq9wA^3h}=fTu7I^N}y{A_1xCFqlaOf6RIk(YK_7uJTc zi;QhRS;n}KWC@QZI{fr;SO4@w!OD&09Em_{3iK_dt@(aQiN4=`$DaIvBEssCwo_%s z@6*p^$ys$9cTp;j-(RHR)2N`FAAcOt%D>A^>+r1pD2=i4OSGiPu#^2X1YK;|%aet@ z8)T9GSGBKTj7J^|0D;6}JFgQGiam#HZYq4-%hN&0lZzOF^nJ6xk7bp$Js+$^96{zk zLCLJ%clBS-AXdsNDpmW6+{Pqb#^&r@Mqjk@T(aY$>^+{E90>9*5+s2#b{?Jq2odG{ zgnUQZ&jbykohT8i1Vd{jjA7lK0g+6+0FYmodaUxkEyqdKV3G zyk#N$?>)a823#(he>C9M5(nJX*9CE1SEhjjs3jz>`+fMgrkzdhZN_te^k3q-y$lf7 zt=YJ_-1okKL5D?nb#eJU8ateRit+IdO8=dvetzCm2)YE3m7#Tf8)Ec@PiEcdD;D=p zjlPoue>M7A6n`cTwinxBuw`5&38FTykp#=^5t87{stV3F8?jtsUwiWGJQ=rqcEvR@ znv#$D1gVSfup7~dlI0Pa_8ttB6j z+%5V>tjiMMv!Egrmuf%beM*-jPrsD1ni~h{x@X? z;~%?xe_bw;V5OQEgc!Ll>A!IsYb>TD8oAiNK5&+byAW^W(c7;VH}#%a;`(|_fem^n z1l7_VryxwEjQ>MU=O@bP#mxrd3|+uz?}dyj_GrwYd$ojiAn(TmQBH-_@AThp7b$vn zron}0gfglZLC9SJW7S@!H5YC<^g<`@?}Df=^`w?6nkb<=u1o0RsBfzsf5~Su&hFb2 zadYlNq}8M+((*S_K*V1|Dd#C|3Er3N`4}q{UvJLNP4KWIs-Y@$wBLiig@s(DSiazJmjyXBjk!Lgbay?N+Jas2Q1J{C_hxd z29HOJH6?JX34-CEbrTCw`xw zI)LnsE?XfVhaPub*gChZq1KS-&V3mU#MNXdkFJ2^tTvp*r#C{*SkUwTVzN3;G(MsF z^&3ksQJ|X2$oowg8&=n*)$7hGZwKVQG!}~5fej; zJydW$n(nTo-oMzA5Di*(EfbSL8Q#V>mh3tB`2<6rpdaU|O$plIQlMk_z3sq|J2Iqp zuFKF*70}KgLnEbjre;iVIr#SIQ6jQ=BTf|TSz2?xLO*X`yXnFnVhl0yYyUScYik5F z(0)JnEn(-siC4xUu1;f3WIR~+47H1uh8nlxKZH1tON8FACNjZ3S?p+}3AwqDt++pH zoeH*|Va3U=?@SeXF4`Dax_lup1al&c_|bQVjL=r_@F9tRG5O)vi~$0vm>aL$nnu&% z%+EwzNm6DZnv*ui-eipG{8(R~`?(Vj51xZ*9f)4HXxE5d-Eh^LF*qBKc1sjCEYY_) zrarMZap(0x1CmNfq@?9K8MO`8IJ$zK7?%0V3`@dOLaZt?Cv2mXG2Nmd(mdKQWJrk_ z$zowXesw5|Ro5_F#)iyVm zPjWpKTiI1_jV$=%tY0Gd=tm;JgV;|0qA$;=d6eglM{F3W-`XS2w8q~hHX!o&hQIOu zcegOR{Jm`HVbd`ExpSVK2^%DsOMPqs9EvNa8&Tkj{bb&@8SS7VsrN*ryuQZW&k@N()$cGJn$VbKi%2IW_^*^i#ePd5*DN_SRG3 zm$!>IY$b9|If?(GgBJb=-iIn*vCi&$3D1AGUBC3z-;yixL;SEP8suz2InC2OjV_}_ zJ&rqcCH75en456vSvo}odFobF>TIz4R=w7F_$vYO0IdsDlOfNMn8{C`V6qm>gp8JC zv)?|Xf)^i!NU?lEe@L+uPKXq%eeb~TF7Jx3*%;!B`YTnAUAyr$czyn*T4yPO)p8G1cYQNrkXCaJ zkFkd`Q{*9CDpd(V`cr#mcRVGdqCZxA5mSI<4nVHkvmCL(2{gBM^l&ZPAwM}&^7uDE zF9@M}SA(^r_6DCz-DG4+7m3J)GE%a3=;}Kj5gl=BoXL@onb&bG4WLcGqCeW}M*KK53T{a`*o<4J2=pa(& zI@jZte_@i5!S3h{j$12wnZ~*+R2D>Q(>CNmhmN0QJR|(+ZPwWr@tzv@MFh2EUybgu z!0Mu_WbXaxR63Db$u6Z#cr>;PY9W(*ZClS|*3rC;m^!+l#NZ_j*HoCmI0cu*4OB`sPo#Mu z>t}{LoeLDPJ4{l6NB2F(+~}8qDY_my9H`CY#jLy|p|Ec~zgY^egOkVV4Yf zL8tU}TBMBel<={wrXVLGc~|nfzs9~h_#%K1i|=Anlf1nClF@%H-%_Yk&F4hann+u_x; zcZXjhrfu4g@+T8|mmQMKYwUlF8Wbipym}>1s|8Q^+xC(uanxQ(>Cc7WLdw_=9-`<- z8itA|Cr2_aDeq&UtR09w_rd|nND}VJsf8{2Xl>d_WqgIm5=ClJi6NbNj>*F8+I))D z5HFdCI69U3iO;+9plRdf9p*Xg85o*?{O`|1@>is&$IK1Z5?@JV1qx}H)fMQ5*F*&G zo9a|~M;@_r1hB)CwaAX>7AzhCbxvFO#dsoqD5&}^rI%>tgz)BH#N?Tib8hNNz5QKo*kFQR*_`jQOnf^N65^n?)B5>unowr{0+cIP@!G6BsU)?YknP=IHv1zXYkhY^LYDdYNKAcEiDVrPm}9wL zZ#Pm_E&#*)*ykg;aJ;<(A*7Rw{ZsUa#3wmUh(mN)16ShqRb%6lvRx2vd?5e!Clp5L z_QsbYnV%@OwztLBF;op;W8xQDf_zRs1vj5DT>FAoBezpi#KgH7314))YsK zDpkCkU&~$L18m!cbu&I@D}r?|-4HtHN$tzsZYsG0DBWEhZ%0emr1Va1Eof`c8)uPa zCyA<2v*4s-VHbhKsSd-)}YYk`W&AwW^umXJ!^YyLUMK^_<%42J*7o>FKA^ z&SZ3@oqSMiquM+%RyyCS2YdZy=3qZ)|E7j{9rI|Q8qqTTFi{h@D#pm^Zv%3iqjuo2 zDuUxkZMW?R?(6|uT7lLm_`8Tqja7%29@4cH8e*I#`ESy?_(x+%R`-Pvi5(GoF|agn zTYf{#N;&kS#Wx7+TIR~q7sDi@ruTyTlq6-(Zcl3awGsW-%LgbpLo=5Cc%F!SlXGl% z4BT6iE=|fv6y_a?>ARs`WOGn(Nm`hZ^8D=E$TB3)IF$an-J@X&UrmE-fDev7x$I8E zts4;sc{~6~Ki#F$)Z^<*Gdh;#@l2{O{Uo&ZQV>^mdYFnq{?JQ$SYC&YeK-l@?+a6s zTu=csAZgWQ*mze)6Z&IBRSNyN5wiJHH}%PM1l}1l%QyDuGI8QBAj#fL1X?~`&r#8c zbW9I7seD^3Lm!(#yX#EPNZHJ$6LI zM2}sGr@UjN`_HNZM(0b8i`N2HuA1(VDd~_1{lTdu-mk05-kF{H$?OBA631{6U>SOq z)Y=~_`UNJFj{}}vC*Q_F8`>RwAP7o3!Hm{t)p12GkWfvjBr&zx@Pj0h^hCn_Bf?n-AqU@gA9*r9p?UvPel-SUK&l@p_6mnnC zfvdm!iBQXZCmGB4f$aqF9<|64$34xdeG(&4g`BS*u?R4^S+L|zh_EB5*>GBiz z@W>9o<9p(pRh9vcAv{QN1gz%T>sE6iW8lVvnN->5H-VhQ2owc`w8de7In=$WyoTs@ z=iW@Mk}c~(cvErO5+^~ukHwpMqHTz&l$lN6msL+=`XY4Nlg8HoZA<%o2&nADCu$9i zJA9Smp{o%-3@&!s&LdWVvSR_^>M~ar#|xur%9wEK-50hTmT!{4-=Ac#_bT(((e1a0 z*PijQEp#5fbfGg4{V?n3b-AOt)*q&14__;#28-*=@w@9e|l$WcsNeD3MakoX*JWF`TN z*lQ(M=ii?73NkE`j~2PEaXrYX3;!Y6@ZwSyn+pA@)oTvA$LsXN+Z{ELVX>Alwjw{Y zdw*>9C8~JovxF#T*bMEUK(hecEZbh#?*Bq3w*F`ljbs*kBQ57OAwT@Neqz&5b_LD0 zcspD*lXiPtDi!UwuG>$9jf(fj_wP8^I|ruP9m{TM_K6?D1l>gj4B11xoGstphv%eR zh?w-{fTr?~Q}GRvz%qp3IQ+x@iVBru0gJ|yQ`Kr7m?T4jd4 zus5|0tiAg&*`g;5QC_~xz2^<-l_(vB)_`E-B(J=KotMxC9jH}^v^`>R}##}A3w2Do0j$ii+nUtqES zc>z3Aw>s{T!FNx-DKCN_p2h)Vt}onaVlq(3xl0=0`ERuM>`|F0=P{9a^2N11QAIu9 zaexQ9Vci10v_5IlxjM(!o_^Mu;Y-H37pEHT2z7X<-_kJo3I#Vjdw4;p0b#~w)9%V{ zhq5Ew$J8iRJElt#4PRb0$}lcftxSYx1N}j-@8s=IPnkhh_qsKWl3L=b24j3G)37M* z@Kudl)}K%XlZ(SYwT9n5=bML)Jm06usCpkgdymiBZD}U8_q5U~(JVC@ zh-QzNV)D*RGw*Nn;9XlnY!Gf{Rq>$cN}sbBSI${_u7GLYO=F7iisn={GVI zl6Qb$b$oOT)(5tsFz3Cnbl7t)kN-#_)Y!obJ}$V%F{851oXoNR17o%~*_g});g{FZ zG@bb`{PM={DxoT2O#WdE1$6LllXw%9r6&D z4jEW4sO;R-qFBote@Y-pM3Rer+nTU*(>cHPq;Jd|@5AXJ9St%*xgtdpLIP_aiHy074^ zQTzT+3=Yc7kN-Q+OzD3EG*kKC0nM8IGhNq#W_@9&q~+^5e_#Lhj#HM~hWsOqXZz-3 z_x{e?kZ(xoiNeoIBNr`oa+b-jYesiu?)y0Qh3CecHYF+!Sk|4KId&q@!&@&Af8lj$LeHKxNT(S5m`t+H#>^H21s`Z>&6%uau7pBgft z(>oxESvuUo%z2FQxe=i%kwE8i0T|AW`BYETRYL`L={_pXE8wC{3f~ypxP` zS`d4C&M9u1RDkslIsnn8uVcW79Eq=yWT$4M-p;<$*>H{zOmtwNJN}viM^@tf90fV^ zok9PDocSudspK^wiRV70(shXLVSoPS#4w&Dan$hN<_(+}b+;AfoisgV*Ux`#mN7+I zWJZYs1dV?_py=Ex4wZ~^0=+HVO|tBv{^~=(^szG9GCYd4U6kt+ihUYY;gv1MP;TqLKmL3pq8EoSY$x)<&bsfGbJU< zp)~>4_8~j-JBBpM4A9eEX!aj`{GJm3)yHoiEb~H9jS~Iv*A-6gldpoEoI5KKmWp-y z9&Ste{Cx~U=ZUesN53zI4z5;;CiSL+VBcK(2%fA5&oO2FMM(8x0Tv}7E|yLAu^qJ? zv&g#|JV%kR>bQLS?iQ?4?OBfEy6DJ3&D4Z-uHh2Aa)K%#5(hyTQ4%_iDPYaKUd*Wp z+s?oQ4i3>)EMjG>WJj!w#u^?w#HhvWmd9tT&(?Y$c;n@?^!4o77pYbzc1(?w&J0KX zlj|WQlKhXg|YLue@G>IU!ryN|R!WNX>; zFcZk0b8qRN^&O_Y+=!wg@?|1dN#Vh2<^L#pz8LlIqvxwAK(22r^HgMm@2)yVi28+$ zTc~y`Jy3cRmpaNtD1jRnF7pVX!fcCX*2jGV)tc{$+hP#rYI9`_@pVA43s(+ziP&HW zr!byP*>*LA@KAdlWy47Ok1ip9cP|0KN0~nENKhR*FIMyYJr_E@R)HO{Qk^oxm&7aX z*UptxWQhaFX3Aabb{85>X-0a`lcEy2f~)FImmOmaexmtsRFhp(O%czruCb`Uq zM^tU=l&wxP;E7>E4uGj{XH;XmaivwQet<{8?2sP1ztf8*htz%Zvn<$2C6}lb`+PdI zytSkxiCx&9tkBR|H*fNp^Zs7?Q8Pms(FQr55EVO`@+pU>TBDd;L)`>S{;(Z^8a*fIiBG;&FZXT`t)BCSH)^L0t=|;{hO6w|Y zlhGd3gLvKSM%l-r^_y^rS9?%med$`%uFqU9 zPEy}`d>(y8`A*VXRVy-WO^*P7I8skESxkb2kzD@fXm(ey|i4d(UEd6Z ztH6+>12Oitrw?mJgpz~Lun?wx2N;Xrlx{S4KyB{bXKCRlv`RZ{v}PWiorzjWa}E5y z0_o$umMWRO?A-4q>5+o)rCNt(!lyc>BFgUqP(33!TVUOA<{)&4*$rAr+>a@$gW%PRHx>r_9d^t1YvGeeiSm;HYtR3O$-R$-N(Ibep zb*~$Ce9S~0?akC1tjj6GFhIQD@!!PzF^#~7t!{9Snsq9>Je@+_#l_9=XNleCGs5gx zTf+&c0h_(kLf&4Ds7ka##s!8MeTB!Ax8f5KRmlX;&xSvgZjbzS^C$6o6Q89Cf=&C= zT>YiWkAyB4nVhZ*vP`$<_$4aETvCvx8yx|_S+Dk8{d$h8jgltz@sVi?ew1|WI%BTx z!*6%#W^~=#&J(Y$%eN8obH`V#GvqBl_tt91t9_( z-T_pB^j0N)yB|^?6twjGF*VKu882*}eq1^m>dd9=AK4KOud~_cYxw!MUs^R?G$s-|@-PK>KGG8H zHU3>8!oO<<{v8s`*iYo&^^;Pt%cwFblv8ZpO!SkG_(URf_6xw{olHbpTy}4TMh(hG zoYJ+xwVt_?15`lFrrLE3yo{($!mpn{ZS&|ZZh79L5fEF3S^&l@F>HRLrDojTWnshp zGFqrw6%F?TfC7ilQ5Zf)y$4*AVXU7*P)!NYGS^=AlVtIw(aSlTuJ?%d2(G>BRiD;_PwO6X-mG(;O3H`I_ML1z#ZR1%lHc zQE-Z(GnGT`G5Di-OTMvd+EaqBqJFIKTN>!2i9dRF-=>a&0jEaY_8L@1Z}VqVm7U*6 zkDW-S?Y-IrIe&%^5@wyT*>uyFzXZV!Df2^r%jeChTgn^kXgZ-hjxx~x_4K0q%&>E8 z;~k-M?Jp-%p5EH68SGewnT&!WKjr&0eD%Z#hHMjNj}mLubU=)_aXBJ2iGtK*DjG#f z7DB)W9^J929e4cXFCe^8%PJ6_$1xYKNKN;J__9B0+zj~k`L8Y;!c^^ytKbu%c(~RC zZ7y-gGTczjD@HCg>2-A$ z)3N6VoVypao0VgLC_7!-|3yr!-+qbi;QzECX~w6%m~(?SOeIAmLFy*7N*})GlS7w-m4iRpUXNDwoTk z7sblNW?ufUwVSixCs&6fwi(_E%IMxD0_31I+cyveazl`48IIDO?U#U!c7PPC;o6}ecHW+$Ev^g$l>O=P)T%Dm~X5XEU);Yd%_dyMj_Wx2;B4(w{F%eDxZZCE&FK9Gs>FDvf5%RLGC zL>_u&zv_tof00YrO3cYJKhry}w=EIDNMU*PwTI7oeJ$!{2+&|-0psZve-H52v(kGE1W2r)~>&XGm7nxcBvV=Ap;;-7?N2j=#!BxY*1nL z%|s<2hA-K<0ei^6SMt#=zRf z=UJ4JnB#mm%)GpXb;MjzpBl{FN~Mt1x5@l93eOf$(8HBg6h$RHh*C#RWDm*#hr*wK zc|#;T%?wWxzO@7%ai)j-^%e)I{2D-R`3|JjdQC3kB&auKZu~PMJDlh)SR;DbLuj#ojGU1LT~U@G%+V`Bf;dP9q4 zRmpi=ow}}^FZ=}fIk1wcQx3dudUSErbT#HN#_H52Z6}_KqbpL zzR_N^0d4?RuF!uy3A07t0+&{lJXQ|fB_FPbinHyc-=R;AZO5W5{m1`4zecVV`7Z~2 zLMqo6g0=YzO2Dz>zjlP20+4~#N?M6GGP%Bxut0kmNH6uPj(+TJubTMl-L8|as@C&lE5Xsi=C#8iX$1b z8h*Zp)?5eoz~BCSBmMVA?g&s@qQ-QBO__OB6styx#PiJ zo!I;%`D8Jh+B_gXf=~amccU*)JODy(6m@lgQT{CQ5X^VLnKpGR;RCoq(7V8~PhJtN z)(5C3*ElX82}z5QtCszjCnAcy<3I^mB81bm|Gf`TtITcM)Dz4*4Eu9nBU@LC1`IA_gA{Jvk7`03f;H3&!<-@ft|9%C5yZ^!h9?^XPNE9SjDiaG8n}bROK&gWk zsQ;x7A`?VBIFzcEW_p#1hbXJUq53=At*ar-}BJBX&gE`kR0x@rcMBqHaH+}{Lsl})j3D>t=YP-N2dhj zBp{To_y%yiM}^W=38mdie>BBMj)CAaQ!9QiV*KUJXx3)~HmIW5;w04jTw46~?aW*7 zgUarIuoi<6+M+lek>TN*KJ%@t2b1IwQj=DndU{W@>q#5>q)>eaT1jsXmz|2F#LIJp z6NqdmC7`n~&_m72@6?&4TKxU1s4-iA0{Y2Wq$)pqt8z6`_-6@yZc!%kUdyd+537*2Z z`Cy@he}2~aFXM+tZOuF?4(2&|0vL$XR^kYcU$+DH|3N*RtpXd>CRlIEWr|=O0RAlf z1n{T&-1WLG4gSydnl;lS<9XsS#B_Ih-Uhu+UO53vy!T{pN>g$j5(1-r`VzoInvyHR zb88^xVefJ1CH|8pcjLt>2El*ReK9aSn+xyT5*K3S@({D0B7D6NDbpi#44s+^!s~tRj zo2NqeAI%$)V!+sJ09g5)(s<;DWd-}}VA$|nlgcyak@oAuaC!)v?H3tY?b{MRtq0ls z&my=frj1bu)y5!4Fx3^|z-35+y!H6$WV3GclA`KG>f5U-+Q^e)Rn9ZiERbbIENYWqz<|U<$ma zD9~F3y_&cZ&Rgr~acGL8jk!PqPW%NEPv96CQTwYouwia8pVFdc60GXi+1@ zI^oDovl`FkybYF6XhEYMf=}Is5obxVX^UeWZQ@p}G!^KaXFTUyMGINLyk1^)|N_JS(4C(*v zZiUSyBet?Rp*x*ek_J+Nb*l|kwQKNcgc({zfXV5Jy;R~;6D8S7^#JAneg`Tw(`0eG zMz}vF!6nGhL0Q>OL8t4FX+oINi%%U12j)RAO}kSAD5O8Y+9b>G;qAF-Sn-V?4V~EN zbkBu~<~oUF8Ha0SWEG5$W*bm_EmE$tVg}g8Z-?&iBKA=}yr0<%$BDH#v-7W37fZ7y znG7$v_+&N<#dbro(=9xO_$5X2UA^E?X~f`8@&k6}zw zx7EG$p%2l8mi0M=@oV=~#EdiCD8y|&5xz`;#izW;3A^2}6@_TJaD{T)Pt1A1Q{@_T zrDI`1ALXD09!OqJXnY5OrobKHG@u9a1cds+MpYO8q)1lV24+}KROE0wRIX{>6`3In!1W~LX zIUWOQ+nZ;=vxOxQbww1JM6Tk^R=pcJtEpT%L_f5}c`Y*y@ zM-b&+IALag?H~@W=Ox@6Zctwg4O@uB^*5qI{R(0CtZ&K^HyF@waO22U4S1|_+>;f> zmzHU573fpA5m>2HY#YK?kGrckTO3*J2y#~Jy7~%)oxuMl)xrgp8&$7j(3`wM53;f) zjE-s;+WE-A?DFyEpAt|CCmrM?FO)QWsE=MC7i{&jq5xBp~?#?L&|>GEhH))DNF#S%+tA3PQh0Z zH1*si*)$788u8`_PS~kxhU8A}_%zshXR$P#I$ou4da`KY3s^g08JxDn0P}g3( za2XvksV{M%BKD_xd`AW75jd}J*mI1$`oH~NnbiL84$=ShuU?>YOY;0GzjqgByG#-+ zk;R`R#6C`ahk>onU34&VizRoL@%_qUk|N~87Xo=};woA-G1|Gny<`pK3jjUYT~&Zv zJBo)EJCsSqO%C5&N?COuFW&>Ee}vF0jYXORqcw#%@jhkE@)nt9JCu1Zu;y-3O^dO% z1U}+%%OK%#?2|(D9|IqI1Km+*jXa3?kR5y_B^?TK!PXl}7Ss=mtq$1)N$nQxWdsDPkF0&lc*xAo_r^C)tjKynBUpH0w)d4M32( ztC-IYZy!hkzDqhgNNU^JB64}P-E;*)B8XvL;5a!^6hV=S)9nS|&;4VKr7ZAafskq=Q_rS#?U2-E;4Gdd)f` z#u{6uE*%gF09e*OW;Gjj!lOYZ$5wwwK`;cR1S^TCK*B>0?AnmRP6wqW60NVCP2s=^ zpxa@m#HI{1sXwX3oVD#jA>V9XiEh~qZvO!e0eN7r_|0j-M5(QI3URmCOZ!ac;hcfS z^RFrVzT+-R(V>eyQ{;*u`_dhU;krG;7U@0NrxPdb_UP9u%PwHSH$yk5bh?O^)( zJUYE$sd^Suo*WejXqHsUawo~DAq-V)|y1W60Bk+Dm zI_mjvp=-L@4Jj`HxgMiY`lcFFH_1{1D@txn%P_hFelc!t7j)1}E|NXIr7-Ys8+EpX z-0qhI^mobJd$JmZu0NJo`5H-cw@bZHfgM-pwN>YII~iB!3Mf}Y3F~@rs9H2>_~L$s zT`o}EMnOJ*$_d4Wc^R~UFCSeM6|=z40>e7`Yl;$l?Yl%uNL5*NOLD6=GNmhE=ouJj zpvE5!x>eq}bZiLf`plu`HjLSuo)?Q(s;N9>5jp#NI}0*z2j6<2?>ss)8jNnAO-7yT z0VBY|^?Jl{7?zbcy%P2&Wcju~u7Q{&J(2x@wb?)_7gr-F)$d&D-))l7=YWQ^9t+RA zbJt&F?~C3M(vezE7wE|3(4?wwY%5PdIB1%H^SA=r8E}BiRrTp4y95NZlIM!MJABOn^A|%|QlEOK z!F{wgsE0ufr#^X8eyx&4`G>&EuiNq+qWSd+46a9F<@Am7-%+C6x8!ofE}$RpYBNKH z(1ynybL!o!Jv{nn{;?}Te%*ZtNSPL4_Y6fhP8H(BfiEIr4Bw{k- z&ANCSBbr9y5!h}`v}u<6$$#}xQ%$Ey6Sc;s+k?8xQ^4bHk0|&nHIt0kSptm>LT|h3 zqA}_816W3QN7(r%cF_tyj+RT zPy;mRPt-0c8x+(U|ER?W>1}KL8*YAc#Oa~HF!G*BKhhbg8)Nw*X zR?eFv;h{}#!e%yd5;nLKRjlvI&8>%spv~M4Wr`zOoI*NfkPdqP;W4C>=WOG)F+1+6 zL@?PMt}dVRvainHvr>O_EDLF0ffZ?ld?nxtrXHw+r&E-g0GI^Y)VNhg1Kss~IvJ2X z0OzQkvgu(+Rc5|0E?*&gP z7a)aKg^Z9B6;Io|$*`i^oNhL-pM%?1h=m%nU_2Ybi^7PY2Y zg;S`YT`(P0-mf2QVzym_(=)cifrwk6ikGkG4WzfmSgZdn$pmal&|WbB)c8G$HL+@=1u zaXjC8CGK@tfOx~;N|S{-@cbQ!Pi*H?M2I`*YRHsZ1)I~*rDKJlqi|q3{RMFY$gHnJeaFFAo#$0Hj{zD0 z;3K+^n`KA|&{Dxha+tUaEOb88sIwQ{v-~);76fXUX3WXpb{-Jl68ML|Q03R$lwhf) zVGaWht#~BN@=WtV;U0^E^!rzHv+wPd)U2(}SUzm0d(cGtGx*a7FnrAM{V246hR(~% zkkxm`ADy?Go<2v2JKEnDotOIdpZk1R@GOS=^a_jX<}c*kTwS#^pS!tCIX4ZwtfA-o zRK~!-$T#=1gi(NQ`Pd@>UwI_)TMq|SyUQM4E=x;_9471R+dDN;SNCrw8fX#aKHW{r z-*|V!P@lQ-#BpA50Lw7s>CuFDnqHIKlp^tf1KkNz!nd{wMvVl9dLL>pGbm*ug{NHZ?7r=HQI$y#*K1nFCLD-a7ykTx?&lKe zI_&j1%xd<0RYlJJd++$u!26`k=@h(XFrFHAl{vqGPAt6+~n&*qUFGgVG z5(sIf5BC;iI&M;j-1~vl(woLcUY25s%f410$}9Nrh$0eI>Ma1GKIuf_ZRbIE_Wh}uy@n6 zT-lSVYw45y>Wgvj|7c^X@eYR`E;;&_yU8kWKF|n(F7KK2@{vl*5)@L77R_;YAzoNz zs%VcbvdJ)ED`^x6B+6&HbU7)1K*-tsmTiiQa*vZnI2EpwFr+)pjHHkbOr&ctv+Qjh z*h;c5Dv5R-a{dzUzayOm(Y+r+V0M2Cd$q{de0^1&@Vq?5M3fn zZ=`6U$7MLUW^s#7dqg|de?d2KxmBdQhgk*pAW$#lbf3=jQNfVF8^8^eZWOHa&F$;X zzhG0My3u{0%N0p(IdJQ8r`nG`2SQrzrCPGaovoK{{dTs}tBxkxkSsZ=`Qn)M4jPZwH{uBjyYIh;Je10X{gN`CQFFJeXNS<%bHjWWxywk|uv#he%MIOGpXxtp z3&R(iFX)NE^K2)it}lQQB0}!p@DW*~5Tsa3p6F-yrn^dhU9un-GYzxs+*QsoGF?tD zVYqc^?I7Kgz%>9-KYXqBV!cM&G7LM>OHXT<8Lm!{Ksexeyb2#Nx=|RfHQ>;@V2mgaOP&yvVSr)1BuiDSVRgj4B8+RAprBdK>K(Z`B$>s3O*+9o+4fb;Q_ z((h#X_%c1q-HGPsR)qCR$Nf9joi92UgtxEy=&2G{s=5U`QiV>2N%AA_e!_29H8qw! zN=*E=sgLkriu6PZ&$)1;A3N`IP%z#5lYU8q6h28q_O#^aiqR7fW@e6%b5RvPCS=3J zR?~PFW)79TFj=VEes4qVlZUyqBhAj9c zqGA%)YQFTbluc&kvI6RlvI?QQdbb}iYQ6VLt0Y|D=})S2(=E@>r{XW)Y_uh)bz13{ zGapg<6+(|LYx26qN1zqC^;1XO%BXZ+!YDhmJ^{PbDMW7Vu{2zBPYD9?kMykl>>l8Y z`lqEyh(lK%Jfqm9CRph?Jc*(q<@x>Tp7JM>e(4B<-J*5#f3D zRv6yXt=S=|G^W3NM@uydR7_*1^VB^e{`_}ujE+v$Af!4r;FU1EtO#n-#{UrC(v z#}>j#9$IwaFqh}^otLAiLs=eHmUJ)j*V3*GZzktPhLB60QizAuzs;&l*9F4MqHo6* zXV)EVl8X?4j!UmzhyPak)ObOx--Sh2y(&4L8deJ-O z>38$BYHkFiJ55#EaXmIE_grR}-Vbk6sI{`QFfo$B);FNoO*84QKXGk1ewhq6E9kGu zQSt6i7hk`0XxF^U-g>g-(IwvAI+JhLWWjYaQ_GNCKy0!Xeo{yvPQ7W`Iw0_7vM-WC zlv4zytH)BSW4${7(!$(0rphZa{|r>xRwN&=X?+ujrNWF2Js>IxEIz+Dn)}Y{zB33F zZSq`xd}J0XWbF3`^v5-CaY$2Mh1cP5KabXQTwZ&)b*AxkdbX%hV3!PYH=?e!Snbn{ z;M|r|*-AfO{_-J>=;nFsCxw}^fRJh{%IQ~GyOEY7-;p{xdkNtO4~ndu<3oGA&W`G~ zR1b@JpUa6cp62eW6-7iwnS3mJvzIEzAB5fx-!joe?1OH3lM-YrMnwtr3Z67) ziB&93R=d9XAWzPvTf+NTv*sMv)3&(oo4&`s>S5sQ5mUEEj~C_DscbLHxQtMzzM5yv zuf~RE4*kZ~z(45?hBZ(wJicq64J-%YXAja#c7oyLvdjz*Io~XvJN}CBSRUKmDvbKj zx4F>4T%~;qnq*m4UR(6O(PS17(&P9J! zRWKi6!3EjxI-)ninG10m&JMU->Y7t1s|tf-^7W4IFrLR<&cWMz!px`X>en9=>8Z&_ z&=PN&&R@QI7%aUXpnQ8}RgVd~W*d4$LPm5xviN69uz6bcl#S<*Br zg%rzS;#rH$;_)u=P^`0Ks7gVl9-}Rx91~+iJW?26xfsgy;v4H(ohS0WXCwdX?B&}= zUAxt1GMP*3B=gLKM>pl0f9>=1-}dg;_8*y6PJSLj;6$BRx}Ru{^_?Jo*WRbQGE1)U zjMh<=wN0|9@yB`pA~!Y(PFcv=MDF^{Ap^5k`gj^0uI&WQDLb|^WUMmU-p=*fudlUxnSpWBht`=vTQY>er-Rt3e!SYKOiiJvDqm}fqn)hX{mx~dy%>`=lp5K^1pzgnFQ7C3rq-1h&{({f|6LPvr!5C=QiR7PO?y8J{Y8 z?>vz&V6Ixa|LFQA?uIi%lXyq3nWRj!ayuTct5}4QKP80 zn8@DI@Mi4R+uQ1yZ+|EN#<_O;RwESc=@ZDXK;F&J6<$vk<{H8qe5f)xbx~U@B{Q|P ze)tiHuk@S+KA6xD$(4;XIp)>N311g_$T_obK&VbZ;n zz?POR{-j#<+zyhJ;@SA-PWr;v^ewBariKgs+-0`xivsP6p2=4^SWy~q82(#xtpjg; z7cZG`TdI&+q_D4!-S-NMmhRePWbcd?W`@lSB~3T?t3jt9TIPKzG&J3h>^ZJB9Mk9Z zxbW#LZ#0NOEqxyuOUzUV@;e?)kGFp_s1p#;mGAN*Yt>k9ce42;a!cJSzb!=;DJ**!etw~dxrD?k+Io4sNA5g+) zER8(vHk0SMQ->$6#KL-RSAGF%VaVOR>K9Kw?(1rkOCDR4$g#>bdw3q7b!&XBx$@lq zM#aB$n|N}J;<8a9Y(;uvD$iDPOMvZBy14CV zZ&9_6oUt~~-Rqqd*A6UP?KeTnte<(!H#4j%DZZ|IY#+pF3 zGMZOh)nE^}jzmO}U~t{1#cleGCr8+N)}lb?)TT^}E3GDIF^!N`@HqCOjkB4mQc&RS z`*2lRm#H)|j7ecNBr`)-*7UW{W@}@fluOraC2omG5&D)h8{dhLvXNRDZG7eS@M_|( z!tG}BEIw0uc9>2~aPg$}jmz`>fmQ2ZPa8(M%p-G|^^-cqD}PhoX6L+GxRdK}`fT+wgb;uQNFh3aqKC*5ZXB1NlBTuhj($E=EqQ+-M8C-+9fuYBHy2#o)0FeR1XKQQnz;>_2YWc1;?n0$xPw9O_dRU-M=}bcV(Ut ze#kpGvFIhE`;ifbT+&CvBA;<61?9l=_+A_Ri7_F73_9M;oPKf;dH_KkDB$198si$V67$E3I7#MjGb?cLPb*f=vfa%ZppOAFp%Nyp<-hkY|*LAwNal+ei} zhyXfjjnBu2@=JQglr`LvSu6f&!$<~gx;yMGJ*C|!f@?_ywP9z9{Hnc;cMN=g^?C(t zW^!J1$Sd&j*VoAUzB|8+Z*ZTw`YpunX{Y8aAY+<7vdHpOd-fV!A*X?;hl8N{8Mleo zahDo#j5D(s^vJ6fp|thI?EB{Sjc}18{2R!YFfuZ{!B1{y%!=H8 zc6V2$Zjq+jNogueLpoI{Zun3TV)-_x_Y`x z?W5>-QGGQk8csTa698q{X?uM9Y8lz@A*uzd{+NfXi4p0OgYPT`AVRRz-bJRSR@slt zrcnTNA=A%ooCe;XK4nv4KRVK^o|A^Z+jP7TmTpf>{kC?>d0jT|0INTGQUId@U!oBKX`3hVVRodE z17b4Fa0S(V?2~bppA|2}N4nAq67NOCXg4hoQ;E#^%==RPIge?2B4(^4pM5OSmgDy^ zqDpYGO(t5LcGDC!ZmRoiYIWuV-Ofn?b^ZL$i0ThgWc;EgkdH_$Q~1U3`@((+ zBN|L+PVodLyDj1%n$WQoVLVD<2W(EE27sYVp7ef;~Gp5Z@TiS_N0tMAPv~=q0e`YeBGqJipzkoJt?eI z!#ddtVv!XKSz;OQ1V?@NjDTb8c9ry`DmW8f(2x!bI9BkeDyF>lKf6h{m_5KTj~?^K z&7_(%pNHf$4XNHD%*=Feq4t=0g&{j~K|1cw6oP|6LM*c4eYb`K?e@gFozs-B;Fl*{ zcejsYpFXZ$r%%`U%!F?VF?^;dTEMzjK^F*pD_?%{J>2-x=lmF38Phqdnl9;H7jwkhPNV`pKo?e> z88jm89{-~wZt1Z`!4ZacKNjvb14#&h z*Dx7bueK)%TRHywh)#$@ z1J4_rRHLbGHq96J@R7p569>yw4O6kUShGPfzF1-~JX@$*^iRgKV)5y`8ksZ^D6O$! z`Zfe%NZ+3+^5l+deskC1zTgo%KAXpv-P=SOZ4fvg@xHVeBf8K)k+|J^?~)ES}dm#Jfb;eE_y;2QWq z{B3YPfMj>j=+>%VnP%a17Mty$?@M^@YAS!!2CP@Z4vDhZKJS;voxNXGxlXEzG^D7P zehKw_T2S@A2!Yx#W=95P?~*Jw_`zDFgQM*!y;~usPy$>ojRECEj%fA3G3XBk5r2?a zURJwHWiu{gP+X5}>kBkP+#=nq_64^b&L>Oa6aGx$-Qpx6UCplY*utT&6(%EF`SzM# z9_RS}@>^uC0rO@276m9(1#si7+w0Hc1!mu4c_~QoOsYzNYl*YAr8?;nFp6<|5eM0& zc5HHN>7pDU^*%84*^k72u@&hyv}3P7%TeA^&Ba%YBsy7Ypu)^>=n0z&C+mpF9!zBA z`s6>6nAe+#5r?EWXL^pPgd}8wy%4#;BrzGdr#6J*nD+~IQ(hwi)_iidBp*FQ{2=|t zoaCj1?UTJ7-j3G+pTqWc)PLQJXO1D)`m{1|>wclahquz#V8K6$_+(L}s@&Q}eA8rt zf_bIAy?3i;o$@E9Sj{CfyFu-!fk?ecG3hI)(#zZ7_tK%`4OqD{sJ8SAekBdp)HVlqgl5DdXeQ%3l+ob&wYce1&8+wntP&r%C*$d3Rv8ARiwpjO6 zf0>i}xMzz%^5s86P|^2fHUFwzvf%5|W6CP#=fkub=Uz^>d5t;|!x{P`xO?e?kNA zi@;w8kDMG;%?*zqC;sSU{A}Agp4hGw>XVN8K78pE%PxBK=3l&LmBq_{dZ?C^ z5-ex$@R)Ks&+?xP8qj%hiRV1ApD*{nSJ@86kf~U_Fwc37;?PFDKwC{GpIDrL6?u5% z>`Z5OABPb~B6~aW+Z4Or1FeRR@3t;~5ua2j;?rudI`o5;lR0J;Y=T#mEM%|`i(A@U zp!Rc3(8H+3c0OcCaiv~#@yCCN&oZGCuoCjZxqNSljcmc)kXm9`-$RBmJWDJ#J zNbK3)9SCvjxXk?*YYu%s9fk-|-w59NFAj8J6L6p|A<@(vggN<7mO7+NUaQGA)3f^k zv!pUDS~2IYelEkB;RYRsWFT!>2TLDj4%>ukyHL;IffABJy@rneAoeamxj8`T@g>yq z%mzM~Cn7dQT_;b#fIR&@p2uQbrifT*x6aq}z)5BwiabUMT5l7hy8^q0&3WJNy{Dlh*(SW%;s zmnsn`R#aBsC3MB?n=PsfQ)_0>)d6xF>l1P3V|!D3bC$=SjWJ03h>L$Tkgdu4% z_ZfZ)kz($qIkU{C7_-!qZfY)pp59FOAz?kBdiW#smQR5J&SnZQhy_e^bHzvAYw)LX zd}6czHABvvH+ibVI9kDj;)_bgg01C*$Rr!JXH5J-Xz^z~rMW$Yj8(M|@o6 z+#(PbP|nKf3MQ&g=WE+?5a&TSGn(Uq&QuZ;7Ap>X(18f8g1MbgtEmOss;lN3f~zOc z>%%HAhv+ZvlnTY2N={qTBT(FFe8+#d(+ecM{WW*`1I3*pe*T*~rN6<(xOMAq?zEMn z3U5Ikelt|mLl+vbNmh|owWkz{3=FtTB!>CSu zqC58tzoLx?Roii9#fiO;7hAcx+ZQOpT=Ulb@b@~cXSt&-)v>TK_ERTQBXt^yJ_qd{ z&MgL_m#)l<3vc3W|@~d?WDTXsFjt}jKJor#yDnHLtmg2vuG*edhbQn zG?&{5a;2`7*8DQG!eQ&Y>JtgYUTEJBo2e;?s5Dk4pXVQP;+GD)5x3ukzG9CLzG7$N zrB69u66<0~-*qxWCvV%E&{MnvHLS6hYnJw28zngOVC<~7CY=Ch)hI>c%eBCRFv19> z@lZ&0k+#t;;nM(Y_hYU_kv6-AGK<&?frE8yR?#0;1wR3RVXG1|@FX%%eK&aLM`>btn!6g=#a?2H|GSnEH&a%m>v z-6AHHWdCsdu&kb%6U$*Y;F@&3@eoD2hUWfH()BipT1YRNbQ~aE!PRO9)R2u5csHr6 z=HnKm`5l`agj>(^Z2;$$Z~jqF(qc;E6%cP6m7|1~tc;zXLFU&0SRP7b^uvJ~&jcuU~Kxp$7ro{35F;Ng>(qNd?hn$p?C!)a)I zX^i*PC{HGxx?JG46a$!4QZ8|U@5BwgEpXswX+AmB?oPOR(EesSM)NFrJrq9-Io)= z3a*ARmm(2@U#g#^O1ex*%x%>kty+%H_{_h0mj$aA+tMUnJtxg9M-iP3dW1W)bZhQ= zqn2BebDrxMcyC(*59jW#iGXh){6tarGY8?R=kD-lX3r5>J4Fxt8hqqQrK?+F?+7R{ zpUNntd+x?%9NQItPSA&+f`o+@&-r;Nk3*P2Xim71JeHae(Le%f)VOsjA2|~gPWFkh zUt&$W-BBuMoh&5Ud3<)T>oUD~SZOzHX=9>ni|&PDG(p{{cj*px@wKVKHYG72nqru>nzBq?NdWU^7iRq+faHL_s_rqT0U1j z=WN^pU-%BJfh0BNd~}6hX?XGtbwRylmSDDcXSXX2f-m#HiBP>zdjIB04<}+7f1n3U z9D5sC@6ik{3EtlAD-jwo?=Qt)f6v!6>D_gNENZ$eU3t$x&R;(i>26xEK6-FNFf02e zhpd-0vW92}-E!i~w+103AjNV+jnLC}u3X*b)=3+y?u(=@9CX`NuT##LFp%Lq0>wG` zvtSZT!W$Xbuq1&RLH^B>VI}^J9$df-)wOIkh3d1t?MY9<)^{SXc)xAn_U9*$pk0eJ z@qzvmgsCceuQ{a% zO-#N?v;OPb-%Bq7FSOUs->W=vaphtm@A3!F1K;Vxdq03)ylTaKvvYms@+RiS$*b~v z8L(d-&2^_Cbl$}mG288R;j>lSZJ^424~yIl-cCZ4<=82Tz3>MH-c!oUg9~j#ge$;L z&xDJ?{YpdG;3Y1F@d2{EHN2xu;i@88Q3yzA_1ThOw8zu0+;r;>e`Rd6eDfz;a_fv% zP-v~*pN+EJIL01Ick;PB`5HN^xtX1JIM)0n51T ziZLe3tnn+Y#zShBRG2}Pcfhh6pw$okwg*efmM=zg`xNS8O3C6fVoGrwYTC|k%+}E& zxCi6}cKbv#RxkzG8rf+bskvSRq%t7Ug1R`^J)UY$0ZkB6ixkIJ6Ifd#FSVi9k5ppC^9m*k4ms^%%Bvv z6A##xJYMKanE`~lZF`>PR;t}m%?S?KWUu`{gU`1>muGtstf~j7=TsNt!F`#%OK%rQ zT*he{v(ii5CvnW~GLuem)=1%Q6zlzgpWO_iUf8q5lD#3V*FQhp=@iSawNt1XWhCAk`h|UBz^#<@)RsE^1)!zpVqlz*;4;`rfnEc%hE zO{+-nZeQ3F;sIjjr=?D~(SI>F=$U>A(Mlo5&_zZsw-wGqhJ$%&|7g9m*$a$nz?ViI z^2)3&G6U#i3ad9SDkwxBdxCo4C{+t9DOplizmKQK2Zotj00zLrbtlGxt3WSkiKQHM z%_hVH)e868`Pd%t{7&3fnq)eR*}ffocUl;!C>DMSM>zS-ONQP{HdhT4=9l%TZCIrB|DL~csOg^Q2OQMb1vKL1-s_x0^fd$t=9gwwm9U(`TL zgU$8=dV}!#hjduA;zmMqS*pe-trH*ZS25t3-bA(|qoS=Z@y0-T}(?2)e zNFq!HTw{$ZF70X7SrdZyb$UuNH#zESVeD0CZXb2Yi>?iwS)TcLzGKW557ArsedFe) zovYVw(1{pdp46Gd;f$Lah@lEv!rTKVd2L_@cb6#j)g@}sH}DjSq>yeT!W%&3`SLL4Rc?$#qAosS87*tv(y}c0nta8kr?HfOE$UTb4hbC#9nH+jKa- zGCG(45~)w9pJ5)pm4Nb?(TTBRA|_$LLjoM?Ccn?oF5-*hEq4^XiyfWt_7Gth+Ly@s zqf5-fx9d|+w2c#H&vn|-NS|qNm0Ta=CzB5nQ%ufYE7zhgTMaxi5JX~&c< z=OuG3FUVnhb==I6_a%_21bu0reU0iGI3rB&Y^llyx8L1aG4w9E%cotJVY>7N9lS|& zf8h#F4J`Zi2Ndj#A=~=_(Gq6)Z$?Ro2C^g=P&z08Gi2%i0^ktoTmQ>P>Q?Q1u|04R zR16dNTN^24%_D7U?-tQ*d5^KqECPvgxlL?xshxN*g2g3QGaM-<_nwq5mnAUj#pZiD zNY-zPLv^vdHB&gnIAilgWXfxX))}~IhW7{ShbX%4dKMGnGASue>@TyNhh)ks*j~n%DOQn9sZ;pn6EBeuH;!w zD<~(*v!=-vGuCf_45%l^UqTHMofwiI{Vk4~?$@u|nEeZe{B(f~R8`cK>7^fT&e47N z4i2f9bA(R-$F~jHZ}p3X_*gwQpF+u?mOB@WqkN}JT~e*w zjvCD5tfn`#syqg0MVpLQIFFtkb?OClJlXh{7Ag?G{fkqei#+Q8UZ!Lc7tQ`qeNV5p`M=iXe*(OAvf#JuW3S zH&&uip7d0)=FWG5?1YQ28QzXB491(k=~Vrtl7hchdyo#cI<{X{T3Vqmlzr2s!6_=z zuBg@X^aSgsG{#2GxA@c|ieqU0Lk|dhL`^lg6^XiUB&Sxr$~^15`{I4hA-CSeRbl<) zw|}t&wtMe#fu0FY68tSBl5(^0#5E&T+$}wH?B8TT3G|KZF`x?S;^%zqR_*|3Q$f~v zmX5uPq6Oxj;@GA1g1H8>q%$e}v>eO^*U9TO8SL-)1#PjYqyW{|>QG%Y-hu}TLril` zZeEiI58|Hu8D{-7BaYHlW%SRt9+3h%B~Dq4QH!v|S*-48Ri|Z-8ilUn^EaqJ?X!U= z9FA0fkWS`x9E*45?RE}xW}*pXlpfJdkwKMxfp;5H*$hvef(YcYr@^5voNoi*a9C{`7@18MJ^ zeDPlSTLdLb_S(BkxlQH%*b%?d>c>H0Q518K&47XoKTu)=4fA?SPKdU{?@^9xfmOOS z@+}yzBpRlNf|jSs!f@$>ea$n)37l@#!cx94#Olx~UWTj!>ZMh~ecaARI%|!755JW# zHs$+WKWt^h4|8%VH+<%&vECr~N-eA}gr=lNIFOCO&)5ON+6}cX6m~_;yX5ex#Vme^ z$YLdKKkKtuEa?PlGmS3;_JE3|*-VIiB95r1Jj={k0R_v!h`$zrtRhFx(vqvxb+ z_0*=MeKVfBx8m;$6asp+{C#CDhS{CVpx&ZM?kijWC)GcSoBUD&09>zR_*4#2$ji`Y z>m_unHkR(I0JW5IIm#{#{`whnx+GUN2a3bM@y^DS!q6hFtMmtB;n!b(*3Z z0_-m9L7~0(Eichr-f*?6ouxYXU4G1YVB!VnLV7O>QRjG`d=PfPF-ut-Mj{7$tx{(4 zz+OZ<9vNOBKb>phi8Og95MJ>z6P5ChhsLwa^i4RaIG-tnfKlk;N?#yba0`z9cLr?a zdog@A!p0@P1K1T1H7twVpk*Ij!V$#N5`td|#Mj-&l*q4+fi;a)!|$|kSp~0S#oxmu z@ET%=TPoL%b@D&*Xiw=iY2dHs@)j1Hbcvo-ow};wqGhf^^7V-$8=C-qP;qlIk!49l zm4MvBr))i(t8e9GmQ(+GSYNi9s$z}w9_Wi`SB^u8ew#;bSpV3;PR^jogVr0Y!K2ph^r`|j5 z@@QXMWVxo*bLbGy9CJl}-0aw6`!~7#(wUP11+2Lb4Vh* zjlYzGE7|!;N|U|O@3_#kPa0(4qEP~YAp%hMGc`I-2bE9~ZONFT4JF8$J{`L*vnuK_ zN%)!uD=Y#NMOqbjE!HQ+2sq@~HDjqMgRHp)YWVoc{HON2^0C)1GH6%t{mm}GA^&&k zuC+iIGp>-;HgLxf6k)g{=aP(X#d%ioA=H93u=?ESL>`H|GfNy)V%+(39QbMD{9uyx z`V6cl=~-_n=W?V0IoEBW6BKFMHK+XKhiZv;zQni@)(q`$1Fm*HQ}4CkjfYoLQ*#OK zs_-r)mVkM#TUw{i%I))92M;5+VfO@E3q1fgws4B?*-=p~KBCr3ihc>k1K(&2WQ8iku|F z(8C_A+%}W9=cG+vEAV!N+5X-uiL6!xAB|%<1>oAt2b3m4K!QePP@jamLC@{#(#b4bOmxo1ap=?sr>m~ z95bZJ;0@%cDa><~XyW0f=$ z?$mTa`WdV4|C5XO055Ty9%})5Btsy?3}a1?rWSugD6$AW6oo6|MD9D2u3Lt&hCU(+92{iv0Xv~>i7%7`c| zwWj-b2MS!y0T7w?mHI!dy>~p8|NH;{suZHk60%oiWkhyX$Vz3D6_RA{P0A*-NLE&q zJ+em`3FXSjo|kcnjEk(S?{Qw$>(%@H{=7fm@9%c|{acCabe`w)`8BmN(ih*k-A={6iOILvH!Z^XWiQ*6#wnr0Pr?4-9Do`-DRf%- z+T`8xsu7R%emBX7*m`w`q47g2E?M~Ti5x+Fx(9f5H> z>h0t+;*USuV^i5Y-D7lhtB^9N1svaWi!I%N?@@d%^Oi=yb2A8Do1S;>NtNd16x6+c zW8;&hTjh8YKCq-*X+a*_Mw)D3HTME{xu8R}i`n8~r;GMeXZi{!jxD~YrL8=B{bf~e zo{alAnW4d%8dE=$3 z4Ih!cW<^d$Ni=&h*{2$eOoh%ht(6k@wdb=zq-&w}XzHlq<&g~)*KY&cPmeX{-Q2Ky zk`|_?B`tSc)-E)T+o7dyyTfX@W}sVFY zHA~$43{pvndeg>=@oI-PRtp2LLsOVgUKfS44PBHnJlGoJ<}1QE8IKgV#oWI?^VnWE zytu!&bd=(Y-8~8&=PKvgF}#wI&}cz?lDmt|J<-QojtLLX_C6IS+1_BVRhRhEuJ1Oj z2^b??(R_i;ZS+om(bDis)r5sdqArUyXXL44*j3A%>1MVIUErQ$v5dISB-AfMdG!WeyG-7i6x*mxjJNJ0Sn9w3q$#>KL6|JLY z5>N3eYpyfQf#Tbkk58MI<_foKdIryH86oU&1@@D()u`A`%JIEwwxu1*VHZOxVaxvI zd+I?y< zvovm^5_2TsLg)1uxP7j)9JYHJ0aL-#E*1-#v81?K+ilaqerTNR|TG&&XUdA)~h#5e!Twk_mucvVq;i0)#@|*y{yr$M87C9yn;Z{sYYrlluA#0 zRQ7eh?If4c6AMo@h_Q*G%5gk56XJEdZeIGxST*a&LO@EnCZS4BOsGRkLMM5e?v>*6 z+pG1>*~in*Rvf*(Ftv3{tIJNAC1IIGPHb!1>ykpbY)eP%#`P@k!d3q#wUIkh=e9|t z_U>6T%?o>y)4eh{<>tZNDWb>%)X;FZWesdJYBAaBx9bSkXqLuJKEI2kSm7pMQx%WF zA3YJ~j;-7JF~6@9n7DyjiFS^B->trpx2#H;R(EyOiUrH4a@H;AXIqRVp-{x@2ZzUI zcNtXYPGz2x+-h>r!#kAb0$dQVq2ey;j^uEAE#4}?pruQgLt5;L?7(M?yeak?6)ia9SYVwe7_YSs&!FkLq&hrkL zBm@_%(vRz`)qH;a&&Is}6f>sWHY@1SVWCeI2bda2ykTvijW@n?M5awMerJkPthcvX z%q4jJHC66n(4MDXkI@H-PXU!i;Jf+jFS`OIIq4fep4KE_sqt6*a&!|Jyf-_E#cJ?3 z)tK&yXr1V464-dMp}0c3;o2&p<}D>rA>!Q5-^MJb4_lx*sfi^)^R^p(f<{sPmJKrq z;FWnxQ`tUsiUPGI$IF`;Xe{adcKJ(Qd0EhUqDSf!+w+>^jkn--^Nr}AL6!9{pY@*H zqy|YfTt)MhD0OiTsVD5o>BkkJep+bzCKyvr1-s&8hFi>GVk1-w{+Va}^w9Cn(g{Cy zRu_6tZdHJ_c%W8?xpxw7QCf2-`w^$OV|OMavaWaUB;Afb9rsLj*%f7QVwiT$f`&vn z-Ay}J?+%4!MZ@D$66}NR4`^kD#zwAUi9h1se$q(+r^*$IYtF;nwk3n5TivsYYtn8C zEj#5UQ3c0km&|!=1C5f&&Wk48CBx`0f6Yo6m^&HvoWJ~`i?nI$Oqs9PDThbsuv2_p zZ>)xR202j_>f+|TW=wM|(@hTcX$RZ4&TDYBLKH~5aL(-%`D&f{)(gz1tD2g9ph(N zQcMjo*0efhTQB@?qxxJled_F`t7m)GeDCoJR1&uv=q17incmYl-VqZxTN0&O$md(I z9U}pUFRsU0n(YGZ%|>qF>VF-_9iX_ki5dgqwnygD_DfKjr%Y8@4Cw-5IjIP2M44+` z-1gZqX{-~vZ^cs2QLGgQWAGU~Kj7IVf?5CW8}Y2lNJ0(6GaSieVvSe)cuCGvp^NetwH_wxT6jImJ4&B1fS`A2(AmQeUZjbq3 z=mq2olB2vE##?BGp6xRTOct?fYKddcQN>*AWYrMF#YjT?@qtwXt> zlNz&Fk)Bt1FH%7=L&xSGt$zsSRj1#(wRz>a<!Ob@$4z_D8A`MNI!iS=JV341>Q_B?HL)*;%?Q($ucv8*1E3Y#GoEEm7LFP2 zj7v{MtenCkMg8F9LbUQ=>7o`!Fpi)7DF1=@rra#fyWs1jTm355foZ`&A~ zaO|TMzaTR?7PwvBVL`SzV|MrXy@v$|f5vusSD*`Q#>WPa3_ zP>hSr--d64lIhz7OH($U@@aHRP-NyIP56P1e|>x5-sjJQ)LL};E!Q;dbaGC_F%42F z4;t}ZDUtgExYx!N(FCMpyqB=~q02i49)?qtzfOyt{d3_fjne?`a_QGaJ2)0j`sro4 z)E_AOLAEtb7cumg1uX{@7V35`)fIC{XP3ait-;|kU52VPaV?cUJQkZVtF-1zSB5Vv z*6$ziU|6;?X6DbqQXZXN8Ee_>eW|(?JWh0FG1c&7gag5b;3+1S2O*?uPwmn1rh#)T zL1qEd^4QziaTDXu*L@0&yJMsAZmCvmw{iQ!s4xf%u zwmYhk0*x7{{?48M78;7DY_Pl2&b#^+9{=`%#XaC91UA2pSo8!#(A0M$Zo{E&Os^L6?6ocV(Km0#XX@CEbV%`aqxdjmrZtzuD7iO#;Bi?DI zWkn}hKZS#&q!|y+7o}LgI+gLF?xoU^^UJgoz7j1FDTP;uxvgzXFvb1@yY?H_eUMoy zyF!4JsY^*Kk|XCyO}UaugbrS1B|Pg?Cn z+uT>kpy9h}wXnz)mj(F?1v3G^C!DNO*sbn=&e8opVH-FVL|iz4C}w( zw0fOdl8qY3RY_{%wA2tQd5tuJVXlQ+}!O~ub^lwDR$sKl{oC4rWv z$^ng+n@9(r+cTBj{rKF9Xoc$FG%Uf>rFo(Lug^3piKd>{$=a@tzs>%G`eZQ@PuYTb*Hyx1 zD7)&7#Wz=TVD6RUeg*m*#TWX3oc*z<+SN~U`YM*xlk7d}e+;T7^Is56I1trPxb|mG zx2VdiMNQ0SYF1<8+c?wW^CQB~2z*Qi9bHzomlpI=8Ivo8m~_d|NDH?<>EtcZxM^x8 zRqt6YQahW;nNPiZt~qk!ln13Rv;SWU&t#{A_PeR|p0U_#@nAitosOwAbz#4arkfpZ zcR)(<>WTwMW=})!O7m(OiB$2#*itw{M0my{Te*Ag$_@lBqeGpK>7gy%*=+Dxr4$in3 zhkTbDOwfi%_7r4Wy7d?f(Os`}%ZyE*ycUOMa;je|FRE!UqE9zNeq~X1|KzoG+;ZiVsj*Pnw@|(Z-G^>B9IEQ%<7(aC&(3U$0!QE@ovi<)O+;s{fXC2$6@rvc?hXecwaY(3iflr0%5_gU4wj zsU0ZT>48PdZ*z<4+tGWaDcsK@gbf5M=weD9cbum=$Ta<0#apHghq9ut{cpu)H0*!* zICW3sH6vTjt3q|}HU;-xe>ge{c{RKU#ymSrTi8DlH&Si5f6awFcQz>MDk*9MEJ~$u zMqN){<-^p6P6KMVd~OOm8I|soM`K&47aO% z>tG82LZ^Y7OtV0#_0Z^LUU8=BbF5OSrd04kkh6O=UiPj_uM!RdMVB2O!yr{iJTX%n zB~qg7bV7)j3h%29j7?LZrdBh_Sh#sNPdL;RH}(aYd1}TtO@AH8D)3nD3^`d3h=z*; zrXC9V_{w6&S+B1ys_8QXt@FpUFK5xwCFsEh!*zMhw2O`|8~Nc>#^?9$L;x$NT&MYE z<>M?7UF9ZTU!*;tHlKgK8Y^x*J0Il3&uM;ppdl@RGGvPjr88{Xc}a2A$Sj`M&rVO= zgxiFfN!bA*CqE@hw8)jGI1+3%33zv?R2ZMC`TT_|nlZU`vXFd2nO-MiBSqU#H=kns zos4RoZTD^eN1HYRm7(_IB_Tw?8@i7}vq^V~?^cALziGexnaXM{yp(NZ&V=Sgt??(* zVgs6Cs`^CQg(`)mtc87u5XIOBMJb1vWox(mT3!k{OeqgPcYG&2bCNBT3 z{N1kX-+Ln5bzXz+*w3PJ?CZv^_jj@{!q3`pkcd``Z|6B#I6((wvGmg+ho|ya;gtgq z={m_cQe1i1gUqe)| zy

2y%jpiqMXDAy^`5%My`kyMTWDjWi_|EE|~8%_-87!+lQ;^Cq~XA@$Sn~A9$?- z)#&DB|K271T$5lAJkJ?q7K@LBmO)%W^{*9UWds99{sQ#JKiA3so%sIyUnzDr3%tAP z$w+umM9`|U?U);uE%XDv*AEgdDof_dTFI?r%2f4gp7V}A!eTy^(FNWFLmw*#954fQ zfiL**P=BRKlFL0h6KN-8wb!%fJYR;gN+AeB5RQ75?DkKebSsb+4beMEfH1pun#wn% zew?`yHG$X`0Fu=`<&f_L&%w#>EUi${yh$1fjZg)JHdlxB)78$Zmnhrs#P??lt21r2 zYV!1NE&1qPbYUhk=$mCHS}yTe8lAQ5uSFJ6xrMA-O#%-imz%fOm&$`Y*=s2o8yO2;>*W-Znv@zE5u=`m4!_$wV%VmT+8&B5UrMhg#?05_xpeE)X`s5cvhUl}>VSh(eQ6htF~+ z`lwM0VT)SN2R@UQO5`{l9*cDe!W^R&ep*IX25DZaC(PnfTWxQwww)<@7nTOD~<&NFV!gE68EcF{%lAP=kGbBB=%*M}E(^M&Zjk3>zXmm*z*)s3!5Cuf55g0u z2knP@@8Y4q9HY^)O}}U7LE8uCkVWLM6ZH*NA?V;?+}9SMi)RMB{qT4y@8Et>7)QHp zWe7%ZT6Al7!}-{v5zo;|Cmc(_z#;OYP~>TUYyFvmHN$ zT7IEH&AkVb}boISebEzYUxAy&XBs1AWR~bD_n@ zS&<&dx)wC3{6_WE_k$1jT_EH-V`GncBr#ihg*Ai-`$A+GMe?OiQwcL>= zAGlB$`A;!2_)rW;9CxWaa93#S?M9qs<1WY*$EhioHD;w*Ns213vLs!0ryieQo zh)^_-K=<96o6_PftxmuHSF#k0D z4cRk`{AesFOL|VnkQV{!u;zC}Nd(Boc`z6Cy|ANj&>z1QD)}*kTIhah@H{JltsJ`r z{UfRzbKP6C*+>0@Fr|;7drAbFSO)iguJ1h;V!u{MIehs2PMQ7b{*Vc(3i;pCGk?EJ z|L2TN_9{#_``D|^{-o>-$pL+xz8^ACk9smRV(K-ycv{5!gyxLt$iK}ZHCu=)r?Wup zMh=8h)3Id|y{oUz_&dN^#uj8dleYkl?;xvSdCcpwR2Fn!Tln6+KcO45oq3A(=||k$ z!&n5~8E4w}_*Ab~eSAZww48NoC1!`NzPa6itIInukEh3>sEaZo+3UxxAS^5Pk~p4( zIoJVcSJ28QH9BQ4ol2P*q@}s}A_m!bmk&#F0Mg9H29-x+i!mL`WF7ESaR51DSb=;b?fu9 zi{LaH=Wnf%SaTe^{|fQB5t4xnR>Ew-4asFht&lc5j5|CUIi~vjRvlsF>gYCuoSDFs zGRV!e!bHFOCib6!KudWgLh?%OY^EovN9P@vEubL(aCS`Mm>Un$Ny(Qr6YBs+(yixt zLy{5UcU(8I99)j|q-lGwhF!_tqgRWtl@wB8p>lL!tpLBAq zj^9r2v<|BI%5}?dXa+W1)TLC$6TqAiSo33K6@3vHahAcR>)U8ai`=GEe#PtIz$fz= z{?QQ%UUE-_A!wvqXP-Gz{VB!DuJLksv4y)#zU;0B{oH2?DpU~TzDv-7E(-rH2IZqM z@Y>NH5R>}+sqN`yfG?{NkB$fR>vPGWnt@CkJBSh=v3-80|FpG=BY@)Z`!`KUB zt6ZzV>XE9o6S70lTT6RW#N3lgRSQJrT@*G%Gl$Dj%Jc;nyrVImeW@nzmQd~%`I-B! zvMWUN^p`J%~d-cnaNu(`HZGluU&bx=mLhXt4m^40t?}IZB_bE z?Gs=T=>pXEhWt#_DV`=r3O3(2Y0j4Ab)W1rV)g6T@uO6>gr=A~T@%mONxCD@^AzlJ zD1wIAf}}OH+19gaMY`v{Wu>%TP8X+AZfji1zZD~SA6C8Uj1UZ{irU?W(haC-q0=G6 z*SkFP5`m}|TMcR#_I1c{ytZzXURpTGQC^+^ejLce9Ma6O6}1orQ-w5nxP1vCtEtkMU80}oOkfVjxaSGX_rddz%ADy zV9%>T;v2!HT+>%6&?0%?bPjrXr_i7Oyto9j4Rgcv1inUJ*Tm}OiV|05C4(}kGX|+g z?wh<(IeL9jxu9-0t=3WImkq94j`wqXeYtYqy@D{P&)=z5%XaN>QD2py5?8N@s~7Vg z9-fHi5wiQhk)p)&f zhr)^2kOve}0pq>iHKUR$o{8#7Z9z2qx(;Iox4&L2H(SzPM`N0))UPYT0ndPI?v{l1 z1y!d9n&%S?jrCa1-%*xe=0V5amu&0dq}?*J82zzsA45_ZE=4tVxrJ+vn8Ad5#$*Ta zH{^=gJnbz4sN-9G^{kh$&qPBP*`qm1RApQEmo+$^SU4$2)UC|9&J!chQy2d*eHO?S zbevAvt4ma_gl(GikLuE!n^hDyO_Z-VHOcpOTpHHlF%$Bq>>e-iLpXLZ*l68c;bco;(N4jl<}rc-aCllgrWTjnzuU!Bwo@ z7nh)UYQmi-?zZtkkd%F`joV+pYeO9J|Nwis13 zNUyX-gdadv;?}zH)xMwa2-8+}l^VtIN9}=vk^^0h3L=Zjt*ohFr+%uN7BW9Ydrke} zh0qT5npH}BI?34}v$tLCSCCDR!_y@G@s-9VA;aT(KDLMFK7W-Qiinvnhei=vq|#U+ zv8@++VQW)u0`<)z`557KyIt&OzK@t_vgnsOR$NM^bLSIgr)hHSqcW~y6Bk7NH^nhk z@JZ$K$3nVyTj|}Fk|67Qtqi;M_1Q(Nc(OuJ5<>fc`h@*``A!KSf1r4U+%Sm?Ce z-49NiFFddxrvz65$2?SFQ&VhG+4SY`JL0L#<^`9Ge6`5=@>9m@JRFL;FC8L7L6NFh zDL$|gmUC2D6#ZIy_eUPor>C|4(<1te-CddEhiW1v-C5`iCC-b&j!AE$^cgxn>LmM# zqfB#D&|t51bi(zu1V|2u-*jQSY}Scg)k4gkJPcqoIyY9HIvWXoezkGeO_b z)2OaO<>T8y_ixoppw&=L;ZynwJ&%DVI)gN9CJG0B8K}$|<34+8@)`B#w-G036KCI) zEQub6)ibfhJ>LtDPn@+axqXu-H-@XbB|{x{A=y&A$p?zwdx1igxV5+hwDKq$U&B0B zt6hv<{aRO0)Vj(zNdzsy!=rHogKx6n0lvngUM6lcR5uddQb6=kWZZl63$>2_B$#2W zWC{$8xhskFk-NFb7+Dd+n6ak;n;l#+c$zt9ug~H5s_L`HEiUXwk*@RhY<}5>z!K;7 zz75^q3@$#rI=S;>zF@sr(YlpHI3}Kyt>*JZDu(xdk@Jj4pY=DOw{%?jDWcBReS1du z_)Cc6X6KL0V)Rry$rPst->V$tac;(Imz-8kPz+Yg4s(5vIlbW*Wnxg~_3xt34H`Ul zy3@!WEF#p*lV2p(lJ+VHIBz<4tZo>*U~KDG@MHxe>SjU(&>xa|PWAiMX5 zV3d_WGE$YSr1AZ~ggm*>;u0 zY)6t9RnoEQ<76i$w{EkXS3b?$PG%bR;WiS-a`Jwmd!O;CJcH-GHTA+1G7&yinfB(m zZ*mlxDo1;qLGGE?j+1+?Z2m&c2ocnb8|(&tHqU3-cE0_Ysyldy%N3(fL^%%InSTwv zjT&r*%O7VckjtTk1XHNwp8086ffgMGd!nW!M@HKsv4aGZ31Sap6woGYg$DeK=I27Xko4v>*HfRwOiCW4Nm#> zu@7T)+1xfh^HfQGw=In$TvevS89&Kme|iJ1LPZ@;N&2wKRNaJrW=`{W!=n3df`=~# zspLi`EiT<{SlJl!5mughCmZ-}2dAnk!Spw5Dn!sZ{Ml7Nk;%cRJG-$I(dl*XwKu_? z7lU|*4+Z?<*pFdMl$vM=6~gJA5GhgPc2GZr(_A>}_eVQ413agVle&;ZT@qn#=19sn zBhzditjbM7PSuv%sL_I4p5EN;i&r!*>IH6#%{?uGtqv4d9Stg^)YqYln&nW06M=?6 zBCO2Pi-zq-mz>DSc9{>_JaUs3e0qQl+b<~`uy8aTsBkNp z-uS&`Gnk8Ve}|TQlaX6->-M{slZBSeZD%yypziK8FI4ak3`;|I-dBK$oq-^5_x}`@hkFv`p18dyywG5{S zEj5Qy<$Y7yUj+~>O7o)`1xg74WlGis?vn_TZTxhEnJ5%phAK~>J)E`)YQB$iRQSG)=Z+HR z3A`g_`Z4*nyK~?>;Uo5BlarQj+k!adm%MkCM|cX;Sl%9G(yjzUu7xqz*Zs!@&M>r{ zj@YkmEc&Et)9NmX6gkMA1WjLC3Kp+90sOk3G(?bdk$N z8~BhU0#R{n@C)B9rES?=Lh@=-C+$dLE@9)|*9Pn$5ZQEu z2fU6ux(^*09Q*bIO|Sv#GI}^k?Et4WV_GZzbPf+TEHlnSdUu?*<4$ec+t;TEMkYDB z6ew$?T1qdGoE6)G4*xl~yY z%B}ot>UaFTuOW|xJMzl!7YsBU-5xNeQ5No#3*vU6{O+WlniHK4LPxjyoQWd|q7Xbj!d;UB_$1Ok9JbIzQ23vNN zsa}(qV0R4cG*?-L9@=4Zy;mf}%%|@v$Lb@+XfAS;@8;)jZ=8hY?B36&e&-5- zLLE{KLYn%KQ*x+3F>rZdaVSnhY7v-U8w(e+O7VrEdMU_RFZeH2K!4-I3etxbUaow1 za%LOC?X;O^h)g8h<^;tg!NPq~pP#$ODPQn{QqhW@c6ZYdp6)H(W0h(}jMrxWJv)!O zBwlp~4g<+a5FLiQM-%oF(Z5P5Mb)-gW5*0}osKR!UIuS2v(!7lrN`S&``do)Vk7#p ztEDt5L6Cq`XN$nl;=MkZoCw67O&GWAA&kuXF&+o{r zm)B>dZ@bFg{NT;?fyBw@;|1_|a=rg0>O7gGiuo0opT66XOhHH3uAYiIKINh2Uokv! zlUl_7iADeN5tqrwkB6U}y{?eYw?uS;Zl7+8}z z-x>PsPD4y>{xTHvMXyC!rj<{8QXQF!j-!>nx+!ISf@n;aGAU2-SI7Mnqh;X?8#l_% zdwan}*reBzf_r}t-9DRLV)UIbh8?UX?%x+p8YiHHlibHqZ*;Qh!n|a7IAx0QbY=d_ z;F!F;06omk*6MnB>AU}$d?%~~EuYhov3!SL5&;ffe zcW8tV6Wq^7Eiso;({F6khLf4vcOo^O8+hb-D5-OC6!Z8rL7|*Xjx7|lZ z146)xUtD`d+~o1eG)Z_j5Eib?&`PRN)CL{K`%AV5X~+j2^U8uG8OPQZCgl^ucc@|j z=Dw-wDUaPf{e6eDuVNrC(-<8gwO6=vzR31h`n-A<|G17Q?=6|G9@geI2YuBTR`^vJ znDu9O-Yl5^t;G4{A5_+yp*buZaGZfG^9)H6=P)1CS80&@(G;E+%#EOSYP}bQcpTjI z1aqJW8KFQ8l}6jBg`VV2m%wfR4>x=k?9B(RL{6a#^4B-FjB!D*03#NKcs8ELKz!y6 zmASz7k9;BX(Rm~OSbWa03c>=QFK{ukoJ)1TA7WSgH(w&>KlA90bn*-;159T(V>qQgG9JxcM4e&x*Il~A*ttnS=_2da+hNPV3q-g5xc{Qbv@ME7VWf7$x%4($h1Getr6HRQd9%<^=%rErzh&I+=ee@K zrq^h}ou>V=x#5{me3W4A4DA@^F1p$a*gk{oR@0MN!v${uYR(V z@yW!O4E1N}_8-|6fyT2F}Q_>ITVwNu^ukQt8iK zgUrfMF5hhT9ll&x#2w|0`p%v#?GCn4u}cv0nJe?E8-WZ+cbe#X7Ri7q3^bCy{i_jt z0cQkn_{k*Ar6;{Qbfdv3ZM?IT_~H2O z;+6h>5vGcFMlH`zS*)fmh;%@fVFbEYZ9x2Rzy^Z>IoHc5{)QW`VLkVD-1>@Db!pZ1 zEa$acHa~Qd`&JFgS)Xna=;aG|MfOpSuR+H7k1-wh`u|9v69#Xd7i#>nztom9()Pt- zcq2=#vewXRfn7bGCg~GMn)=;gallDUV2c>9Gg4=gl_X{VJsXrCq%NwDXjS~``K+qM z5Dp<9z%4xwWC9K8Sjh(G_5!jgxb`IKX9ztg$7IY4g9zT}9+h9gQ)4>+UFvV+oF&27 z^_1?W3GYs81UC?kh6jrKd#q2Nud(Q$vMRGzbB>V2i{ z#6w8GRo+}LB$iy+jA3sB&pT!22NHDU&72`%?g<>Y!j%AnSP=u)1SEI-`siGog4S1L z>t2n4ciC1suHby9|1$<;CvXLc+lZbC8juYn0q0Et#o$Z~>ySgVFY1_c`5TKRp3A-C zGHu=q#~u&&P}@9LKB8qR8sDy!TMC=RU!MXesr$r!70q~>?A3rCnYW0;`&#IbxIhhO zro+x8Mwe?B=S+@IwQo9yAujJ5j`%V)@G=raz`7GXhx9`F9uaYkQz8T~AvEr~rbyBE? zBo?HG?+9&fx)W7~Cqf^t_0SYjE@FxYx z6*4+Ubr2nYg8UEb98iqxOF=1u+7UAE_(ga+l@Ke<(ZyqsnZ*}Ay0jO=io0h@B^qJm z%SY8fHNEJ_o$(ccpNcxSrjR67?VsqV*A3gDi{3kO&=G-jnT24VPOY<*BP&ZZ*?V*2 z#>Q)U1iqRUZF@W^uIwqu#49)HLffAVAbS{JaC4GVH9N$?>M@##gUTTx?`lvX0>9SeD0^c`7WR6nVX|&=Px=+uvWh7(t zD|Y^n=hF&IXTw!&B+tRgJSFC-V43JTsQ1pJ57(^mq72v!H*v`6c>DooGZNYm!XfFMR_#?xz z(D*&Bq2_aVzx;D@hfWIR8gE`;IZc*mSLBP+&q=f4^mB2r-TpQ6r@QNp&TUE%f{aTD56XXTLjFsEC6S&M2sJjfxRrw=NzmLrFyujsyD z8>E_w;niOGLSmF4BJ8m!KD0q97%)zK2~YgtJyJ4W1g{tzvmRNmT%b5$2YcLg7reii zJRPBW)$X6pE}D!|_w?9Lk4U4Wu9I?VI|iP3e?H7Dc+J>IOGOjI(scMhJfDTLV@4Q| z-$fREcydK5vB8hsS1F@Y^rjys?eCTQJ8*Q3J3Y28{!0qT@W&kiBRIOT$NM!5St1}* zueI6t4y{m-lSwN+VEitS_c9){0aRZrzMmo+doV8uBSpU2)zeAZ_jDNMPvxYLVpX#5 zrJa@pT45*fQCme3Wl zTiQEBJnyi0-CT{dVs5lB@+$tH6$+vK1Z3MkXzn$Nm=+gO~ z!z*9ZgIoh(v9pSuMUh}aXH1iO{dUzcgm?)8b4r6bv}`ihEO*=sH2%9L8uZW zwih@>-Nfux?l`hHjxi3HDEAXV6AU@a9lzX(UKh#-&UVC~h$@X`0DLEK)ah888{!>o?|8w)Tk(?+ zpjMBafT{A8ZB7VrPcz)8NBIkF^mwI(4f8l4J57M^c_#+8or%iUFovt0wL+y;TgpH@ z%Ss9BxmZ5-k$EuNT%Zpu4meLw$DOzSe`z1^TLYtrZOKf{v|7@+F<&ec&Nm4o+)XV@ z7EJ)7}68`9dTZBAw4stJ6FeSH470p(?I4wLkvC51?FhG8TU@Jd^B!{jVGOkh=C#Nc8Ex159Kh|tQ@_G&9u{ktzext2V14Ud`s z{lBtEq6Q*S4)U+Bi#I|Luljh>VkoFloRTzn>%rY#XH>TRloFo3A+7Ept9_Et*?0^=#Cxcm`7`OQtzW z^+w-J4!o1i&A&Oe1>J68Lr3-BH)xhtC<2IXvgWo&!8cU7VnTSK_src_BJ6C&WX)-F zgvX-oA>GyonkB^3I8*iZ%}K9kN&=QW_bB?5NXLUzdc}|MYIT>D3SB(`grPYtSk^L=QHyg1Xb^B{-w!wI`RML_5A%({Z$&pjTF?th=4sQuR!IDl?MI6 zs>1v=e`fqwO6mU$By1LC?e9eJ=v53#0c1XF!7$yeo!iPI7jqqoIiZr9pC3ByEM3^Q zUl1KO>HPBg&_P>Ah}j3z3q4f(>Dh)#CL#`HuKD+)%(`*px|pR?YI5k)m;K+rb@$1H zaRlR|nP!!KIX;VnLg)`RYziV}rh`ej$fTnLCf!R6b6+0WJ_G6U)1(g%JzYIE<{`Br zMTYe5w|92otaqBO6|c(NNkMGe2h>}fJ6@h1UMsY*9Wl!N(7J|$S=l9C^Y0!rH;HH{ zIQneJ^w{Ie!Q`gPjiY6l8f@Oaz~oAxo?Q@wCn?PpH#j6!>3X~H0ecvN^#~d3V;=J5 zJwPUskrcGk*1dB=8|dYzMI;)vs#N^NXx2&QpvZJJ02a-|TQ);Zvz9FbrCZmPOPq!< z@a}>nxS#(b6*Qx-G&}H%^L2I-i0t4hx){lU(pCdz(14VXHa-fdxy?Hc`823X;`6?Q z!&?zmAGBwxp$k`qNI!;rUT~4?!{r?*N9~2jVc?C9IL3w_x{Nyg40LI&8tF9-`@^EL2>4>5_Uvnn`-Z3#GNPHh^x z>ft4%=Cxp&{RhA12{qq&$8c(~juFr+IhKZ{_-r)~>VV9#+G(CMpe!&_P~O5s9^u$p zR9!zMPr|6io3q|+mu^PG%Xlkaw&mei3bcEb_pt#gbYx$4nBpctLzKp1v?UEDbRNIbVr?p?Ox(@O z_@NM;>8tqmAQb||uN#3FLwg95ewymFt$upKH`xWHYBlmjJN_y6XyBO2>1$Jj4*1zV zs(|+&=T0s3PC7K#F@be=7KrZg>f!Sp8P=A&lK46VWBdh2^-!Q32@pr-WzN~2L>wXS zTc&z(T~OmIZjdgprc;%fYG?%fQ``9e3;b(+;Lo;oZ64wIq+OQ}OxjRK@57%wkrH#Y7RjIR4|(f%rn zmlbQ{JH5hPw!dW)1>)w+zM^S6Qaj6!7GM^vC)ca%bGG0(btabaQw<#&dh%q=+-0J{ ze^yZ*$kI_{oL&=utbI0a4)Ne~)DqJ1+D!t-z(!>b&0q zWcZx!tzb%P|M<_bU0`-NaUHw4EV-mNxOuT@XBeEP)u)tDmC z6Mdf<_?e6lGxw1i*W-u&i=Z~Cz30~Hx}4g4%$G_XX>zyp zP$dN#32+6~oMK{?k~}79i+I!;9dz7_xVUtSy1H1EI6a&+01ta@{`yev!+{<0Eh}E~ zQ^lEHj6cD^QYxVpR4>fkn`URQr}N>ddmMhVhg$Oet&c66|0E1d@c=&mn+=pf&bZFG zqRkHZ#U@V3spZy)Mg(s1lk7Ih>B3Ut@|J(F(tL52y;Efyu?mCK`CN9Jd7gCGUpQ$a z^fn+2A5Y>GEz|5!HV@BWDspLjl^K?fT~@D1IVDmoorQ^NNeNqrwZZ=eHf+qI>&t;L z-u<-6=|?{F3`)7~c34>BW^0TI3@=EQdhWO>jlf)M2TsKwitd})E6j~PU*Hgo$7pU# z71XHENFvOEyCOKK_Vu9vy{{KDC*);z(nAY)wpNxkUgl#-ni-z1ZYs1)h?+~LDQU>i zoxgHPV$#?FDkvW@BNX;@D?zSzr+kgf@9t`6!K39YYQ3}2H|9AB?KqR*Y!Tx$GtkNA zStPWU00Kpt^qdcoCFN> zcjUDbwir2si&!WHwx)qn%RwF(NfN*W12(q)`YDe+(ksL6(&PrGYx~AUK%=khMz%RPp-{H(^c7ol2 zb@^T9Fjgsp9-v~wE9`_IkbgZ)uBpc{7U@o&dviF&6?1k<)bleL>QYP4Q@Q&MR)?ZZ zvxqn6_=`Tp9opZ9goz`a=!n_2o&D}fD;BWRc}>OKC_65@_=-b2d5gQlPNKdjVm=}; z+(cV z6nEDRUV+Bfe_@icZ%HK9T}!o-Nu{HA&aens+xW!gT}8hNEA*ubIL6BXv&b9qM?%fm zv!bMSwk%}Cv!2qmv*q&;+-2nDwytM!a(bv&-%RRZFCv|+A&L*O9y9JRfX$KTJt_%(EKB-nQHo63UbB z%XWBdkXyGr-v8+dMzp|E(Gj%hTYLiSMUdQ=G^}*3-&SqBUvqb)%3e0mj-f1aXET^( zQ7w`#6WJ$(UvV#@>po3rxvOH=TPOW|p?Nmvf$G9$7sYnC#nS4AszycrcjG;n){Pm9^p46D1Qe7zZ_gcnsE=Dn-s z_m<>SV<-s`YpnLk_ZSx6Hvw^F_&LXUUrwD=KLiyV`xDH;R9ws~lDTs@Uic?q=%;pQ z@r*fz+*uP~O6tB>aD+h!X~7|>R5Wbcik~ku^&TE`{_%=qOy|G$yUOG@dV^jsrnLxc z7_G$)$@Lot4{N-aM6)R6kD*U3#H2b8^3&B%Iotwj{A?VDZZft&ewkhRGZrR^fB!W} zd~E_IiL)r!{U=$dCc2a^_%mbhXsNro{7&SPpKxWHbnXlbDBUvDPEn@u6oKgKqYUc5 zkcGEP8E0c5-T_0v=fris6y~#Ovy+mewm{r3>Qr>xjyojcFG4_8p=i=$!kX*=18AIX z1VXka0QwPYr*g4eWP$tUPS^jA<^27ZxC7&V8Jn{+OeD+AtZx-?;o;3@=^n0JtC3m- z)IFR6Fl`3D_rW*%;sT8lRxILfi3lTT%4AFEs|D=}314M`ADdDL%}Em6?jDjxmGiV0oMW<7@`SJ|&kW`wSE4u? zEYwp(V49E{GP2VxqM-Z=-Ou@(6#Q{xv`9aKRkp5-%zbP!QNp7ar%}W0B2O^Y2u*~K zoolTQ^o(4B&EFK9aZ{(yQa=|i)x-TJ{b36AZ!baP5R%~I+ttp!WyLHE5S;~6;}Svp z7^uu-p8Pp6CqU=a{;z45?2+ikRpJzuAgz3ZNu;o~usdf#k#0wdf<)Hr|3`xGq21Wt zZa%nka)|-EJIiU5`Slc{a{JPZ==0AW4V<_2`Ppqauo3(>)-VYJb#Iqa^$N)>dPE~Y zf(UNj<+bE7@9mLK&n^t*uP*V{g@xa35^z!<8sA&qAaGt8Cp;VXiwzAi+tK)AWDZ`$ ze;=8{Ra%UU5odpi)~m362W{J7uEzw~f0Bc_V+GAk{Scc`?a_>Lg+p5zB*^Iwb5%bz z1+7Bt7_QU6uchB6zOiuF`s>OG_KRe5vIaDFjRz$d-N9;m7QYGT5W zhE!14aveukf}k2434dw`^mtV8mPTmljY1Ota9a)Ft&=ZcxG4g?hjzZ2 zb;c9VlwtcP!LD|;+pGdG=AF*Yqp!bVaMu4!itN%$0o*ajvphJG=htH5UySOYG zYt>&QIIX2|`(ADHf|W|p-alRfKQ;GqqJ@!j}nCs_3O%5b%Y!$=YKJdWcNns&>r^HNt8z0@_#`#Lj@Ek+=W zC|=lfer`Of8#z*oX5LP~RrP*fKKi5lqqA8;@LGfCg)Xc8YK!hQ-r!0PSjsFgEC29~ zZTJxKGM{+9pN4q$*8K{ylozV%TZ#2-an%nH;@@|UBr4M~xgdd%qx4Fu7b9;}eibh& zOUZRxp8E|OC(|LXGu(!a*YDa18&7x-04qaP=VY2zZUby?V&`Sjt~)8|NN17xWRP|f zMIIH(fFSR4J4BxcsK242pcCgS_clVB{tFFsqvFDlMI53EY|4Oe+XvR{=*abox(0#w zapl195qR|H;{@&Ny0yNln%c8~@3gHS6t&;+G5WCaxTuQGni@Es*Q6R?-)~RhuFX15 zm_ua#okJk(@#C~s)qadVMsrdtK-|iTBEh?_mbf0t^Q=t=jWJ3{t(~3m_ZWiaRsLm8 zkI;*-Yg+f7ByktUt_Y=&mX=>0r>AEM-}ebu#FxvX%QPp|d68=E%{WyJ1lw*sbHG7o zB{8#N;(mS?1G^HkZgcke;?%eOt}>G{16aCkp`Vi2&PEvW+LHb+V~JE;x`8$R*oB0` zRk9K_B>Ya6RlnP~^@!rlJI(7_U5_-PP1HCDB0Y0X%pNJ{M6;kp=TizHPmJ71_Ym1o zT^?%Y{Z13%5!@a-)wnlGmxHwiqH#du4#+YbLcEq;EcmBCkS+ps^aQ7}c$+d7UGp+7 z+o>Y_llH}Q`glsDuv~+zRzh1_@P12$(0{1|(8G7=+}m$du}vnQ8CV&p@Ta?5So49G z_lBZ>=XCmLqP&TQ1}(f6dBF|`IgeeBnw)1A<4Ig5B-YoW(TW(+`VCyPMK>JIKjex; z(P$c7iyag@krK3W5eS|j-rmWnUug+UpH^y zyNlzHF5kF11A4Ie?oQOWl5pe3lE(9R{%4Qzv1F}cQ{y*4c{Xg7rY;vEtauquDWU%0 zo8Z{xN83Ly9{Nf|bt)Nmy?5bX z9*)!>9?pfoJRGEpV~cdSl&{3#njp|ZxChSPD({aj;JbYDI+gmE6}oPpDj&7*?4y&y zUPD!3cEy%@7mbeRBE;{T zfNxL_$;$tte%)sYGz!rZzTP3>TX;Nm7)2EFKY+3Z3oWTFa?$bs0gKk5jpjGD&VKn? zZdyW^Y3jV|uTLAiWi@d4j~`??KaSA54GPbSDD)$6>w1&?9jZT?O8LBib5)8l{7)8; z{IHO@^`*{f)TR6e!bl*Bx{-8TH{ntNl48`$@uS8A0!9de!xe;iH+p&YB&THXq>Ce! zl@C_4B}a(Df^UrTg^#NH?2K!d(-xwKE%8GsciJ<1!~?ylNYe;rb#NENJN>>J)Q3nm z0{cb;&o1h#njvD|^OK>w>650M#Wu>Cm*uk&QL9Z#JqF$Rl(0(!JI0MtjD3M1+YeBo z{|1D5!r{9_UDfsw38Z&(IC8J@aUV2d5;%1K*ap(r^Yy!0QwvwTDy33bm8%(V7w3Q7 zWua1z#*K;1MBdDxR_9Z+^~V9Y$QaLk-HbXLGk$$=g6hglOQ=wOj!xv;Sl~jp8t*rL zkHDMHLZrwg3D#@k91Yt3WF0hIiX9uQu9&|x>Q{Sw8GT5&7na+&)Fo=@OV3X|y%o9j z82!p^j$dTr^!{`-YNV{5vv7ypz7JfliCx}|2P}#xS70_5adtZOSu7HE@sTmQ>t1Ug z;(k6^>!EYsXtnxVfGpp^dkmYmQyva^O;pHo4qzud?w57BCG|g|QcsPFKeHlVpl$U| zBc(E#!q|wWg^lkZLA{7Q;5e7_Jl`r@P!ir!(>BSZtf{K;LVY^vV0|-6?Melm`Ki}^_N#;EnNw{ zi!+k-nye-W6Ax5_ES1v>h-%P1-1GH=y%hw-pv{w4I)`3VmD_xgJDh&$(JVOx8_Dkn z9>CggGKIVF^=pYGvRmRs;to^-J;vGWg$fVV`{fgBfgcS9Hz7ZO-(Sc$)TJp~ZH`0| zBVlGd7kImGHDsY`8uVxd1pDq%jtaaywv@g&q7n-_-5M&ZLoycIx_pIvh4fG1Rg_*F zJWV=AQS(+;nCZ^)*vij-;XLuQ;DDOETaEWsx_Nz@P9Kc~>Du9vrfPo4Uzy)!A?Cui zSUgAe>mw6(3TBjZ&|rFicGp}?+6U{PvFwVxXIfKvrt_}aIE1T{NZmsEU=F7%vo`}n zky@c3U~x727<0`FQ;Ei}sK8JPE49i1I<9UvnaNvR-x%TcFVqiAMpxfspEB;C;x~+M&~YU(Q$NgwYU39vOja^IH^({OJf+@5WpUozz6Kuh3P} zis>WThEr>RUsn@Tg>35Q>?t2mHGtXuE_gk5wWMRXTHti&28Zi06gPXz(Z!1nPLei|2h3Y+c1}jC4z_nZSO}D+0u6TZOny_JD^YbmY**)__PA45i0x%NUqoMIK zNR%!^|Hh%2I#=Bgy_M6q1zBHtk@UMQlKUG&212A8E2#pM<|OrX?8te}k0fWH)FV_Y zhWNv2%Cv|$Dma|X3=AM$# ziqG}^-VuJu=ia}H{r`VhG=KkN&TVl?eCZ7hS5;+ZqFdw;N2DS4GKW98lhgKWeeb>r zF0M8KBeBEH(R#vylgDu;XE z%HjzaL#Efik9jjGvH!I9@iGy8xlvWa%4)29Nn9J|#if@CpuN3A2Ssd_VvsR!2eP-a zy+huSWU|?x(&Rgj_lO8T?<3E=hYSc#0*kHM{7erIwT_HtovhZC`N^WkbZQx(viJ?Q zwd-y8U(W1vvw+ac;h!J?Z8;A;?VxEACfvRsBgmS=r`e)bShr>RD>puoQtcf=2)57p zTGRdzY{l%RtbeQb8*;E&9vYt>M8^6HPJF|@%p_1PVe)uLUM6s(^6vUq|~H{)$%3~j8f!S{vm?xEkB!L%*S;Bp^w9y>{~-7rVf zIFU+T#X!UaJ#%t3LjYM`Hc0O;2Gi<%hX5&8H8t z7_)uFl6VGOhe=e&CCCNDZXN8T(HjKr?eNy;?kAV*AOQ!rDWL8s_PB!gPt1A9$oHZa zQn?Qt^*_e)Xz%=V@uvCh!rzI4QL>i!p2Df^!X2Uf-H-1m;}@jM*%>FeSB}Y(N_w*F zQlK5ua;(RQHSTSK6r0KQkOaBzED!H|#4C>;Mk37B?;QOjAgrQr>%HzD7WW%qldg;; zK!_4syddpFe_lQJM>+Uql9giaOCjT8?GMl@QCYPpAy+t2&Fo|@r^VdO=5HFyJ@GL8 z{3^T&wAT-M`-}-;@dRk!-%G&bFiFMBoydF^f#TMY@JD^ldYaRI%Lqa?kjOYFj>#zm ze{K>){ST?0kzTVfKG+Xl+>aT9Try4#GN%R(_s3F{&%@aHc^2VlPO-I`vC%@bg+u8N zCI4MpnDT9>wovpC`Jy*^hp;fib4ytG$e6W!^c9n+^EuI*m=1QM3*Tca+t|YUl8+l( znwFdidZmSA44z7>$?{ z_G?jzaYF17>rzIYpBMMAY@P!UiY4A|jA4?tb!&fe1`8o8sddN|u!W2;SaCD`&McH5 zmn!w-L6TM^w4r4_=YFH#K{(ILnH3YsUpd768;kQ041~6bYQJz!$5<{{g|@bvF!eCF zd4%ShY9$YuOM|MM4L14rG5oF!f9_!2as@B!9O4q+0u0Lk>rRnvIESlg6V7jyOe<=2 z#t-s`&>hHn8%(%k`V8FCEoJ>xlalyEmc~^5=82Ik@jQr|&=jI-B6aUisEP>o@i$CK zyvnJ6USM5Xt&Wa*kc$~DF&hvkNb}}MQNsxO5R7QV+0Co>OpLPYhf2@7c||!39B!{~BnegsvD`pFcBoH2m_qzKxQ`-Vg8q_^oJ* z^~U3zRza$07i27g`6|r9)#)j9Ns(}$DBHeIV1jd>Z!4Tn~wl=#8 zo6e2AzpGqEh;N}Z1ebu2ZS2&uN4JxW-ilgrg=E{9^| zfF(1EK9oMS!jEm1ni@JzuyuJR9jo=lt-=R+yq?f6@T~Uw4|OB%(6(JbhICu<_^&{_ zzn6$V|LP{pZc5Zh4N5Ov4EZBhwfGo-@rJwx`&k?g|qR%xifmLKSwXaWgsX??H>sHnc9t?fH#IW zRG%sSWo4XVF?B>GO(;s6(ZhM#^Q*l-^eyZB9|1k#$Du=xP|(p0Q&`EiNcZVoR+bSi zJu|PQ0cB#7p3JK~sm(*J;cu!o?3SyQ#7>(WEH_Qih>EskFBhX;BK=T=81)qw6q*vh zWz=oZRWwSII{K3TXtg2Ui^ujk1zBS zms~iGQ1E_k3W8kIXMq=}b0U zKPKAWT4dir1#F8EgN0T)jvSu5UcG1zCU7f9rPCFN3~^F=sfXGh6p<7S zed6SO#p|sqWb!fYK?Ge%aV^}l>p&&zusq3fY5n+4Eh5#~%2utaP!Q2H6D&G~WDNf(=GZAV*YU#juJC6;qK_@5AC$n(nj)9divoeUbJ1He>EfFkPR(oa~k6#p7ww7*uy*bQlxUqrF} zVS(Wd9{W~ZQ$JS5!bD`Lc-cBHCnR4Mi#&`V4!I!pZf`$aqNGh%@i|V4ArrkD)nZae zz}@)4MYQ<*6TK!%7QUyhSwL9uKKRWqY8XI?)`+4CEV=lm4FqL#_wnRnlO7UL9bN%4 z!mP(Lr4cH0>y;8D8)8SkR&IGwOoO~L3ox$pP)f=UN_(k6@I_u z;Z0Dk9AC4~2h&0BV@-bZ2iE>r6U*X_)`DI)Yi{GwqPAlu)}=ZOHNq%_WVuM=i#q}u z%MPj!Pp3_frMRZVXMn?2<1YCX0n^#*5C*LfqShGcRC8fpG5V?YrXz%0=f-_<1>1rU zJ^-|`DT6$-nodvy2_y^l-n3PrZDcb`3AT4fLj78pIWcn{B-LD(`w{?PkUdVSvHtc_!DE{A~1TViS7c`AM2o(|H zz{#~6vpG#3*zjBlX_lt9rc=%+^(L9!PirIyT$84s`x%zs>sV54d|*x4U=?NPPxg%p*N0lGV{sE7<%+dqp0bKFZ$A{9e0Ma33LWi+!X}-}ShdID zmS<^Fr#~C=P-gp&|NO+eI>XV1Ogr~_1_lp7bpi$?QhDj+`QI)jV?v(FvQ+8`8$bIyc_Q zz%&Q1(XMJ#xU`Y6K~1VG&L#cDrAW_vE$)4)6$`H#!^+3&-Z_Sf)8iP(;?^Gu) zb-8UZbw^ERj?6m=n6DE7-~}>dDgE0@?T~xeJfhfLGhJ+t6lU?b*^ou&Oye-$J$pHH zeMkUdF7eJgh{^Y+GD|igU>kxP7yJV|9@k|7wXX{jh_4KnpLGi!v4~(bd5EjwA{9UA3SqTEZz1E*TJWV8X zO@vedq7jpebv<8k+4BvW@t8UwM6^C~Ggp&=Kq_1hV}w$Pw%s~*o40QZ)Sc0OVp zFK;LDq<66PcU2uXVUXZdy*D>o79{!6kXUls+^DHV!hCXiY*eBroeg~L#hV*xUca

NV!~(?e@Ny?Dx4c^N5A(cM4|Wai049WAax#94bFDDi~oyr{k`?UOM9Iyq8tV0C2`{B{plHp^aCrQ zV7CV*YxAuy4%`#{siqIZe9coFkZ2f|`*S!)`)_N)AVF_GlXcGmO2o4t-#B6^@n8XZ zupH&Qi|!1Mf@+4i&nGgn5}#$gh+I)58+ABNcj;WkDW^6P7CV@h0^xcTr0OCd`2zIW zi+W0c2DO5XwF|5RKR3zK^g=#C@iHtb=yjucUk!t5CKQKEkVP$hR60DlhF0FC;)EuVHB?=2 z9S#b?mQq+rLkF0pW|=?# zbX!**JrXAKgM`7=LWXPL&Bu#ONE3r1nd{{3b|m5ZEOdUjIV=@VOwemjM^dN6moIGtKwD!yFRH);v-~(}XUVg>@kO7B?2*I&QH+eqGWMnmh?cEWRKt&w| zNUc3Jrvd!-z-RhKU-Ny3DXH`maH) zO?qBK>g#d7h8PG-&dhd6;CK;;DE8ZoU&=i*NC`3aOx#@?$m*omv4A+JYG1&j$jQFd zMv`(jSu!ORA#=7ZcqZ21H92cu81_&slj@ZWV~x9hw%+{4vg)i-WfL{&GQ9TTt9>jS zqlTw^aNy`@mopq5KMRRR%CbI{*qA2%L`gzfS(YA>@FjClmu0i$0lyfAlE&qu%RJg| zlOsF*au{litDYoiy#%aw8c|@#%-wjGsobv%?qB$)eJwGA}{K|e{qe(o?8$mjJUW%j;R3dnS#(jk4)?SzjC zzThx=1hF40wX}1;X8X`(^WibK zsJJ3g3s@iU^nBj%CbP#Nr(s;PCZ2mC552WSPeLhZuX=9Aw@y~YD+y<nPeUam;%WLOEFUARU2kwY)6r2y6<&KSU&L#X(KMk`NgXon33u?^kh3tZP0$dgmdy zy@3sv3&wlC4(z`8YapGNmycwKg!?cZ$GZIm)!o>G;V0%wb0TDezMpCUhOCb1;2d=Y z(F?lK*GE`)Rh#D4=-)`mbecIJ`!G?B%ReLz=!%PE~K8Bwe@1l)?De4L^vlMTxO9@&n&AlnYcJ%nTDKhyn3eMtXFYG({--EVXoQZ z*F&dQPPN)FSQn#Rxreq6v=%ZCv@%J45)9YPUgr+W5vKJl5VyynGh4dP{dl>_o*Z6D z&=PW8v^l8hfXZ{~i@dTY#2#EH38ZvC%cAm03VdZnCq(Lxz9U0ZegE??Z? zfB(YG8c^@yMX%*i*$YpP6!PG zY0h17qydlCvMEF+E20xT-?8tN5Deu+6V}{6BifD}Jt8 z)1uwI^@RTMl-*Rv@IeT##Jx<@9P0sy#bi%G8#82h*8?C7QJP&{=XX1sY21`&9*=7EnJK>Azpwmm>pxqP(SZ!Vk(Wr+db5) zQUpYv1|%$^0;qf1FN*iV5xNG4KmtbtGH30O>)Hcl_=4iw=#?0xQw3rWy~`=6{+`z#pHJ`;7l)-%kToSz)owpoh| zz0n1ulk57dcjtOLorrFeejB(9N1E6FGY+jZK--QGhbEsM4^tTdg^(TV&27IqBTP4a zo+XBDbsV>jRYZ?;5;GVhX5Zla>dubfvczF8GH)iyhs)`)+@61zts5dDQZzVDfm+l3 z_B&{dU}=u_Cq^^8pV_uF3rf^n%jAUG<@NM*cQ^ zC{@$nHwO6Z%ix7$cm{tt>UFO!ycy4&U3C35C~Euo^I4OQFY8ficc*@Nv%m&zMIfBv z(-46uzq$MMu_@!1{sM!$;E%lQ Lb(vJOj{E-sKAjdq literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_free.png" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/homework/problem3_free.png" new file mode 100644 index 0000000000000000000000000000000000000000..daa8cce8dd142a6a30423435b09a9625110780ec GIT binary patch literal 47122 zcmeFZWmJ@J`!=e8bazNfNQWQ|5`sudNJ=AJ(lUUAbVzr13(^cjgM^^cIWT}oGvvS! z`$m7y|5^L3wfDRB{;=16K8Vb4&wXEcp2v9{$2AceYKnN+)Y$j#-NRFQA+LGw9t!l{ zz55?9(Sdh7#PEHA|L(hKD$3rg8GE<|yg;*-QI)xOuPzSf%IpE~8q4K{zT3Tf_`P@k z?hiVbS>C(XT&g55qwQ_HcYT^ls!MYg2MHL_x6aNT^PyLAq0BOK3G2>g_WqE^sOJ)d z;T6`kLe3Q|&WJ|4DA~<2?v)GKulc4uqpiD_V*9qOcHH1RqozWVWnsIbeSaQ#yVx0E zvef3GwXtsWYNpmiS2>026|V_IyVkfPq4QEWMxpSBjUY9*(BA3J3{m=mRMxMv0KVpi zkKGMU{&3jGS!lp*_08oD@9EWr+v)DylhgGfl2ZiS;xu4?slC)`8Ju5Z)LK>ZroDum z+n^{%%CBO%GoW@E>>~$P{d4P>6xc7;glyopC9Jo%^OrmI9einZ2#D`_Y@6#^s5j*H z>R7$eWmWb<5!2c7UjKhJiIJRerDg{wkSgk6q1hRu@7#k3%BG$}3cp_M4f{kp=cV%Z z{y-08zv+RXZ63-!syrr;BDE}$d~z=oIi6 ziPXl@ikJNQmZ^9*DhWNhsF{+8GrO)p%A_;F(V5O<-=0#+t=ur1>S6vp!WUhKmsuY06E@2}+d5(mdX z{V?z^PoxjkESA6@qol5-r5ov+sXGad(#>@e`f8{@phoQlvYEpK?KGuatMuFIyL z{W^|LGGTUqG^Lt(Z~V(!<$3>L2u1f&z;{#q0q2uO!ok_N>%~3T!j9hTa-kRf+;V}V zxajmOmb4%7vEL+(F1fZJ=YNN4Jp6zyNErm0+pJUeeO zHqBXugvVOGQb#C`|{V%ekVy@i_FxE6=1U_MFzqoS)&%Bh8OdWpw73@UMS;yj(! zqdAX|LCx(}3un1MbMQ~vXYt`NR^Fdh$p)P_>#k#q&p#f^LaQfQ(r-HX*VxuYV@+}{ zvN7mh9{NtUz;l}xxQ%A9z%R~pTNgZcwRI|HNO`4t-Z6ZS4|wD2PjeIighKt@Mi$7i zlU(loCvS3d-%_l6wwtP`R8Hj?d1?XoyEw9nIG1w!6)i^j`cR7U93~7N7t7WHt)Z$&V6HSD&-xGkq(gp;N)2(CNoh1I#5_*e;CP{j_YS**p;@!KNVIc<9#(9rERD#v2iSz-`qsd~MEkT{8cVtR&ervqTFItLAfmxbk0ON!q z6fkMQ%Lbqs{1Z1}r^O^kQYg^djc=+iWKYbNM3g}$ovv~cOK*J7E}2tis-c8uw`MHE zDY`=2)4H59Xdi#Wtny_^VNZV7;q5#3S4?fs!t*E|nmxR0_9Jv!{uRWYL=&{`Gl7H2 zXB*eAp0l;>UL#LKG8vY7Sd^{iv_T8UK%)lwT}s&xA?SP697@Us^p`W2B^JQCg2`0Ats*3Kt!lD_9I#fhlg%K zXMqUC|8uC-ZF6#KqLdwCD`=pZp8IKXhj91<0a54nys9isLzf%!7CL^zxN|5ihPIaJ zBq`-Mlg}!NJh>(<2-1UN5YUBx9SqA7<2Em=^MkOY!TH(7?sxvMwa6rI@E;UAM(STI zRe3B(T%UcdTeGB*nAMvupocB^JnWP>7ANSy5A{3!eVy&F@P*ggVf{f0+|*n>%605i zZ?i>oHI1_1M^30hAchMys@h)t^y#AdO!`e^2im8pe4OHzIO`>|d{7{fgQB1j__+;@c-= z(BC@^FD94G(ryC!Xm|3_`PpNa?4!)i`Q9leQwy;?eBe5z7)yt2pnX(sO1~rQlyKdR z6Z4%oTordFOwR#y67fp=(5&!AnzHBlXS!uXX0y`;9ZvRDwEh>XH0iz?i%t=`*r?;K z3ya^ONq%yH#F`IL)+i%}r>HY~0q zJH-n+FB{TqRcqAeWmXs7e_pOt`uJ{nzoeGJ?Bnw~T$x8o2*c^h8E>eNp`YKh`*+w= z-=P?rPzWImacZwjf*yj1`oME#SW95@{3_W!@U;6D2iu8THh8BO>o9M2j1$sZ%!??g zrSd^JCWWS%V!(WFZ?6A_1zdVPSxbxGlE_Q%aOc?@RE++$Xg{;ZGN5PS1O)tWJXzVr zn=l~3NtJehsJ;i>r$vYzBERi)iE&}{@u!$zq(H$w+^&m=Y-GS{Uo-jS*+$+hKGAaS zC}h0H;xfapzd2_~GwLAyiM1wZ!loffAVlIB<@H~_9ETsI z@?tx)ezy_K$TgFX2_R!H*?wx5Wo;<&2VjzMd%NG>qDJfh|mG>VZr?m2ar$ zNaWWCe2F@k35+J#|GIZi5ExP5!3~y;c{fPrmh4}o(4!fiyyFZlhjx9wYN@aus{t6Y z=Rx=ZbSi>`ZPK~(y5#NH2ZTS(*U=U4=)1A}bAxg#p9kmmsUG*gL>V7FXL&Pe$PB{2_(f1CNBJoCUKW< zH{`BOK=5YSV{tdFnd@)1k=J!wAZW0({MD8#Yf2P;aGZjWq9cS-?xD%yq4zgiqDZ$C z-F+lRL7Cev{6Lo%y8b3r5oGvQd5v`XCe*JbOP%p^S>L(8E_~1b-rqJ08YE%|7%~m2J86r zg$q*j;MwV*1)jECDL;-Li*KLpEtm^CFKYvd43i8xH;0@Y zmsZyT^6~4Lnl~4gx-~`xe@3W$?`UI$-O;pMLswsOm{tFJ??SuX7b-&}bfbT1x_ z+NScnA?`&>;ls5<5eJamM&w6c`eybhf|equSjBiEeLFX-%n<3_ftE zy4)(QvpZUc|Cub7M%644{^D=k>Y77~N6g8i>GUKhmj`a?$41yetsChR{=nsgnS5qJ zvk3TF|3C~)=|C(k&GyA|=dG}i+pm)k?>qByBz($pB=F{gG0tuO%#z(iZM4?ZpZne2 zIO_tAfCrDi9dl#H{FP#@_9ZNHR!+@nsf{J{Q{v7{ZCK<%2lA|JNQBMAYfmppXx&iaNH@$WO4t}m3_F*~6&)|Wmu8qF$}IqQjPX1&Jd+Z#7;p#b zyf0mW`{hW2eRNMx;c+Zr3;kIR33CiV(y6W46z6Z;acEd?Z+d~tB zf!T{X=cecTEjeiaDk}BAsgkk{FOF>kRB+)Qx4Un&})+cO$-NI**30rI>K z^$u44SvUrEnRn0WgCS@6!<})3M6@JtcYI9Q3_!po5A*Fm&z~-tV;7QWJWED6B|&_2#bBsL-x%+g`407W24FvcJ4) zx~ejyYP8!dm-7^NJqp>m?Vo_@Q^2xyZLBB!b5`4`W#5MyeDTcQc`B^zPA_w}sSKEZ zu{LD`I}d*VWbyt2I$5Qkf*6p-2szJg-#24xfyd^GD7}Ha6YXP|t$ov3!tuJgr0HOm z(N;PP;VItSZdTLJ1IgZ$dVA$PRjfEJaZ6IoZQP`t%%v+e-fA?|T5zLP6|$aq{17|g zboV&BVks{_YoS$oynM;`ysW!7bi}#&S zg;trgfj)BR)X2_aganx$_K>S{>gLg56YDgys%Nq~vo1D~kr&?K8X(Y#xsfcW0d+40 zkJ0B)Y6-K51N~MQ%`IgyV&I!Q)Vb5|(y_Cyr!f3`RKv?;RN<`(JH*#lfh6E-Ti>c* zUQR78-Y&`js5B!1${RY0{;J&ZQishnCve0I9z<)_mhnXFy> z4Dv0vb7ey6FaUXW&Dsg?oG4M%1&XxSEXpaGr#r$L$a8u`68T`Q0l*pX8p}>q=_^<3 zA1i9deU+Jrfdg+}h?yH|PsO`N>f98@G)BIsPV*n$~s%xTa> z(Pn_sr2Lp-Y^2TD52@rsEAFq-!}rv2?qOMO_xlLYwy?{m`F7{rB$EZTY}pz~V{$c+ z*Y2#+>Fz~!8%WfpI?xl~&-{o6-;2xhp&bF_7umAFmIo^8CJ1pzWb2j8srzaJg@Be* zw?-34FW3#;a}|1Zux(g>RKhY31l}nZhM(9JxktF4o~|lQ>pY&*vAx*p_H%^-ZMZ@{ zA|avqy)>L0I_6nY4SHs}(BEv5?Q%w>Hz3EqjlHb0dcV?OPb|=lH!YF(E;w_yszR+h zxENtHK~qkMG!5tGC`DupnXs|9*(%nAZ2*3F%-iaDkU{L!;#jpzVoCkp&*CU1HG+o{ z2==T~+yLWA=+VEU`WY#2} z>G|`|7IW;7y<42|rxGjg=bUU-OhEABa1hsK7^10}ztk4)sL7VK@!M$N7M4#yVD+B% zPk@gQKwb-F^{aw<7u8UNmu-5~2zjGvp2(*>4RP15)#6>hwcxLH3uePJAG@hDD(Dx+ z-4ro{F<(fU9-30|_d(v|1}phbIZo=yv-v-YUR%kRgXu4}_UkOpzdxabn=VYueymSLD7?UlEl)k)Un*_$ z++$_r!?f+b*!rAwMF?dzV`KH`(T^RoqTD{~>5r0|zKe}9DVP)I`n*wbh$hb!PvReu z&f(9(%dZ}?_v|dLh;m}Wd@o1!EBq5jpP4NsQqBt5&xAV6Y?>yRP)49WsyA(s-o@Eb zh^FQ?c3Bq>`E(orvl0ma!=K?wrd*Fv7;E&s9XDxskuBk&$&n8td_(ge3}MFdQU{t)+w60krI9bDiHw#ZP}eS968UUhhpk_vu{b%dohwQ9lM=7 zkNY*E#t?42@amBr`DZHI9-eNI4e|h)${E5tALG}tM9dBWb|)*n`L-ipDPpfT1=Vd2%j@E-((V}0gpFT$w-Yj-H-IC4!s1NjM?=3#!e7>rZa zlRpc*c8%HSYi;$zEQuq?Pn#=9##}LMc8a8UnuSns;82+R@FDzMZ~72qfom;1-gf=) z>Ii4qI$9RRu-U((N=_`q-INxsT#Y7b)nf1|t$4)-r|xiA#n;Zc<6jY`#+hUiJfk}x zB5YLN$9+%D`xzHI`h;;Gb+5Dp++39Q)j7{KslI`Ll$u1J8vs*L6>xi>$vci#oCgnA zR(H^@7wD?6<2+Z6cNXdq`J>#~eqja8?!mm(dH15X91t^qkJ&lJJR|=3p+nVV)(OAt@SM~Q1svyag#1ggS zV}mC1=Q)mNZhS+$-e5*MxP0-9$Nuu0GmG0#PsoE2IU-h(xTxX$L-A~1cTQ=9LyC^Y zp^Uv@Be&*hiW1C>*{O&DSH@+H*JX+^na!VCJRN#Z{nX$w=pTP5@`35)1wsk>9zS~T z3k-{c9s`sg%s6HZ>r*xtp`y+hfF>5Ujl?~tSEiOp9O);x`Sp4cPJLS`V~;b3Q|`yq~8J1hy7mN+4}(f z%ToG(dLIaYH$V26kDzq3qmBTVul)KizA=yyxP#QpBv8_ozhK*@Vcf#We8E=fF@(MA zPi_S^PlWK@RV@+DX$wm0oqz9q*G8$%)(FRcp7f{9u6)3Sf&f{0bLHdlYm~}kcb31= z87g%O)HWl10;TG?DW`~QKR>X9GxNF&RS$Wsi<-ucU9|W}Q2&0t7}iI;_Wy`A1*I z=vUm1=LX!c+tI?1hpWA?3s&G--~(xZEcEAdFM{$Af8S%4>C*vu9ZVTsSH9psJt*j( zN^xAMZj|w-l#=zEYRqiZ7AZ3>&AIF}At$2|eOuLdc5L=e>LY)yYPytL$|SeZ?PRXC zp8ZmUBHh(Nz^zuV|HJZO?K0*;`DNm}NA}4s_IusR1XmYpU>7`=0Q$WRFo4?SM`ZnX z8U|2SLgzD-!)nDTFyYm3vE1?aaa%IZ%Bjw(#+0L6R&ImK$OEF5Yv(+EkbZr` znQ&>L^pt^|L=VVd&g!UeK%w!k= zeU-M%V@L=4V;BvY&rLyp#oG>a7^C7vlO0s%O&h5HB@q=)Dwocb-ArT3pCK}5TZQ=o zA_i0BPY#_|S|ywNs3d0~psWZt7Z*ptxOIjnY;R3i*GFIXR*IS)5-?qI6j_I_)Cc2a zw43HvXm*rb@uD?K;-U|7yvZ-{hGYvm%p1{4xX&73!&p24uH5HpJ%U=$vW!EQ+$My+TE6+O4QNHn-N~6!hQ+xZztT1sSDbxu!W3WSONLv@uFyBsS z%4>zeK8jfVGk&1!{Cw5v>xwJJEQE2he=vthaYdW|TIhOr4klpt^gHl<<$t=JOf6<^`Rrs; zx8w3m3t+)DIbYYtJ5ux3?Raq=p6waJ2cC{Pl*B$1Cx78(NXNn8B(&hQPpZDtdb~Nc zC+@ZWkWiZ7)qbBk2)XfPNR(dcy*7BzoAN#4cf44@YC(pObxosCQV{HdPRj12^pb?& z;1=A4icKfg6KKx^R2Ft~HNlwsK!7cq2z-hHCpaY3WU9`RkY8%`)dd8y7j)(+)q3m; zf&UB$0WcuRl~b7T-^DX!EXGnX78j=)QSkH&vGs1d_JYdlAhG{uCUB z*PIe$+2jBK?@MEUId3^I>Ta#_xbsxw&dhVdUSF(kyFuk$fa|q%Tr9dP3fp`SavBGs z2fi7;cpOb44c|*0XWfjx3Jed+J9$J7k8z;~_kT!**nOL4svz>ZvI6 zVQ~SYDu7t5#(KRBPm+pYs)4Z zmd?yZr^0%Ihe>N>+}USCT39Q7aX^(qi_?XJH{MJUE}ko5Rk4mGOF<|Vh!IFsIHLhd+ku1G!_VHx;;GzQ@zmcJEdeS5~2o)^U@Jk_AeG&TTKeqY_&I{g73`UnxBbIOLTYlrI{mcHln+~=!e%J=zB>0D zGlaY%JUDv`)1&KV!SA#YXtnK6`|0`=F4tDOyI1)vhxu>BTS{O zL!60_Qwn)zRp@l)H?HF!p~KD*5sBN~yMyKDt*E=OL*%f@(q#?ha>)3 zOB4^(K#$hZa@4&I;O95N7}F^Xv(i!q4Pm4wyA!(Lq6`-^vdiFZscVek8<_+D>*rt1 z14MOeD*#Dqoe0{(vw0)vKZqi>+vi9rckh1W-r+4@pzZbA5Z`|*uD=6&F#C%9%MtZQ^>2>;c@NNy5y`&L#j-P!GLj7>;G?71H z4F?4a?bI`m^VQ=**jv1}5+qLM6m$8N{;q}mXOYe-PAL2>9!Pw9Ri0UCg@$L|n6O5o zMBG(#42qEavqOHG5WEmx`E+!1vbyyhVaNJu@8CH6RWgMZ^sx~-^Hnb{Jb8gJDtdDB zGMQ*l(9YyD_eO^W<50D};Cp=(^40(DK}hDx{RfEzjJfcY&ukj}i(TPQFw?s|RzVE= z$9HYNh`@Nf&Oe6QLwWi@PFX>&3P!_FLhDR@_&GRTV8Qc}V|)QMQSdHHE8!EfLLS{O zKxaZT)@GZPjwRs?#|U)^d;Ia7V)-p@d01V(Qa5WBqKPDqiU;d1{lQd?`i0GFiBM1o zax!P;2{28fRq<+1)Duhf?Bya-5$NH(^iTYQqTzT4JhGx$B)gx2dZXvuik!L)rTuFWCEB@`OlZrDsJ?g+yZ1$691yTuuV~u!-A8e z5OlnJ!rF3r_|7{(!Sb^Feaw@oUych^)%hAA#kd7klqZqqta{>rrmfXzKl6&^Ws>&R zmd@0N`>562tq#lJ=Ryv%FMdvzYw2laESvkX`BiFj z+{Cn)!9NeYIFCQQ&@IPJ=LBfexjU1f#dKEd z1qZ}+58%zTfl#ZnQBkxB7sx!}W<8x_j-g%0+81{s`2zR_|7j~HEnm~-_2%AvP%t?>w1F2+w{486%e$1k~BGXb+uPX>o2$zhntED-HkO~mLowT9fHu;VFUQ1}`WGl^iD7LQOc_+tQGg!ZbFNbpH>~RE6Wd;WpHCfXYzDkG)Ib(%BrSTL>G>`@jr?Oo! zu%lO(@^|2W;MRUyG3%`^W=Q8YtOV>X%_+c`$I$?lp37bfJEU-M9sNQ%FB;%J9|bWy zq@tRdL>W{CjB6|vu4}B*37W|qI#7pS-uDk4QDj&$V>Q4`83e3$1fcx8yBW{_kvw^24Sy^4?oX$bO3%7 zLdFCW*uwrEn)j3MZE}kCTgN~>Oye!hrk?3kJ;Y+a#(L+0l30sca!E-Y@>khbFtafk zv%h8GRNh~pm-bJxTED+to$2;Xt;N@?3buf^`QLUtnugq1ZmyeRJDuA=U%AzL55qVr zLaXGZb<9ldMx}Og>C|5^laGj{OQcy}8&uc+meHuaF|0G$^{n)P^V4Ztz>HS{LBN!C zgKaP{g?j|VD8H7n@5c(=LmAw>C6U3h2Zg zUb&5|ysWkfw38Qdim?^8Ppp+dY$04n&n=jERFQRhBRG3Fw!5x__iFoJ>B3?#Gt}~f z&}Bz?Y*disguL*WYxOk2IRk8~$ywKm*Vm!b3F3cNc4ylw!i7}ZH+w)SLCuH2xWKEe zebTh-E`4tyo&aFv5-rjvbyQm{`U}B#X+(RpEM>608jHdccBO|EvOoZq_O7-*hpi}t zXXYBB?k`t*(r0%t-?(5Hh!VL!$;z&Z*<1-9qaWSLyh_iIpdUq8=W9^G=4oL8`-6v>I(8_Ok z?#tKH1AC`;391@rrKu}qY``>qRDfXRpV+UgEw<>cO!GQ`DnI(ZQi#?}z%!mDX-KCc+R^p%j;ZKq|5)k#|tyDF!`uKDfrXot3s1_CZ8JYQdTK zH{t7QgX$Wip?DF;zIPPd1}bkla~8G$o?UHP=7mYS=bJZRZ>1isk~!nR-OwBL$ki^)0B$)YXr>8_W@hy&9Pc_}pvd`0pB$)n=n3nm&eiYqFPT^= z3x`)wCBf{U#XqPFk622xdKBh0@=mlx`U)vb2F}nJTeHP4wyOf@_j+kvkJUqG&7(?h z?KsT5g}Zp*5<)o3yvevc=bamzrKC7kzU)uTlLTmvo5u4g>c6SkCOiR zsuDRP?<|3nWgo7)!B?&51dYbGjzW$DqY}bcA(;*KGsX%W>^c<mqvV_Cuw;#&;PFh+QX4WbEIN=xEW|sP}4_)No^!9 zt4w%|Jq~-QDE@TIP|*LB%DZ?j;4p6;hfV_gA+M)(jr;z-IAt9gom-5p&&A$gk<*8u zNeENxCO(~*%6{XSFgJDLHG}ivty(XizZ!V|fOSxy99Xj4M9My|{y;ot+b$O`%C)Rd zLD>DmcL*^7CE7di6HWA>+6$SFu*^TC(kC>T{{gG?zr={)Y5l^ivfV3d*Ihy*^s4Tj~4`3=lxq|yRJ z_2$wY)>I{&a8pw#xsi}N>T?3Zd1Dhg|F_L5JQ}Mb?9t1QLrnPec-*|3t_>br7uCr< zyL#nD#+3Muzr*7z%oT*v^X`*4JrwmEou}?&j>*=W|EQEpXe+KNq;fP@q@sGMBECy- zOk69`Cno&m+{0`bt$)Y#~%Ppi2lWIu$Z1)`7ub|ue5jkzbQAZGKx;lw)oyI@K0-=9@3BDYrgSvZ}#s8t%H z>klRZ@`j~cG_vt02}bXoZlBr%IHq#?s$klA9`Is|6|3clRioeV$zL~nD|u`kk#RnE z@vNi*5M&)7UbEw2Bl~^CTHVfT1T|Ewb{xD}H?ykpzLZUTt{Xip=HA@av9~8o1PzS3 z*fggllUfM^F0)pmMX<-nOQNjjqfU zcXFyyYvv-S>d&;_^t>=82>)|70k3WtOFh22=;cs159AdU|C`5RG^8j$dzJD1rIBIU zf|leZTUh|b6IH8+n}~ERvCR6Fd#w8;gMWwP@+}^FFbFN z>Q-v;%&0(YxG`JVu^HtK-F(loIsP7@WU`quP-LR|@d$gSIc?dCiJQ0iop7seMp1;q z?QBFQBJ}G(BBpkLLI3bJAUFXM2Z_e(K^b32zWzGivbevf4RYJ_vJwln!zVf!dm%|KC3S-k&og3ad`ZU?0>wFP2BWXWv zrEhqAba_hSv(ke{vq2l{dw!ri=d=j!Hz2WuC6(KCtdC-L!m={TvX{e{Q8# zCh+*Ifi%5fDdXO=*-zb400c+S?VbG#T`Vr+l)4OXgX`Nbx{AN9NTF~VZeh$*ZwS8m zayYON;;oXd*1*fgaF5&RMc&Lct0WLvrtrp=w<>)OZ^qSG@W)L3d*Z&-hUxB z`*j6FS%Y5ON!h4>HrBHLr0whr^A*7`eEL^gLUs|&cr8K_oo;Gx&(Nv&fwKvdt^6LxF#75=o5y;_fKu%{~Xv{+vVN&5k!kDqWfp3}9)Lx6jg2^K| zb>W9qrq~YasK)${2;2iORer83w)2reovbp30meot9i>w$@j71`{#8z#)i2wSdct3b zYeO)fcJ&*YltT-MMbS99psN0y{?lH|YJt&V+t)GSrS~Bq5Y8uZ z_$%)OdI|S5z(gbIfDszT0d{Kh5J#K(49E(^cOWs&Q9lrH3eW@6%5J609!rzzqUGJL%nFjiY;sTGs(WO?O-~q!F6FoC8EiK z0(wuKUZl=No&#b6_Ga7x&NA3nGyYharaXN4fF4~m7Y)wH%~6j||H6HLxfj6etI1b6 zSKC5kNpWPmE4|nutgU`a(ErZo7(r~GFFxRhEGhzr@S|wbR|ki zxKT^ISev2^?RqER1Y?FPFdQr$ijj|SCLsyvzE=L~A4vgX8%*V{L&|{ZBv+ed{?b8n zziZjLUOGDV#qsx86B7*ZPsC|uxu)^zC3)vnL<4xYWeZPybwAm2@#o6ykKgpFJ$=F` zKYk1`NTH_}TUeg-1KpxJrj-ommb>XaG$>U(I9L}xdK3IIgaGf%%6cS*yqDJO>f2UR z920Ovf*tPocn~lOmzmVp7vVNLEbuJ2W;u86aMI7^i2A-Zroy8Z&>nUKjzc7%uWS*i z$0KH6=ThLpZ&qD=H!SaBw(*-s(D?E2SHaC_K9O;mLaZ0j2$7`mtP7m=sm)JB(vjBP z>`mXPdJF?8p9`zRCJ%3Xgq!hmkqzVcQ92O<JZ(-N(gjR^b081+R2Z-4e0Z|1M# zwo@8QF7sU+V~XY>_Cvmyvq&P|MLyBj9H}!GI20_-u1mjhe$4ga*bOqrB-$+8K^IkV zRTf|q)~cu?RoHe3+#;;$P&y&_X+`jzf6}t)J80b+7w^R1ssVy_hu48rr1PD=1W=fGfAJ+IBNh`647r3nx0{bn7nl`64;y5FcOXyCvz&85 zQhaW&M?7gQ6?pX8Yay>o)pF~aekB0sGm_ZRGX@(zhsFKMCN=#Brcqf!l%i4uDwAlN zyHCy1z9|R453+UV7m;fEm^p6{EOQ(`Cd$}@d?wlF-T*Lo4Xo^CwdCCTc8;n}DmAoU zYUf7og<_%Y_Ho8!Yjg4@UOLR93#}e~Z`d<^`&{MaD~akVy&ZhosY>12s%n|5d2zlw z+PN>YCH%llIyPzU1K-lGbg5N2Qc{)tp4tXe*GdSAl3!ZxwyWO;av-~8JjA}oSwy-a1y5P`mYDH? z=?S=lVXFIp>Q_|^?)uXBc2CTnJt^K|pki#v_p7tFznI5<0ico+jlb*|NEcA=%)SXm zSI)Q}9H4Qh3aFgfz~Q>oT}MYX+cS3{Dw*aVoc9I$(y+-YoX1;DJM?++G3FlBQIQBZj$KBUspNqg@m&?ef4 z+3*;MsnYom>nNpOxgFaLKEgBgNsn@Feu{Z@^j)pRBDp%N=Iyui%C_@u?oOJgjy2O& zBlS(_aQlO<|C+iuT4_czHo|VG`%XSN@0$`j$@dP9I!pySf)31`@C;J(tG$J0rj->* zNq~oRa4U2@CTGmi4nK%C@Bma@!n4Cr@qENnixmR7A`oFP&dQVmgxjRiz;Ov8=hWu? zl?ose!>v^-&uG_Iw^jj@dB80)Hw2HN2n}U11~m+SsCP0ZQ@C2l2aAmXpH`{>up|)^ zFuIU1iC|#LNsz8cFs$#cat}ohH6Gvzx+Jmnbf2M7zkeI`TC?e_iMm#htCpbzwlIet zs6;pKDxTsr!ZM;m$c7;sa(IU2192Q2`y^<*x747{5JCu3H|i5c9Igg~95A{U%Jgw` z01?-_zN>#E^||{htAOJsa!K`4qjILP~R6ro-f~Nb)btUkcm#0QBw|VW0Il%-Kq4}iwZXxx`OmzR{yVQcUh0-TrVpOmT5|qiw_H-)m;{#h-D{)~ z#HJxGi4epa;RFOy+8Vr!U-{WCgF%lhM-f=lnuH+2TBrg_;u)P%?lVAimbhSo+?UE2 zc9;VSvhAIkB`bH-#iG^wwSWl$R}oWP_`|co%1r=xeHHl7{D9s>tX~+W0zR{jYO?PJ?j(_|e^4 z-L2XrKX(Lky^nZIK$q?}H&>6#FiK>O!Wf&06Z$=_`QJF1o8tf^L z_wd1{Uy*=*ABsy6){I9jSw$)Po{*T&vM&zi`UU4fG;K8F$XJ#nr%&_`Tf#VJ`X1b8 zFS_hQ5yrwA%a;!iv1#ZJV8ZeWB8$e|avCe$xE|P>5sW*8O@d4Ccs&90cYByv^YxDH zNfhRdt7Zz4T^gPl-o>s7FE^|-b5-Z_NSg05ft01R!m{|V3Fz+aIV&ZQCE6>#z>s~Y zkyD0BS>7XB;|~5QqEvh&P(EJb_&wH;E~AOIZ^EL=CEUs(IJhsu#216r7Qh?cBoy%M z7Yva0^KD0NqCW^k)BE3ssDD#e*xCQMq>4Vv{x3N$pbi6W#%0*Lqsr^!#|(&;{uL=;?#R+B~P#%U;#lLclL&nss>x75GP8M_rzf{c%gB5qrU7 ze!N(G9A0pEa?n}n+;;kDD9{uzZWr$_jffNBvNk`)gc+`RNaa4to#1$#lFmc&JdvCm zIMC&{y=yZ^V?&shv<~DaOMyhMgJpfgKj^C9kyZcs*qe48p!OG#lzcnydoyEV_jA%# zp#S>6cSZ?(dn&R17WShblSE6UH6kp@s{Oy_h*F6#sd?F^QoIC2??&L%{d~nFpr)?3ed7HZ_HQ9I zE&Rac0#{|+2VTFCTT(RO4g*ef*EfaaPE$8MweLvg2*6~6@Sh5m>_PrFT~LfA>L#DP zBSOB+{>x9mkPmDBN4WF2co}O@5Bi9ikyxr`$ey$f1j6mbjxYdi@GAsKNhOpzge9 z|FJ;*#{%`gV}Z*4A6uYkeip8Dr|3G6WdQ5?33_-bX0fAsj{2GQg0T9(wR@@bN89;;7XV*5+gM!kvzF^FWbn*; zPhNbdkd}*9p_ToP_nV@u{A;B{TG}H`d)39J%a3xGoIYjf)*35SodHImYN3}p)fxE% z2#I@)yJ+-Ib_|r1$F#I{;m-GXiR42lSZy^QO#1Z2^n9s+ljy~tSim3ihGfsK#r}XC zJ^8h;rvq8)rBs3v6ToBgF^Pno1D@3v_C5!`UBbB`$Rwm% zLT0Xh6b@?Etf5+AJB##tt@m+2W~xRKXecC}&D3BF@BC!Js{S1J)ii-sKd`H7(2z3u ze%%CcC^H%S83&If&{X6Hht-i=Qj)SlsOQTpPd@p(@cQoF!p_ zazTTCozH9@#9x6c^}RO}r5*Ka5m@ESLQ@#q04Y#i*`jM9PwU;W>fuQ|)UhBB@&%k? zv45OmgOQDYtZ$|XsDfg+bs?ds-PJN1J$zCKk^5w1*`yrpG{#7o{?Hk;+E7B@2yFbi z{pkJL^f{TM8Wb%rCW=iY9w>ktemVD776IR_JOQ_)v6#my~9e(rQ{NqsT7CQk+DJqHMk(SH$ToL|5 zu_EAPPD0}U!QNYkRoU)qyAskd2&EfA5Gg?rkd}~CK}uSXkdzomOSh7P5|EM-krW3# zBvqs(q>+#sfOPEp0pFN&&AIma_S$aibH4LE-h*d6bwBs-yv{3kmlyt^&do5- z@Z+-T0@0Y*vkVT67oDE#Urm!YF7&mS-@dP9Pn@T(Fub!UrD?$=`dS@#3D?r^>976D z1la;@Tc0~1#c`KYJ^d~u?8EY8fo!#*xM1CF3$6- zhSoxe&Or}0fgAJ9p~@apc}DrB=E+kk244n>1_zk|UwYz8-AQ~c&VJx`*= z;Y<+dV2TssSRuTI`KqDyamD3qAnS>gbs+0w7&UiC96kThoAr*cb3T2z>v2#;nfw<1H`qaCNQX^ASny zViHq}oL(PxTf@w2HMNYiq;o=&=ns9iNf%!~&qCxq0c`$VbWieowUCH>LKjC6mZ=_m zZq;}%!$8q5zYXXW^i*WPi{f=~46WT&t^ybMQbb@3lho}SdXp8cb@OTEwKyUBImXX>Ibaq}p~hHS z$v0NPFZ>S2j@W^ZQ#IvriGWI6Ct^#AW2Il&XFIt-w&t*GMm4}Iq{iUAWfYI?x4>x^+!S^nLi3oOd}#al^d$U@coP0c;;HtOcw#3xC7x#fk$A#c&-rKK z$rT$spW=1w;3K&3jh1_iFKLA>uH<*g-Q6*&n-ej@FVRb~u>0KgbI4)VpD+sJ-w{uv zQK;E8LUE(%55VZR$PCTjkWNqg0ixwXB>YoYbB06x-Qes;cC{Mkm@Tin#BqmV9Hiez zsM6^BEWf-(^dqy&MU>B447a^EF%>65`TjrAy-=nBX%5Y_m zWWXptQP(!Jrh2h$KDFx9vsLFd%~3A{lB+1J{` zYOrflzoHErd+?TV(Wwtj(E>lXlW)ovmeo%$<^@9FuP?_>#e^ zDN3DPzypx>q>#+^_w{jWbY}!WGB0mB)ThCwjhCnCnrRxotDf+oMAYdY0RL;%)Z&l5 z&G`*FCZ6ZJ6mQrX<5pqjg{(|%`!OH2UEvoTqdET#5!Z)_Q!<~Q*Dvwpahme=~nwpj{tj9$-r5* zm0aLwa4d?Sgd>&*ESh(BvNR?cf}W5ay-f$loI@%C@FVs?H!?M;A8s)bd26oZI_RU_ z4vIS`p;=`SYn&Pxoeq3_l^MX`yY})i8~V}%Ma^2-TYJn+>QE4O^SWKhrAwyr=B*lU z6Q4!WimSgAs*?_CQzTJeAGs*P7vI3(6&5Mx=WxCv>rLajffOP+?TKldmKPQ>Y~QDy z-aJ^z0fK7l4tifUfhT-C9e&m3pc?v|CRNt$T`feH5QHs9vBUhW3ygL&y_~chvqPC)}G$yfOVQ7 z5^tg)Q0Jk45xz#nXVhL>?J%Klt0YtdF5KK_q-ts7)Lu#voo|{H34sy_9E-_i#sxTu(_9qJIWQBgM>}s zlwxcM({orai+0@{*^lE!%*I$VKCR?CM@k~$MJuYgu1_U5Z>`#!!`-tjWxvuNb+~XX zj-f$}RJHfp`;$rkz;qs?sxkeUXaf&x!+H|IcDg`uC)zCfwxgW{diz%U2wSJ}O+ zk~mSuZS4!{oOjVtIt04ih_!Z^W!ep5pKRHL)LUo_1!7XJ$@|xc1%Z<8?rll>5 zCsUYtThL};Pbe+T+9P>uswdvM5Z3KxIuf(@9oM|h_mZj?R-{uHpR7|Bytgq9D_9zn zav}`Nf%v(*ddpi~TKGeSNJch|=S}!*OC3pd@Y@vuH42d|5rQ92N_Er4c__Fq8s$&> zPJM4`!>8UR5P0Fn-w`;vH^~<2So2*;6`WDiyGHQ3sG-L-!)#LMUsa>KZ;j@1n*sz! zSnDZCLv(2SoN+nk!Aoa0#+bHmyVCv$ho+C(6>nU>TKNTZRymGhjK$SlGLnm-<4@V7 z;=O%S(L=U;ateRk0f6y;9MqbdX>UyO7_Rwy->DRnDbx=5&Z+x@Nd9i^VEs0MQUB9#WV^9Bx%2# zDwzSG=WSyn_HBA%a|Z`!Ten68%;`8rFTcEhzt}Y-dI>O0gZFbGhMvOIH1RE9=!?Mc zuSQ*ZQb)uOFw8ZAS0fSqkK(Rd>0eB7^q?-?w%|=sxw0!Ta zncMYG;@iWvP!Q2E7V$1wB8$tHC`iZJEW(Q z6$xz8z>*^8)3VuD@PsPienB|A3*s=}AFgaM3F-C{Q6C1}F4EQ0R_fN=q`F#F6^t3f z7>Fma$u98+XpXu^;N-V>B8*_A@wjQ)`%v!~1f%gVR7-7e8HbebR-~hp+dOCj1A9L6Xsy=t1E zHe;>dXcSYH2A;n^6=S10o&ziLEd;J5{T*;3>wRl!m{=*yS8CjFhwvibi|e}w!&1eS z$F5k291I@|{ci$*qP7EI)Vp&pW=(lk2-!WMQ^*<`u`B6z7#Nr?jqTf45~2^p6Hm7m z$||+PLf-)M+hOY!%}_LW1%>+s>`<0!we-|@M8Gt-QSQJb2gnsXPk2kZrdO)}(C}p@ z6fqY3+j9r7vbhhIL@<`1kTg>^#W46FGtLE44N|6?cTWx`PT2b~ST4aP?dgF$0@d;d z07ddQ0O|vJh91hGFcLU2!ZNnk6Cbv&jkqQ!f>j!$8yRL`HSG5y?Ky~oTHNfNxf*2H znA%U=w{LzoFNonDdgU>I_rQVv00(;I!s!hu^H2QKo)X@;h$DK#g3NHCV*ZnHW_Y6d z0p*kMb#jJhex$pTdj6S3z?KNU0JZ-u0VONiSTZUT!zHaZZ5gBa>Nn?&MXEN`4{YkP zC<wHST!v9AReB zS-5)a+Xy5+ha^|j!w9`m zO()nK%KX(GhdZ9ie)?SYL+MXb=IVCesE8VVy%qxo!FbZc<*ii_X<>)H!887l6m_=v znryK;y3b7y>)tiF3$|zgD4b|*+6MUWN*R%53o_{EJzOSe!Ws|VQZ^g zQ2N0wiHycZ#EPA9y*4VP-7#?81q;sw$qQLAc(CAK*U`E6yr2vQ)3Mdl?ZqN7pE!}_ z*^d!aO8|iu~q$36H zWvNh#50zGZ>XHjB4$Bn5usmRBF*vz^Emth_mi=1ZQ1oFhlZY+srB7@g%WQ?#d zhieO8lyWi$meKTRDRHeSUxd{L|HyU%_uMT!mM~@j3NhNl%g8=NnZAY1M45h^oEns- zHYpytW8T&wDA^gnX>aUS#e;?SBoHATntiQpU3a}$^rOh2sT5cUJueGnkyw6Z*n)6y zpFENuUmO1*@{n2@Y4>#@YZ}%Yz#q)Q=0i!EWO&)+lNFJ+`;TS44s$##)XZqe8>||q z7K(7h!&4#(mgpDbj;0g&og`#Dd<*{|`OiRN<)a(da=2~+D>}OQf zrpo=qid=9Zce%y4R8Ra$APd&a!xNweYp;GR&jY~%Iu7eJb`|OXW$$f(=UGglu9D6S z)PsNY=Q{#7k=lmn-=nv3~>D^(k?m5RLHmr>bLsBi6T-V&a&;N4+^rsY)GC8}yS@#59J3(ZkPaDdb4>ZYzJA zK+9(>B?x9RyFCW3l}%;C*_4JU8v7YF4yaG$vzR3+8A^R3DABUE28hdM+J?RiCe zse@OrWvwcuntsLBg$bW~d8uzjzB2REe9oBXYnQ*YHeOd=b-IL;SL_U5OZO+d0yGGD z`EAR7-6#7hYAIrBc{L~C!!Cgv?_;&d`CDGutiZ>ooA)(1gnn+c&>QzGQ1=iDA6Z(l zLk5g6DtxMm@*iI)?!<#tfhtoe6v0uIBfj(ak>cbeWXHVey|0>B<_j0bB|4UoXUcmO z0!gEq<2NCX#7R(QRY=pME_k$1c2~y%Lwr#{2#JA;3=;KbqD&|zL*fM&x(n<^EH=;y z+h&2>gn>Z<5Zp#SpxQXUr&;QhH-fZFtrVuDKr`@W_%GhzGpai5)0(|dc>msSMC#q& z5vlYW{~bh%;C~RQ|FJ~|WPMUs{ zBs0T^5u9$)DcQSKWzF2YPDU>&7N|HPIbJ?d=65_vZloI-=}*cn&>Lp>)(k}kEefC@ zNED-#%$q(nFVFNC5U5MLCRu?}%+PUmp2e^NpRyZ%CZs(*lWN$}Vf^7heemIF`HZqC zI*LCR#4wZ|->k=I^r&9^x>ydcZ%T31i+x0`hciL>0O_L4xWAm;jmS9#S~oPAK^9%a zpL(p;I|NYT%S>$g%o5n>kx=De$1?C-*7V#(5I5sAQ@v8fDht=$_?3EH&lcIF7_v^l z_5f?%g0yU1JQ0VLWycZ z-U;(7e<=6EwrS2l!);g8$>*>(jtkgqi_SZ5zhd5bHvP%2(nsH7MgDVf&YV0Wr4`Y-ry zN=>G%%Qx;;PnKi=)nnx#L;g+%^dHJ$hUuUguD}LhYr6;gl?S`M=s)dGv6z?sP(oS$ zYdO?e;0xMDQKseR5NX{B4odaOpnR+uOl_PlkHb+#yFH^s^XkGcrkSHS)b#Z>SsAv5 z5vm_=7sj&lD=Eb}e!b@(*lX4lA;2VMl#G9e()_AE?dmI1P!#r+oN|KQlD{X?`&EWj z*pLr@56MUOslaJ*G5#jX;3-s~4xbScFZov@J5Ko8ZkR*dKD}~!h-T@X>X)j#J2x_S zug|PC7%Lez^9)Rd{yJt%Y9wh&Zhe(+yl0q)TAuDU8^4Rq#Q z6STF^&*ff<0Mc?0ow5PpZV;0K0;9GS4u6_k0u;sRxhhEoVDkK${L<~ht*t_vMnC_- z#0S?M#$VB1f6Q*Z)L&2py5D#hFMkFocR%n%X%D}f)7sm((7!zV^0oyNQUKb{6wzJq2 z3Zd^iXYJlic(NJ@_3uB9Z6(>j-eIT?8)lU9V4aWNyh`5Qrtn$+H3&uw-rwBV7>%iS zE3L%I`!S-*bs2<%Xao&U6!8#C;Zf5vuhou zd*-l7Y7?_zqLQ zmF+<8mL}5924pm>x596?t*=k9xlT3TBKzVtSkiUZqBEzU#GtwWl(H2D;F5+Z8P|IS zfjMKcf2!$w=egXOj*j<*wXQ#T4{~>->G8PniX1b6%2QjR^6`)i_84$>_b*EO`W&?q z4@cvEC%2xPRd59(N7u=(EM$nT`^E7qkdMoGcj3;dc=byoF&fHGd1Zc)`!pgm$^|y) zqG&~oENzU)U;kYA2}}-lx%_L82}!Cur34D$u<`>#!vLtdc^`ZT@DPzV4D&St>yyOj zfS&`1t*f*R`$Vd}es?oB{+kDb)FjYTE^gWiFEzrRq3`w6nlYqWQz(rn_v8oFI9tgClpY|NE0s2t0lF1{t=}IP-5!f;` zPsa(TGw!=@w}IRM+y6b+Kw`p3RSXzSFU0B3uackgwkKdhXPwy*v?c#)Z(P;jVKCCbwLY4MCcy|hd1 zDN)-N`Z}IKQi21%y?k1J{){XU`A*vCHY-;#J^D|_df{5(9NONtIVfFJ>OSVwHr5)c z(a+&J(HgSpAM=BLAn%htk3dBNLg5bBHUQxUj~Fkv4>C4Jbx$vqjV$m8X%|_(7LX*B z#uIM}Nu|ZZY4uW61PiG~6>PGpAmtP-3|B^{?Db-sL+tzPr_Mc7&g~lWiqgZ#JvYw; zhaG-}-fAE}GQTW~`aH_?e0jm~h3C$yfvv2-RlbI!b8)!kkj|%|XqN=DtQ+ z8`k0D7q&~{?kjQ=QhdR|{D;j#clxhp97yo9fjZ0UJEhLm?o*ca@!#{b-vPHv`C z2j{yid<~d8XIsycey#lJzftR=EPG{{O%Rcze4m+r9eq*3LV9@%s6a3AEz7pZnoV0QEwEmEI-^*bLlSu9W(yjHp z#?^CzkP8jbAN6doUiByU>Hzf}Tq6f~db+&x+I6xCqaF8CJ6P0E*>98#F?%kGM2;tG zO4`v@^F4ngsieB}ty`QyovXn^KAL4y!c9diD5F=;iqPW8%UupH-S>pAb8tU zLZfEDH&XfCc&>Yw64R!|oeu*;GZ0unm7E}=4O5~{At|+7d1(mV$uu%G${=P7$+NYA ziG{Ud8{0n7O%*#4-1tB-cJK@)V-Sqj<}rzQeFcs43}-0%D>(|;TrS$y6AfO(QO4dl zM%LS)&vEY=E-4@LYsXc%ir)c=0*`;&19N>Np96scx=hGBw)!4yI>dRF9H~XLK9p*w zJ8bCVkIbO>QxT}4g1T#Tw&nwixG{!SQO=yqvxMC9oO5hO%(FN%WfXTcv;LHf|COox zKU)<-t8z#KV2Q4?H%ugw90vmyJsfIPrhqi_x*^qDvzva_jslJn97fVKrkLkA*CrZt zW;oUEL%S!+ST_A7eC4$__GZRz3{3s}B8Ybr8gU8!dS}_OaRL0Vyo{@Ns*tK${`gmx zO`eV?t~{gAZREdv3^HcLB_6}*pQX;@>7H8^gV+K$=bM9-J=Bgof*+R~fTwv$iHzz- zTMkkhf}xtuTjI0?l83}7yyVd9y7Cg0?LCY?ED@;i0 zxcN~i<7njk@zCemt;0cp5#h-9;@nGi{53o)iFY_c5?n+tW|mWkxTD7LwJA_ZF`A(q zg!HwlMZxHaSMOcCYE!|ZI5EeC=eJAsRCv>-KTJCP0;2-A3+30cW}JSyK(0D&NGo8` zsiR67!=-m;N(f=|9_q~fGt{ps#gEkwY~Ur7w@ZMoSHHnJP7I9L#6aeocDDug3)G|z z<4=pK^7fCPK1q5r^;Z?jmxP2RFj0&^E@jrB&w6JW)eFq3*|s3JZvy zQi%(nvvAfB=y(+8X1eyo)G7k;+2eHDS1$CTqDiZ@NHTQ{S8YT+X53o~^lav?0`HW8 z+RN*P@-;Wr*lRyV0oejrR483C0!h8%mcASx%(4gvEg@B^@Ca!O#i#I&rnN^W&*}K= z8P8a$Sd5w*A0SprX6)@mov#CstN7(hR;%M`xcsvrs#kfE>n6FR&*9}c}FaQ+j%R~<~%8?yNU)-J-AsgR2)Kx$Cg3XrgP9UfG<_g*DK zpZVSjKnU1uj$E_|OvDP_Y^V)-us>9)Pb0Y;NFP;@TDxU<& z-S{sQQTYKO3|bGhWRZ*km)|w8%H3c&QAsSy{K2bx*&;aKBWI$@JRfWYb4v}f-J}i5 zsA(RJ5hJEkR(<>9>l7O|sF?Mr#kMEzUQ3Jfcbuyf`3kSLpUC=heq`~bG~1WQJ-5YZ z7zl7wH`|JkF7Nq(K_NQC{Lth08DwJ}(^T#A1KumEutx_Qw&Hnhg4O{AsyTZUfZnz< z1}XHhRW3IqP$d!DOlqN8*3JfsPAU|i%K&_~zwFK=WGBAshQqi8M6(^<1S~IV6s_x) zf}tNp2Yu6X-0M9*>dNp(k-%#{A83#x=Rget@hLXd6t@Y=#rL9O*pv?O-LV?`=m0ha zs>c8}b%E$NHboHpPuNs>Q~8bG*wnW#_@vtK^DaN#zS0q#Nun4}B~hGM93qeX+^_^9 zt``7tRp|zVNX3gwZXI0pY_NGgtYui|rq;XorHh?dDQF`+5njm`2R$SDt|JQNfMJVymDUk|!ZJoes{cV&Z zE)m^pv`QTJ+yz3kl`)4M?k+=@i&VjFp*@O--ECWA9=^5HLs=f;U5-o@RYqnQdHhV^ zh&9ip?HPPD?+rtYHKdLCu1hzoU*t2eFTp2QW_S|IkB%b6b=(MjBx|{d;7I3s5$*sM z$E0S6=O_F~o5h|3@x3Uoq0F9{fFQ6#aJP*AkggS#W`Ce*3O?k?KLk4?L8^Nn=zKdJ zK|tXhL)#u`p4fP?l3f01E}O`*-xA`felJ9+&tW9t3bl;MY=xu!S~$p1vFn=3#h{qRE{g2yTCUM=6p4k z3=QV*O*ckF5}dkD-|nqB-ZvoG!25jQY_tC0CmN`DVd8CI3!j>h9e;vTQ8&kqOk7m} zdQjjK+cs7deux5q30PVr6|xPM*&%EyKa3B4icQ@k435P33!CD1pp_7a20oIPOV21W z`{Ve^(D7EdPPNoeC@jKHjLXE_;fz{5$knEk=|u{rI1>ajYImfGdDnhEAcnblYH`?Z3UALxk6Qz^91dGuU)dXp2-u80WId5&Z;RrAB=sw_qIFcv994)fvpzH z(PxzhOSVvLimffL9^LiZ$!5$?RU15at;Ut_{sBxWW269Js(cv$Q-J`OA{GX~)P4H6 zAd}RI_%4Jz_F@{=a>HN1RBz&+z|`!B8f2Q?cCJXRQ&n5ieRrx(Ql==~ct`PO1y%Hi zdghFUl0`870xZ<0i$XTbqOQE_QaO`o?IC*`u$Q_7fQcp0CgIH1O60MfoVi6=3`T|b zl6Z~pfQpc$)DPYS_dhWP>AiYO`pHTR(r4mt3vFBLm_kJR3D#n}VcYM&ox{TBZd)vnY%Y~6rvS%h zYti5SZjro+2f$_k))a6H(A@IqYLKAwCtYY;X^&V#CI5?|7TBYl)@$h=SA-q@LmB?ZQYo~JNW@(Aq_io1qWvc@W_E3WZIuDvh@|*M$Cbv->()y`wp@HF zI>qt((im`-h)B#6 zVx=GbZjR{>AF!RpG4VYD<$HhXowU#u?`+&BbJ7oik3GkARKfYZ`$_$5ALwH#7QT(N z{tbCk3<3T49&y%r(os;q^RC!mrvz9obyc!5kv4<2nXPJR4@){Cl5~?n4T^*d1`z3d zF|cZ=Hy7a~>bq!j&04ZYLvdj&u~*HI^O zJ4pG1%BTr-0DV-rd(?Q(s_&FvER@&3fo}GTNaE`vrcFNqYCfo@^GrhaRti{}h6Z*U z@fc~x9JwvDbRhBi3Y$XAixu!TsdcFYP;dqaBvmCUv1cOJmv#qNGUtghd7QFuUG4#u zN7@0O^87>cY;8b#ghfOjJ_^lbterMPaEVCo!zk=0gJb9#sO)8Dhsz&1M{mb`9>c~) zy1?;JiWW(wv+Y+7{zfTvRHnwCohEx%q8wR|kF51GcZ~7?L(g-1ntTDSzhV*+O4=`C z0e^Hmv51)wah*Y|K<~*9s5D7Mg2kSf_D}v8G(`BOsn_G(^W-nT6opEe^NT&e&5%d`5f&>#b0PlC9S3t2SgIH+bNMG zi_OM8*%}k`xx&<#|8OvSDgKS-9Z8(>z7G@U29Rn7;FbxS9jWWQ5_^P*FVJC70q5kF zm#rBWUtd*rn9kocOuHR_YMAD_4o8S-!*G%I*&P0<^1kR({OJ1kGyKTlFZ}4>-{41z zcd5w*$CS>)Veh1~N>q_s@ZUXezCv1d=><-G`GvcsQjAMd+_~%G~ zG5Y=*7@Gd5uzWo@Q#Mj0IP+PEK>(dR=!mqyll6-UhNZj%%ylA0;0;+-W|Y&tM$HH7 zU;l!QoE|x0y^C-o24Z#^igumZBS2Bf1xL1w;t)%IlO1Qt!7VKhiQK&-VX;lO$u$3^ z092D{Kl<`AL85g*D74KNiXO4zVV^@F|< zPO&4lG6*{Y?-L>L6zk84zGUl>4A@#BG!GxZG&zlaUrwy`N!WoR!DY>#snKJ*nvcex z1vv-wFdx$~R38&CFL)seu`g|QV9*a=VflyEF%}(`R|aTmYU?2 zxZr=#EupfT#pfRaVY`P(GakWjsHnZd5m>VNFG(PqJgL$gb6!fE8<~h@zrrzOf7d9_ zV?ig6!<9#`t1Cw`H7D$m$FP&FIC=?s`tJT$%}S9UciLaD4SK` z6=W!b@_kPXy#a)(N`n1!+m6q5&1hU%j-Tt63=EWTZ0^zTrQI)k_X(AB87x;8uhfgX zu9_W%zpV4e@uxXFmhhF~xaG04nqCU_#pwP-VYktKORJ_$C0sZJjEc4+a0H= zdHXJ*&*JIRPvkqloA4fn9{^deZoxB6FVB0LC=u?B!&?y+wf6A#JN1xx9xOx3?#j0| zUsAESE(QIR&*7##^*hVM*>0<21y%On3$NRcz2@J_q@Y0Gv|W`TyJekF*uI5MneWc% zivI}v=;nq^at!Sw_2qXzq&W!Dc>?Uw@>{0dPw{xgYnWAU7y}Z0&lu0flbR@68^l)7 zUgFl@D&C6$t$8ISN(B_4sceFHRSWgsd@I`K3e+-D@E852}buaTJTh%yk zFof#}&?z-8g80>NFb z8at`LubqEt!viOHqTbs-$nbWXPYkVa=g2Kypa1>bP*|kb*DGF%`x<=*(&8@|=uOz1 z`XQ>?7?2d3V9fZ@GcqI#dfkIWL?L)j=^My#U4FR+cyixDDfId=5DR8bPO;I~{9w)P ze4V%=7CPy(`6Eiq`$uG`uV2V>Xq?INN9)Z7tQ>5T4U?$;?vvxcI59jtYy*09p`VEH z=E&Jk1nQ(&80)rZD^XqfJ@*y8;h0Y%upPj!NzK4NuT?U;AD@hydU=A%2k4 zG-v(M#_(*~3n>^H7Vm>%ttVRzsHR@;)hW?4kQbg_JvlxIiVrYoR}w|nfvqw0Y376rP4sWl8;Zbr|sgvv7YT?bW6UWAhm?;_JAsp zI|}wJtax$F!Zmtjf)-JIr%#mk;N0Po(BnNGqte~gmepvD{(R*aTsPM!rRB3)$|GQS zSGCA+#rw#X{En)@R~MKD_T~%~TU^zfc0QdA%BoC$KmU2OB0<;WfoL<%GFuumuecd{ z#fgU>d=P0D`N-LJFw7F8)_?+cARvVF)x}=mw(7M`A51m{u-5;2%{kK= zRqpme1;prO)hG7?^Dp?WNx@C*@Sh#cWZ&{slIfQ8{-{!jPjx>_ih3EuMwXejR)>rO zdA5_l?l!mH8(Btl)KBMCjTv{I%og>rU;%7c<~Ne=QUC>+4gCrClvAKuvn71Kr+Y@H zgwqUczW&1)J6Ea<&6lOWW>Iw}M+ z-NhqeVrXWwV_F+t)0Osh#OLEtXl=wzpk74r>IzKbL2Dl=pTpM*KpH%>$WdSSr42MO zfNnee>Fn++H*Rd4s{oxW9@1|^7Od7eFx%v*KYrL*Gprj%gG)yN(F;B**sB;P&P^gm zT^6?VBqmJ2nxW%bBu{_?0k2UlJE`|}&!fNH{-Ap6j@T+)7AFOV>RWJZ;7j%Ylav)% zm;=gt?fVB2ZZrcvOc=(p{z|Or*eOj{MuI<3T%HTruzuZK>1HIc8o~7`RCPN1lcO@U z3L$p@PDnD(C>RXBK876hk=`|XYy;2rO_BJhPj?&q8q!{S2sFjRNC&t(S?5%mNeCr9 zGj%$&8}_h3bY20fdf;q%T-2Kt+1LI2{v&a5e8wa&Kgj=y#6TZ?-}+zFd0 zifeB~-3Mj9Tyhn!j?Iz2vASbFbT3=Y>KruFUxX%PiDqp%l2mzO#?(s+GLxVl^KK$F z!H6|d1O~HpshT`gg5PgX;#+z;rgh55{h$b)+FO6mR>T^BA z%mv?I(`tc9j-UXAW$wIcFZ-2G5a7r$2hL)C)nEoI_s#~I?deyut30!e`U`3j@I`*D! zL7e3O5}I}GQ9o!je<;rAqLPykM>mlE!F|AAE=1mh*P!ff6%d7Ybb@u#Ktseu9dRrX z)ahF3ticbn=)c$Cmwo;vVt z6+i$*4E~bDq2l$ z`wcK&xD!PuQkEEBs8#STMZi3-GN=FOfV4l!_#)sNL51B_5#iMNe)TyU;eKRL1ei6{ zgbg^vT3=1hRlX0kKTmfQeUUR^iCKPG3a$6(egqjnkixT&fz_2d5Ua*}0f03(2hPS+ z|3L;ZeU%JFFS)VCgBxJe6XcWh=tK%mD6dS>7%vBdPK8s)jog8=(E*>Hp7R8hl;mL} z)pYotX6x4c{ew9O{fVA+qWxjIfrnX+y~AISPe62D?#9>ePb zs`wWcY9GTB0MFGZ@0DFwQ%8QwV=8#w5`NV-g(F!;R|c$Nd)J@{=vBkAyMx32jj|Kw zil|(*U4XEZB_@%~k5+P4cu%={0e%H8voa}qq4!#GZZ})KFYy*%dmQ+Z0%)55JO!gI z-)XyZV2R-8?|%98IEC{E9XbaN7t#EX&ID6*QY3YGyBQ{zEYl5mRado8QV*E>}%Q6e!ybz6$K9>@z5RoVp8&TO6wd`sa~Q{Zo6^2yx=TB#xBVPr-C zM!KLmPbNapUD&E&a;q1zG{M}=V#E~=I=c}L)jE4_q%)vx;WZdQ8mKfKHdX@Qu2nNI zG__iadAMha6@2|v4+fe+U=0Qbspa_s?^|~PIE`(V!Gd5>`sI$#9D8&QJx`2i{c)Hs)p$F4fSB8rTYxca8d`$82D*mw(Sbztn9>+6 zznBFaz7A|nUN?S}-4J&_=FX0LQ1?_#EclX2VmNbEgo6uS(fyM9I&Wr`(yp7m2QQ|) zH^$v7E<EnM|%ocGanAa^@f zGl@~_c2mp`(XEhJu&eW0a95htfnb@0`ESp=iZ|0nQDm-@zk-K`mBEva z0=@DF{|jfha#n&EpiJ_0fgeRqOM+dElR((AJ2```rR8$>^|C!Ew7fuPM1iE0UB1LE zimElhYE=X+N4MGuw*%;C1hCQvV}OSHjuLoH7x)}|D7-{CoYnjF#&c`ygNMQcF=9@G zs>cb>FNAs!T>@*Xd>F9NkW<^h4*c=j1Yjx<(&i(J()i^6*`T^Jl^c(pNG(LC+^w6J zUpX$4c`Qf!fTU1sFT4=QWXSYAF-26wIWW6`@J-Pp%UdSY1Vs_*n1&l2R!i={Y~{Fu zcU9)o6^V!^^efcfgl{P3@BPs`xR;GC>TbO9`PlEiOg&h05#n*DiI0;{)(4QOObQGk z5|buC+bPavrIjnOo~vNkG;3t*+xJRfm~;c@WKD=@W*#b3{)c{DXjvGGL*yPJ@CBdi z^%`>PEwRL`r_An8&-jQi5qtwao*zBcB0-8JERWP1`O zv=4~rW5TF36%gkdI}Uc%26mO>v=f$uEqeWEU4M2J+p8aox~seH)|L~=lG=XH%2ur_ z)&oN-BH5V5M=J4G`6#qanhC@aFRLv+Ok!W;CkppH9se1*9qt#Uxz97+ED@GbJ@ZF2 zmhzlJTLR}Tx0>Z)z@(5Eq|C@6s8&c3vmGQhV`=!*$2J%5(u0F{=CK?D{9J@_Vh+7b zz#iYQ{jwObl}sJ$_(%C4`}w$Wdi(`?P7aTSA@!NzkbG{A6@W1Ccg!nwvZfsK^G<&N z+?C+@{FiD_A22s4T)06KzV@sQ6k}P8Xn*<=_@%LgZP$8(a&ecGQHcK6@`0@m%kW&FU5X+EfGBEKZn<*dHFNIHZB%xo(xx z`XjKws9X}!YEg`;N{rW1m7q~*2BXB>G*Gq-CR1HqNqhqh;gnr79ebcrS_^EbJlwxe zKcv^A_T~LsiZ@8rPD~M3Ro@~RpK0O&$e}1~>49h$Dp2*QEY0<|TQE=e&Nn{5DSe`19^0K~ zL8jtM4cMa>#B(v60Ttm113?i~a;P0J6x=v#?8`a#uNwP2|6^m{nZIhtX&vvJgz~g9 z?B%(CYV5=O#X=AC2QP4W$CNb3r)t1lG9I+cfw`m%hkA11DcJl$+a(Tg9f6>?=v`yL zaz%1E`2FCGAAbr(onH6caZD?O>E55868G1H#T5&`->n3hkKjNM<6c4<_*#Ls=w%X8c+0Se`yg?{rE-bLiuBgrkT_-zZ^IfPj=jhF7t6Ln{-Ky}k@Bml725E< zKC!UF6zg7z9yL5x(E_)fKBp~?z$j{Zr~FYj>O<6oMuudZ3oXduz<{f%g=E|)Gobm3 zjmz@(Q2%AlS>F!l3;keNoBL_k>#4 zr7_mf0DP@ap8}QR4eU3rhv427TN`BBUumnT%f|!~u25WsG?Bb4MITldT#o|bFl9!C zUUlJ~?I~1o>E`XTvu^84eFj(Eutv3iJAY-gV?HH^uO6EI*iWqrE|+(eI<(RZPn+j$>h$jeFBeeE$|uWVSh|3p*2-G z4ha}Y8s(@5hoyp@iWYq4(}-%oU{%j+cU`7;G9do%<$Ds#BIbV`=?KwCGy}LXM{w>j zG`tI~fG+Ju2dTW3n-}ohV*(VcL3zzAMFlQ$*pZ&~CO^2gM+!JbB-0STT#c+jEf~9+ z#C}Un_!{VvX{W%PHd&rN0Bz12qg^U1ob@1?&pE2(g+C;a01X}m%l;fZDl1d>fb9)% z*=4szQ}9JmEuhw?!YPoqKN6pxbHFuD$|jjKz_5FL1&l38EdiBtT8nCd(M>GL{jRU_ zQR#D?*BocJC~|aYMch5-^D>dklAG#Ck~JNBmS`7itQgZ9DeSYmRJum;9#%TW3MTX0 zWz0@?QZ~E%vaKohct`JahDWqtgtBpC^(aM}Z1ry?P<^`BVe4MX%O|Gb z?AqPE2#*cPR}2Vwh)isGZqdk2N|DSl0DwMBNVniXyfGfFd?2VSw_(N?p|ph5@wKXD z0xuYDkVN|orlai34?&y7Anl(wnP&4ZSGP3iB=A8e0TN9WWt*`D<8bEBSmmjn=v68H zZq##t8uj*z|7g?;zYi)jMv~I6iku@d4RTV?AC;6Gu78q`ig`s}I#HA50}?KRW1tD< zahp^9(VJ4Qhn`?@>2d3tRl6ovHE7&XqV?lcm9U;RH}E#%M;(N;tXzos{URylIcGNU zdn73!F`>YOeQPXFcbFLewxz&EM`bmf4I>bG0Ug@St! za338f(*ew0jee#cuzah0uY|%k^8us=%~SV#AYT};OEnhp2>l#%cwT1blpUP(=>`TU zn)lSnrh~5G*RC>{(?=8qb%!D(5?lcCx%1OO zsNtrv1cJE4;sc4`3`6mE9pfS}G1E18(lPS(PA6p?p~>yB7R62Vc0m`ElD0s03X%Lo z&MlQ>?at^?6ejzoBG?S>6u0k^DtX8_mt-8zaD#MGMbG{fZU=!g+{*)FxFO9 zT{KeN;Ow;}O$q@DkS$%GU%22iNkMgkru@#U$mL*s-Da{ks!2d46_;u{i2ALPf~!}> z+N}Id7*z;Hbsh0(AkLR#&ID3AVmtF0_X+Mk-z~Hifz~pv0NHQ_pRVsa%oJW14LRr6 z4)iU3NfFmDto6D@46R>kwyj-3j)(1pfRFiOP|$esc%d_EJb-4>nX(kpjMucYj37ckcb zK<2E7gcK;ez5}MFp`68l%1q9mfO1@yJ_CIEHCQ!h2W=5SkhZPuRvye{QB>EOI`cH_V*ynff&Cs4I;vXPM_xbA>I3X^7p7eg z$>}i#gJXivJl#50uk+mbqEFH3j)l{ic3?mG15`81?h$wIH8*~qAKTkp+D;c2Op>%$ z+8!!{O{^!%e40U>fSL6LjVncNxauPv-Q|`l`qg&qNl?$Qq#e{VoQ-M`w)?>Y=13CX zOT=B`Ct%$*{t(69MGOCQ=Ex-IEV8V_u^B@tL%pkEYhm~DI_0QZEC@-LC{6^{9E-Uhd(k7 z41yatQ=Xof3{L=Q6sxgaKTx5{GIGbL{Yj`tzKP}OAp$;*Skh~knQ2sJ{kqMdtmLZy zBkTuAFFkoGvF#h1RG}iAPzmJzCmMXd9u~Y^Khkk3yxQ9|19LO1kD0)h*<)OCx8B?$ z&~3<=`y+3e%I?FsxHY6lv=}Iii9x9H&RuM$|y-tiktl zfTk{x%5&wpfS1&*{_>CVymz2TTDE`2lYXnC-F&Nbp9OLHxKTNCM4{6_Ri61>5Ya}z zsaX7~{5j>C4iv1Nrehfw+GT>fuVaw^4a(vNP?iGD+rL9uY%`WmAt=j;7XED=Bli@_ z3dWw)zTQbN`8j0tGn1)2Y(X3gbjOM~g^~Rqt(}WI)cGFAorpF|N+l6CqTF|dVUSvva%-c^xMW?jMr(`}_VXKd z*=O7H?Ad4M518looB4fz-^=IqdA|(QTF1y4{~B2t)g5%;rbI`4ZV@$y!N>Nk@G@<% ziaqq&0GeNZ!rE-u;|OqnEO1xB@`8&6d*AV$!y8Dm}As=FRhQ6>IYtu1^dYB_`h&kZVUWANIO^Lg*(NyD!a!%C8&q94lXf zYK8ml&-)#!MMh997t8oS)F4;qErM>7l8$P9@Ec90%{-$8NYbIYnib>bh9=3R6hp;MCX*a;|P8Re?Pd)v&0bi5(R*0^Id5t;0u zJ9MHB+O=I0not5nqgO!UF{`UNb6om)0X=ckP$QBWWq&u15Rs?=ZsPIRIZdr;4#=3J z0u>dD)+JNd$>4fQg@R@<=cV^{sI_A@l+QNH&9OGq8K;d)rYfgT%BMvhu5uf`3D^Pg3!HQ z8f)!Om-f}_YLu%^imbL(NzoSwR=uG@Af$jRoid|m%6^^47H{Y;2=roB702hnHX?ONHV#%e-X-i)84?{Ib2=(`ud?wz#Kyyhu&Y6_2)-UYyV|?BW%* zNQ$PZpCb0W%1BVH>bJDGzAYLEok@oYS7U!ysCbOKdmX^FH^PCYh#w%)bob{~TU{DI z)mF}uq>fh+Odq~8mcUdVHXl*vDZBse>b!=oKdsJNGc@kbXObHNy2Du6dV&l}bWQ`! zH~lFA-cWlFUi!QQb_>L_V=!^y4CGeud@U2*Mj*eD!FiWy<&fJ<+LhWEZT-Uzh3#4F9{Q9=J)hK{S{aq ze9BygUIujbLx;X!=qn+g6|IsiH_n80>7&Nj!@SA2IZkbTm8IP33a=*BEUO^ul}p|J z@nbkmSg%&%F|BBZ$nPe@fK_Q)v#H?q!bo1DU4HY9)Ia4n+&UVu!{ZLE*dA;0=kOy& zyo0-?^=6ABXLvoGy@yYLiu)_anW*-JZBOtq-MyN2U&)~f7n&m{&j14tISmVVoKYo! z@bk4T2ZTrv3n7<)=5!hw6gvso#+WXK(u(LW#qDZnOckqGPN}AL?c%S!2^`f#%`s+G z%Y_Qi&*l}$aA$?jQ@5w3fVURd$cUBqn+Xacm=#6npvhs9C2smzY0$xIx`&8y;@W^M zlNrKoxMpWfpK7ILsD0ki1BavqD<2O3O6+{M!ll<eg=F=+^2zQX;e>%Ga=J=a^9K#j8ji>rVP~${6@jZWpkJ=e5 zxY~8rC9;jrR9ystx~r&$KsMoAGA%gF@ZnY@^9fmgM%nRLQc-ddnE{KJOUF`DPK*=# zj8s)bGTPC2B|llBQHg$X(}1!kW{NGR)kkiW78qoblxQ#3ez<*mVScLO1*-4Zo0zrF zrYzGgFH}X-5rb9`thSf`fmGI@dKa%&Hy2bz9oxj+ewOH->TY9}d_H{|@AC3;q Yp%rkf;CANTJyP(o*=a|8V0j|^XN!CN761SM literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/note.md" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/note.md" deleted file mode 100644 index 9cdb6a6..0000000 --- "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/note.md" +++ /dev/null @@ -1,212 +0,0 @@ -# 实验记录 -### 5.1.1 进程映像 -* 屏显 5-1 HelloWorld-getchar 的内存布局 -![image](./record/pic/5-1.png) -每一行是一个具有特定属性的连续的内存区,每行的开头是该区间的地址范围。后面的 rxwp 分别代表:r=可读、w=可写、x=可执行、s=共享以及 p=私有,再后面一列的数字用于表示文件映射内存对应于文件中的起始位置(如果不是文件映射区则为 0)。 -* 屏显 5-2 ELF 可执行文件的节 -```bash -(base) hypo@hypo-CW65S$ readelf -S HelloWorld-getchar -There are 29 section headers, starting at offset 0x1968: -节头: - [号] 名称 类型 地址 偏移量 - 大小 全体大小 旗标 链接 信息 对齐 - [ 0] NULL 0000000000000000 00000000 - 0000000000000000 0000000000000000 0 0 0 -...... - [14] .text PROGBITS 0000000000000580 00000580 - 00000000000001a2 0000000000000000 AX 0 0 16 - [16] .rodata PROGBITS 0000000000000730 00000730 - 0000000000000010 0000000000000000 A 0 0 4 -...... - [23] .data PROGBITS 0000000000201000 00001000 - 0000000000000010 0000000000000000 WA 0 0 8 - [24] .bss NOBITS 0000000000201010 00001010 - 0000000000000008 0000000000000000 WA 0 0 1 -...... -Key to Flags: - W (write), A (alloc), X (execute), M (merge), S (strings), I (info), - L (link order), O (extra OS processing required), G (group), T (TLS), - C (compressed), x (unknown), o (OS specific), E (exclude), - l (large), p (processor specific) -``` -1.其中编号为 13 的.text 节是 Helloworld-getchar.c 编译后的 x86-64 平台上的可执行二进制代码 -2.编号为 23 的.data是用于保存已初始化的全局变量和局部静态变量 -3.编号为 16 的.rodata 是编译器识别出来的只读数据 - -* 屏显 5-3 ELF 段以及段-节映射关系 - ELF 可执行文件的程序头(Program Header)里面描述了与装入过程有关的信息,告知操作系统如何将它们映射到虚拟空间中。我们用 readelf -l 命令查看这些信息 - ![image](./record/pic/5-3.png) - 02 段所对应的节装入到虚存空间VirtAddr=0x0000000000000000 的区域中,而且此虚存空间区域的属性需要设置为“R E”——表示只读和可执行(包括了代码段和只读数据)。 -03 段所对应的节装入到虚存空间VirtAddr=0x0000000000200db0 的区域内,并且其属性 Flags 为“RW”表示可读可写,但不可执行(因为它们都是数据) - -### 5.1.2 堆区 -在堆区分配内存可以用 malloc()等函数来完成,用完后需要用 free()进行释放。malloc()函数的原型如下: -```c -#include -void *malloc(unsigned int num_bytes); -``` -该函数将分配长度为 num_bytes 字节的内存块,如果分配成功则返回指向被分配内存的指针,否则返回空指针 NULL。当内存不再使用时,应使用 free()函数将内存块释放。 -* 屏显 5-4 执行 malloc()之前的内存布局 -![image](./record/pic/5-4.png) -* 屏显 5-5 执行 5 次 malloc()之后的内存布局 -![image](./record/pic/5-5.png) -* 屏显 5-6 执行 2 次 free()之后的内存布局 -![image](./record/pic/5-6.png) -观察[heap]区,由于将 5 次分配的内存释放掉第 2/4 次分配的空间,原来的空间将被分割成多段,但是 Linux 操作系统似乎并没有将这两段区间回收。 -原因:1)malloc()作为 C 语言库对进程用户空间的管理和 2)操作系统对进程用户空间管理两级机制的问题了。C 语言库向操作系统申请可用的合法空间,并预留给变量或缓冲区来使用。然后用户进程通过 free()回收则代表这些区间不再用于原来的用途,但仍可能是合法空间(还能访问到原来该空间上的数据)。除非 C 语言库决定将某些内存区间向操作系统申请释放掉,这些区间才会称为非法空间。 -但是如果分配的空间较大,malloc()回收空间时会向操作系统申请释放相应的空间。 -* 屏显 5-7 Mem-malloc-8M 运行后的进程布局 -```bash -564c4c575000-564c4c596000 rw-p 00000000 00:00 0 [heap] -..... - -564c4c575000-564c4c596000 rw-p 00000000 00:00 0 [heap] -7fcd72fa8000-7fcd757ad000 rw-p 00000000 00:00 0 -...... - -564c4c575000-564c4c596000 rw-p 00000000 00:00 0 [heap] -7fcd72fa8000-7fcd737a9000 rw-p 00000000 00:00 0 -7fcd73faa000-7fcd747ab000 rw-p 00000000 00:00 0 -7fcd74fac000-7fcd757ad000 rw-p 00000000 00:00 0 -``` -* 表 5-1 /proc/PID/status 中关于 VM 的项 -```bash -# 初始状态 -VmPeak: 4504 kB -VmSize: 4504 kB -VmData: 176 kB -..... - -#分配 5 个 8MB 空间 -VmPeak: 45484 kB -VmSize: 45484 kB -VmData: 41156 kB -...... - -#释放 2 个 8MB -VmPeak: 45484 kB -VmSize: 29092 kB -VmData: 24764 kB -``` -VmSize:虚存总量 的变化——从少到多然后再下降 -VmPeak:记录着该进程历史上曾获得的最高虚存总量 -VmData:数据区 - -### 5.1.3 文件映射区 -mmap()可以完成内存映射文件的操作 -解除映射的函数为 munmap() -```c -#include -void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); -int munmap(void *start, size_t length); -``` -* 屏显 5-8 mmap-demo 的输出 -![image](./record/pic/5-8.png) -* 屏显 5-9 /proc/PID/maps 中的文件映射信息 -```bash -hypo@hypo-CW65S:$ ps -aux | grep mmap -hypo 3076 0.0 0.0 4508 740 pts/0 S+ 20:52 0:00 ./mmap-demo -hypo 3115 0.0 0.0 21532 1012 pts/1 S+ 20:53 0:00 grep --color=auto mmap -hypo@hypo-CW65S:$ cat /proc/3076/maps -..... -7f2c49815000-7f2c49816000 rw-s 00000000 08:01 615399 file-mapped.txt -...... -(hypo@hypo-CW65S:$ ls -i file-mapped.txt -615399 file-mapped.txt -``` -* 屏显 5-10 被修改后的 file-mmaped.txt 文件内容 -```bash -hypo@hypo-CW65S:$ cat file-mapped.txt -Modification in the memory---------e-mmapped buffer! -And this is the second line. -This is the last line! -``` - -### 5.1.4 栈区 -#### 主线程栈区 -每一次函数调用所扩展出来的堆栈空间被称为一个栈帧,因此随着函数的调用层次加深,堆栈的栈顶会随着栈帧的叠加而逐步扩展。函数调用时的返回地址、栈帧指针和函数内部的局部数据(也称堆栈变量、自动变量)都保存在堆栈中的某个栈帧结构上。 -* 屏显 5-11 stack-demo 运行输出 -![image](./record/pic/5-11.png) - -* 屏显 5-12 /proc/PID/maps 展示的堆栈变化 -```bash -#begin -7ffe5f0e5000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] -#第 1 层调用 -7ffe5f0c3000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] -#第 2层调用 -7ffe5f083000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] -#第 3层调用 -7ffe5f043000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] -#第 3层调用 -7ffe5f043000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] -#第 2层调用 -7ffe5f043000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] -#第 1 层调用 -7ffe5f043000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] -``` -#### 线程栈 -* 屏显 5-13 pthread-stack-demo 的运行结果 -![image](./record/pic/5-13.png) - -* 屏显 5-14 创建线程后的内存布局 -```bash -#线 程 创 建 前 -7ff695103000-7ff695104000 rw-p 00000000 00:00 0 -7ffd7f003000-7ffd7f024000 rw-p 00000000 00:00 0 [stack] -#线 程 创 建 后 -7ff695103000-7ff695104000 rw-p 00000000 00:00 0 -7ffd7f003000-7ffd7f024000 rw-p 00000000 00:00 0 [stack] -#在ubuntu18.04中并没有观察到出现两个stack -``` - -### 5.1.4 访问任意进程的虚存 -系统中有多个并发的进程存在,每个进程的虚存空间是独立的,除非映射了共享内存否则无法相互访问。进程通常只能通过/proc/self/mem 读取本进程内存的数据,但。 root 用户启动的进程可以不需要通过 ptrace 也能查看其他进程的内存空间,只要求被查看的进程处于不运行状态。 -* 屏显 5-15 /proc/PID/mem 访问权限 -![image](./record/pic/5-15.png) -* 屏显 5-16 show-var-addr 的输出 -![image](./record/pic/5-16.png) -* 屏显 5-17 read-proc-mem 的输出 -![image](./record/pic/5-17.png) -在16gb内存的ubuntu18.04操作系统下原代码运行失败,lseek64函数无法定位文件 - -### 5.1.6 虚存使用的物理页帧 - -```bash -cat /proc/PID/smaps #给出了 HelloWorld-gechar 进程各个虚存段使用物理页帧的情况 -``` -* 屏显 5-18 /proc/PID/smaps 的部分内容 -```bash -hypo@hypo-CW65S:$ cat /proc/19361/smaps -55a323dda000-55a323ddb000 r-xp 00000000 08:01 615382 HelloWorld-getchar -Size: 4 kB - -...... - -SwapPss: 0 kB -Locked: 0 kB -THPeligible: 0 -VmFlags: rd ex -``` - -### 5.2.1 分页机制 -1.每个处理器核上运行的进程使用的是虚地址,每次取指令或数据都需要将程序虚地址转换成物理地址,这需要借助于页表信息来转换. -### 5.2.2 进程页表 -* 屏显 5-19 show-virt-addr 的输出 -![image](./record/pic/5-19.png) -译后运行 show-virt-addr,打印出“Hello world!”字符串的虚地址 0x561a250f1754 -* 屏显 5-20 crash 启动信息 -```bash - - -``` - - - -# 课后作业 -#### 1.设计编写以下程序,着重考虑其通信和同步问题: - - -``` - -``` \ No newline at end of file diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/maps-check" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/maps-check" new file mode 100644 index 0000000..8eead85 --- /dev/null +++ "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/maps-check" @@ -0,0 +1,21 @@ +00400000-00401000 r-xp 00000000 fd:00 52072941 /home/hypo/linux-homework/5.内存管理/record/code/reclaim-swap-writeback-demo +00600000-00601000 r--p 00000000 fd:00 52072941 /home/hypo/linux-homework/5.内存管理/record/code/reclaim-swap-writeback-demo +00601000-00602000 rw-p 00001000 fd:00 52072941 /home/hypo/linux-homework/5.内存管理/record/code/reclaim-swap-writeback-demo +7fe7196da000-7fe7196df000 rw-p 00000000 00:00 0 +7fe7196df000-7fe71a6db000 rw-p 00000000 00:00 0 +7fe71a6db000-7fe71a6dd000 rw-s 00000000 fd:00 244 /home/hypo/tempfile +7fe71a6dd000-7fe71aedb000 rw-s 00002000 fd:00 244 /home/hypo/tempfile +7fe71aedb000-7fe71b09d000 r-xp 00000000 fd:00 364328 /usr/lib64/libc-2.17.so +7fe71b09d000-7fe71b29d000 ---p 001c2000 fd:00 364328 /usr/lib64/libc-2.17.so +7fe71b29d000-7fe71b2a1000 r--p 001c2000 fd:00 364328 /usr/lib64/libc-2.17.so +7fe71b2a1000-7fe71b2a3000 rw-p 001c6000 fd:00 364328 /usr/lib64/libc-2.17.so +7fe71b2a3000-7fe71b2a8000 rw-p 00000000 00:00 0 +7fe71b2a8000-7fe71b2ca000 r-xp 00000000 fd:00 2765112 /usr/lib64/ld-2.17.so +7fe71b4b1000-7fe71b4b4000 rw-p 00000000 00:00 0 +7fe71b4c7000-7fe71b4c9000 rw-p 00000000 00:00 0 +7fe71b4c9000-7fe71b4ca000 r--p 00021000 fd:00 2765112 /usr/lib64/ld-2.17.so +7fe71b4ca000-7fe71b4cb000 rw-p 00022000 fd:00 2765112 /usr/lib64/ld-2.17.so +7fe71b4cb000-7fe71b4cc000 rw-p 00000000 00:00 0 +7ffdd65ed000-7ffdd660e000 rw-p 00000000 00:00 0 [stack] +7ffdd664c000-7ffdd664e000 r-xp 00000000 00:00 0 [vdso] +ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/meminfo-check" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/meminfo-check" new file mode 100644 index 0000000..95d3ad9 --- /dev/null +++ "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/meminfo-check" @@ -0,0 +1,46 @@ +MemTotal: 1863248 kB +MemFree: 1151560 kB +MemAvailable: 1170196 kB +Buffers: 0 kB +Cached: 217140 kB +SwapCached: 90124 kB +Active: 137548 kB +Inactive: 340016 kB +Active(anon): 124936 kB +Inactive(anon): 218736 kB +Active(file): 12612 kB +Inactive(file): 121280 kB +Unevictable: 28 kB +Mlocked: 28 kB +SwapTotal: 2097148 kB +SwapFree: 1441364 kB +Dirty: 4 kB +Writeback: 0 kB +AnonPages: 200360 kB +Mapped: 107548 kB +Shmem: 83192 kB +Slab: 93800 kB +SReclaimable: 31668 kB +SUnreclaim: 62132 kB +KernelStack: 10192 kB +PageTables: 37436 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028772 kB +Committed_AS: 4616544 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 215276 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 32768 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 153472 kB +DirectMap2M: 1943552 kB +DirectMap1G: 0 kB diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/pages-blackhole-demo" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/pages-blackhole-demo" new file mode 100644 index 0000000000000000000000000000000000000000..1a308c3cbe3c768bb7a1875039421138fae5097b GIT binary patch literal 8512 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 +#include +#include +#include +#define MB 1024*1024 +int main() +{ + int i,j; + char temp; + int fd= -1; + char * filemap_buf; + char * anon_buf; + anon_buf=(char *)malloc(2000*MB); + while(1) + { + for(i=0;i<2000*MB;i+=4096) + anon_buf[i]=0xaa; + sleep(1); + } + return 0; +} \ No newline at end of file diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/process-pages-demo" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/process-pages-demo" new file mode 100644 index 0000000000000000000000000000000000000000..3f3c0787a92742a4928b735fb6ba69a5aaccec8f GIT binary patch literal 8816 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 literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/process-pages-demo.c" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/process-pages-demo.c" new file mode 100644 index 0000000..da4f710 --- /dev/null +++ "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/process-pages-demo.c" @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#define MB 1024*1024 +#define KB 1024 +int main() +{ + int i,j; + char temp; + int fd= -1; + char * filemap_buf; + char * anon_buf; + printf("-----\n"); + getchar(); // checkpoint 1 initial state + + + //第二步将在进程初始布局之上,创建两个新的内存区间,一个是8MB 的文件映射,一个是16MB 的非文件映射(匿名)区间。 + if((fd=open("/home/hypo/tempfile",O_RDWR))<0) + printf("open tmpfile err!\n"); + if((filemap_buf=(char*)mmap(NULL,8*MB,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0))==MAP_FAILED) + printf("mmap fail!\n"); + anon_buf=(char *)malloc(16*MB); + printf("allocated/mmapped\n"); + printf("filemapped @ %p \n",filemap_buf); + printf("anon @ %p \n",anon_buf); + getchar(); // checkpoint 2 allocation + + //第三步将在上述进程布局之上,对文件映射区间的前4MB 和匿名区间的前8MB 进行读操作。 + for (i=0;i<4*MB;i+=4096) + temp=filemap_buf[i]; + for(i=0;i<8*MB;i+=4096) + temp=*(anon_buf+i); + printf("read finish\n "); + getchar(); // checkpoint 3 read finish + + //第四步在上述进程布局之上,对文件映射区间的前2MB 和匿名区间的前4MB 进行写操作 + for(i=0;i<2*MB;i+=4096) + filemap_buf[i]=temp; + for(i=0;i<4*MB;i+=4096) + anon_buf[i]=0xaa; + printf("write finish \n"); + getchar(); // checkpoint 4 write finish/make the pageframes dirty + + //最后将通过unmap()和free()释放文件映射区和匿名内存区。 + munmap(filemap_buf,8*MB); + free(anon_buf); + printf("all done \n"); + getchar(); // checkpoint 5 + return 0; +} \ No newline at end of file diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/reclaim-swap-writeback-demo" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/reclaim-swap-writeback-demo" new file mode 100644 index 0000000000000000000000000000000000000000..89e9e0076d9a4a1436fa5554b1de446df0f0cf46 GIT binary patch literal 8912 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 SiVF7E#DyZ>C7Y9tW&Z)y=V289 literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/reclaim-swap-writeback-demo.c" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/reclaim-swap-writeback-demo.c" new file mode 100644 index 0000000..9834a40 --- /dev/null +++ "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/reclaim-swap-writeback-demo.c" @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#define MB 1024*1024 +#define KB 1024 +int main() +{ + int i,pid; + char temp; + int fd= -1; + char *filemap_buf; + char command_smaps[100]; + char command_status[100]; + char command_meminfo[100]; + char command_maps[100]; + char * anon_buf; + pid=getpid(); + sprintf(command_smaps,"cat /proc/%d/smaps > smaps-check",pid); + sprintf(command_status,"cat /proc/%d/status > status-check",pid); + sprintf(command_meminfo,"cat /proc/meminfo >meminfo-check"); + sprintf(command_maps,"cat /proc/%d/maps >maps-check",pid); + + //在进程初始布局之上,创建两个新的内存区间,一个是8MB 的文件映射,一个是16MB 的非文件映射(匿名)区间。各自用mlock()函数锁定8KB 和16KB 的空间(不可换出) + if((fd=open("/home/hypo/tempfile",O_RDWR))<0) + printf("open tmpfile err!\n"); + if((filemap_buf=(char *) mmap(NULL, 8*MB, PROT_READ|PROT_WRITE, MAP_SHARED,fd,0)) ==MAP_FAILED ) + printf("mmap fail!\n"); + mlock(filemap_buf,8*KB); + anon_buf=(char *)malloc(16*MB); + mlock(anon_buf,16*KB); + printf("allocated/mmapped\n"); + printf("filemapped @ %p \n",filemap_buf); + printf("anon @ %p \n",anon_buf); + system(command_maps); + system(command_smaps); + system(command_status); + system(command_meminfo); + getchar(); // checkpoint 1 allocation + + //对文件映射区间的前4MB 和匿名区间的前8MB 进行读和写操作各一遍。 + for(i=0;i<4*MB;i+=4096) + filemap_buf[i]=temp; + for(i=0;i<8*MB;i+=4096) + anon_buf[i]=0xaa; + printf("write finish \n"); + system(command_smaps); + system(command_status); + system(command_meminfo); + getchar(); // checkpoint 2 write finish/make the pageframes dirty + + //run pages-blackhole-demo.c + //该pagesblackhole-demo 进程将大量消耗物理页帧,因此会引起reclaim-swap-writeback-demo进程的页帧被回收 + printf("please run pages-blackhole-demo\n"); + getchar(); // checkpoint 3 be swapped out + system(command_smaps); + system(command_status); + system(command_meminfo); + getchar(); + + //最后将通过对文件映射区间的前4MB 和匿名区间的前8MB 进行反复的读写操作。可以检查该进程重新获得物理页帧的现象。 + printf("compete for the page frames\n"); + while(1) //compete for the page frames, by writing + { + for(i=0;i<1*MB;i+=4096) + filemap_buf[i]=temp; + for(i=0;i<2*MB;i+=4096) + anon_buf[i]=0xaa; + } + getchar(); // checkpoint 4 will never get to this point + + munmap(filemap_buf,8*MB); + free(anon_buf); + return 0; +} \ No newline at end of file diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/show-virt-addr" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/code/show-virt-addr" index e8e8f4f230f00c27cbd3447be5b3425540eebb4b..0b45ae5fd04211a8590c30997da3214717921a1d 100644 GIT binary patch literal 8504 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 z z-ciHE#En`0+EYC;*8VeqidzkjcOwc5x?EcP{@G!HYJ3wN!_5IbMO=?~tc}6N3~gHL zz_LVVk$=gZ`u3L>aH;(DpZL-;G7PQt-+6!(Sw2%@zJE7w^)A>N7Q+hRJW+7jnw5ud zRsgm`RHFn>$aQ0E+k#`ZdM!xiKjE<766TvIIf_(wz#NO`fSz0X8p#boSPdHU@1bcubvg*^#AAHZ+VZP5BmW%l}9nT@(aua0RS3Yd>Uwdg0V*%PtLmW zo`H%A$iQr-`%TjJVsn0Hs9d}meCY$2157s@IqT&TA}nBHpCk>0^e?W?IYQB9$KSkV zW5$~Y*JsFIQk@_`QM!$>T`?-xO}bafuki~HGE|0AxcUtZztGVnO^^Wn_8GpZAVc<& zg0qf}p&^n*HIobvlJ>r4=?nQ1Uwzzp;|Wd!p=8=OG*gPxM)aK->xtzA9Ml4IOQu#T zzm(LE$5#cSkOG}F?1p-1dW$Ib2?tdwaH5QXAib!KFodo%e}efkzaf>eu`y0^j%tmc z+N-tv^Bnm$@W81c2@O$s$+3^oTo+zM;hlIa9iU+#Kpv`9@0@xCY^rMI^x{-HHMToh z2ne3FYGi|Ic*@Ss8E6@vJHDuCY<#PHOUBSf<5t6qe~JN zd>3Lu4Qsw|9JuTd0_SU>_Enqy3OzI~w?MZFV19Ojqd$@hy|Uooz?rDHue(r!hPSY| zVCT*T#6llI-VEGb$kkiPs&|}WXaSUTl{&8Hc?wTgT;ed+GC~p(+3JUp?{Lxc%352AaI%r=yiu`%y;+^cVTUPb*F}2$h^@V2cWUw5kw*SEQW9N1S zlq3Zd+k#(;jRTri1#2Lp|8E|ENkBm7FO?K0TM!Ivw+;x}BqS(lsq5!4uOYE5cHG!F z`=OrD2%x#Cz3cy(2}t((r2VHq(C;|?xv-FN0cCZQ=~t?QSwM+&L}Fs=9H&ytq3zj= zh~Bf;SXl!g&1eDa-2uJ*{S8@YMtR38yTv*hx z!r+xP!e)>F1lU%$qB(h|j?<>&Q&LYA?=#j18ccR1YidV9qJbxDV1I|D9wl|?hc76$ zHN8_YNim&Wk_T$wC?I-eCo-f0NUpbOlh5eQ`)i=@J3Mz0Mp922V&1*~Zipx5#}9@$ zHU2zEyE%MdYAC+A+yc;nZ1M3Ilu^KuQKF~!EFvto0_R#1glO_IT4Atk%woCTO|3ji zI}l`OIx#VbaJi+Wr8NNIo}OEG0RkA=%+xtP{`0y+DU64HHXAC1@*{%Cd*X>lcx*Uk u@XT){Ws<-j8veg~u|KDe*EPHqPwg{=26HCY;j6Up@T8u|KSn=#>h)i-unyD! literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/5-28.png" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/5-28.png" new file mode 100644 index 0000000000000000000000000000000000000000..342b1a63b6a44593d925357587d0cfb0ae092d9b GIT binary patch literal 31532 zcmaHT1ys~qyElr02q*&5A=1*_ARt}R-94mqqolNSgS51CcXxwycXz|L=bUrzUGKf` z`?;2DU|@#-?AiNye)UYiXK4}SmpCtBU|^8NL_f*Fz&!B-|9`%K1NRi!HxGiFXSM=j z3NOGvw-*NA!S~p9LMnFhRz`M?x;BO|#+FtVhBUVNHim|lwkB3~hp%aMtl)>0r61XDnyYl#4Stl;O$hFU2WL@I=D5 zVNw|{C&rHab`eu2iiegP>aGj;?~$mt_whI!f*0=L<=S!xSlo6-JdfDsYR`)wjw`5Q zZS5YlxOuo4OL}7$s$5W=r*5MR`;-kFuub!n!w&Ek>Jmqbvg9oCx9qS#hjW_Vmkn>* zxh)iM*lrBSlv!j~6)4!g%Ex2297jp4cLtX<>##?nH}7IJ6gL>!RLOWYYc={y;GCHf zpT>Yi{oyX?$)cOTl_ue2p<2sKbRXr$O6%19&FS6sX+Nz@{U*AQZcD2Wv*kiW!|m(O zw_|W_6NOyHL&-yXqodERJRyBC_Zk@N^{9 zZXB2C>DCl#Q3slwyJ30Z0RUGec>C`iP0b zRNV(X-G`)U$ty!fzA(bB7H@xgCMFh0)5M-DU6P-_d)^|XV0>gZt&XD2%TE0Qsw6)?3TStwH{<`8lyk`ayJ}=|6i;!%Tto~he zUPXQMmq-t#!4$4yYPC`YO68hBo1aTne%avRymb^VUel`x z-S`xo$Q-hw~v|C;av-wixPNCK-eoG0I>Z7%EIrOf8>{K)f-2ZhfhD?Y1Ln&#|HSIN}aoF|l;_9+=IuaMrb;<8yOd12hAC9&I!*ErnQLZ4&h zU^y3$(~U$m)hbV9V7DN9W8U@h!+O4gBCFNCe2x2NsLjq9_WEVbH_8ju{Gwu1j7IK` zuJO;OH@|YPs}?sYz{&sMX*HXj)MU-SJ@5Hdu2EdkaKY=Hd*V8kGNo1pgvyM~{BzM_ zb=uya3W;OWqxe!MQ_;YRYximX_=nj7gWaxR++xq-i@jMo&CB_?%g(w7>WG=&re!ON z`IR<&tdlwo2}3{ADa2K-Y&tSrq_PBKEqenZ$)mf%2&w$T@MLK<8w)7JXP|qcU;+}I zGnBIZXz{09HFr%>lfz@hP#dy?&C;n­QqYJUAvD1YLE>*c=8#Wmvw&&A>X>|bvZ zT8=cStE7~6zy{3=IUH8gm=&{hqoz?WVNd;ta2xf_jXHkV>$TODa;sI5WdUDyhZUcP z;|-}Moy`NDxdzwQqE`~S;LDzel@dBRAB=$nJv}`EP&BS?#!0EUH6E`bhUt0DKBsnu z;H+#deXJTxwx-fdAWchy!Q-^?+0oL13C8COuamuuW4$)!EmRKEbiF_!BrJAGmD@$s zS&b>wX!_z!*(BLI)&?u$pYEnsOsidKkzpmjI29YZKfAoKBQERedZ$+TQ=tdde72D>dA=_Q9OzQLb4UiHNNFMxY>_wB@4i=8!<$sh z*v(#+yIK9pqIhY$N!MJgD8UQ1;q+>*I~*F1>qYP(9CCA^ovF=QH@~x^V^VU`*YexF zU%9FoBRZzK-?Dt4vsuoq<&-=@x;COWoSQqd7$1lIJid?umJn2sUn{cMBJl9uL&|Cm zUE^n2elzzj%0>vvSiyYJYkO-3*438!k+FZO+3!np{NaUOVj2z9+S@(k5t~g}{nYvP z)XCWe$GmG~glPKY!5jX(50t13)72s5nd%tomTjhRn7IbWFt6u`=@c(LAMV-GJgM8K zdk`>7}qn7&4gSTO)PSBDPkI6z-*{F-Cxs!8RXYURT z?M!`Iar;}cTsL{Q?xQ#D3t@)Vj}PqZ=pEzZQ4iitLYEkh^_dr(`MDga$@uwgZS2-t z^!}lEL?qO~paPb?x1)5ZtQ4L)6aJu;Iu4O`YmASN=TFS+3pfndCYNf@sl4PuPioGo zWaF)90FcM?#%(?lfEBFsF|6!|ld_u-gCkeLLhw{$dCp8HjT@HOimCkXln0Zn8XY3x zpo>Bk*gE_sqdStEO|Z#zK$9zX0yZwQoR5xI+w`8mRbIQ(g5n%(G8{?t&!d}znPjP+ zgB80|s(7fqS$(nBE2qLeGaA)SBTK_PCwm-8czEZ1uY~Z~(M;KKQaD^Oz}bXBr&WkE zW3$xJ)AMp1z<0hm>FKVacBYNCp}gdL+4I^W5BB z;f|P;OJmo9lGfCoqeJarGnlPJ+li>~Pda*B(Gxmm%aA?hREWmYuX!Y-9gyO{?hRdK~ee<+hG`j9p zjEjpq`f{w-Q@Odf)?S&+6%ZP_Jni|2eIIKMDGr-SP_HtPR&io?JX{dW8DlUToHM96 z+nS92y-pQ}iQW&kMF6*JOb1b#4SI4Y^iQ;94=7M;^GaRL z|M_dR-!0P}Vn`*{A9vGN4E@A0J)V|TKfOq<1J4%xxFx&R8y(aYmU?t`jONX+AjJd8 zoN%Qs%$)GZ>O_)UxN%TqN$@y+4w~*DW=I4f4UEENUT;QMnCW~YY>mxECIHyuh4SP* zr?|Fs9|Ez9#rFZM_+kmOk5=7F;xH{lfsjhtHvL z$nWyRTh2X@r0tDy$aK}MAD1FDMTmR6iE9ZT4-sU;ygyXgl zXZ(0?d`1%ifuc&s{j;|t3=GVtr^JUMgt9|j@VD=UkZvF&

-F)Cdpy2xXga5pBJJ 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 literal 0 HcmV?d00001 diff --git "a/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/biao5-6.png" "b/5.\345\206\205\345\255\230\347\256\241\347\220\206/record/pic/biao5-6.png" new file mode 100644 index 0000000000000000000000000000000000000000..7461b361e214d9649666d133df5d293d491c22f5 GIT binary patch literal 18756 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 KL>cfa_ +void *malloc(unsigned int num_bytes); +``` +该函数将分配长度为 num_bytes 字节的内存块,如果分配成功则返回指向被分配内存的指针,否则返回空指针 NULL。当内存不再使用时,应使用 free()函数将内存块释放。 +* 屏显 5-4 执行 malloc()之前的内存布局 +![image](./record/pic/5-4.png) +* 屏显 5-5 执行 5 次 malloc()之后的内存布局 +![image](./record/pic/5-5.png) +* 屏显 5-6 执行 2 次 free()之后的内存布局 +![image](./record/pic/5-6.png) +观察[heap]区,由于将 5 次分配的内存释放掉第 2/4 次分配的空间,原来的空间将被分割成多段,但是 Linux 操作系统似乎并没有将这两段区间回收。 +原因:1)malloc()作为 C 语言库对进程用户空间的管理和 2)操作系统对进程用户空间管理两级机制的问题了。C 语言库向操作系统申请可用的合法空间,并预留给变量或缓冲区来使用。然后用户进程通过 free()回收则代表这些区间不再用于原来的用途,但仍可能是合法空间(还能访问到原来该空间上的数据)。除非 C 语言库决定将某些内存区间向操作系统申请释放掉,这些区间才会称为非法空间。 +但是如果分配的空间较大,malloc()回收空间时会向操作系统申请释放相应的空间。 +* 屏显 5-7 Mem-malloc-8M 运行后的进程布局 +```bash +564c4c575000-564c4c596000 rw-p 00000000 00:00 0 [heap] +..... + +564c4c575000-564c4c596000 rw-p 00000000 00:00 0 [heap] +7fcd72fa8000-7fcd757ad000 rw-p 00000000 00:00 0 +...... + +564c4c575000-564c4c596000 rw-p 00000000 00:00 0 [heap] +7fcd72fa8000-7fcd737a9000 rw-p 00000000 00:00 0 +7fcd73faa000-7fcd747ab000 rw-p 00000000 00:00 0 +7fcd74fac000-7fcd757ad000 rw-p 00000000 00:00 0 +``` +* 表 5-1 /proc/PID/status 中关于 VM 的项 +```bash +# 初始状态 +VmPeak: 4504 kB +VmSize: 4504 kB +VmData: 176 kB +..... + +#分配 5 个 8MB 空间 +VmPeak: 45484 kB +VmSize: 45484 kB +VmData: 41156 kB +...... + +#释放 2 个 8MB +VmPeak: 45484 kB +VmSize: 29092 kB +VmData: 24764 kB +``` +VmSize:虚存总量 的变化——从少到多然后再下降 +VmPeak:记录着该进程历史上曾获得的最高虚存总量 +VmData:数据区 + +### 5.1.3 文件映射区 +mmap()可以完成内存映射文件的操作 +解除映射的函数为 munmap() +```c +#include +void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); +int munmap(void *start, size_t length); +``` +* 屏显 5-8 mmap-demo 的输出 +![image](./record/pic/5-8.png) +* 屏显 5-9 /proc/PID/maps 中的文件映射信息 +```bash +hypo@hypo-CW65S:$ ps -aux | grep mmap +hypo 3076 0.0 0.0 4508 740 pts/0 S+ 20:52 0:00 ./mmap-demo +hypo 3115 0.0 0.0 21532 1012 pts/1 S+ 20:53 0:00 grep --color=auto mmap +hypo@hypo-CW65S:$ cat /proc/3076/maps +..... +7f2c49815000-7f2c49816000 rw-s 00000000 08:01 615399 file-mapped.txt +...... +(hypo@hypo-CW65S:$ ls -i file-mapped.txt +615399 file-mapped.txt +``` +* 屏显 5-10 被修改后的 file-mmaped.txt 文件内容 +```bash +hypo@hypo-CW65S:$ cat file-mapped.txt +Modification in the memory---------e-mmapped buffer! +And this is the second line. +This is the last line! +``` + +### 5.1.4 栈区 +#### 主线程栈区 +每一次函数调用所扩展出来的堆栈空间被称为一个栈帧,因此随着函数的调用层次加深,堆栈的栈顶会随着栈帧的叠加而逐步扩展。函数调用时的返回地址、栈帧指针和函数内部的局部数据(也称堆栈变量、自动变量)都保存在堆栈中的某个栈帧结构上。 +* 屏显 5-11 stack-demo 运行输出 +![image](./record/pic/5-11.png) + +* 屏显 5-12 /proc/PID/maps 展示的堆栈变化 +```bash +#begin +7ffe5f0e5000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] +#第 1 层调用 +7ffe5f0c3000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] +#第 2层调用 +7ffe5f083000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] +#第 3层调用 +7ffe5f043000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] +#第 3层调用 +7ffe5f043000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] +#第 2层调用 +7ffe5f043000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] +#第 1 层调用 +7ffe5f043000-7ffe5f106000 rw-p 00000000 00:00 0 [stack] +``` +#### 线程栈 +* 屏显 5-13 pthread-stack-demo 的运行结果 +![image](./record/pic/5-13.png) + +* 屏显 5-14 创建线程后的内存布局 +```bash +#线 程 创 建 前 +7ff695103000-7ff695104000 rw-p 00000000 00:00 0 +7ffd7f003000-7ffd7f024000 rw-p 00000000 00:00 0 [stack] +#线 程 创 建 后 +7ff695103000-7ff695104000 rw-p 00000000 00:00 0 +7ffd7f003000-7ffd7f024000 rw-p 00000000 00:00 0 [stack] +#在ubuntu18.04中并没有观察到出现两个stack +``` + +### 5.1.4 访问任意进程的虚存 +系统中有多个并发的进程存在,每个进程的虚存空间是独立的,除非映射了共享内存否则无法相互访问。进程通常只能通过/proc/self/mem 读取本进程内存的数据,但。 root 用户启动的进程可以不需要通过 ptrace 也能查看其他进程的内存空间,只要求被查看的进程处于不运行状态。 +* 屏显 5-15 /proc/PID/mem 访问权限 +![image](./record/pic/5-15.png) +* 屏显 5-16 show-var-addr 的输出 +![image](./record/pic/5-16.png) +* 屏显 5-17 read-proc-mem 的输出 +![image](./record/pic/5-17.png) +在16gb内存的ubuntu18.04操作系统下原代码运行失败,lseek64函数无法定位文件 + +### 5.1.6 虚存使用的物理页帧 + +```bash +cat /proc/PID/smaps #给出了 HelloWorld-gechar 进程各个虚存段使用物理页帧的情况 +``` +* 屏显 5-18 /proc/PID/smaps 的部分内容 +```bash +hypo@hypo-CW65S:$ cat /proc/19361/smaps +55a323dda000-55a323ddb000 r-xp 00000000 08:01 615382 HelloWorld-getchar +Size: 4 kB + +...... + +SwapPss: 0 kB +Locked: 0 kB +THPeligible: 0 +VmFlags: rd ex +``` + +### 5.2.1 分页机制 +1.每个处理器核上运行的进程使用的是虚地址,每次取指令或数据都需要将程序虚地址转换成物理地址,这需要借助于页表信息来转换. + +### 5.2.2 进程页表 +由于ubuntu下无法安装kernel-debuginfo,下面的内容将在CentOS7中实现 +* 屏显 5-19 show-virt-addr 的输出 +```bash +[hypo@localhost code]$ ./show-virt-addr +Hello world! + @ 0x400630 +``` +![image](./record/pic/5-19.png) + +译后运行 show-virt-addr,打印出“Hello world!”字符串的虚地址 0x561a250f1754 +* 屏显 5-20 crash 启动信息 + +```bash +[root@localhost code]# crash + +crash 7.2.3-8.el7 +Copyright (C) 2002-2017 Red Hat, Inc. +Copyright (C) 2004, 2005, 2006, 2010 IBM Corporation +Copyright (C) 1999-2006 Hewlett-Packard Co +Copyright (C) 2005, 2006, 2011, 2012 Fujitsu Limited +Copyright (C) 2006, 2007 VA Linux Systems Japan K.K. +Copyright (C) 2005, 2011 NEC Corporation +Copyright (C) 1999, 2002, 2007 Silicon Graphics, Inc. +Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc. +This program is free software, covered by the GNU General Public License, +and you are welcome to change it and/or distribute copies of it under +certain conditions. Enter "help copying" to see the conditions. +This program has absolutely no warranty. Enter "help warranty" for details. + +GNU gdb (GDB) 7.6 +Copyright (C) 2013 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. Type "show copying" +and "show warranty" for details. +This GDB was configured as "x86_64-unknown-linux-gnu"... + +WARNING: kernel relocated [892MB]: patching 85605 gdb minimal_symbol values + + KERNEL: /usr/lib/debug/lib/modules/3.10.0-957.el7.x86_64/vmlinux + DUMPFILE: /dev/crash + CPUS: 4 + DATE: Wed Nov 20 16:06:12 2019 + UPTIME: 01:13:52 +LOAD AVERAGE: 0.15, 0.12, 0.17 + TASKS: 558 + NODENAME: localhost.localdomain + RELEASE: 3.10.0-957.el7.x86_64 + VERSION: #1 SMP Thu Nov 8 23:39:32 UTC 2018 + MACHINE: x86_64 (2501 Mhz) + MEMORY: 2 GB + PID: 13115 + COMMAND: "crash" + TASK: ffff98a87ea2a080 [THREAD_INFO: ffff98a84dd18000] + CPU: 3 + STATE: TASK_RUNNING (ACTIVE) + +crash> + +``` +* 屏显 5-21 执行set 命令 +```bash +crash> set 9301 + PID: 9301 +COMMAND: "show-virt-addr" + TASK: ffff9c8597f50000 [THREAD_INFO: ffff9c859472c000] + CPU: 0 + STATE: TASK_INTERRUPTIBLE +``` +![image](./record/pic/5-21.png) +show-virt-addr 进程的PCB(task_struct)地址为0xffff9c8597f50000 +* 屏显 5-22 用px 命令查看task_struct->mm->pgd 页表起始地址 +```bash +crash> px ((struct task_struct *)0xffff9c8597f50000)->mm->pgd +$1 = (pgd_t *) 0xffff9c858ec60000 #PGD 起点的虚地址处 +``` +![image](./record/pic/5-22.png) +可以看出页表起始地址位于0xffff9c858ec60000 的虚地址处 + +* 地址变换过程 +在使用页表进行地址转换前,我们先对虚地址进行分析,然后再展示地址转换原理。由于本例是使用64 位系统,一个页4KB 只能保存512 项页表项(4096 字节/8 字节=512),虚拟地址菜用4 级分页(9bit + 9bit + 9bit + 9bit + 12bit)——对应于PGD 索引/偏移、PUD 索引/偏移、PMD 索引/偏移、PD 索引/偏移和页内偏移. +![image](./record/pic/pic5-11.png) +```bash +#各级索引/偏移值的计算过程如下: +1.PGD 中的索引/偏移: (0x400630)>>(9+ 9 + 9 + 12)) & 0x1ff = 0 +2.PUD 中的索引/偏移: (0x400630)>>(9 + 9 + 12)) & 0x1ff = 0 +3.PMD 中的索引/偏移: (0x400630)>>(9 + 12)) & 0x1ff = 0x2 +4.PTE 中的索引/偏移: (0x400630)>>(12)) & 0x1ff = 0 +``` +* 屏显 5-23 PGD 第0 项的读入 +```bash +crash> px (0xffff9c858ec60000-0xffff880000000000) +$2 = 0x14858ec60000 #PGD 起点的物理地址 +crash> rd 0xffff9c858ec60000 +ffff9c858ec60000: 8000000017e7b067 g....... +crash> pte 8000000017e7b067 #用pte 命令对其解释也获得相同的物理页帧号 + PTE PHYSICAL FLAGS +8000000017e7b067 17e7b000 (PRESENT|RW|USER|ACCESSED|DIRTY|NX) +#px命令无法获得期望的结果 +``` +![image](./record/pic/5-23.png) + +* 屏显 5-24 PUD 第0 项的读入 +```bash +crash> rd -p 0x17e7b000 + 17e7b000: 000000001e687067 gph..... +``` +获得PMD 的地址(物理页帧号0x1e687) +虚地址0x1e687067 在PMG 的索引/偏移量为0x02(相当于16 字节),因此用物理地址方式读入rd -p 0x1e687010 +* 屏显 5-25 PMD 第0x2 项的读入 +```bash +crash> rd -p 0x1e687010 + 1e687010: 0000000017f40067 g....... +``` +此时获得物理页帧位于物理地址0x17f40000处 +*屏显 5-26 PTE 第0 项的读入 +```bash +crash> rd -p 0x17f40000 + 17f40000: 000000001a6e1005 ........ +crash> pte 000000001a6e1005 +PTE PHYSICAL FLAGS +1a6e1005 1a6e1000 (PRESENT|USER) +``` +* 屏显 5-27 读入物理地址的内容 +```bash +crash> rd -p 1a6e1630 2 +1a6e1630: 6f77206f6c6c6548 7325000a21646c72 Hello world!..%s +``` +### 5.3.1 页帧、节点、内存域 +* 物理页帧 +物理内存的分配使用、访问权限保护等管理都是以页帧为单位进行的。一个物理页帧的大小和一个虚存页的大小相等.进程用户空间使用的页帧根据是否被改写分为dirty 脏页和clean 干净页。干净的匿名页内容为全0,改写后变为脏页。如果需要回收改写后的匿名页帧,则需要将其内容换出到交换空间。干净的文件映射页(页缓存中的页)内容来自于文件的对应内容,改写后变为脏页。如果需要回收脏文件映射页,则通过回写重新变为干净页而可以另作他用。当进程修改了文件映射页里的数据时,该页就被内核标记为脏页,与磁盘数据产生不一致。内核将会在合适的时间把脏页的数据写到磁盘中去,以保持内存中的数据和磁盘中的数据是一致的,该操作称为文件同步操作。 + +*NUMA 与UMA +UMA 架构中只有一个节点,各个处理器核访问同一物理地址单元时是完全对等的,而NUMA 架构中,不同处理器核在访问同一内存区域时却可能会有速度上的差异。 + +* 屏显 5-28 一个UMA 系统上的/proc/zoneinfo +![image](./record/pic/5-28.png) +```bash +Node 0, zone DMA #DMA + pages free 2053 + min 96 + low 120 + high 144 + scanned 0 + spanned 4095 + present 3997 + managed 3976 +...... + + inactive_ratio: 1 +Node 0, zone DMA32 #这里开始时DMA32 的ZONE + pages free 47254 + +...... + + all_unreclaimable: 0 + start_pfn: 4096 #zone DMA32 的第一个物理页帧号是4096 + inactive_ratio: 3 + +``` +可以看出该系统只有1 个节点——node0,但是里面划分为两个内存域DMA 和DMA32——DMA 内存域从1 号页帧开始而DMA32 内存域从4096 号页帧开始。 + +### 5.3.2 空闲页帧管理——Buddy 系统 +每个内存域中未使用的空闲页帧,都由zone-> free_area[]组织成多个链表,并由buddy 系统管理。 + +* 代码 5-9 free_arae (linux-3.13/include/linux/mmzone.h) +```c +struct free_area { +struct list_head free_list[MIGRATE_TYPES]; +unsigned long nr_free; +}; +//其中nr_free 是对当前链表上所有空闲页帧的计数。MIGRATE_TYPES 是页帧的迁移属性 +``` + +* 屏显 5-30 UMA 系统上的buddy 信息 +![image](./record/pic/5-28.png) + +* 屏显 5-32 /proc/pagetypeinfo 中关于页帧迁移属性的信息 +``` +[hypo@localhost code]$ cat /proc/pagetypeinfo +Page block order: 9 +Pages per block: 512 + +Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10 +Node 0, zone DMA, type Unmovable 2 4 5 0 2 2 0 1 1 1 0 +Node 0, zone DMA, type Reclaimable 0 3 0 3 0 0 0 1 1 0 0 +Node 0, zone DMA, type Movable 5 1 0 1 1 1 1 1 1 0 0 +Node 0, zone DMA, type Reserve 0 0 0 0 0 0 0 0 0 0 0 +Node 0, zone DMA, type CMA 0 0 0 0 0 0 0 0 0 0 0 +Node 0, zone DMA, type Isolate 0 0 0 0 0 0 0 0 0 0 0 +Node 0, zone DMA32, type Unmovable 140 80 40 45 18 7 1 1 1 0 0 +Node 0, zone DMA32, type Reclaimable 1 55 23 35 6 2 1 0 0 0 0 +Node 0, zone DMA32, type Movable 24 146 1715 727 536 251 98 30 56 1 0 +Node 0, zone DMA32, type Reserve 0 0 0 0 0 0 0 0 0 0 0 +Node 0, zone DMA32, type CMA 0 0 0 0 0 0 0 0 0 0 0 +Node 0, zone DMA32, type Isolate 0 0 0 0 0 0 0 0 0 0 0 + +Number of blocks type Unmovable Reclaimable Movable Reserve CMA Isolate +Node 0, zone DMA 3 1 4 0 0 0 +Node 0, zone DMA32 110 20 886 0 0 0 + +``` +### 5.3.3 物理内存分配与回收 +Linux 在/proc/meminfo 中记录了系统中全部物理页帧的使用情况 +* 屏显 5-33 /proc/meminfo 信息 +```bash +[hypo@localhost code]$ cat /proc/meminfo +MemTotal: 1863224 kB +MemFree: 218968 kB +MemAvailable: 481060 kB +Buffers: 0 kB +Cached: 593472 kB +SwapCached: 676 kB +Active: 866552 kB +Inactive: 519076 kB +Active(anon): 677668 kB +Inactive(anon): 334056 kB +Active(file): 188884 kB +Inactive(file): 185020 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 2097148 kB +SwapFree: 2091252 kB +Dirty: 16 kB +Writeback: 0 kB +AnonPages: 791500 kB +Mapped: 342916 kB +Shmem: 219568 kB +Slab: 98952 kB +SReclaimable: 38556 kB +SUnreclaim: 60396 kB +KernelStack: 9984 kB +PageTables: 37444 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028760 kB +Committed_AS: 4615408 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 215280 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 251904 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 135040 kB +DirectMap2M: 1961984 kB +DirectMap1G: 0 kB + +``` +* 屏显 5-34 free 命令的输出 +```bash +#简单地了解系统中的页帧使用情况则可以用free命令 +#第一行是物理内存使用统计量,分别是总量、已使用量、空闲量、用于共享内存的量、用于缓存的量以及可用的量 +#另一行是交换空间的使用量 +[hypo@localhost code]$ free + total used free shared buff/cache available +Mem: 1863224 952416 217520 220476 693288 479616 +Swap: 2097148 5896 2091252 +``` + +* 进程的页帧使用 +```bash +#创建用于映射的文件 +[hypo@localhost ~]$ dd if=/dev/zero of=/home/hypo/tempfile bs=1024 count=8192 +8192+0 records in +8192+0 records out +8388608 bytes (8.4 MB) copied, 0.0679351 s, 123 MB/s +#代码 5-10 process-pages-demo.c 代码 运行情况 +``` +* 屏显 5-35 porcess-pages-demo 的内存布局 +```bash +[hypo@localhost ~]$ cat /proc/9191/maps +...... +7f19df573000-7f19e0574000 rw-p 00000000 00:00 0 +7f19e0574000-7f19e0d74000 rw-s 00000000 fd:00 472929 /home/hypo/tempfile +...... +``` + +* 表 5-3 /proc/PID/smaps 在各检查点上的数值 +```bash +# checkpoint 1 +# NONE +# checkpoint 2 +7f19df573000-7f19e0574000 rw-p 00000000 00:00 0 +Size: 16388 kB +Rss: 4 kB +Pss: 4 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 4 kB +Referenced: 4 kB +Anonymous: 4 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +7f19e0574000-7f19e0d74000 rw-s 00000000 fd:00 472929 +Size: 8192 kB +Rss: 0 kB +Pss: 0 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 0 kB +Referenced: 0 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +# checkpoint 3 +7f19df573000-7f19e0574000 rw-p 00000000 00:00 0 +Size: 16388 kB +Rss: 4 kB +Pss: 4 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 4 kB +Referenced: 4 kB +Anonymous: 4 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +ProtectionKey: 0 +VmFlags: rd wr mr mp me ac sd +7f19e0574000-7f19e0d74000 rw-s 00000000 fd:00 472929 /home/hypo/tempfile +Size: 8192 kB +Rss: 4096 kB +Pss: 4096 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 4096 kB +Private_Dirty: 0 kB +Referenced: 4096 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +ProtectionKey: 0 +VmFlags: rd wr sh mr mp me ms sd +# checkpoint 4 +7f19df573000-7f19e0574000 rw-p 00000000 00:00 0 +Size: 16388 kB +Rss: 4660 kB +Pss: 4660 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 4660 kB +Referenced: 4660 kB +Anonymous: 4660 kB +AnonHugePages: 4096 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +ProtectionKey: 0 +VmFlags: rd wr mr mp me ac sd +7f19e0574000-7f19e0d74000 rw-s 00000000 fd:00 472929 /home/hypo/tempfile +Size: 8192 kB +Rss: 4096 kB +Pss: 4096 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 2048 kB +Private_Dirty: 2048 kB +Referenced: 4096 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +ProtectionKey: 0 +VmFlags: rd wr sh mr mp me ms sd +# checkpoint 5 +#None +``` + +* 表 5-4 /proc/PID/status 在各检查点上的数值 +```bash +# checkpoint 1 +VmPeak: 4288 kB +VmSize: 4216 kB +VmLck: 0 kB +VmPin: 0 kB +VmHWM: 352 kB +VmRSS: 352 kB +RssAnon: 76 kB +RssFile: 276 kB +RssShmem: 0 kB +VmData: 56 kB +VmStk: 132 kB +VmExe: 4 kB +VmLib: 1936 kB +VmPTE: 28 kB +VmSwap: 0 kB +# checkpoint 2 +VmPeak: 28796 kB +VmSize: 28796 kB +VmLck: 0 kB +VmPin: 0 kB +VmHWM: 352 kB +VmRSS: 352 kB +RssAnon: 76 kB +RssFile: 276 kB +RssShmem: 0 kB +VmData: 16444 kB +VmStk: 132 kB +VmExe: 4 kB +VmLib: 1936 kB +VmPTE: 32 kB +VmSwap: 0 kB +# checkpoint 3 +VmPeak: 28796 kB +VmSize: 28796 kB +VmLck: 0 kB +VmPin: 0 kB +VmHWM: 4604 kB +VmRSS: 4604 kB +RssAnon: 100 kB +RssFile: 4504 kB +RssShmem: 0 kB +VmData: 16444 kB +VmStk: 132 kB +VmExe: 4 kB +VmLib: 1936 kB +VmPTE: 60 kB +VmSwap: 0 kB +# checkpoint 4 +VmPeak: 28796 kB +VmSize: 28796 kB +VmLck: 0 kB +VmPin: 0 kB +VmHWM: 9212 kB +VmRSS: 9212 kB +RssAnon: 4708 kB +RssFile: 4504 kB +RssShmem: 0 kB +VmData: 16444 kB +VmStk: 132 kB +VmExe: 4 kB +VmLib: 1936 kB +VmPTE: 60 kB +VmSwap: 0 kB +# checkpoint 5 +VmPeak: 28796 kB +VmSize: 4216 kB +VmLck: 0 kB +VmPin: 0 kB +VmHWM: 9212 kB +VmRSS: 504 kB +RssAnon: 96 kB +RssFile: 408 kB +RssShmem: 0 kB +VmData: 56 kB +VmStk: 132 kB +VmExe: 4 kB +VmLib: 1936 kB +VmPTE: 28 kB +VmSwap: 0 kB +``` + +* 表 5-5 /proc/meminfo 在各检查点上的数值 +```bash +# checkpoint 1 +MemTotal: 1863220 kB +MemFree: 163052 kB +MemAvailable: 730148 kB +Buffers: 2116 kB +Cached: 785260 kB +SwapCached: 0 kB +Active: 824652 kB +Inactive: 613544 kB +Active(anon): 651680 kB +Inactive(anon): 108456 kB +Active(file): 172972 kB +Inactive(file): 505088 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 2097148 kB +SwapFree: 2097148 kB +Dirty: 20 kB +Writeback: 0 kB +AnonPages: 650840 kB +Mapped: 238944 kB +Shmem: 109316 kB +Slab: 100516 kB +SReclaimable: 40256 kB +SUnreclaim: 60260 kB +KernelStack: 9824 kB +PageTables: 36296 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028756 kB +Committed_AS: 4352980 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 215276 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 159744 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 132992 kB +DirectMap2M: 1964032 kB +DirectMap1G: 0 kB +# checkpoint 2 +MemTotal: 1863220 kB +MemFree: 140452 kB +MemAvailable: 707748 kB +Buffers: 2116 kB +Cached: 788908 kB +SwapCached: 0 kB +Active: 843484 kB +Inactive: 617104 kB +Active(anon): 670424 kB +Inactive(anon): 112096 kB +Active(file): 173060 kB +Inactive(file): 505008 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 2097148 kB +SwapFree: 2097148 kB +Dirty: 8 kB +Writeback: 0 kB +AnonPages: 669584 kB +Mapped: 241992 kB +Shmem: 112956 kB +Slab: 100984 kB +SReclaimable: 40640 kB +SUnreclaim: 60344 kB +KernelStack: 9776 kB +PageTables: 36024 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028756 kB +Committed_AS: 4346340 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 215276 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 225280 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 132992 kB +DirectMap2M: 1964032 kB +DirectMap1G: 0 kB +# checkpoint 3 +MemTotal: 1863220 kB +MemFree: 115132 kB +MemAvailable: 690628 kB +Buffers: 2116 kB +Cached: 799788 kB +SwapCached: 0 kB +Active: 855404 kB +Inactive: 627976 kB +Active(anon): 682336 kB +Inactive(anon): 114792 kB +Active(file): 173068 kB +Inactive(file): 513184 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 2097148 kB +SwapFree: 2097148 kB +Dirty: 24 kB +Writeback: 0 kB +AnonPages: 681496 kB +Mapped: 248424 kB +Shmem: 115652 kB +Slab: 101092 kB +SReclaimable: 40672 kB +SUnreclaim: 60420 kB +KernelStack: 9824 kB +PageTables: 36324 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028756 kB +Committed_AS: 4376652 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 215276 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 264192 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 132992 kB +DirectMap2M: 1964032 kB +DirectMap1G: 0 kB +# checkpoint 4 +[hypo@localhost ~]$ cat /proc/meminfo +MemTotal: 1863220 kB +MemFree: 110004 kB +MemAvailable: 685816 kB +Buffers: 2116 kB +Cached: 802524 kB +SwapCached: 0 kB +Active: 857812 kB +Inactive: 630520 kB +Active(anon): 684552 kB +Inactive(anon): 117476 kB +Active(file): 173260 kB +Inactive(file): 513044 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 2097148 kB +SwapFree: 2097148 kB +Dirty: 0 kB +Writeback: 0 kB +AnonPages: 683712 kB +Mapped: 250696 kB +Shmem: 118336 kB +Slab: 101576 kB +SReclaimable: 41196 kB +SUnreclaim: 60380 kB +KernelStack: 9792 kB +PageTables: 36064 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028756 kB +Committed_AS: 4351288 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 215276 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 278528 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 132992 kB +DirectMap2M: 1964032 kB +DirectMap1G: 0 kB +# checkpoint 5 +MemTotal: 1863220 kB +MemFree: 110996 kB +MemAvailable: 686816 kB +Buffers: 2116 kB +Cached: 805216 kB +SwapCached: 0 kB +Active: 854320 kB +Inactive: 633204 kB +Active(anon): 681052 kB +Inactive(anon): 120164 kB +Active(file): 173268 kB +Inactive(file): 513040 kB +Unevictable: 0 kB +Mlocked: 0 kB +SwapTotal: 2097148 kB +SwapFree: 2097148 kB +Dirty: 4 kB +Writeback: 0 kB +AnonPages: 680212 kB +Mapped: 248896 kB +Shmem: 121024 kB +Slab: 101584 kB +SReclaimable: 41204 kB +SUnreclaim: 60380 kB +KernelStack: 9760 kB +PageTables: 36040 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028756 kB +Committed_AS: 4338120 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 215276 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 274432 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 132992 kB +DirectMap2M: 1964032 kB +DirectMap1G: 0 kB +``` +* 页表的动态分配与回收 + +### 5.3.4 内存回收 +回收就是将已分配的在用页帧重新回到buddy 系统管理之下,以解决内存紧缺问题——回到buddy 系统作为空闲页帧可以被再次分配使用。可回收的页帧包括未修改过的文件映射页、修改过但是完成同步的文件映射页、未修改过的匿名页和已经换出到交换设备的匿名页。回收过程就是解除这些页的使用(包括解除页表映射等工作),归还给buddy 系统管理,可以再次被分配使用。用户进程可以锁定内存,使得它们不会被回收。 +![image](./record/pic/biao5-6.png) +系统调用 mlock 族函数允许程序锁住它的部分地址空间,这将阻止Linux 将这些内存页回收,哪怕该程序已不再访问这段空间。锁住的匿名页不会被换出和回收;锁住的文件映射页可以回写/同步,但是不会被回收。 +* 回写(同步)与交换 +回写(同步)操作是针对文件映射页的,而换出操作则是和匿名页相关的。回收、同步(回写)和换出三个操作都是以页帧为单位. +(1)回写:文件的写操作往往只修改页缓存中的内容即可返回,因此会出现页缓存和盘上数据的不一致的可能。通过同步(回写)操作才能保证盘上数据和内存(物理页帧)中缓存的数据相同。 +(2)换出:换出是匿名页回收的一个必要步骤,仅针对无文件映射的可回收页帧 +(3)回收:回收操作则是涉及物理页帧分配使用的问题,将可回收页解除使用者的页表映射并将页 +帧另作他用。 +* 进程间的页帧竞争 +用户进程并没有办法直接控制内存回收,只能通过进程间的物理页帧分配的竞争,侧面观察到内存回收、交换和回写的过程。 + +* 屏显 5-36 reclaim-swap-writeback-demo.c 创建并锁定内存后的内存布局/proc/PID/maps +```bash +[hypo@localhost ~]$ cat /proc/10227/maps +7f1d07cf2000-7f1d07cf7000 rw-p 00000000 00:00 0 +7f1d07cf7000-7f1d08cf3000 rw-p 00000000 00:00 0 +7f1d08cf3000-7f1d08cf5000 rw-s 00000000 fd:00 244 /home/hypo/tempfile +7f1d08cf5000-7f1d094f3000 rw-s 00002000 fd:00 244 /home/hypo/tempfile +``` +* reclaim-swap-writeback-demo.c 执行结果 +```bash +[hypo@localhost code]$ ./reclaim-swap-writeback-demo +allocated/mmapped +filemapped @ 0x7f1d08cf3000 +anon @ 0x7f1d07cf2010 +write finish +please run pages-blackhole-demo +compete for the page frames +``` +* 检查点说明 +checkpoint 1:在进程初始布局之上,创建两个新的内存区间,一个是8MB 的文件映射,一个是16MB 的非文件映射(匿名)区间。各自用mlock()函数锁定8KB 和16KB 的空间(不可换出) +checkpoint 2:对文件映射区间的前4MB 和匿名区间的前8MB 进行读和写操作各一遍。 +checkpoint 3:pagesblackhole-demo 进程将大量消耗物理页帧,因此会引起reclaim-swap-writeback-demo进程的页帧被回收。 +checkpoint 4:最后将通过对文件映射区间的前4MB 和匿名区间的前8MB 进行反复的读写操作。可以检查该进程重新获得物理页帧的现象。 + +* 表 5-7 /proc/PID/smaps 在各检查点上的数值 +```bash +# checkpoint 1 +7f1d07cf2000-7f1d07cf7000 rw-p 00000000 00:00 0 +Size: 20 kB +Rss: 20 kB +Pss: 20 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 20 kB +Referenced: 20 kB +Anonymous: 20 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 20 kB +ProtectionKey: 0 +VmFlags: rd wr mr mp me lo ac sd +7f1d07cf7000-7f1d08cf3000 rw-p 00000000 00:00 0 +Size: 16368 kB +Rss: 0 kB +Pss: 0 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 0 kB +Referenced: 0 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +ProtectionKey: 0 +VmFlags: rd wr mr mp me ac sd +7f1d08cf3000-7f1d08cf5000 rw-s 00000000 fd:00 244 /home/hypo/tempfile +Size: 8 kB +Rss: 8 kB +Pss: 8 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 8 kB +Private_Dirty: 0 kB +Referenced: 8 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 8 kB +ProtectionKey: 0 +VmFlags: rd wr sh mr mp me ms lo sd +7f1d08cf5000-7f1d094f3000 rw-s 00002000 fd:00 244 /home/hypo/tempfile +Size: 8184 kB +Rss: 0 kB +Pss: 0 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 0 kB +Referenced: 0 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +ProtectionKey: 0 +# checkpoint 2 +7f1d07cf2000-7f1d07cf7000 rw-p 00000000 00:00 0 +Size: 20 kB +Rss: 20 kB +Pss: 20 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 20 kB +Referenced: 20 kB +Anonymous: 20 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 20 kB +ProtectionKey: 0 +VmFlags: rd wr mr mp me lo ac sd +7f1d07cf7000-7f1d08cf3000 rw-p 00000000 00:00 0 +Size: 16368 kB +Rss: 9252 kB +Pss: 9252 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 9252 kB +Referenced: 9252 kB +Anonymous: 9252 kB +AnonHugePages: 8192 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +ProtectionKey: 0 +VmFlags: rd wr mr mp me ac sd +7f1d08cf3000-7f1d08cf5000 rw-s 00000000 fd:00 244 /home/hypo/tempfile +Size: 8 kB +Rss: 8 kB +Pss: 8 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 8 kB +Referenced: 8 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 8 kB +ProtectionKey: 0 +VmFlags: rd wr sh mr mp me ms lo sd +7f1d08cf5000-7f1d094f3000 rw-s 00002000 fd:00 244 /home/hypo/tempfile +Size: 8184 kB +Rss: 4088 kB +Pss: 4088 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 4088 kB +Referenced: 4088 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +# checkpoint 3 +7f1d07cf2000-7f1d07cf7000 rw-p 00000000 00:00 0 +Size: 20 kB +Rss: 20 kB +Pss: 20 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 20 kB +Referenced: 20 kB +Anonymous: 20 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 20 kB +ProtectionKey: 0 +VmFlags: rd wr mr mp me lo ac sd +7f1d07cf7000-7f1d08cf3000 rw-p 00000000 00:00 0 +Size: 16368 kB +Rss: 0 kB +Pss: 0 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 0 kB +Referenced: 0 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 9252 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +ProtectionKey: 0 +VmFlags: rd wr mr mp me ac sd +7f1d08cf3000-7f1d08cf5000 rw-s 00000000 fd:00 244 /home/hypo/tempfile +Size: 8 kB +Rss: 8 kB +Pss: 8 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 8 kB +Private_Dirty: 0 kB +Referenced: 8 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 8 kB +ProtectionKey: 0 +VmFlags: rd wr sh mr mp me ms lo sd +7f1d08cf5000-7f1d094f3000 rw-s 00002000 fd:00 244 /home/hypo/tempfile +Size: 8184 kB +Rss: 0 kB +Pss: 0 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 0 kB +Referenced: 0 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +ProtectionKey: 0 +# checkpoint 4 +7f1d07cf2000-7f1d07cf7000 rw-p 00000000 00:00 0 +Size: 20 kB +Rss: 20 kB +Pss: 20 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 20 kB +Referenced: 20 kB +Anonymous: 20 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 20 kB +ProtectionKey: 0 +VmFlags: rd wr mr mp me lo ac sd +7f1d07cf7000-7f1d08cf3000 rw-p 00000000 00:00 0 +Size: 16368 kB +Rss: 2028 kB +Pss: 2028 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 2028 kB +Referenced: 2028 kB +Anonymous: 2028 kB +AnonHugePages: 0 kB +Swap: 7224 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +ProtectionKey: 0 +VmFlags: rd wr mr mp me ac sd +7f1d08cf3000-7f1d08cf5000 rw-s 00000000 fd:00 244 /home/hypo/tempfile +Size: 8 kB +Rss: 8 kB +Pss: 8 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 8 kB +Referenced: 8 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 8 kB +ProtectionKey: 0 +VmFlags: rd wr sh mr mp me ms lo sd +7f1d08cf5000-7f1d094f3000 rw-s 00002000 fd:00 244 /home/hypo/tempfile +Size: 8184 kB +Rss: 1016 kB +Pss: 1016 kB +Shared_Clean: 0 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 1016 kB +Referenced: 1016 kB +Anonymous: 0 kB +AnonHugePages: 0 kB +Swap: 0 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Locked: 0 kB +``` + +* 表 5-8 /proc/PID/status 在各检查点上的数值 +```bash +# checkpoint 1 +VmPeak: 28796 kB +VmSize: 28796 kB +VmLck: 28 kB +VmPin: 0 kB +VmHWM: 352 kB +VmRSS: 352 kB +RssAnon: 76 kB +RssFile: 276 kB +RssShmem: 0 kB +VmData: 16444 kB +VmStk: 132 kB +VmExe: 4 kB +VmLib: 1936 kB +VmPTE: 36 kB +VmSwap: 0 kB +Threads: 1 +# checkpoint 2 +VmPeak: 28796 kB +VmSize: 28796 kB +VmLck: 28 kB +VmPin: 0 kB +VmHWM: 13744 kB +VmRSS: 13744 kB +RssAnon: 9212 kB +RssFile: 4532 kB +RssShmem: 0 kB +VmData: 16444 kB +VmStk: 132 kB +VmExe: 4 kB +VmLib: 1936 kB +VmPTE: 60 kB +VmSwap: 0 kB +Threads: 1 +# checkpoint 3 +VmPeak: 28796 kB +VmSize: 28796 kB +VmLck: 28 kB +VmPin: 0 kB +VmHWM: 13744 kB +VmRSS: 28 kB +RssAnon: 0 kB +RssFile: 28 kB +RssShmem: 0 kB +VmData: 16444 kB +VmStk: 132 kB +VmExe: 4 kB +VmLib: 1936 kB +VmPTE: 60 kB +VmSwap: 9348 kB +Threads: 1 +# checkpoint 4 +VmPeak: 28796 kB +VmSize: 28796 kB +VmLck: 28 kB +VmPin: 0 kB +VmHWM: 13744 kB +VmRSS: 3088 kB +RssAnon: 2056 kB +RssFile: 1032 kB +RssShmem: 0 kB +VmData: 16444 kB +VmStk: 132 kB +VmExe: 4 kB +VmLib: 1936 kB +VmPTE: 60 kB +VmSwap: 7312 kB +Threads: 1 +``` + +* 表 5-9 /proc/meminfo 在各检查点上的数值 +```bash +# checkpoint 1 +MemTotal: 1863248 kB +MemFree: 67188 kB +MemAvailable: 556916 kB +Buffers: 172 kB +Cached: 806276 kB +SwapCached: 0 kB +Active: 881212 kB +Inactive: 577388 kB +Active(anon): 586216 kB +Inactive(anon): 284320 kB +Active(file): 294996 kB +Inactive(file): 293068 kB +Unevictable: 28 kB +Mlocked: 28 kB +SwapTotal: 2097148 kB +SwapFree: 2096628 kB +Dirty: 0 kB +Writeback: 0 kB +AnonPages: 652388 kB +Mapped: 337764 kB +Shmem: 218376 kB +Slab: 134840 kB +SReclaimable: 65512 kB +SUnreclaim: 69328 kB +KernelStack: 10128 kB +PageTables: 37096 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028772 kB +Committed_AS: 4560968 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 216300 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 190464 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 141184 kB +DirectMap2M: 1955840 kB +DirectMap1G: 0 kB +# checkpoint 2 +MemTotal: 1863248 kB +MemFree: 63872 kB +MemAvailable: 516796 kB +Buffers: 172 kB +Cached: 793440 kB +SwapCached: 4 kB +Active: 872652 kB +Inactive: 589336 kB +Active(anon): 596768 kB +Inactive(anon): 313804 kB +Active(file): 275884 kB +Inactive(file): 275532 kB +Unevictable: 28 kB +Mlocked: 28 kB +SwapTotal: 2097148 kB +SwapFree: 2096628 kB +Dirty: 8 kB +Writeback: 0 kB +AnonPages: 668440 kB +Mapped: 363284 kB +Shmem: 242188 kB +Slab: 134620 kB +SReclaimable: 65196 kB +SUnreclaim: 69424 kB +KernelStack: 10192 kB +PageTables: 37432 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028772 kB +Committed_AS: 4611936 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 216300 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 229376 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 141184 kB +DirectMap2M: 1955840 kB +DirectMap1G: 0 kB +# checkpoint 3 +MemTotal: 1863248 kB +MemFree: 56520 kB +MemAvailable: 14148 kB +Buffers: 0 kB +Cached: 48440 kB +SwapCached: 15360 kB +Active: 1161024 kB +Inactive: 405136 kB +Active(anon): 1150128 kB +Inactive(anon): 385492 kB +Active(file): 10896 kB +Inactive(file): 19644 kB +Unevictable: 28 kB +Mlocked: 28 kB +SwapTotal: 2097148 kB +SwapFree: 644996 kB +Dirty: 0 kB +Writeback: 124 kB +AnonPages: 1502756 kB +Mapped: 23996 kB +Shmem: 17496 kB +Slab: 97976 kB +SReclaimable: 34104 kB +SUnreclaim: 63872 kB +KernelStack: 10176 kB +PageTables: 41284 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028772 kB +Committed_AS: 6646500 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 216300 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 8192 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 141184 kB +DirectMap2M: 1955840 kB +DirectMap1G: 0 kB +# checkpoint 4 +MemTotal: 1863248 kB +MemFree: 71752 kB +MemAvailable: 24264 kB +Buffers: 0 kB +Cached: 42428 kB +SwapCached: 60244 kB +Active: 1157844 kB +Inactive: 394680 kB +Active(anon): 1145672 kB +Inactive(anon): 385636 kB +Active(file): 12172 kB +Inactive(file): 9044 kB +Unevictable: 28 kB +Mlocked: 28 kB +SwapTotal: 2097148 kB +SwapFree: 589384 kB +Dirty: 932 kB +Writeback: 100 kB +AnonPages: 1449988 kB +Mapped: 28548 kB +Shmem: 21280 kB +Slab: 97332 kB +SReclaimable: 33368 kB +SUnreclaim: 63964 kB +KernelStack: 10240 kB +PageTables: 41580 kB +NFS_Unstable: 0 kB +Bounce: 0 kB +WritebackTmp: 0 kB +CommitLimit: 3028772 kB +Committed_AS: 6683348 kB +VmallocTotal: 34359738367 kB +VmallocUsed: 216300 kB +VmallocChunk: 34359277564 kB +HardwareCorrupted: 0 kB +AnonHugePages: 8192 kB +CmaTotal: 0 kB +CmaFree: 0 kB +HugePages_Total: 0 +HugePages_Free: 0 +HugePages_Rsvd: 0 +HugePages_Surp: 0 +Hugepagesize: 2048 kB +DirectMap4k: 141184 kB +DirectMap2M: 1955840 kB +DirectMap1G: 0 kB +``` + +## 课后作业 +### 1.请编写程序分配几K 的空间,然后通过free()回收的空间,验证该空间仍可以合法访问。不断增大所分配的空间并进行回收,探测出在什么尺度上的内存空间回收会造成不可访问。 +思路:循环分配内存然后回收并访问,若成功则增加内存的分配量然后重复上述流程,直到出现错误 + +代码如下: +```c +#include +#include + +#define kB 1024 +void *p; +int main() +{ + int i = 8; + while(1) + { + p = malloc(i*kB); + free(p); + printf("%d,succeed,%s\n",i,p); + i++; + } + return 0; +} +``` +运行结果如下: +```bash +[hypo@localhost homework]$ ./problem1 +8,succeed, +9,succeed, +10,succeed, +11,succeed, +12,succeed, +13,succeed, +..... +125,succeed, +126,succeed, +127,succeed, +128,succeed, +129,succeed, +130,succeed, +131,succeed, +Segmentation fault (core dumped) +``` +![image](./homework/problem1.png) +通过运行结果可以发现当分配的内存达到132kb时,回收空间后该空间将无法访问。 + +### 2.设计一个程序,用于验证Linux 进程用户空间的管理是否属采用了最佳匹配算法。 + +思路:连续分配1,2,4,8,16,32,64kb内存,但每个内存块中均用1kb非空闲内存进行分隔,最佳匹配算法只会分配满足条件的最接近的内存区域,验证是否是即可。 +代码: + +```c +#include +#include +#define kb 1024 + +void *bufs[134]; //1+1+1+2+1+4+1+8+1+16+1+32+1+64 = 134 +// int list[]={0,2,5,10,19,36,69}; + +int main(){ + int i; + for (i = 0; i < 134; ++i){ + bufs[i] = malloc(1*kb); + } + + for (i = 0; i < 134; ++i){ + if (i==0) + printf("<1kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 2) + printf("1~2kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 5) + printf("2~4kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 10) + printf("4-8kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 19) + printf("8-16kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 36) + printf("16-32kb pre-addr:%p\n",bufs[i+1] ); + else if (i == 69) + printf("32-64kb pre-addr:%p\n",bufs[i+1] ); + else + free(bufs[i]); + } + + while(1){ + int size; + printf("input size(<64kb):\n"); + scanf("%d",&size); + void *ptr; + ptr = malloc(size*kb); + printf("true:addr:%p\n",ptr ); + } + return 0; +} +``` +运行结果: +```bash +[hypo@localhost homework]$ ./problem2 +<1kb pre-addr:0x7d6420 +1~2kb pre-addr:0x7d6c40 +2~4kb pre-addr:0x7d7870 +4-8kb pre-addr:0x7d8cc0 +8-16kb pre-addr:0x7db150 +16-32kb pre-addr:0x7df660 +32-64kb pre-addr:0x7e7c70 +input size(<64kb): +7 +true:addr:0x7d8cc0 +input size(<64kb): +65 +true:addr:0x7e7c70 +input size(<64kb): +``` +![image](./homework/problem2.png) + + +### 3.设计一个程序A,分配大量内存并填充某种模式的字符串,然后进入阻塞状态。然后通过另一程序B 分配大量内存并反复访问。设法查看A 进程的换出情况,以及相应换出页的页表项内容。 +代码:A +```c +#include +#include +#include +#include +#include +#define MB (1024*1024) +int main() +{ + int pid,i; + char *buf; + pid = getpid(); + printf("PID:%d\n",pid ); + buf=(char*)malloc(1024*MB); + printf("addr_start:%p\n",buf); + for(i=0;i<1024*MB;i++) + { + buf[i]=0xaa; + } + printf("addr_end:%p\n",&buf[i]); + long size = &buf[i]-&buf[0]; + printf("malloc size:%dMB\n", size/MB); + printf("please run pages-blackhole-demo\n"); + getchar(); + free(buf); + return 0; +} +``` +代码:B +```c +#include +#include +#include +#include +#define MB 1024*1024 +int main() +{ + int i,j; + char temp; + int fd= -1; + char * filemap_buf; + char * anon_buf; + anon_buf=(char *)malloc(1000*MB); + while(1) + { + for(i=0;i<1000*MB;i+=4096) + anon_buf[i]=0xaa; + sleep(1); + } + return 0; +} +``` +结果: +```bash +#运行前free结果 +[hypo@localhost ~]$ free + total used free shared buff/cache available +Mem: 1863248 520728 994812 89348 347708 1043556 +Swap: 2097148 855548 1241600 +#运行A结果 +[hypo@localhost homework]$ ./problem3_a +PID:15352 +addr_start:0x7f540c076010 +addr_end:0x7f544c076010 +malloc size:1024MB +please run pages-blackhole-demo +#运行free结果,发现RAM占用上升1G +[hypo@localhost ~]$ free + total used free shared buff/cache available +Mem: 1863248 1567736 66200 85324 229312 32076 +Swap: 2097148 863004 1234144 +#运行B后free结果,发现swap分区上升1G +[hypo@localhost ~]$ free + total used free shared buff/cache available +Mem: 1863248 1608888 63744 38280 190616 33664 +Swap: 2097148 1842800 254348 +#使用crash工具查看换出结果 +#计算结果: +#addr_start:0x7f540c076010 +#PGD 中的索引/偏移: (0x7f540c076010>>(9+ 9 + 9 + 12)) & 0x1ff = 0xFE ->760 +#PUD 中的索引/偏移: (0x7f540c076010>>(9 + 9 + 12)) & 0x1ff = 0x150 ->a80 +#PMD 中的索引/偏移: (0x7f540c076010>>(9 + 12)) & 0x1ff = 0x60 -> 300 +#PDTE 中的索引/偏移: (0x7f540c076010>>(12)) & 0x1ff = 0x76 -> 3b0 +#页内偏移: (0x7f540c076010>>(0)) & 0xfff = 0x010 -> 80 +crash> set 15352 + PID: 15352 +COMMAND: "problem3_a" + TASK: ffff8be4d3e8a080 [THREAD_INFO: ffff8be4fa6c4000] + CPU: 1 + STATE: TASK_INTERRUPTIBLE +crash> px ((struct task_struct *)0xffff8be4d3e8a080)->mm->pgd +$1 = (pgd_t *) 0xffff8be4d14ae000 +crash> px (0xffff8be4d14ae000-0xffff880000000000) +$2 = 0x3e4d14ae000 +crash> rd 0xffff8be4d14ae7F0 +ffff8be4d14ae7f0: 8000000076d2c067 g..v.... +crash> pte 8000000076d2c067 + PTE PHYSICAL FLAGS +8000000076d2c067 76d2c000 (PRESENT|RW|USER|ACCESSED|DIRTY|NX) +crash> rd -p 76d2ca80 + 76d2ca80: 0000000071615067 gPaq.... +crash> pte 0000000071615067 + PTE PHYSICAL FLAGS +71615067 71615000 (PRESENT|RW|USER|ACCESSED|DIRTY) +crash> rd -p 71615300 + 71615300: 0000000070ca2067 g .p.... +crash> pte 0000000070ca2067 + PTE PHYSICAL FLAGS +70ca2067 70ca2000 (PRESENT|RW|USER|ACCESSED|DIRTY) +crash> rd -p 70ca23b0 + 70ca23b0: 07fffffff6c4de80 ........ +crash> pte 07fffffff6c4de80 + PTE SWAP OFFSET +7fffffff6c4de80 /dev/dm-1 2251799813080286 +#使用crash查看相应换出页的页表项内容,发现换出页储存在swap交换分区 +crash> +``` +截图: +1.A运行结果 +![image](./homework/problem3_A.png) +2.free命令结果 +![image](./homework/problem3_free.png) +3.使用crash查看相应换出页的页表项内容,发现换出页储存在swap交换分区 +![image](./homework/problem3_crash.png) + +结论:当RAM不足时,休眠状态的程序将被换出至swap交换分区 + +## 实验体会 +通过本次实验,对linux系统的内存管理系统有了较好的理解。 -- GitLab