-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
1816 lines (1661 loc) · 178 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Baron的博客</title>
<link href="/atom.xml" rel="self"/>
<link href="http://www.barondu.com/"/>
<updated>2019-07-02T02:36:49.000Z</updated>
<id>http://www.barondu.com/</id>
<author>
<name>Baron</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>G52CPP复习</title>
<link href="http://www.barondu.com/2018/11/26/G52CPP/"/>
<id>http://www.barondu.com/2018/11/26/G52CPP/</id>
<published>2018-11-25T19:27:27.000Z</published>
<updated>2019-07-02T02:36:49.000Z</updated>
<content type="html"><![CDATA[<h2 id="G52CPP"><a href="#G52CPP" class="headerlink" title="G52CPP"></a>G52CPP</h2><hr>
<h3 id="Lecture-1-amp-2"><a href="#Lecture-1-amp-2" class="headerlink" title="Lecture 1 & 2"></a>Lecture 1 & 2</h3><h5 id="Header"><a href="#Header" class="headerlink" title="Header"></a>Header</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span> <span class="comment">// C or C++</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><cstdio></span> <span class="comment">// C++</span></span></div></pre></td></tr></table></figure>
<p>reference 省去 copy的过程<br>What is usually in a header file?</p>
<ol>
<li>Function declarations</li>
<li>Macro definitions (#define)</li>
<li>Constant definitions</li>
<li>Possibly other things as well<blockquote>
<ol>
<li>Ensure that the header file #includes everything that it needs itself</li>
<li>Ensure that it doesn’t matter if the header file is #included multiple times</li>
<li>Ensure that header files can be included in any order</li>
</ol>
<a id="more"></a>
</blockquote>
</li>
</ol>
<ul>
<li><code>#include</code><br>Replaces this statement by the text of the specified <strong>file</strong></li>
<li>Java’s <code>import</code></li>
<li><h5 id="Sizes-of-types"><a href="#Sizes-of-types" class="headerlink" title="Sizes of types"></a>Sizes of types</h5></li>
<li>A minimum size (bits): char 8(1 byte), short 16(2 byte), long 32(4 byte)</li>
<li>Relativesizes: char <= short <= int <= long</li>
</ul>
<h5 id="bool-and-inttype"><a href="#bool-and-inttype" class="headerlink" title="bool and inttype"></a><strong>bool</strong> and <strong>int</strong>type</h5><ul>
<li>bool : <strong>true</strong> / <strong>false</strong> (C++ only, not C)</li>
<li>IMPORTANT: <code>bool</code> and <code>int</code> can be converted <strong>implicitly</strong> / <strong>automatically</strong> to each other<ul>
<li><strong>true</strong> defined to be <strong>1</strong> when converted to int </li>
<li><strong>false</strong> defined to be <strong>0</strong> when converted to int </li>
<li><strong>0</strong> is defined to be <strong>false</strong>, <strong>non-zero</strong> as true</li>
</ul>
</li>
</ul>
<blockquote>
<p>In both C and C++ any integer types can be used in conditions (i.e. char, short, long, int)<br><figure class="highlight llvm"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">int <span class="keyword">x</span> = <span class="number">6</span><span class="comment">;</span></div><div class="line">while ( <span class="keyword">x</span> )</div><div class="line">{</div><div class="line"> printf( <span class="string">"X is %d\n"</span>, <span class="keyword">x</span> )<span class="comment">;</span></div><div class="line"> <span class="keyword">x</span> -= <span class="number">2</span><span class="comment">; </span></div><div class="line">}</div></pre></td></tr></table></figure></p>
</blockquote>
<figure class="highlight clean"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div></pre></td><td class="code"><pre><div class="line">##### wchar_t type</div><div class="line">wchar_t : wide character (C++ only, not C)</div><div class="line">- <span class="number">16</span> bits</div><div class="line">##### signed/unsigned value</div><div class="line">- Default is **signed**</div><div class="line">##### void</div><div class="line">- you can create a type void</div><div class="line">##### auto</div><div class="line">- new to C++<span class="number">11</span></div><div class="line">- can only used for **initialised variables**</div><div class="line"> - complier will **work out the type** at **compile time** <span class="keyword">from</span> **the initialisation value**</div><div class="line"></div><div class="line">##### #define</div><div class="line">> An semi-intelligent ***‘find and replace**’* facility</div><div class="line"></div><div class="line">- Often considered `bad` <span class="keyword">in</span> C++ <span class="keyword">code</span> (useful <span class="keyword">in</span> C)</div><div class="line"> - **const** is used more often, especially for members</div><div class="line"> - **Template functions** are better than **macros**</div><div class="line">- **Remember**: Done by the pre-processor!</div><div class="line">- Constant `#define` usually written <span class="keyword">in</span> **CAPITALS**</div><div class="line"></div><div class="line">##### Conditional compilation</div><div class="line">You can remove parts <span class="keyword">of</span> the source <span class="keyword">code</span> <span class="keyword">if</span> desired</div><div class="line">- Use for **cross-platform** <span class="keyword">code</span></div></pre></td></tr></table></figure>
<p>#ifdef <strong>WINDOWS</strong><br>… windows code here …</p>
<p>#elif <strong>SYS5UNIX</strong><br>… System 5 code here …</p>
<p>#endif<br><figure class="highlight armasm"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">- Avoiding <span class="keyword">multiple </span>inclusion</div></pre></td></tr></table></figure></p>
<p>#ifndef UNIQUE_DEFINE_NAME_FOR_FILE</p>
<p>#define UNIQUE_DEFINE_NAME_FOR_FILE<br>… include the rest of the file here …</p>
<p>#endif<br><figure class="highlight markdown"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line">别忘了endif</div><div class="line"></div><div class="line"><span class="section">### Lecture 3 & 4</span></div><div class="line"><span class="section">##### Pointer</span></div><div class="line">![<span class="string">Alt text</span>](<span class="link">./1496502642897.png</span>)</div><div class="line"><span class="bullet">- </span><span class="code">`&`</span> Address-of</div><div class="line"><span class="bullet">- </span><span class="code">`*`</span> De-referencing</div><div class="line">In C and C++, variables are <span class="strong">**NOT initialised**</span> unless you give them an <span class="strong">**initial value**</span></div><div class="line"><span class="bullet">- </span>You can use NULL</div><div class="line"><span class="bullet">- </span><span class="strong">**Dereferencing an unitialised pointer**</span> has undefined results <span class="emphasis">*Could crash your program (likely)*</span></div><div class="line"><span class="bullet">- </span>assigning one pointer to another means:</div><div class="line"><span class="code"> - It points at the same object</span></div><div class="line"><span class="code"> - It has the same address stored in it </span></div><div class="line"></div><div class="line"><span class="section">##### Casting</span></div></pre></td></tr></table></figure></p>
<p>char c1 = ‘h’;<br>char<em> pc2 = &c1;<br>int</em> pi4 = (int*)pc2;<br><figure class="highlight coffeescript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">- **Dangerous !**</div><div class="line"><span class="built_in">print</span> the address use `<span class="javascript">%p</span>` <span class="keyword">and</span> `<span class="javascript">(<span class="keyword">void</span>*)</span>`</div></pre></td></tr></table></figure></p>
<p>char c1 = ‘h’;<br>char<em> pc2 = &c1;<br>printf(“%p “,(void</em>)pc2);<br>printf(“%p\n”,(void*)&c1);<br><figure class="highlight markdown"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div></pre></td><td class="code"><pre><div class="line"></div><div class="line"><span class="section">##### Arrays, C-strings and pointers</span></div><div class="line">Array</div><div class="line"><span class="bullet">- </span><span class="code">`char array[6];`</span></div><div class="line"><span class="bullet">- </span><span class="code">`char array[2] = {'a','b'}`</span></div><div class="line"><span class="bullet">- </span><span class="code">`char array[] = {'a','b'}`</span></div><div class="line"><span class="bullet">- </span>The addresses of elements <span class="strong">**within**</span> an array <span class="strong">**are**</span> consecutive</div><div class="line"><span class="bullet">- </span>The relative locations of <span class="strong">**different array**</span>s, or <span class="strong">**variables are NOT**</span> fixed</div><div class="line"></div><div class="line">C-string / char*</div><div class="line"><span class="bullet">- </span>C-strings consist of an array of characters, terminated by a character value of zero</div><div class="line"><span class="bullet">- </span>‘\0’, or 0 </div><div class="line"><span class="bullet">- </span>NOT ‘0’!!! </div><div class="line"></div><div class="line"><span class="quote">> char* str = "abcd";</span></div><div class="line"><span class="quote">> str 是 ‘h’ 也就是第一个、字符的地址</span></div><div class="line"><span class="quote">> char array[4] = {'a','b','c','d','/0'};</span></div><div class="line"><span class="quote">> char array[4] = "abcd";</span></div><div class="line"><span class="quote">> array 就是 'h', 就是第一个字符</span></div><div class="line"></div><div class="line"><span class="bullet">- </span>char* 是只读的</div><div class="line">![<span class="string">12689f76eab6d982f416cc4f6e15e466.png</span>](<span class="link">evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=12689f76eab6d982f416cc4f6e15e466</span>)</div><div class="line"></div><div class="line">这里两个print出来的都是整个string</div><div class="line"></div><div class="line"><span class="section">### Lecture 5</span></div><div class="line">![<span class="string">6a4ee268a72a8b9dc7c7b83f68cba2e4.png</span>](<span class="link">evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=6a4ee268a72a8b9dc7c7b83f68cba2e4</span>)</div><div class="line"></div><div class="line"><span class="section">##### stack</span></div><div class="line"><span class="bullet">- </span>last in fist out (LIFO)</div><div class="line"><span class="bullet">- </span>Function calls (stack frames) are stored on a stack in memory</div><div class="line"><span class="bullet">- </span>stack frame</div><div class="line">![<span class="string">52a56050e9f28bc036a1906cfd328d0d.png</span>](<span class="link">evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=52a56050e9f28bc036a1906cfd328d0d</span>)</div><div class="line"></div><div class="line"><span class="section">##### Lifetime of local variables</span></div><div class="line"><span class="bullet">- </span>Your local variables only exist for as long as the block in which they are defined</div><div class="line"><span class="bullet">- </span>Do not access them after that</div><div class="line"><span class="bullet">- </span>Do not assume that they keep their value after the function ends</div><div class="line"><span class="bullet">- </span>Local variables get destroyed for you (auto-destroyed)</div><div class="line"><span class="bullet">- </span>But if you use malloc() you need to call free()</div><div class="line"></div><div class="line"><span class="section">##### Global variables</span></div><div class="line"><span class="bullet">- </span>Variable declared outside of all functions</div><div class="line"><span class="bullet">- </span>Global variables last for the duration of the program</div><div class="line"><span class="bullet">- </span>All functions in the file can access globals</div><div class="line"><span class="bullet">- </span>Not available in Java!</div><div class="line"><span class="section">##### Static local variables</span></div><div class="line">Local variables can be <span class="strong">**static**</span></div><div class="line"><span class="bullet">- </span>Means not moving/unchanging</div><div class="line"><span class="bullet">- </span>NOT the same as static member variables!</div><div class="line"><span class="bullet">- </span>NOT the same as <span class="strong">**const**</span></div><div class="line"></div><div class="line">Static local variables remember their value between function calls</div><div class="line"><span class="bullet">- </span>Like global variables</div><div class="line"></div><div class="line">But, you can only access them (by name) inside the one function they are defined in</div><div class="line"><span class="bullet">- </span>Unless you keep a pointer to them</div><div class="line"></div><div class="line">Static variable remembers its value Initialisation only occurs in the first function call</div><div class="line"><span class="section">##### Global vs local variables</span></div><div class="line">![<span class="string">552b5511aef4638112f5f5a7fb995764.png</span>](<span class="link">evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=552b5511aef4638112f5f5a7fb995764</span>)</div><div class="line"></div><div class="line">Do not refer to data on the stack outside the function</div><div class="line"><span class="bullet">- </span>This means local variables or actual parameters</div><div class="line"></div><div class="line">You CAN refer to them, but SHOULD NOT</div><div class="line">>Things to avoid:</div><div class="line"><span class="quote">> - Returning a pointer to a local variable or parameter </span></div><div class="line"><span class="quote">> - Storing the address of a local variable or parameter</span></div><div class="line"><span class="section">##### Using multiple files</span></div><div class="line">![<span class="string">05f1607f86a43382e00ef97a21735133.png</span>](<span class="link">evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=05f1607f86a43382e00ef97a21735133</span>)</div><div class="line"><span class="bullet">- </span><span class="code">`extern`</span></div><div class="line">![<span class="string">d926279ef50ca572eaf0f5e80ee74d23.png</span>](<span class="link">evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=d926279ef50ca572eaf0f5e80ee74d23</span>)</div><div class="line"><span class="section">##### Encapsulation</span></div><div class="line">![<span class="string">a0e03a14297eb01f82df1eb75191bae6.png</span>](<span class="link">evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=a0e03a14297eb01f82df1eb75191bae6</span>)</div><div class="line"></div><div class="line"></div><div class="line"><span class="section">### Lecture 6</span></div><div class="line"><span class="section">##### struct</span></div><div class="line"><span class="code">``` </span></div><div class="line">struct Time</div><div class="line">{</div><div class="line"> int hour;</div><div class="line"> int minuate;</div><div class="line"> int second;</div><div class="line">};</div><div class="line">struct Date { int d, m, y; };</div></pre></td></tr></table></figure></p>
<figure class="highlight capnproto"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Date</span> dob = </span>{ <span class="number">1</span>, <span class="number">4</span>, <span class="number">1990</span> };</div></pre></td></tr></table></figure>
<p><strong>注意分号!</strong><br>Use <code>.</code> to access struct members</p>
<h5 id="The-heap-and-malloc"><a href="#The-heap-and-malloc" class="headerlink" title="The heap and malloc()"></a>The heap and malloc()</h5><p> <code>malloc()</code> returns a <code>void*</code><br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=a3387c215ea60dc0e8734bae841021da" alt="a3387c215ea60dc0e8734bae841021da.png"></p>
<figure class="highlight lisp"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">int* pInt = (<span class="name">int*</span>)malloc( <span class="name">sizeof</span>(<span class="name">int</span>) )</div></pre></td></tr></table></figure>
<h5 id="Positioning-of-struct-elements"><a href="#Positioning-of-struct-elements" class="headerlink" title="Positioning of struct elements"></a>Positioning of struct elements</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=908dc8380cabfd31644390642311987d" alt="908dc8380cabfd31644390642311987d.png"></p>
<h5 id="pragma"><a href="#pragma" class="headerlink" title="#pragma"></a>#pragma</h5><ul>
<li><code>struct</code> may get empty space in them <ul>
<li>To align members for maximum speed</li>
</ul>
</li>
</ul>
<p>-<code>#pragma</code> means a compiler/operating system specific pre-processor directive</p>
<pre><code>- `#pragma pack(1)` it will save space but will speed down
</code></pre><h5 id="union"><a href="#union" class="headerlink" title="union"></a>union</h5><ul>
<li>Elements of unions are in the SAME place</li>
<li>Elements of unions may be different sizes<ul>
<li><strong>A union is as big as the biggest thing in it</strong> </li>
</ul>
</li>
<li>Unions are a way of providing different ways of looking at the same memory<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=d869ddb12cd209ee24f1d586d7a29a09" alt="d869ddb12cd209ee24f1d586d7a29a09.png"></li>
</ul>
<h2 id="Lecture-7"><a href="#Lecture-7" class="headerlink" title="Lecture 7"></a>Lecture 7</h2><h5 id="classes-vs-structs-in-C"><a href="#classes-vs-structs-in-C" class="headerlink" title="classes vs structs in C++"></a>classes vs structs in C++</h5><ul>
<li>Everything you do with a <code>class</code> in C++ could also be done with a <code>struct</code></li>
<li><p>The difference is <strong>(ONLY!!!)</strong> in encapsulation</p>
<blockquote>
<p>struct defaults to public, class to private</p>
</blockquote>
</li>
<li><p>struct: Data only and no member functions</p>
</li>
<li><strong>Data</strong> should (usually) be private</li>
<li><strong>Methods</strong> (functions) should be: <ul>
<li><code>private</code> for internal use only</li>
<li><code>public</code> for the external class interface</li>
</ul>
</li>
<li>The values of the data members comprise the state of the object</li>
<li>Interface methods can be:<ul>
<li><strong>Mutators</strong> – change the ‘state’ of the object</li>
<li><strong>Accessors</strong> – only query values, no changes</li>
</ul>
</li>
<li>Use <code>this-></code>not<code>this.</code></li>
</ul>
<h5 id="Constructors-and-Destructors"><a href="#Constructors-and-Destructors" class="headerlink" title="Constructors and Destructors"></a>Constructors and Destructors</h5><p><strong>Constructor</strong> (as in Java)</p>
<ul>
<li>Called when an object is created</li>
<li>Has function name same as class name</li>
<li><strong>no return type</strong> (none/empty, NOT void!)</li>
<li>Adding a constructor makes it impossible to provide a C-style initialiser. e.g. <code>= {0,1,2};</code></li>
</ul>
<p><strong>Destructor</strong> (similar to Java finalize)</p>
<ul>
<li>Called when an object is destroyed</li>
<li>A function with name ~ then class name • E.g.: <code>~DemoClass()</code></li>
<li>And no return type</li>
</ul>
<h5 id="Default-parameters"><a href="#Default-parameters" class="headerlink" title="Default parameters"></a>Default parameters</h5><ul>
<li>Default values appear only in the function <strong>declaration</strong>, not any <strong>separate</strong> definition</li>
<li>Use `= <value>‘’<figure class="highlight stylus"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="title">DemoClass</span><span class="params">( char* dummy, int iValue = -<span class="number">1</span>)</span></span></div><div class="line">{ <span class="comment">/*Nothing*/</span> }</div></pre></td></tr></table></figure>
</value></li>
</ul>
<h5 id="Default-Constructor"><a href="#Default-Constructor" class="headerlink" title="Default Constructor"></a>Default Constructor</h5><p>The <strong>‘Default Constructor’</strong> is a constructor which <strong>can be called</strong> with no parameters</p>
<ul>
<li>e.g. one which has no parameters</li>
<li>or has default values for all parameters</li>
<li>A class can only have one default constructor<ul>
<li>More would introduce ambiguity</li>
</ul>
</li>
</ul>
<p>When you create arrays of objects, the default constructor is used (because no parameters are provided):<code>DemoClass myDemoArray[4];</code></p>
<p><strong>IMPORTANT</strong>: Do <strong>NOT</strong> add empty brackets <code>()</code> <strong>when constructing on the stack</strong> if there are no parameters!</p>
<ul>
<li>Compiler thinks you are <strong>declaring a function</strong></li>
<li>e.g. <code>DemoClass myDemoClass1();</code> // <strong>WRONG!!!</strong></li>
</ul>
<h5 id="Initialisation-vs-Assignment"><a href="#Initialisation-vs-Assignment" class="headerlink" title="Initialisation vs Assignment"></a>Initialisation vs Assignment</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=ec9c972cd119567ada7356a102fddb93" alt="ec9c972cd119567ada7356a102fddb93.png"><br>Compare the following:<br>1)<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">int</span> i = <span class="number">4</span>; <span class="comment">// Initialisation</span></div></pre></td></tr></table></figure></p>
<p>2)<br><figure class="highlight abnf"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">int j<span class="comment">; // Uninitialised</span></div><div class="line"><span class="attribute">j</span> = <span class="number">4</span><span class="comment">; // Assignment</span></div></pre></td></tr></table></figure></p>
<p> Member data is <strong>NOT always</strong> initialised</p>
<ul>
<li><strong>Basic types and pointers</strong> (e.g. int, short or char*) are NOT initialised</li>
<li><strong>Default constructor</strong> is <strong>called for members of type class/struct</strong> unless you say otherwise<ul>
<li>Using initialisation list</li>
</ul>
</li>
</ul>
<h5 id="Inline-functions"><a href="#Inline-functions" class="headerlink" title="Inline functions"></a>Inline functions</h5><p>Use the keyword <code>inline</code>, e.g.:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">int</span> <span class="title">max</span><span class="params">( <span class="keyword">int</span> a, <span class="keyword">int</span> b )</span> </span>{ <span class="keyword">return</span> a>b ? a : b; }</div></pre></td></tr></table></figure></p>
<p>Similar to a ‘safe’ macro expansion</p>
<ul>
<li><strong>Safely</strong> replaces the function call with the code<ul>
<li>Unlike a macro (<code>#define</code>)</li>
<li>Avoids the overhead of creating a stack frame</li>
<li>Code gets included in EVERY file/function which calls it</li>
</ul>
</li>
<li>VERY useful for smal<strong>l, fast</strong> functions</li>
</ul>
<p><strong>Defining</strong> functions <strong>within</strong> the class declaration <strong>implicitly</strong> makes them inline</p>
<p>Function set default value for parameters in <strong>declaration</strong>.</p>
<h3 id="Lecture8"><a href="#Lecture8" class="headerlink" title="Lecture8"></a>Lecture8</h3><h5 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h5><p>A way to give a new name to an item<br><figure class="highlight matlab"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">int <span class="built_in">i</span> = <span class="number">1</span>;</div><div class="line">int& <span class="built_in">j</span> = <span class="built_in">i</span>;</div></pre></td></tr></table></figure></p>
<p>References always have to refer to something </p>
<ul>
<li>Must give them a thing to refer to on initialisation </li>
<li>No such thing as a NULL reference<blockquote>
<p>do NOT return a reference to a local variable</p>
</blockquote>
</li>
</ul>
<h5 id="The-need-for-references"><a href="#The-need-for-references" class="headerlink" title="The need for references"></a>The need for references</h5><ul>
<li>Useful if we need to keep the same syntax</li>
<li>Useful as return values, to chain functions together</li>
<li>References are <strong>necessary</strong> for operator overloading</li>
</ul>
<h5 id="Passing-parameters"><a href="#Passing-parameters" class="headerlink" title="Passing parameters"></a>Passing parameters</h5><ul>
<li>When a function is called, the values of the parameters are <strong>copied</strong> into the stack frame for the new function</li>
</ul>
<h5 id="New-and-Delete"><a href="#New-and-Delete" class="headerlink" title="New and Delete"></a>New and Delete</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=ef32056ce228ec5b633460e63656994c" alt="ef32056ce228ec5b633460e63656994c.png"><br><figure class="highlight vbnet"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">MyClass</span>* pOb = <span class="keyword">new</span> <span class="keyword">MyClass</span>;</div><div class="line">delete pOb;</div><div class="line"><span class="keyword">MyClass</span>* pObArray = <span class="keyword">new</span> <span class="keyword">MyClass</span>[<span class="number">4</span>];</div><div class="line">delete [] pObArray;</div></pre></td></tr></table></figure></p>
<p>delete destroys an object </p>
<ul>
<li>It cares about the object type</li>
<li>Calls the <strong>destructor</strong> of the class it thinks the thing is (using pointer type) <strong>and the</strong>n frees the memory<blockquote>
<ul>
<li>You MUST <code>delete</code> anything which you create<br>using new</li>
<li>You MUST <code>delete [] ...</code> any arrays which you create using <code>new ... []</code></li>
<li>You MUST <code>free</code> any memory which you<code>malloc</code>/<code>alloc</code>/<code>calloc</code>/<code>realloc</code></li>
</ul>
</blockquote>
</li>
</ul>
<p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=24e0bd55dd6171f5d3036f058584c8bf" alt="24e0bd55dd6171f5d3036f058584c8bf.png"></p>
<blockquote>
<p>If you want to <strong>create</strong> objects <strong>in dynamic memory</strong> then you <strong>must</strong> go through <code>new</code><br>You can use <code>new</code> on basic types (e.g.int)<br>Array <code>new []</code> uses the default constructor for objects, and does not initialise basic types</p>
</blockquote>
<p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=cb30edd5ec403dbf58ac40a90c20178e" alt="cb30edd5ec403dbf58ac40a90c20178e.png"></p>
<h5 id="Lecture-9"><a href="#Lecture-9" class="headerlink" title="Lecture 9"></a>Lecture 9</h5><h5 id="this-and-static"><a href="#this-and-static" class="headerlink" title="this and static"></a>this and static</h5><p>Static member functions do not have a <code>this</code> pointer<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=67c0ba8529a038b39d516e37f601c6e1" alt="67c0ba8529a038b39d516e37f601c6e1.png"></p>
<h5 id="const"><a href="#const" class="headerlink" title="const"></a>const</h5><p> Pointers to constant data<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">const</span> <span class="keyword">char</span> * p=“Hello”; </div><div class="line"><span class="keyword">char</span> <span class="keyword">const</span> * p=“Hello”;</div></pre></td></tr></table></figure></p>
<p> Constant pointers</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">char</span>* <span class="keyword">const</span> p = “Hello”;</div></pre></td></tr></table></figure>
<p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=ff801fa4ef0ecfb70a1db868e7ea273f" alt="ff801fa4ef0ecfb70a1db868e7ea273f.png"></p>
<h5 id="String-literal"><a href="#String-literal" class="headerlink" title="String literal"></a>String literal</h5><p>String literals should not be changed<br><figure class="highlight processing"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">const</span> <span class="built_in">char</span>* <span class="built_in">str</span> = “Hello”;</div></pre></td></tr></table></figure></p>
<h5 id="const-references"><a href="#const-references" class="headerlink" title="const references"></a>const references</h5><ul>
<li><code>const</code> references make the thing referred to const</li>
<li><code>const</code> references are useful for parameters<ul>
<li>Passing by value (not reference) means the original variable (safer)<br>cannot be accidentally modified </li>
<li>Passing a reference means that no copy is made (maybe quicker)</li>
</ul>
</li>
<li>Using a const reference means no copy needs to be made, but the original can still not be changed, <strong>like a copy but faster</strong><br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=80f3cb928a8018b98d3d8c668ff8f90e" alt="80f3cb928a8018b98d3d8c668ff8f90e.png"></li>
</ul>
<h5 id="mutable"><a href="#mutable" class="headerlink" title="mutable"></a>mutable</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=0d8cd472d9a6254ba005ecf8e110fa2b" alt="0d8cd472d9a6254ba005ecf8e110fa2b.png"></p>
<p>提前 奶一口 const 就能改了</p>
<h5 id="friend"><a href="#friend" class="headerlink" title="friend"></a>friend</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=f50408dc9ca5f56cbfb1597f1888c204" alt="f50408dc9ca5f56cbfb1597f1888c204.png"></p>
<p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=20a5378bac3d99f5ce1e54ac8339dc3c" alt="20a5378bac3d99f5ce1e54ac8339dc3c.png"></p>
<p>friend 写在 被用的那个class里,就可以访问private的了</p>
<h3 id="Lecture-10"><a href="#Lecture-10" class="headerlink" title="Lecture 10"></a>Lecture 10</h3><h5 id="Namespace"><a href="#Namespace" class="headerlink" title="Namespace"></a>Namespace</h5><p>Namespaces are used to avoid name conflicts </p>
<ul>
<li>Only the name is affected<br><code>namespace <NamespaceName>{}</code></li>
</ul>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><namespace><span class="symbol">:</span><span class="symbol">:<class></span><span class="symbol">:</span><span class="symbol">:<function></span></div><div class="line"><span class="symbol">MyNameSpace:</span><span class="symbol">:MyClass</span><span class="symbol">:</span><span class="symbol">:foo</span>();</div><div class="line"><namespace><span class="symbol">:</span><span class="symbol">:<globalfunction></span> </div><div class="line"><span class="symbol">MyNameSpace:</span><span class="symbol">:bar</span>();</div><div class="line"></div><div class="line">using namespace <namespace></div></pre></td></tr></table></figure>
<h5 id="scoping"><a href="#scoping" class="headerlink" title="scoping"></a>scoping</h5><p><code>::</code>Left of scoping operator is</p>
<ul>
<li><strong>blank</strong> (to access a global variable/function)</li>
<li><strong>class name</strong> (to access member of that class)</li>
<li><strong>namespace name</strong> (to use that namespace)</li>
</ul>
<h5 id="streams-for-input-output"><a href="#streams-for-input-output" class="headerlink" title="streams for input/output"></a>streams for input/output</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=7e47ed3f2786a6f2b291711287938712" alt="7e47ed3f2786a6f2b291711287938712.png"></p>
<h5 id="File-access-using-streams"><a href="#File-access-using-streams" class="headerlink" title="File access using streams"></a>File access using streams</h5><ul>
<li><code>ifstream</code> object - open the file for input</li>
<li><code>ofstream</code> object - open the file for output</li>
<li><code>fstream</code> object – specify what to open file for</li>
</ul>
<h5 id="stringstream"><a href="#stringstream" class="headerlink" title="stringstream"></a>stringstream</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=083ab4900f76d981996bd34eba875257" alt="083ab4900f76d981996bd34eba875257.png"></p>
<h3 id="Lecture-11"><a href="#Lecture-11" class="headerlink" title="Lecture 11"></a>Lecture 11</h3><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=44e5ec986fe4f5ade5424f8ebaf8dc8b" alt="44e5ec986fe4f5ade5424f8ebaf8dc8b.png"></p>
<p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=4c71ba063f5c40c8849d84cc4a574e6b" alt="4c71ba063f5c40c8849d84cc4a574e6b.png"></p>
<p>没有virtual的时候<code>pSubAsBase->foo()</code>是调用父类的<br>如果父类方法 virtual之后,再这么访问,要看<code>pSubAsBase</code>到底是什么class</p>
<p>vitual 之后想用父类的function 就要 用到 <code>::</code><br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=cb89b4a32cd281517449b5e582872cdc" alt="cb89b4a32cd281517449b5e582872cdc.png"></p>
<p>1 2 3<br>4 5 6</p>
<h5 id="Inheritance-and-constructors"><a href="#Inheritance-and-constructors" class="headerlink" title="Inheritance and constructors"></a>Inheritance and constructors</h5><p>create in stack<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=1f77f23c106a84a64a598ba9ee7a9435" alt="1f77f23c106a84a64a598ba9ee7a9435.png"></p>
<p>create in heap<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=b30b898d6bf1d16929d372beee785e65" alt="b30b898d6bf1d16929d372beee785e65.png"></p>
<ul>
<li>Do not call virtual functions from the constructor or destructor</li>
</ul>
<p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=2dddaf0fd087702683124fbe82e56537" alt="2dddaf0fd087702683124fbe82e56537.png"></p>
<p>想要也删掉sub的,把父类的destructor加virtual<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=8ef4ca3a01b939007a0f2de0cfef5fa2" alt="8ef4ca3a01b939007a0f2de0cfef5fa2.png"></p>
<h3 id="Lecture-13"><a href="#Lecture-13" class="headerlink" title="Lecture 13"></a>Lecture 13</h3><h5 id="Function-pointers"><a href="#Function-pointers" class="headerlink" title="Function pointers"></a>Function pointers</h5><p> Function pointers<br> <img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=239761c804da4fbc17d87e8985b2148f" alt="239761c804da4fbc17d87e8985b2148f.png"></p>
<p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=1c52f0decc3f8b926dd9ae46068266de" alt="1c52f0decc3f8b926dd9ae46068266de.png"></p>
<p> 括号里是paraeter</p>
<ul>
<li>callback function<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=088270f898f3aff1ce3a8cf83c9fae60" alt="088270f898f3aff1ce3a8cf83c9fae60.png"></li>
</ul>
<h5 id="Virtual-and-non-virtual-functions"><a href="#Virtual-and-non-virtual-functions" class="headerlink" title="Virtual and non-virtual functions"></a>Virtual and non-virtual functions</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=3975d70c9da8d9aed62fdb091e6d86d5" alt="3975d70c9da8d9aed62fdb091e6d86d5.png"></p>
<h3 id="Lecture-14"><a href="#Lecture-14" class="headerlink" title="Lecture 14"></a>Lecture 14</h3><p>4 functions created by default <strong>if needed</strong></p>
<ul>
<li>You can make them unavailable (e.g. private)</li>
</ul>
<blockquote>
<ol>
<li>A defaul tconstructor(no parameters needed) </li>
<li>A copy constructor (copy one object to another)</li>
<li>An assignment operator (=operator)</li>
<li>A destructor</li>
</ol>
</blockquote>
<h5 id="A-default-constructor"><a href="#A-default-constructor" class="headerlink" title="A default constructor"></a>A default constructor</h5><ul>
<li>Automatically created <strong>if and only if</strong> you do NOT create any other constructors</li>
</ul>
<h5 id="The-Copy-Constructor"><a href="#The-Copy-Constructor" class="headerlink" title="The Copy Constructor"></a>The Copy Constructor</h5><ul>
<li><p>The <strong>copy constructor</strong> is used to <strong>initialise</strong> one object from another <strong>of the same type</strong></p>
<figure class="highlight nimrod"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="type">MyClass</span>( <span class="keyword">const</span> <span class="type">MyClass</span>& rhs )</div><div class="line"><span class="meta">{...}</span></div></pre></td></tr></table></figure>
</li>
<li><p>Takes a <strong>constant reference</strong> to the object to copy from</p>
</li>
<li><strong>Has to be a reference!</strong><br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=ff34c6d257eb117256d4547061d4d722" alt="ff34c6d257eb117256d4547061d4d722.png"></li>
</ul>
<h5 id="Assignment-operator"><a href="#Assignment-operator" class="headerlink" title="Assignment operator"></a>Assignment operator</h5><ul>
<li>Used when value of one object is assigned to another</li>
<li><code>ob1=ob2=ob3=ob4;</code></li>
<li><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=ddd6c53e9de96359d88867c23e79e495" alt="ddd6c53e9de96359d88867c23e79e495.png"></li>
</ul>
<h5 id="Destructor"><a href="#Destructor" class="headerlink" title="Destructor"></a>Destructor</h5><ul>
<li><strong>Default destructor does nothing</strong></li>
</ul>
<h5 id="Conversion-constructor"><a href="#Conversion-constructor" class="headerlink" title="Conversion constructor"></a>Conversion constructor</h5><ul>
<li>A conversion constructor is <strong>a constructor with one parameter.</strong><figure class="highlight lasso"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">MyClass( char c )</div><div class="line">{ <span class="params">...</span> <span class="keyword">do</span> something <span class="keyword">with</span> c <span class="params">...</span> }</div><div class="line">MyClass ob = ‘h’;</div></pre></td></tr></table></figure>
</li>
</ul>
<p>int 就可以这么用<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=09b26709fb14dc3f167476cae7b9da90" alt="09b26709fb14dc3f167476cae7b9da90.png"></p>
<h5 id="conversion-operator"><a href="#conversion-operator" class="headerlink" title="conversion operator"></a>conversion operator</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=410f5e9fca1f84660a1aedb7ff0ab2a3" alt="410f5e9fca1f84660a1aedb7ff0ab2a3.png"></p>
<p><code>explict</code><br>Providing a <strong>one-parameter</strong> constructor provides a conversion constructor<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=d8eddd2eb7ccb5d66c95a990e6f558f6" alt="d8eddd2eb7ccb5d66c95a990e6f558f6.png"></p>
<h3 id="Lecture-15"><a href="#Lecture-15" class="headerlink" title="Lecture 15"></a>Lecture 15</h3><h5 id="Casting"><a href="#Casting" class="headerlink" title="Casting"></a>Casting</h5><ul>
<li>static cast</li>
<li>dynamic cast</li>
<li>const cast</li>
<li>reinterpret cast</li>
</ul>
<p>casting-ness是强转比如<code>int& xr = (int&)(x);</code>,尽量避免<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=c07fbdb853c44fd167b8888c3ac56c1c" alt="c07fbdb853c44fd167b8888c3ac56c1c.png"></p>
<p>dynamic 失败的时候会抛出exception 所以,sub base class转的时候。用dynamic.<br>Pointer:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">BouncingBall game;</div><div class="line">BaseEngine* pGame = &game; <span class="comment">// No cast</span></div><div class="line">BouncingBall* pmGame =</div><div class="line"> <span class="keyword">dynamic_cast</span><BouncingBall*>(pGame);</div><div class="line"><span class="keyword">if</span> ( pGame==<span class="literal">NULL</span> ) { <span class="comment">/* Failed */</span> }</div></pre></td></tr></table></figure></p>
<p>Reference:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">BouncingBall game;</div><div class="line">BaseGameEngine& rgame = game; <span class="comment">// No cast</span></div><div class="line"><span class="keyword">try</span></div><div class="line">{</div><div class="line">BouncingBall& rmgame =</div><div class="line"> <span class="keyword">dynamic_cast</span><BouncingBall&>(rgame);</div><div class="line">}</div><div class="line"><span class="keyword">catch</span> ( <span class="built_in">std</span>::bad_cast b )</div><div class="line">{</div><div class="line"><span class="comment">// Handle the exception</span></div><div class="line"><span class="comment">// Happens if rgame is NOT a BouncingBall</span></div><div class="line">}</div></pre></td></tr></table></figure></p>
<h5 id="Operator-overloading"><a href="#Operator-overloading" class="headerlink" title="Operator overloading"></a>Operator overloading</h5><p>non-mumber function<br>别忘了<code>friend</code><br><figure class="highlight maxima"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">MyFloat operator-( const MyFloat& <span class="built_in">lhs</span>, const MyFloat& <span class="built_in">rhs</span> ) {</div><div class="line">MyFloat temp(<span class="built_in">lhs</span>.strName + <span class="string">"-"</span> + <span class="built_in">rhs</span>.strName, <span class="built_in">lhs</span>.f - <span class="built_in">rhs</span>.f);</div><div class="line"><span class="built_in">return</span> temp;</div></pre></td></tr></table></figure></p>
<p>mumber function<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=98fb08771a499045421cb166a5326e61" alt="98fb08771a499045421cb166a5326e61.png"></p>
<h5 id="Operator-overloading-restrictions"><a href="#Operator-overloading-restrictions" class="headerlink" title="Operator overloading restrictions"></a>Operator overloading restrictions</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=3fafe3eab0ac9eb02564851e864d379d" alt="3fafe3eab0ac9eb02564851e864d379d.png"></p>
<p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=e62601d73c46a1511c4f35975a0364fc" alt="e62601d73c46a1511c4f35975a0364fc.png"></p>
<h3 id="Lecture-16"><a href="#Lecture-16" class="headerlink" title="Lecture 16"></a>Lecture 16</h3><h5 id="and"><a href="#and" class="headerlink" title="= and !="></a>= and !=</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=ce7266d4a5941b51140e0cdfd64cae07" alt="ce7266d4a5941b51140e0cdfd64cae07.png"></p>
<h5 id="and-1"><a href="#and-1" class="headerlink" title="+ and +="></a>+ and +=</h5><p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=6698812de9d8c1a0e15ef834e2416508" alt="6698812de9d8c1a0e15ef834e2416508.png"></p>
<h5 id="template"><a href="#template" class="headerlink" title="template"></a>template</h5><figure class="highlight r"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">template < typename <span class="literal">T</span> ></div><div class="line"><span class="literal">T</span> mymax( <span class="literal">T</span> a, <span class="literal">T</span> b )</div><div class="line">{ <span class="keyword">return</span> a > b ? a : b; }</div></pre></td></tr></table></figure>
<p>The compiler will a<strong>ctually generate the functions which are needed,</strong> according to the parameters</p>
<h3 id="Lecture-17"><a href="#Lecture-17" class="headerlink" title="Lecture 17"></a>Lecture 17</h3><h5 id="Functor"><a href="#Functor" class="headerlink" title="Functor"></a>Functor</h5><p>Functors are classes which overload the () operator<br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=3653bec9375b9a8abf3e4d3544ccecf6" alt="3653bec9375b9a8abf3e4d3544ccecf6.png"><br><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=f67a50564f89ddc4a3fc908866bf4824" alt="f67a50564f89ddc4a3fc908866bf4824.png"></p>
<h3 id="Lecture-18"><a href="#Lecture-18" class="headerlink" title="Lecture 18"></a>Lecture 18</h3><h5 id="How-do-we-report-errors"><a href="#How-do-we-report-errors" class="headerlink" title="How do we report errors?"></a>How do we report errors?</h5><ul>
<li>Return an error value from function</li>
<li>Set a global error code</li>
<li>Throw an exception (to report error)</li>
<li><h5 id="catch"><a href="#catch" class="headerlink" title="catch"></a>catch</h5></li>
<li><code>catch</code> clauses are ch<strong>ecked in the order in which they are encountered</strong></li>
<li>Exceptions are thrown by value</li>
<li>Catch by reference or by value would work - Catch by reference avoids the copy</li>
</ul>
<blockquote>
<p><code>catch ( ... )</code> will match ANY exception<br><code>catch ( BaseClass& b ) { }</code>will also catch sub-class objects<br><code>catch ( BaseClass* b ) { }</code>will also catch sub-class pointers</p>
</blockquote>
<h5 id="Lambda"><a href="#Lambda" class="headerlink" title="Lambda"></a>Lambda</h5><p>Lambdas are anonymous <strong>functors</strong> that get created on the fly</p>
<h5 id="Basic-lambda-function"><a href="#Basic-lambda-function" class="headerlink" title="Basic lambda function:"></a>Basic lambda function:</h5><figure class="highlight markdown"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[Capture] ( parameters ) -> return_type { function body }</div><div class="line">[<span class="string">iAdd</span>](<span class="link"> int i </span>)->int { return i + iAdd; }</div></pre></td></tr></table></figure>
<p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=34ec51d2072e535047267de18f4c70c8" alt="34ec51d2072e535047267de18f4c70c8.png"></p>
<p><img src="evernotecid://A4C2A14E-E2AB-40E7-9264-1D440DF81A61/appyinxiangcom/14488959/ENNote/p60?hash=376fe6aec0ddad80318bef110af99859" alt="376fe6aec0ddad80318bef110af99859.png"></p>
]]></content>
<summary type="html">
<h2 id="G52CPP"><a href="#G52CPP" class="headerlink" title="G52CPP"></a>G52CPP</h2><hr>
<h3 id="Lecture-1-amp-2"><a href="#Lecture-1-amp-2" class="headerlink" title="Lecture 1 &amp; 2"></a>Lecture 1 &amp; 2</h3><h5 id="Header"><a href="#Header" class="headerlink" title="Header"></a>Header</h5><figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span> <span class="comment">// C or C++</span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdio&gt;</span> <span class="comment">// C++</span></span></div></pre></td></tr></table></figure>
<p>reference 省去 copy的过程<br>What is usually in a header file?</p>
<ol>
<li>Function declarations</li>
<li>Macro definitions (#define)</li>
<li>Constant definitions</li>
<li>Possibly other things as well<blockquote>
<ol>
<li>Ensure that the header file #includes everything that it needs itself</li>
<li>Ensure that it doesn’t matter if the header file is #included multiple times</li>
<li>Ensure that header files can be included in any order</li>
</ol>
</summary>
<category term="笔记" scheme="http://www.barondu.com/categories/%E7%AC%94%E8%AE%B0/"/>
<category term="CPP" scheme="http://www.barondu.com/tags/CPP/"/>
<category term="C++" scheme="http://www.barondu.com/tags/C/"/>
</entry>
<entry>
<title>PyCharm运行TensorBoard时的小BUG</title>
<link href="http://www.barondu.com/2018/02/21/PyCharm%E8%BF%90%E8%A1%8CTensorBoard%E6%97%B6%E7%9A%84%E5%B0%8FBUG/"/>
<id>http://www.barondu.com/2018/02/21/PyCharm运行TensorBoard时的小BUG/</id>
<published>2018-02-21T08:03:41.000Z</published>
<updated>2019-07-01T20:49:14.000Z</updated>
<content type="html"><![CDATA[<h2 id="PyCharm运行TensorBoard时的小BUG"><a href="#PyCharm运行TensorBoard时的小BUG" class="headerlink" title="PyCharm运行TensorBoard时的小BUG"></a>PyCharm运行TensorBoard时的小BUG</h2><p>@(G53IDS)[PyCharm, TensorBoard, BUG]<br>今天在PyCharm的Terminal使用TensorBoard的时候出现了以下报错,但是mac自带的terminal却可以正常使用:</p>
<figure class="highlight vhdl"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"># tensorboard <span class="comment">--logdir=logs</span></div><div class="line">Traceback (most recent call last):</div><div class="line"> <span class="keyword">File</span> <span class="string">"/Users/baron/.pyenv/versions/3.6.3/bin/tensorboard"</span>, <span class="literal">line</span> <span class="number">11</span>, <span class="keyword">in</span> <module></div><div class="line"> sys.<span class="keyword">exit</span>(main())</div><div class="line"> <span class="keyword">File</span> <span class="string">"/Users/baron/.pyenv/versions/3.6.3/lib/python3.6/site-packages/tensorboard/main.py"</span>, <span class="literal">line</span> <span class="number">45</span>, <span class="keyword">in</span> main</div><div class="line"> <span class="keyword">default</span>.get_assets_zip_provider())</div><div class="line"> <span class="keyword">File</span> <span class="string">"/Users/baron/.pyenv/versions/3.6.3/lib/python3.6/site-packages/tensorboard/program.py"</span>, <span class="literal">line</span> <span class="number">147</span>, <span class="keyword">in</span> main</div><div class="line"> util.setup_logging()</div><div class="line"> <span class="keyword">File</span> <span class="string">"/Users/baron/.pyenv/versions/3.6.3/lib/python3.6/site-packages/tensorboard/util.py"</span>, <span class="literal">line</span> <span class="number">50</span>, <span class="keyword">in</span> setup_logging</div><div class="line"> locale.setlocale(locale.LC_ALL, '')</div><div class="line"> <span class="keyword">File</span> <span class="string">"/Users/baron/.pyenv/versions/3.6.3/lib/python3.6/locale.py"</span>, <span class="literal">line</span> <span class="number">598</span>, <span class="keyword">in</span> setlocale</div><div class="line"> <span class="keyword">return</span> _setlocale(category, locale)</div><div class="line">locale.<span class="literal">Error</span>: unsupported locale setting</div></pre></td></tr></table></figure>
<a id="more"></a>
<p>输入locale查看下是什么状况</p>
<figure class="highlight ini"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># locale</span></div><div class="line"><span class="attr">LANG</span>=</div><div class="line"><span class="attr">LC_COLLATE</span>=<span class="string">"C"</span></div><div class="line"><span class="attr">LC_CTYPE</span>=<span class="string">"C"</span></div><div class="line"><span class="attr">LC_MESSAGES</span>=<span class="string">"C"</span></div><div class="line"><span class="attr">LC_MONETARY</span>=<span class="string">"C"</span></div><div class="line"><span class="attr">LC_NUMERIC</span>=<span class="string">"C"</span></div><div class="line"><span class="attr">LC_TIME</span>=<span class="string">"C"</span></div><div class="line"><span class="attr">LC_ALL</span>=</div></pre></td></tr></table></figure>
<p>发现原来是语言设置除了问题,<code>LC_ALL</code>后面什么都没有,于是我们的解决办法就是</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">export</span> LC_ALL=<span class="string">"C"</span></div></pre></td></tr></table></figure>
<p>然后世界就和平了(。・ω・。)ノ</p>
]]></content>
<summary type="html">
<h2 id="PyCharm运行TensorBoard时的小BUG"><a href="#PyCharm运行TensorBoard时的小BUG" class="headerlink" title="PyCharm运行TensorBoard时的小BUG"></a>PyCharm运行TensorBoard时的小BUG</h2><p>@(G53IDS)[PyCharm, TensorBoard, BUG]<br>今天在PyCharm的Terminal使用TensorBoard的时候出现了以下报错,但是mac自带的terminal却可以正常使用:</p>
<figure class="highlight vhdl"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"># tensorboard <span class="comment">--logdir=logs</span></div><div class="line">Traceback (most recent call last):</div><div class="line"> <span class="keyword">File</span> <span class="string">"/Users/baron/.pyenv/versions/3.6.3/bin/tensorboard"</span>, <span class="literal">line</span> <span class="number">11</span>, <span class="keyword">in</span> &lt;module&gt;</div><div class="line"> sys.<span class="keyword">exit</span>(main())</div><div class="line"> <span class="keyword">File</span> <span class="string">"/Users/baron/.pyenv/versions/3.6.3/lib/python3.6/site-packages/tensorboard/main.py"</span>, <span class="literal">line</span> <span class="number">45</span>, <span class="keyword">in</span> main</div><div class="line"> <span class="keyword">default</span>.get_assets_zip_provider())</div><div class="line"> <span class="keyword">File</span> <span class="string">"/Users/baron/.pyenv/versions/3.6.3/lib/python3.6/site-packages/tensorboard/program.py"</span>, <span class="literal">line</span> <span class="number">147</span>, <span class="keyword">in</span> main</div><div class="line"> util.setup_logging()</div><div class="line"> <span class="keyword">File</span> <span class="string">"/Users/baron/.pyenv/versions/3.6.3/lib/python3.6/site-packages/tensorboard/util.py"</span>, <span class="literal">line</span> <span class="number">50</span>, <span class="keyword">in</span> setup_logging</div><div class="line"> locale.setlocale(locale.LC_ALL, '')</div><div class="line"> <span class="keyword">File</span> <span class="string">"/Users/baron/.pyenv/versions/3.6.3/lib/python3.6/locale.py"</span>, <span class="literal">line</span> <span class="number">598</span>, <span class="keyword">in</span> setlocale</div><div class="line"> <span class="keyword">return</span> _setlocale(category, locale)</div><div class="line">locale.<span class="literal">Error</span>: unsupported locale setting</div></pre></td></tr></table></figure>
</summary>
<category term="随笔" scheme="http://www.barondu.com/categories/%E9%9A%8F%E7%AC%94/"/>
<category term="Machine Learning" scheme="http://www.barondu.com/tags/Machine-Learning/"/>
<category term="TensorFlow" scheme="http://www.barondu.com/tags/TensorFlow/"/>
<category term="pyenv" scheme="http://www.barondu.com/tags/pyenv/"/>
<category term="PyCharm" scheme="http://www.barondu.com/tags/PyCharm/"/>
</entry>
<entry>
<title>Hexo以及yilia主题个性化设置</title>
<link href="http://www.barondu.com/2017/11/26/Hexo%E4%BB%A5%E5%8F%8Ayilia%E4%B8%BB%E9%A2%98%E4%B8%AA%E6%80%A7%E5%8C%96%E8%AE%BE%E7%BD%AE/"/>
<id>http://www.barondu.com/2017/11/26/Hexo以及yilia主题个性化设置/</id>
<published>2017-11-25T19:11:27.000Z</published>
<updated>2019-07-01T21:24:56.000Z</updated>
<content type="html"><![CDATA[<h1 id="Hexo以及yilia主题个性化设置"><a href="#Hexo以及yilia主题个性化设置" class="headerlink" title="Hexo以及yilia主题个性化设置"></a>Hexo以及yilia主题个性化设置</h1><h3 id="修改浏览器Tab里的icon"><a href="#修改浏览器Tab里的icon" class="headerlink" title="修改浏览器Tab里的icon"></a>修改浏览器Tab里的icon</h3><p>修改后效果如下<br><img src="https://app.yinxiang.com/shard/s67/res/b7a1bfae-d09c-4a00-be66-a474d57e6378/20171123140602_rXDDHa_Screenshot.jpg" alt="aaaaa"></p>
<ul>
<li>很简单我们只需要在yilia主题里<code>_config.yml</code>文件里修改为<code>favicon: /img/favicon.ico</code></li>
<li>将自己想要的icon,转换成<code>.ico</code>格式修改命名放在<code>yilia/sourse/img</code>里,大功告成</li>
</ul>
<a id="more"></a>
<h3 id="添加评论模块"><a href="#添加评论模块" class="headerlink" title="添加评论模块"></a>添加评论模块</h3><p>评论系统真的是折腾死我了,国内第三方免费平台接连停止服务</p>
<h4 id="都有那些常用的评论系统"><a href="#都有那些常用的评论系统" class="headerlink" title="都有那些常用的评论系统"></a>都有那些常用的评论系统</h4><ul>
<li>最开始用的<strong>多说</strong>,省心免费虽然总是挂掉,今年7月份就停止服务了</li>
<li><strong>网易云跟帖</strong>也宣布即将停止服务。<br>Gitment是一款一款基于GitHub Issues 的评论系统,所以只能用GitHub帐号登录</li>
<li><strong>Disqus</strong>则已经被墙</li>
<li>目前可选择的评论系统还有<strong>友言</strong>,<strong>畅言</strong>,<strong>来必力</strong>等</li>
<li><strong>畅言</strong>最蛋疼的是需要你的域名已经在国内备案过(内心飘过一万只草泥马</li>
</ul>
<h4 id="如何添加来必力评论系统"><a href="#如何添加来必力评论系统" class="headerlink" title="如何添加来必力评论系统"></a>如何添加来必力评论系统</h4><p>我最终选择了<a href="https://livere.com/" target="_blank" rel="external">来必力</a>,虽然它总公司是韩国的,但是看在免费且支持的第三方登录的种类的面子上,就选它了。</p>
<ol>
<li>注册帐户,登录选择个人网站安装city免费版就好,复制它给你的安装代码</li>
</ol>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line"><span class="comment"><!-- 来必力City版安装代码 --></span></div><div class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"lv-container"</span> <span class="attr">data-id</span>=<span class="string">"city"</span> <span class="attr">data-uid</span>=<span class="string">"切记这里改成你账户里自己的ID"</span>></span></div><div class="line"><span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>></span><span class="javascript"></span></div><div class="line"> (<span class="function"><span class="keyword">function</span>(<span class="params">d, s</span>) </span>{</div><div class="line"> <span class="keyword">var</span> j, e = d.getElementsByTagName(s)[<span class="number">0</span>];</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (<span class="keyword">typeof</span> LivereTower === <span class="string">'function'</span>) { <span class="keyword">return</span>; }</div><div class="line"></div><div class="line"> j = d.createElement(s);</div><div class="line"> j.src = <span class="string">'https://cdn-city.livere.com/js/embed.dist.js'</span>;</div><div class="line"> j.async = <span class="literal">true</span>;</div><div class="line"></div><div class="line"> e.parentNode.insertBefore(j, e);</div><div class="line"> })(<span class="built_in">document</span>, <span class="string">'script'</span>);</div><div class="line"><span class="tag"></<span class="name">script</span>></span></div><div class="line"><span class="tag"><<span class="name">noscript</span>></span>为正常使用来必力评论功能请激活JavaScript<span class="tag"></<span class="name">noscript</span>></span></div><div class="line"><span class="tag"></<span class="name">div</span>></span></div><div class="line"><span class="comment"><!-- City版安装代码已完成 --></span></div></pre></td></tr></table></figure>
<ol>
<li>在<code>themes\yilia\layout\_partial\post</code> 目录下<br>新建一个livere.ejs文件,粘贴之前的安装代码然后save</li>
<li>在<code>themes\yilia\_config.yml</code>里<code>duoshuo: false</code>前添加<code>livere: true</code>注意顺序</li>
<li><code>themes\yilia\layout\_partial\article.ejs</code>中<br><code><% if (!index && post.comments){ %></code>这行代码下面添加</li>
</ol>
<figure class="highlight gcode"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><<span class="meta">%</span> <span class="keyword">if</span> <span class="comment">(theme.livere)</span>{ <span class="meta">%</span>></div><div class="line"><<span class="meta">%</span>- partial<span class="comment">('post/livere', {</span></div><div class="line"> key: post.slug,</div><div class="line"> title: post.title,</div><div class="line"> url: config.url+url_for(post.path)</div><div class="line"> }) <span class="meta">%</span>></div><div class="line"><<span class="meta">%</span> } <span class="meta">%</span>></div></pre></td></tr></table></figure>
<ol>
<li>Done!</li>
</ol>
]]></content>
<summary type="html">
<h1 id="Hexo以及yilia主题个性化设置"><a href="#Hexo以及yilia主题个性化设置" class="headerlink" title="Hexo以及yilia主题个性化设置"></a>Hexo以及yilia主题个性化设置</h1><h3 id="修改浏览器Tab里的icon"><a href="#修改浏览器Tab里的icon" class="headerlink" title="修改浏览器Tab里的icon"></a>修改浏览器Tab里的icon</h3><p>修改后效果如下<br><img src="https://app.yinxiang.com/shard/s67/res/b7a1bfae-d09c-4a00-be66-a474d57e6378/20171123140602_rXDDHa_Screenshot.jpg" alt="aaaaa"></p>
<ul>
<li>很简单我们只需要在yilia主题里<code>_config.yml</code>文件里修改为<code>favicon: /img/favicon.ico</code></li>
<li>将自己想要的icon,转换成<code>.ico</code>格式修改命名放在<code>yilia/sourse/img</code>里,大功告成</li>
</ul>
</summary>
<category term="随笔" scheme="http://www.barondu.com/categories/%E9%9A%8F%E7%AC%94/"/>
<category term="Hexo" scheme="http://www.barondu.com/tags/Hexo/"/>
<category term="yilia" scheme="http://www.barondu.com/tags/yilia/"/>
<category term="blog" scheme="http://www.barondu.com/tags/blog/"/>
</entry>
<entry>
<title>Installing TensorFlow</title>
<link href="http://www.barondu.com/2017/11/17/TensorFlow/"/>
<id>http://www.barondu.com/2017/11/17/TensorFlow/</id>
<published>2017-11-17T11:43:51.000Z</published>
<updated>2019-07-01T22:12:29.000Z</updated>
<content type="html"><![CDATA[<h1 id="TensorFlow"><a href="#TensorFlow" class="headerlink" title="TensorFlow"></a>TensorFlow</h1><h2 id="配置环境"><a href="#配置环境" class="headerlink" title="配置环境"></a>配置环境</h2><p>我的环境是 macOS Sierra 10.12.6,其他mac版本应该也适用。</p>
<h3 id="pyenv"><a href="#pyenv" class="headerlink" title="pyenv"></a>pyenv</h3><p>安装<a href="https://github.com/pyenv/pyenv" target="_blank" rel="external">pyenv</a> 管理多版本 python,通过它安装 python。原因是不希望污染mac自带系统python。详细过程参考官方doc,这里描述一下我的安装过程。</p>
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=518894283&auto=1&height=66"></iframe>
<embed src="https://emumo.xiami.com/widget/291251140_1775818238/singlePlayer.swf" type="application/x-shockwave-flash" width="257" height="33" wmode="transparent">
<ol>
<li>安装:</li>
</ol>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># 使用git安装</span></div><div class="line"><span class="variable">$ </span>git clone <span class="symbol">https:</span>/<span class="regexp">/github.com/pyenv</span><span class="regexp">/pyenv.git ~/</span>.pyenv</div><div class="line"><span class="comment"># 使用Homebrew on Mac OS X 安装</span></div><div class="line"><span class="variable">$ </span>brew update</div><div class="line"><span class="variable">$ </span>brew install pyenv</div></pre></td></tr></table></figure>
<p>没有<a href="https://brew.sh/" title="Homebrew" target="_blank" rel="external">Homebrew</a>请安装并更新<br><a id="more"></a></p>
<figure class="highlight julia"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># 配置pyenv的环境,</span></div><div class="line">$ echo '<span class="keyword">export</span> PYENV_ROOT=<span class="string">"<span class="variable">$HOME</span>/.pyenv"</span>' >> ~/.bash_profile</div><div class="line">$ echo '<span class="keyword">export</span> PATH=<span class="string">"<span class="variable">$PYENV_ROOT</span>/bin:<span class="variable">$PATH</span>"</span>' >> ~/.bash_profile</div><div class="line">$ echo -<span class="literal">e</span> '<span class="keyword">if</span> command -v pyenv <span class="number">1</span>>/dev/null <span class="number">2</span>>&<span class="number">1</span>; then\n eval <span class="string">"<span class="subst">$(pyenv init -)</span>"</span>\nfi' >> ~/.bash_profile</div><div class="line">$ echo -<span class="literal">e</span> '<span class="keyword">if</span> command -v pyenv <span class="number">1</span>>/dev/null <span class="number">2</span>>&<span class="number">1</span>; then\n eval <span class="string">"<span class="subst">$(pyenv init -)</span>"</span>\nfi' >> ~/.bash_profile</div><div class="line">$ exec <span class="string">"<span class="variable">$SHELL</span>"</span></div></pre></td></tr></table></figure>
<p>这里的 shell 配置文件(~/.bash_profile)依不同 Linux 而需作修改,如果使用 Zsh 则需要相应的配置 ~/.zshrc 详情见<a href="https://github.com/pyenv/pyenv" target="_blank" rel="external">官方doc</a></p>
<ol>
<li>用pyenv安装python</li>
</ol>
<figure class="highlight lsl"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ pyenv install <span class="number">3.6</span><span class="number">.3</span></div></pre></td></tr></table></figure>
<p>pyenv的常用指令</p>
<p><img src="https://app.yinxiang.com/shard/s67/res/c8088c9c-9d3e-43d5-856b-7696457021b0/20171118172703_TsVcPT_Screenshot.jpg" alt="6623c3697be87f3452b4c2e79403010b.jpeg">s</p>
<p>更多关于pyenv的使用大家可以参考这篇文章<a href="http://einverne.github.io/post/2017/04/pyenv.html" target="_blank" rel="external">使用 pyenv 管理 Python 版本 </a><br>查看当前python版本和路径<br><figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">pyenv versions</div><div class="line"> <span class="keyword">system</span></div><div class="line">* <span class="number">3.6</span><span class="number">.3</span> (<span class="built_in">set</span> <span class="keyword">by</span> /Users/baron/.pyenv/<span class="built_in">version</span>)</div></pre></td></tr></table></figure></p>
<h3 id="TensorfFlow-安装"><a href="#TensorfFlow-安装" class="headerlink" title="TensorfFlow 安装"></a>TensorfFlow 安装</h3><ul>
<li>最简单的办法是从<a href="*https://www.tensorflow.org/install/">官网</a>下载TensorFlow直接安装</li>
<li>当然我们也可以追求性能用源码安装,这里是<a href="https://www.tensorflow.org/install/install_sources" target="_blank" rel="external">官方文档</a></li>
<li>这里介绍CPU版本的安装,GPU版本还需要CUDA和Xcode的环境,这里有关于<a href="https://www.tensorflow.org/install/install_mac#NVIDIARequirements" target="_blank" rel="external">GPU版本安装的解释</a></li>
</ul>
<figure class="highlight vala"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div></pre></td><td class="code"><pre><div class="line"><span class="meta"># 安装 bazel</span></div><div class="line">brew update && brew install bazel</div><div class="line"></div><div class="line"><span class="meta"># 安装 python dependencies分别是six numpy wheel</span></div><div class="line"></div><div class="line"><span class="meta"># python 2.x pip用以下指令</span></div><div class="line">sudo -H pip install six numpy wheel </div><div class="line"></div><div class="line"><span class="meta"># python 3.x pip3 用以下指令</span></div><div class="line">sudo -H pip3 install six numpy wheel </div><div class="line"></div><div class="line"><span class="meta"># 下载源码</span></div><div class="line">git clone https:<span class="comment">//github.com/tensorflow/tensorflow</span></div><div class="line"></div><div class="line"><span class="meta"># 如果使用pyenv之后 建议clone在pyenv的python子文件夹下 </span></div><div class="line"><span class="meta"># cd 到路径,以下是我的tensflow的路径</span></div><div class="line">cd /Users/baron/.pyenv/versions/<span class="number">3.6</span><span class="number">.3</span>/lib/python3<span class="number">.6</span>/site-packages/tensorflow</div><div class="line"></div><div class="line"><span class="meta"># 配置编译文件,基本默认选项,建议仔细看下,官方doc有解释,路径一定要注意,tensflow在那个pyrthon下,写哪个python路径</span></div><div class="line"><span class="meta"># 因为需要下载一些文件,需要开翻墙</span></div><div class="line">./configure</div><div class="line"></div><div class="line"><span class="meta"># 编译没有 GPU 支持版本,很漫长,编译了将近一个小时</span></div><div class="line">bazel build --config=opt <span class="comment">//tensorflow/tools/pip_package:build_pip_package</span></div><div class="line"></div><div class="line"><span class="meta"># 打包到/tmp/tensorflow_pkg下</span></div><div class="line">bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg</div><div class="line"></div><div class="line"><span class="meta"># 查看包名</span></div><div class="line">ls -alh /tmp/tensorflow_pkg</div><div class="line"></div><div class="line"><span class="meta"># 用pip或pip3安装,后面的包名替换成泥自己编译后的</span></div><div class="line">pip3 install /tmp/tensorflow_pkg/tensorflow<span class="number">-1.0</span><span class="number">.0</span>-cp36-cp36m-macosx_10_11_x86_64.whl</div></pre></td></tr></table></figure>
<p>在安装报错的时候,尝试加上<code>sudo</code>,若还是不行使用<code>sudo -H</code>,我就因为这个问题耽误好久。<br>注意所有路径问题,编译时显示路径不对,请cd或者更改到你TensorFlow的实际路径</p>
<h3 id="直接安装他人编译好的版本"><a href="#直接安装他人编译好的版本" class="headerlink" title="直接安装他人编译好的版本"></a>直接安装他人编译好的版本</h3><p>可以在<a href="https://github.com/lakshayg/tensorflow-build" target="_blank" rel="external">这里</a>下载别人已经编译好的<code>.whl</code>文件来安装或者更新,注意自己的python版本和TensorFlow版本以及系统</p>
<h3 id="检测和更新"><a href="#检测和更新" class="headerlink" title="检测和更新"></a>检测和更新</h3><p>最后进入IDE,python shell或者terminal 用pyenv选择你安装了tensorflow的python版本</p>
<figure class="highlight ruby"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">workon ml</div><div class="line">python</div><div class="line"><span class="comment"># 进入 python repl 环境</span></div><div class="line"><span class="meta">>></span>> import tensorflow as tf</div><div class="line"><span class="meta">>></span>> hello = tf.constant(<span class="string">'Hello, TensorFlow!'</span>)</div><div class="line"><span class="meta">>></span>> sess = tf.Session()</div><div class="line"><span class="meta">>></span>> print(sess.run(hello))</div><div class="line">b<span class="string">'Hello, TensorFlow!'</span></div></pre></td></tr></table></figure>
<h4 id="更新"><a href="#更新" class="headerlink" title="更新"></a>更新</h4><p>对于有强迫症的小伙伴(譬如我<br>更新是必不可少的^_^</p>
<figure class="highlight tcl"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># 更新brew安装过的一切</span></div><div class="line">brew <span class="keyword">update</span></div><div class="line"><span class="comment"># 查看pip安装过的所有包</span></div><div class="line">pip3 <span class="keyword">list</span> --<span class="keyword">format</span>=columns</div><div class="line"><span class="comment"># 查看pip安装过的且需要更新的包</span></div><div class="line">pip3 <span class="keyword">list</span> --outdated --<span class="keyword">format</span>=columns</div><div class="line"><span class="comment"># 一个个输入包名更新就好了</span></div><div class="line">sudo -H pip3 install -U 包名</div></pre></td></tr></table></figure>
<h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ol>
<li><a href="https://www.tensorflow.org/install/install_sources#prepare_environment_for_mac_os" target="_blank" rel="external">Installing TensorFlow from Sources</a></li>
<li><a href="https://gist.github.com/cosmtrek/91d921bc1c45f30de38b689965ab2236" target="_blank" rel="external">源码安装 TensorFlow for Mac OS X</a></li>
</ol>
]]></content>
<summary type="html">
<h1 id="TensorFlow"><a href="#TensorFlow" class="headerlink" title="TensorFlow"></a>TensorFlow</h1><h2 id="配置环境"><a href="#配置环境" class="headerlink" title="配置环境"></a>配置环境</h2><p>我的环境是 macOS Sierra 10.12.6,其他mac版本应该也适用。</p>
<h3 id="pyenv"><a href="#pyenv" class="headerlink" title="pyenv"></a>pyenv</h3><p>安装<a href="https://github.com/pyenv/pyenv">pyenv</a> 管理多版本 python,通过它安装 python。原因是不希望污染mac自带系统python。详细过程参考官方doc,这里描述一下我的安装过程。</p>
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="//music.163.com/outchain/player?type=2&id=518894283&auto=1&height=66"></iframe>
<embed src="https://emumo.xiami.com/widget/291251140_1775818238/singlePlayer.swf" type="application/x-shockwave-flash" width="257" height="33" wmode="transparent"></embed>
<ol>
<li>安装:</li>
</ol>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># 使用git安装</span></div><div class="line"><span class="variable">$ </span>git clone <span class="symbol">https:</span>/<span class="regexp">/github.com/pyenv</span><span class="regexp">/pyenv.git ~/</span>.pyenv</div><div class="line"><span class="comment"># 使用Homebrew on Mac OS X 安装</span></div><div class="line"><span class="variable">$ </span>brew update</div><div class="line"><span class="variable">$ </span>brew install pyenv</div></pre></td></tr></table></figure>
<p>没有<a href="https://brew.sh/" title="Homebrew">Homebrew</a>请安装并更新<br>
</summary>
<category term="随笔" scheme="http://www.barondu.com/categories/%E9%9A%8F%E7%AC%94/"/>
<category term="Machine Learning" scheme="http://www.barondu.com/tags/Machine-Learning/"/>
<category term="TensorFlow" scheme="http://www.barondu.com/tags/TensorFlow/"/>
<category term="pyenv" scheme="http://www.barondu.com/tags/pyenv/"/>
</entry>
<entry>
<title>笔记 OSC_Deadlocks</title>
<link href="http://www.barondu.com/2017/05/03/Deadlocks/"/>
<id>http://www.barondu.com/2017/05/03/Deadlocks/</id>
<published>2017-05-03T15:10:14.000Z</published>
<updated>2019-07-02T02:55:54.000Z</updated>
<content type="html"><![CDATA[<h1 id="Deadlocks"><a href="#Deadlocks" class="headerlink" title="Deadlocks"></a>Deadlocks</h1><hr>
<h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><ul>
<li>Deadlocks and <strong>conditions for deadlocks</strong> </li>
<li>Algorithms to <strong>detect[探知] deadlocks</strong><br>Approaches to <strong>recover</strong> from deadlocks<a id="more"></a>
<h3 id="Deadlocks-1"><a href="#Deadlocks-1" class="headerlink" title="Deadlocks"></a>Deadlocks</h3><h4 id="How-Occur-deadlocks-看看就好"><a href="#How-Occur-deadlocks-看看就好" class="headerlink" title="How Occur deadlocks?[看看就好]"></a>How Occur deadlocks?[看看就好]</h4></li>
<li>Some resources are <strong>mutually exclusive</strong> and can only be used by one <strong>process at a time</strong></li>
<li>On occasions[偶然], <strong>multiple processes</strong> will <strong>require access</strong> to <strong>multiple mutually exclusive resources</strong> (e.g. process A and B need resources X and Y)</li>
<li>Process A and B request the resources in <strong>opposite orders</strong> and end up in deadlock<ul>
<li>Deadlocks can occur on the <strong>same machine</strong> or between <strong>multiple machines</strong> (e.g. resources are requested over the network) and <strong>any number of resources</strong></li>
<li>Deadlocks are not just related to operating systems but also occur, e.g., <strong>in databases</strong></li>
</ul>
</li>
</ul>
<p>resource</p>
<ul>
<li>A resource (e.g. a device, a data record, file, semaphore) can be <strong>acquired, used, </strong>and <strong>released</strong><ul>
<li>A resource can be <strong>preemptable</strong>, i.e., it can be forcefully taken away from the process without permanent adverse effect</li>
<li>A resource can be <strong>non-preemptable,</strong> i.e., it cannot be taken away from a process without permanent adverse effect</li>
</ul>
</li>
<li>If a <strong>non-preemptable resource is requested</strong> but not available, <strong>the process is made to wait</strong></li>
<li><strong>Deadlocks only occur</strong> for <strong>non-preemtable resources</strong> because preemtable resources can be temporarily taken away to recover from the deadlock</li>
</ul>
<h3 id="Definition"><a href="#Definition" class="headerlink" title="Definition"></a>Definition</h3><blockquote>
<p>“A set of processes is deadlocked if <strong>each process</strong> in the set is waiting for <strong>an event</strong> that only the <strong>other process</strong> in the set can cause”<br> – Tanenbaum</p>
</blockquote>
<ul>
<li>Each <strong>deadlocked process</strong> is <strong>waiting for</strong> a resource held by <strong>an other deadlocked process</strong> (which cannot run and hence cannot release the resources)</li>
<li>This can happen between <strong>any number of processes</strong> and for <strong>any number of resources</strong></li>
</ul>
<h3 id="Conditions"><a href="#Conditions" class="headerlink" title="Conditions"></a>Conditions</h3><p><strong>Four conditions</strong> must hold for deadlocks to occur (Coffman et al. (1971)):</p>
<ul>
<li><strong>Mutual exclusion</strong>: a resource can be assigned to at most one process at a time</li>
<li><strong>Hold and wait condition</strong>: a resource can be held whilst[同时] requesting new resources</li>
<li><strong>No preemption:</strong> resources cannot be forcefully taken away from a process </li>
<li><strong>Circular wait</strong>: there is a circular chain of two or more processes, waiting for a resource held by the other processes</li>
</ul>
<p><strong>No deadlocks</strong> can occur if one of the conditions is <strong>not satisfied</strong></p>
]]></content>
<summary type="html">
<h1 id="Deadlocks"><a href="#Deadlocks" class="headerlink" title="Deadlocks"></a>Deadlocks</h1><hr>
<h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><ul>
<li>Deadlocks and <strong>conditions for deadlocks</strong> </li>
<li>Algorithms to <strong>detect[探知] deadlocks</strong><br>Approaches to <strong>recover</strong> from deadlocks
</summary>
<category term="笔记" scheme="http://www.barondu.com/categories/%E7%AC%94%E8%AE%B0/"/>
<category term="OSC" scheme="http://www.barondu.com/tags/OSC/"/>
<category term="Deadlocks" scheme="http://www.barondu.com/tags/Deadlocks/"/>
</entry>
<entry>
<title>拓展 N和NP问题</title>
<link href="http://www.barondu.com/2017/02/06/N%E5%92%8CNP%E9%97%AE%E9%A2%98/"/>
<id>http://www.barondu.com/2017/02/06/N和NP问题/</id>
<published>2017-02-06T03:43:27.000Z</published>
<updated>2017-02-08T14:48:31.000Z</updated>
<content type="html"><![CDATA[<h1 id="N和NP问题"><a href="#N和NP问题" class="headerlink" title="N和NP问题"></a>N和NP问题</h1><blockquote>
<p>“P” refers to the class of problems that can be solved in polynomial time<br>“NP” refers to problems that can be solved in non- deterministic polynomial time</p>
</blockquote>
<ul>
<li>P是能在多项式时间内<strong>解决</strong>的问题,</li>
<li>NP是能在多项式时间<strong>验证答案正确与否</strong>的问题。</li>
</ul>
<p>用大白话讲大概就是这样。P是否等于NP实质上就是在问,如果对于一个问题我能在多项式时间内验证其答案的正确性,那么我是否能在多项式时间内解决它?这个表述不太严谨,但通俗来讲就是如此。(2014, Wang)</p>
<h4 id="什么是-polynomial-time?"><a href="#什么是-polynomial-time?" class="headerlink" title="什么是 polynomial time?"></a>什么是 polynomial time?</h4><ul>
<li>多项式级的复杂度:O(1),O(log(n)),O(n^a)等,因为它的规模n出现在底数的位置;</li>
<li>非多项式级的复杂度:O(a^n)和O(n!)型复杂度,其复杂度计算机往往不能承受。</li>
</ul>
]]></content>
<summary type="html">
<h1 id="N和NP问题"><a href="#N和NP问题" class="headerlink" title="N和NP问题"></a>N和NP问题</h1><blockquote>
<p>“P” refers to the class of problems that
</summary>
<category term="笔记" scheme="http://www.barondu.com/categories/%E7%AC%94%E8%AE%B0/"/>
<category term="G52LAC" scheme="http://www.barondu.com/tags/G52LAC/"/>
</entry>
<entry>
<title>笔记 OSC_Concurrency2</title>
<link href="http://www.barondu.com/2017/01/09/Concurrency2/"/>
<id>http://www.barondu.com/2017/01/09/Concurrency2/</id>
<published>2017-01-09T09:33:27.000Z</published>
<updated>2019-07-01T19:27:09.000Z</updated>
<content type="html"><![CDATA[<h1 id="Concurrency-2"><a href="#Concurrency-2" class="headerlink" title="Concurrency 2"></a>Concurrency 2</h1><hr>
<h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><ul>
<li><strong>Software approaches</strong>: Peterson’s solution Hardware approaches:</li>
<li><strong>Disabling interrupts</strong>:<ul>
<li><code>test_and_set()</code></li>
<li><code>compare_and_swap()</code></li>
</ul>
</li>
<li>Higher level approaches include <strong>mutexes</strong> and <strong>semaphores</strong><h3 id="Peterson’s-Solution"><a href="#Peterson’s-Solution" class="headerlink" title="Peterson’s Solution"></a>Peterson’s Solution</h3></li>
<li>Peterson’s solution is a <strong>software based solution</strong> which worked well for <strong>older machines</strong></li>
<li>Two <strong>shared variables</strong> are used:<ul>
<li>turn: indicates <strong>which process is next</strong> to enter its critical section </li>
<li>boolean flag[2]: indicates that a <strong>process is ready</strong> to enter its critical section</li>
</ul>
</li>
<li>It is restricted[限制] to <strong>two processes</strong> that execute in <strong>strict alternation</strong>[严格的交替]<figure class="highlight sqf"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">do</span> {</div><div class="line"> <span class="built_in">flag</span>[j] = <span class="literal">true</span>; <span class="comment">// j wants to enter critical section turn = i; // allow i to access first</span></div><div class="line"> <span class="keyword">while</span> (<span class="built_in">flag</span>[i] && turn == i);</div><div class="line"> <span class="comment">// whilst i wants to access critical section</span></div><div class="line"> <span class="comment">// and its i’s turn, apply busy waiting </span></div><div class="line"> </div><div class="line"> <span class="comment">// CRITICAL SECTION</span></div><div class="line"> </div><div class="line"> <span class="built_in">flag</span>[j] = <span class="literal">false</span>;</div><div class="line"> <span class="comment">// remainder section</span></div><div class="line">} <span class="keyword">while</span> (...);</div></pre></td></tr></table></figure>
</li>
</ul>
<a id="more"></a>
<ul>
<li>Peterson’s solution satisfies all requirements for mutual exclusion</li>
<li><strong>Mutual exclusion requirement</strong>: the variable turn can have <strong>at most one value at a time</strong><ul>
<li>while(flag[i] && turn == i)or while(flag[j] && turn == j) is true and at most <strong>one process can enter its critical section</strong> (mutual exclusion)</li>
</ul>
</li>
</ul>
<h3 id="Disabling-Interrupts"><a href="#Disabling-Interrupts" class="headerlink" title="Disabling Interrupts"></a>Disabling Interrupts</h3><ul>
<li><p><strong>Disable interrupts</strong> whilst <strong>executing a critical section</strong> and prevent interruption (i.e., interrupts from timers, I/O devices, etc.)</p>
<ul>
<li>Think of the counter++ example <figure class="highlight plain"><figcaption><span>= counter;</span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">register = register + 1</div><div class="line">counter = register;</div></pre></td></tr></table></figure>
</li>
</ul>
</li>
<li><p>Disabling interrupts “may” be appropriate on <strong>a single CPU machine</strong> </p>
</li>
<li>This is <strong>inefficient on modern multi-core/multi processor machines</strong><ul>
<li>Disabling interrupts on all cores/CPUs <strong>takes time</strong> and <strong>causes delays</strong> </li>
<li><strong>CPU capacity[能力] is lost</strong> on other cores</li>
</ul>
</li>
</ul>
<h3 id="Atomic-Instructions"><a href="#Atomic-Instructions" class="headerlink" title="Atomic Instructions"></a>Atomic Instructions</h3><ul>
<li>Implement <code>test_and_set()</code> and <code>swap_and_compare()</code> instructions as a <strong>set of atomic (UN-interruptible) instructions</strong><ul>
<li>Reading and setting the variable(s) is done as one “complete” set of instructions</li>
<li>If <code>test_and_set()</code> or <code>compare_and_swap()</code> are called simultaneously, they will be <strong>executed sequentially</strong></li>
</ul>
</li>
<li>They are used in in combination with <strong>global lock variables</strong>, assumed to be true if the lock is <strong>in use</strong></li>
</ul>
<h4 id="test-and-set"><a href="#test-and-set" class="headerlink" title="test_and_set()"></a>test_and_set()</h4><blockquote>
<p>Test and set must be <strong>atomic/UN-interruptable</strong><br><figure class="highlight cs"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// Test and set method</span></div><div class="line"><span class="function">boolean <span class="title">test_and_set</span>(<span class="params">boolean * <span class="keyword">lock</span></span>) </span>{ </div><div class="line"> boolean rv = *<span class="keyword">lock</span>;</div><div class="line"> *<span class="keyword">lock</span> = <span class="literal">true</span>;</div><div class="line"> <span class="keyword">return</span> rv;</div><div class="line">}</div><div class="line"><span class="comment">// Example of using test and set method</span></div><div class="line"><span class="keyword">do</span> {</div><div class="line"> <span class="comment">// WHILE the lock is in use, apply busy waiting</span></div><div class="line"> <span class="keyword">while</span> (test_and_set(&<span class="keyword">lock</span>)); </div><div class="line"> <span class="comment">// Lock was false, now true</span></div><div class="line"> <span class="comment">// CRITICAL SECTION</span></div><div class="line"> ...</div><div class="line"> <span class="keyword">lock</span> = <span class="literal">false</span>;</div><div class="line"> ...</div><div class="line"> <span class="comment">// remainder section</span></div><div class="line">} <span class="keyword">while</span> (...)</div></pre></td></tr></table></figure></p>
</blockquote>
<h4 id="compare-and-swap"><a href="#compare-and-swap" class="headerlink" title="compare_and_swap()"></a>compare_and_swap()</h4><figure class="highlight cs"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// Compare and swap method</span></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">compare_and_swap</span>(<span class="params"><span class="keyword">int</span> *<span class="keyword">lock</span>, <span class="keyword">int</span> expected, <span class="keyword">int</span> new_value</span>) </span>{ </div><div class="line"> <span class="keyword">int</span> temp = *<span class="keyword">lock</span>;</div><div class="line"> <span class="keyword">if</span>(*<span class="keyword">lock</span> == expected)</div><div class="line"> *<span class="keyword">lock</span> = new_value; <span class="keyword">return</span> temp;</div><div class="line">}</div><div class="line"><span class="comment">// Example using compare and swap method</span></div><div class="line"><span class="keyword">do</span> {</div><div class="line"> <span class="comment">// While the lock is in use (i.e. == 1), apply busy waiting</span></div><div class="line"> <span class="keyword">while</span> (compare_and_swap(&<span class="keyword">lock</span>, <span class="number">0</span>, <span class="number">1</span>) != <span class="number">0</span>); </div><div class="line"> <span class="comment">// Lock was false, now true</span></div><div class="line"> <span class="comment">// CRITICAL SECTION</span></div><div class="line"> ...</div><div class="line"> <span class="keyword">lock</span> = <span class="number">0</span>;</div><div class="line"> ...</div><div class="line"> <span class="comment">// remainder section</span></div><div class="line">} <span class="keyword">while</span> (...);</div></pre></td></tr></table></figure>
<p>Disadvantages:</p>
<ul>
<li><code>test_and_set()</code>and <code>compare_and_swap()</code> are <strong>hardware instructions</strong> and (usually) <strong>not directly accessible</strong> to the user</li>
<li><strong>Busy waiting</strong> is used </li>
<li><strong>Starvation</strong> is possible </li>
<li><strong>Deadlock</strong> is possible</li>
</ul>
<p>The <strong>OS uses the hardware instructions</strong> to implement <strong>higher level mechanisms/instructions</strong> for mutual exclusion, i.e. <strong>mutexes</strong> and <strong>semaphores</strong></p>
<p>##Summary</p>
<ul>
<li>Peterson’s solution (software)</li>
<li>Hardware instructions: interrupt disabling, (test_and_set, compare_and_swap)</li>
</ul>
]]></content>
<summary type="html">
<h1 id="Concurrency-2"><a href="#Concurrency-2" class="headerlink" title="Concurrency 2"></a>Concurrency 2</h1><hr>
<h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><ul>
<li><strong>Software approaches</strong>: Peterson’s solution Hardware approaches:</li>
<li><strong>Disabling interrupts</strong>:<ul>
<li><code>test_and_set()</code></li>
<li><code>compare_and_swap()</code></li>
</ul>
</li>
<li>Higher level approaches include <strong>mutexes</strong> and <strong>semaphores</strong><h3 id="Peterson’s-Solution"><a href="#Peterson’s-Solution" class="headerlink" title="Peterson’s Solution"></a>Peterson’s Solution</h3></li>
<li>Peterson’s solution is a <strong>software based solution</strong> which worked well for <strong>older machines</strong></li>
<li>Two <strong>shared variables</strong> are used:<ul>
<li>turn: indicates <strong>which process is next</strong> to enter its critical section </li>
<li>boolean flag[2]: indicates that a <strong>process is ready</strong> to enter its critical section</li>
</ul>
</li>
<li>It is restricted[限制] to <strong>two processes</strong> that execute in <strong>strict alternation</strong>[严格的交替]<figure class="highlight sqf"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">do</span> &#123;</div><div class="line"> <span class="built_in">flag</span>[j] = <span class="literal">true</span>; <span class="comment">// j wants to enter critical section turn = i; // allow i to access first</span></div><div class="line"> <span class="keyword">while</span> (<span class="built_in">flag</span>[i] &amp;&amp; turn == i);</div><div class="line"> <span class="comment">// whilst i wants to access critical section</span></div><div class="line"> <span class="comment">// and its i’s turn, apply busy waiting </span></div><div class="line"> </div><div class="line"> <span class="comment">// CRITICAL SECTION</span></div><div class="line"> </div><div class="line"> <span class="built_in">flag</span>[j] = <span class="literal">false</span>;</div><div class="line"> <span class="comment">// remainder section</span></div><div class="line">&#125; <span class="keyword">while</span> (...);</div></pre></td></tr></table></figure>
</li>
</ul>
</summary>
<category term="笔记" scheme="http://www.barondu.com/categories/%E7%AC%94%E8%AE%B0/"/>
<category term="OSC" scheme="http://www.barondu.com/tags/OSC/"/>
<category term="concurrency" scheme="http://www.barondu.com/tags/concurrency/"/>
</entry>
<entry>
<title>笔记 OSC_Concurrency1</title>
<link href="http://www.barondu.com/2017/01/09/Concurrency1/"/>
<id>http://www.barondu.com/2017/01/09/Concurrency1/</id>
<published>2017-01-09T06:09:27.000Z</published>
<updated>2019-07-01T19:28:01.000Z</updated>
<content type="html"><![CDATA[<h1 id="Concurrency-1"><a href="#Concurrency-1" class="headerlink" title="Concurrency 1"></a>Concurrency 1</h1><hr>
<h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><ul>
<li>Examples of <strong>concurrency issues</strong> (e.g. counter++)</li>
<li>Root causes of <strong>concurrency issues</strong></li>
<li><strong>Critical sections</strong> and <strong>mutual exclusion</strong> </li>
<li><strong>Requirements and approaches</strong> for mutual exclusion</li>
</ul>
<h3 id="Concurrency"><a href="#Concurrency" class="headerlink" title="Concurrency"></a>Concurrency</h3><ul>
<li>Threads and processes execute concurrently or in parallel and can share resources<ul>
<li>Multiprogramming/multiprocessing <strong>improves system utilisation</strong></li>
</ul>
</li>
<li>A process/thread can be <strong>interrupted at any point in time</strong> (I/O, timer)<ul>
<li>The process “state” is <strong>saved</strong> in the p<strong>rocess control block</strong> </li>
</ul>
</li>
<li>The outcome of programs may become <strong>unpredictable</strong>[不可预知的]<ul>
<li>Sharing data can lead to <strong>inconsistencies</strong>[矛盾]</li>
<li>I.e., the <strong>outcome of execution</strong> may <strong>depend on the order</strong> win which instructions are carried out</li>
</ul>
</li>
</ul>
<a id="more"></a>
<h4 id="Incrementing-a-counter"><a href="#Incrementing-a-counter" class="headerlink" title="Incrementing a counter"></a>Incrementing a counter</h4><ul>
<li><code>counter++</code> consists of three separate actions:<ul>
<li>1 read the value of counter and <strong>store it in a register</strong></li>
<li>2 add one to the value in the register</li>
<li>3 store the value of the register <strong>in counter</strong></li>
</ul>
</li>
<li>The above actions are <strong>NOT</strong> “atomic”, e.g. they can be interrupted by the timer (⇒ <strong>context switch</strong>)</li>
</ul>
<h4 id="Bounded-Buffers"><a href="#Bounded-Buffers" class="headerlink" title="Bounded Buffers"></a>Bounded Buffers</h4><ul>
<li>Consider a <strong>bounded buffer</strong> in which N items can be stored</li>
<li>A <strong>counter</strong> is maintained to count the number of items currently in the buffer<ul>
<li><strong>Incremented</strong> when an item is <strong>added</strong> </li>
<li><strong>Decremented</strong> when an item is <strong>removed</strong></li>
</ul>
</li>
<li>Similar <strong>concurrency problems</strong> as with the calculation of sums happen in the bounded buffer (producer/consumer) problem</li>
</ul>
<h4 id="Race-Conditions"><a href="#Race-Conditions" class="headerlink" title="Race Conditions"></a>Race Conditions</h4><ul>
<li>A <strong>race condition occurs</strong> when multiple threads/processes <strong>access shared data</strong> and the result is dependent on <strong>the order in which the instructions are interleaved</strong></li>
</ul>
<h3 id="Concurrency-within-the-OS"><a href="#Concurrency-within-the-OS" class="headerlink" title="Concurrency within the OS"></a>Concurrency within the OS</h3><p>Data Structures</p>
<ul>
<li><strong>Kernels are preemptive</strong> these days (⇔ non-preemptive) <ul>
<li><strong>Multiple processes are running</strong> in the kernel</li>
<li>I.e. kernel <strong>processes can be interrupted</strong> at any point</li>
</ul>
</li>
<li>The kernel maintains <strong>data structures</strong>, e.g. process tables, memory structures, open file lists, etc.</li>
<li>These data structures are accessed <strong>concurrently/in parallel</strong> </li>
<li>These can be subject to <strong>concurrency issues</strong></li>
</ul>
<p>Resources</p>
<ul>
<li>Processes share resources, including memory, files, processor time, printers, I/O devices, etc.</li>
<li>The operating system must:<ul>
<li><strong>Allocate and deallocate</strong> these resources safely (i.e. avoid interference, deadlocks and starvation)</li>
<li>Make sure that interactions within the OS d<strong>o not result in race conditions</strong></li>
<li>The operating system must provide locking mechanisms to implement/support mutual exclusion (and prevent starvation and deadlocks)</li>
</ul>
</li>
</ul>
<h3 id="Critical-Sections-临界段-Mutual-Exclusion-互斥"><a href="#Critical-Sections-临界段-Mutual-Exclusion-互斥" class="headerlink" title="Critical Sections[临界段], Mutual Exclusion[互斥]"></a>Critical Sections[临界段], Mutual Exclusion[互斥]</h3><ul>
<li>A critical section is a set of instructions in which <strong>shared variables are changed</strong></li>
<li><p><strong>Mutual exclusion</strong> must be enforced <strong>for critical sections</strong></p>
<ul>
<li>Only <strong>one process at a time</strong> should be in the critical section (mutual exclusion)</li>
<li>Processes have to <strong>get “permission”</strong> before entering their critical section<figure class="highlight lasso"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">do</span></div><div class="line">{</div><div class="line"> <span class="params">...</span></div><div class="line"> <span class="comment">// ENTRY to critical section</span></div><div class="line"> critical section, e.g.counter++;</div><div class="line"> <span class="comment">// EXIT critical section</span></div><div class="line"> remaining code</div><div class="line"> <span class="params">...</span></div><div class="line">} <span class="keyword">while</span> (<span class="params">...</span>);</div></pre></td></tr></table></figure>
</li>
</ul>
</li>
<li><p><strong>Any solution to the critical section problem</strong> must satisfy the following <strong>requirements</strong>:</p>
<ul>
<li><strong>Mutual exclusion</strong>: only one process can be in its critical section at any one point in time</li>
<li><strong>Progress</strong>: any process must be able to enter its critical section at some point in time</li>
<li><strong>Fairness/bounded waiting</strong>: processes cannot be made to wait indefinitely</li>
</ul>
</li>
<li>These requirements have to be satisfied, <strong>independent of the order</strong> in which sequences are executed</li>
</ul>
<h4 id="Enforcing-Mutual-Exclusion"><a href="#Enforcing-Mutual-Exclusion" class="headerlink" title="Enforcing Mutual Exclusion"></a>Enforcing Mutual Exclusion</h4><ul>
<li><strong>Approaches</strong> for mutual exclusion can be:<ul>
<li><strong>Software based:</strong> Peterson’s solution</li>
<li><strong>Hardware based</strong>: <code>test_and_set(), swap_and_compare()</code></li>
<li><strong>Based on</strong>:<ul>
<li>Mutexes</li>
<li>Semaphores</li>
<li>Monitors (software construct within the programming languages)</li>
</ul>
</li>
</ul>
</li>
<li>In addition to mutual exclusion, <strong>deadlocks</strong> have to be prevented (next week’s subject)</li>
</ul>
<h2 id="Summary"><a href="#Summary" class="headerlink" title="Summary"></a>Summary</h2><ul>
<li>Examples of <strong>concurrency issues</strong> (e.g. counter++)</li>
<li>Root causes of <strong>concurrency issues</strong></li>
<li><strong>Critical sections</strong> and <strong>mutual exclusion</strong> </li>
<li><strong>Requirements and approaches</strong> for mutual exclusion</li>
</ul>
]]></content>
<summary type="html">
<h1 id="Concurrency-1"><a href="#Concurrency-1" class="headerlink" title="Concurrency 1"></a>Concurrency 1</h1><hr>
<h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><ul>
<li>Examples of <strong>concurrency issues</strong> (e.g. counter++)</li>
<li>Root causes of <strong>concurrency issues</strong></li>
<li><strong>Critical sections</strong> and <strong>mutual exclusion</strong> </li>
<li><strong>Requirements and approaches</strong> for mutual exclusion</li>
</ul>
<h3 id="Concurrency"><a href="#Concurrency" class="headerlink" title="Concurrency"></a>Concurrency</h3><ul>
<li>Threads and processes execute concurrently or in parallel and can share resources<ul>
<li>Multiprogramming/multiprocessing <strong>improves system utilisation</strong></li>
</ul>
</li>
<li>A process/thread can be <strong>interrupted at any point in time</strong> (I/O, timer)<ul>
<li>The process “state” is <strong>saved</strong> in the p<strong>rocess control block</strong> </li>
</ul>
</li>
<li>The outcome of programs may become <strong>unpredictable</strong>[不可预知的]<ul>
<li>Sharing data can lead to <strong>inconsistencies</strong>[矛盾]</li>
<li>I.e., the <strong>outcome of execution</strong> may <strong>depend on the order</strong> win which instructions are carried out</li>
</ul>
</li>
</ul>
</summary>
<category term="笔记" scheme="http://www.barondu.com/categories/%E7%AC%94%E8%AE%B0/"/>
<category term="OSC" scheme="http://www.barondu.com/tags/OSC/"/>
<category term="concurrency" scheme="http://www.barondu.com/tags/concurrency/"/>
</entry>
<entry>
<title>笔记 OSC_Processes4</title>
<link href="http://www.barondu.com/2017/01/09/Processes4/"/>
<id>http://www.barondu.com/2017/01/09/Processes4/</id>
<published>2017-01-09T06:05:27.000Z</published>
<updated>2019-07-01T20:46:26.000Z</updated>
<content type="html"><![CDATA[<h1 id="Processes-4"><a href="#Processes-4" class="headerlink" title="Processes 4"></a>Processes 4</h1><hr>
<h2 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h2><ul>
<li>Multi-level feedback queues</li>
<li>Scheduling in Window 7 + illustration Scheduling in </li>
<li>Linux (implementation in labs) Scheduling related processes/threads</li>
</ul>
<h3 id="Multi-level-Feedback-Queues"><a href="#Multi-level-Feedback-Queues" class="headerlink" title="Multi-level Feedback Queues"></a>Multi-level Feedback Queues</h3><ul>
<li>Different <strong>scheduling algorithms</strong> can be used for the <strong>individual queues</strong> (e.g., round robin, SJF, FCFS)</li>
<li><p><strong>Feedback queues</strong> allow <strong>priorities to change dynamically</strong>[动态的], i.e., jobs can move between queues:</p>
<ul>
<li>Move to <strong>lower priority queue</strong> if too much CPU time is used (prioritise I/O and interactive processes)</li>
<li>Move to <strong>higher priority queue</strong> to prevent <strong>starvation</strong> and avoid <strong>inversion[反转] of control</strong></li>
</ul>
</li>
<li><p>Defining characteristics of feedback queues include: </p>
<ul>
<li>The <strong>number of queues</strong></li>
<li>The <strong>scheduling algorithms</strong> used for the individual queues </li>
<li><strong>Migration policy</strong>[迁移政策] between queues</li>
<li>Initial <strong>access</strong> to the queues<br>Feedback queues are highly <strong>configurable</strong>[可配置] and offer significant <strong>flexibility</strong>[灵活性,适应性]</li>
</ul>
</li>
</ul>
<a id="more"></a>
<h4 id="Windows-7"><a href="#Windows-7" class="headerlink" title="Windows 7"></a>Windows 7</h4><ul>
<li>An <strong>interactive system</strong>[交互系统] using a <strong>preemptive scheduler</strong> with <strong>dynamic priority levels</strong><ul>
<li>Two priority classes with 16 different priority levels exist<ul>
<li>“<strong>Real time</strong>” processes/threads have a <strong>fixed priority level</strong></li>
<li>“<strong>Variable</strong>” processes/threads can have their priorities <strong>boosted temporarily</strong></li>
</ul>
</li>
</ul>
</li>
<li><p>A <strong>round robin algorithm</strong> is used within the queues</p>
</li>
<li><p>Priorities are based on the <strong>process base priority</strong> (between 0-15) and <strong>thread base priority</strong> (±2 relative to the process priority)</p>
</li>
<li>A thread’s priority dynamically changes during execution between its base priority and the maximum priority within its class<ul>
<li><strong>Interactive I/O bound processes</strong> (e.g. keyboard) receive a <strong>larger boost</strong> </li>
<li>Boosting priorities prevents <strong>priority inversion</strong></li>
</ul>
</li>
</ul>
<h3 id="Scheduling-in-Linux"><a href="#Scheduling-in-Linux" class="headerlink" title="Scheduling in Linux"></a>Scheduling in Linux</h3><h4 id="The-Completely-Fair-Scheduler"><a href="#The-Completely-Fair-Scheduler" class="headerlink" title="The Completely Fair Scheduler"></a>The Completely Fair Scheduler</h4><ul>
<li>Linux distinguishes[区分] between two types of tasks for scheduling:<ul>
<li><strong>Real time tasks</strong> (to be POSIX compliant), divided into: <ul>
<li>Real time FIFO tasks</li>
<li>Real time Round Robin tasks</li>
</ul>
</li>
<li><strong>Time sharing tasks</strong> using a <strong>preemptive</strong> approach (similar to <strong>variable</strong> in Windows)</li>
</ul>
</li>
<li>The most recent scheduling algorithm in Linux for <strong>time sharing tasks</strong> is the “<strong>completely fair scheduler</strong>” </li>
</ul>
<p>Real-Time Tasks</p>
<ul>
<li><strong>Real time FIFO</strong> tasks have the <strong>highest priority</strong> and are scheduled using a <strong>FCFS approach</strong>, using <strong>preemption if a higher priority</strong> job shows up</li>
<li><strong>Real time round robin tasks</strong> are preemptable by <strong>clock interrupts</strong> and have a time slice associated with them</li>
<li>Both approaches <strong>cannot guarantee hard deadlines</strong></li>
</ul>
<p>Time Sharing Tasks</p>
<ul>
<li>The CFS <strong>divides the CPU time</strong> between all processes </li>
<li>If all N processes have the <strong>same priority</strong>:<ul>
<li>They will be allocated a “time slice” equal to 1/N times the available CPU time<ul>
<li>I.e., if N equals 5, every process will receive 20% of the processor’s time</li>
</ul>
</li>
</ul>
</li>
<li>The length of the <strong>time slice</strong> and the “available CPU time” are based on the <strong>targeted latency[延迟]</strong> (⇒ every process should <strong>run at least once</strong> during this interval)</li>
<li>If N is <strong>very large</strong>, the <strong>context switch time will be dominant</strong>, hence a lower bound on the “time slice” is imposed by the minimum granularity[粒度]<ul>
<li>A process’s time slice can be no <strong>less than</strong> the <strong>minimum granularity</strong> (response time will deteriorate[恶化])</li>
</ul>
</li>
<li>A <strong>weighting scheme</strong> is used to take different priorities into account If process have <strong>different priorities:</strong><ul>
<li>Every process <em>i</em> is allocated a <strong>weight</strong> <em>Wi</em> that reflects its priority</li>
</ul>
</li>
<li>The tasks with the <strong>lowest amount</strong> of “<strong>used CPU time</strong>” are <strong>selected first</strong></li>
</ul>
<p>Shared Queues </p>
<ul>
<li>A single or multi-level queue <strong>shared</strong> between all CPUs </li>
<li>Advantage: automatic <strong>load balancing</strong><br>Disadvantages:<ul>
<li><strong>Contention</strong>[竞争] for the queues (locking is needed)</li>
<li>“All CPUs are equal, but some are more equal than others” : does not account for <strong>processor affinity</strong>[紧密度]:<ul>
<li><strong>Cache</strong> becomes invalid when moving to a different CPU</li>
<li>Translation look aside buffers (TLBs - part of the MMU) become invalid</li>
</ul>
</li>
</ul>
</li>
<li>Windows will allocate the <strong>highest priority threads</strong> to the individual CPUs/cores</li>
</ul>
<p>Private Queues</p>
<ul>
<li>Each process/thread is assigned to a queue <strong>private</strong> to an individual CPU </li>
<li>Advantages:<ul>
<li><strong>CPU affinity</strong> is automatically satisfied </li>
<li><strong>Contention</strong> for shared queue is minimised</li>
</ul>
</li>
<li>Disadvantages: less <strong>load balancing</strong></li>
<li><strong>Push</strong> and <strong>pull migration</strong> between CPUs is possible</li>
</ul>