jekyll-theme-gaeblogx 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +9 -0
  4. data/_includes/algolia.html +75 -0
  5. data/_includes/backToTop.html +5 -0
  6. data/_includes/category.html +19 -0
  7. data/_includes/comments.html +46 -0
  8. data/_includes/footer.html +33 -0
  9. data/_includes/head.html +58 -0
  10. data/_includes/header.html +34 -0
  11. data/_includes/previousAndNext.html +13 -0
  12. data/_includes/sidebar-search.html +25 -0
  13. data/_includes/tag.html +16 -0
  14. data/_layouts/default.html +26 -0
  15. data/_layouts/demo.html +10 -0
  16. data/_layouts/page.html +31 -0
  17. data/_layouts/post.html +107 -0
  18. data/_sass/_backToTop.scss +49 -0
  19. data/_sass/_demo.scss +65 -0
  20. data/_sass/_footer.scss +63 -0
  21. data/_sass/_header.scss +174 -0
  22. data/_sass/_index.scss +174 -0
  23. data/_sass/_layout.scss +242 -0
  24. data/_sass/_page.scss +238 -0
  25. data/_sass/_post-old.scss +109 -0
  26. data/_sass/_post.scss +83 -0
  27. data/_sass/_reset.scss +119 -0
  28. data/_sass/_scrollbar.scss +35 -0
  29. data/_sass/_syntax-highlighting.scss +99 -0
  30. data/assets/10.jpg +0 -0
  31. data/assets/AWS-Introduction-ec2.png +0 -0
  32. data/assets/Cache-Oblivious-Algorithms-FunnelSort.jpg +0 -0
  33. data/assets/Condition-Variables-fig1.png +0 -0
  34. data/assets/Dynamic-Compilation-adaptJVM.pdf +0 -0
  35. data/assets/Dynamic-Compilation-dyncomp.pdf +0 -0
  36. data/assets/Fibonacci-Heap-Fig3.png +0 -0
  37. data/assets/Fibonacci-Heap-Fig5.png +0 -0
  38. data/assets/Fibonacci-Heap-Fig6.png +0 -0
  39. data/assets/Fibonacci-Heap-Fig7.png +0 -0
  40. data/assets/File-System-bc.jpg +0 -0
  41. data/assets/File-System-filetable.rich.jpg +0 -0
  42. data/assets/GIL-Battle.png +0 -0
  43. data/assets/GIL-CPU.png +0 -0
  44. data/assets/GIL-Check.png +0 -0
  45. data/assets/GIL-IO.png +0 -0
  46. data/assets/GIL-Measure-1.png +0 -0
  47. data/assets/GIL-Measure-2.png +0 -0
  48. data/assets/GIL-Signal.png +0 -0
  49. data/assets/GIL-Tick.png +0 -0
  50. data/assets/Garbage-Collection-Slides-gc.pdf +0 -0
  51. data/assets/Garbage-Collection-copying-1.png +0 -0
  52. data/assets/Garbage-Collection-copying-2.png +0 -0
  53. data/assets/Garbage-Collection-free-list.png +0 -0
  54. data/assets/Garbage-Collection-generation-1.png +0 -0
  55. data/assets/Garbage-Collection-mark-sweep.png +0 -0
  56. data/assets/Garbage-Collection-nursery-1.png +0 -0
  57. data/assets/Garbage-Collection-nursery-2.png +0 -0
  58. data/assets/Garbage-Collection-nursery-3.png +0 -0
  59. data/assets/Garbage-Collection-nursery-4.png +0 -0
  60. data/assets/Garbage-Collection-nursery-5.png +0 -0
  61. data/assets/Garbage-Collection-process.png +0 -0
  62. data/assets/Garbage-Collection-ref-counting.png +0 -0
  63. data/assets/Interpreter-Optimization-interp.pdf +0 -0
  64. data/assets/Memory-Management-fig1.png +0 -0
  65. data/assets/Memory-Management-fig2.png +0 -0
  66. data/assets/Memory-Management-fig3.png +0 -0
  67. data/assets/Memory-Management-fig4.png +0 -0
  68. data/assets/Memory-Management-fig5.png +0 -0
  69. data/assets/Memory-Management-fig6.png +0 -0
  70. data/assets/Memory-Management-fig7.png +0 -0
  71. data/assets/Memory-Management-fig8.png +0 -0
  72. data/assets/Multicore-GIL-1.png +0 -0
  73. data/assets/Multicore-GIL-2.png +0 -0
  74. data/assets/My-Photo.JPG +0 -0
  75. data/assets/Operating-System-Virtualization-ept.png +0 -0
  76. data/assets/Operating-System-Virtualization-guest-page.png +0 -0
  77. data/assets/Operating-System-Virtualization-kvm-arch.png +0 -0
  78. data/assets/Operating-System-Virtualization-kvm-process.png +0 -0
  79. data/assets/Operating-System-Virtualization-kvm-qemu.png +0 -0
  80. data/assets/Operating-System-Virtualization-kvm-state.png +0 -0
  81. data/assets/Operating-System-Virtualization-vtx.png +0 -0
  82. data/assets/Operating-System-Virtualization-xen-arch.png +0 -0
  83. data/assets/Program-Profiling-profiling.pdf +0 -0
  84. data/assets/Programming-Language-Virtual-Machine-vm.pdf +0 -0
  85. data/assets/Remote-Shell-Session-Setup-1.png +0 -0
  86. data/assets/Signals-1.png +0 -0
  87. data/assets/Signals-2.png +0 -0
  88. data/assets/Signals-3.png +0 -0
  89. data/assets/Some-Slides-about-Containers-Kubernetes.pdf +0 -0
  90. data/assets/Some-Slides-about-Containers-UCSB-nurmi.pdf +0 -0
  91. data/assets/Some-Slides-about-PaaS-CS293B_CloudPlatforms.pdf +0 -0
  92. data/assets/avg-1thread.c +172 -0
  93. data/assets/avg-manythread.c +284 -0
  94. data/assets/avg-nothread.c +71 -0
  95. data/assets/file-create1.c +75 -0
  96. data/assets/file-create2.c +120 -0
  97. data/assets/file-fd1.c +56 -0
  98. data/assets/file-fd2.c +25 -0
  99. data/assets/file-fd3.c +23 -0
  100. data/assets/file-read1.c +62 -0
  101. data/assets/file-read2.c +66 -0
  102. data/assets/file-seek1.c +87 -0
  103. data/assets/fork-1.c +35 -0
  104. data/assets/fork-2.c +44 -0
  105. data/assets/fork-3.c +60 -0
  106. data/assets/fork-4.c +64 -0
  107. data/assets/joinall-1.c +163 -0
  108. data/assets/joinall-2.c +162 -0
  109. data/assets/market-kthreads.c +465 -0
  110. data/assets/market-semaphore.c +504 -0
  111. data/assets/market1.c +478 -0
  112. data/assets/market2.c +490 -0
  113. data/assets/market3.c +503 -0
  114. data/assets/market4.c +509 -0
  115. data/assets/my-cat.c +35 -0
  116. data/assets/pipe-1.c +45 -0
  117. data/assets/pipe-2.c +80 -0
  118. data/assets/pipe-3.c +83 -0
  119. data/assets/pipe-4.c +116 -0
  120. data/assets/race1.c +75 -0
  121. data/assets/race2.c +77 -0
  122. data/assets/race3.c +87 -0
  123. data/assets/race_ABC.c +144 -0
  124. data/assets/search-by-algolia.svg +1 -0
  125. data/assets/semaphore.book.ps +8827 -0
  126. data/assets/sys-call1.c +20 -0
  127. data/assets/sys-call2.c +16 -0
  128. data/assets//350/265/253/347/202/2161.PNG +0 -0
  129. data/feed.xml +30 -0
  130. data/index.html +164 -0
  131. data/js/jekyll-search.min.js +1 -0
  132. data/js/lunr.min.js +2977 -0
  133. data/js/main.js +57 -0
  134. data/js/masonry.pkgd.min.js +9 -0
  135. data/js/pageContent.js +166 -0
  136. data/js/search.js +17 -0
  137. data/js/smooth-scroll.min.js +2 -0
  138. data/js/waterfall.js +214 -0
  139. data/page/0archives.html +83 -0
  140. data/page/1category.html +62 -0
  141. data/page/2tags.html +64 -0
  142. data/page/3search.html +112 -0
  143. data/page/4about.md +34 -0
  144. metadata +270 -0
data/assets/market4.c ADDED
@@ -0,0 +1,509 @@
1
+ /*
2
+ * cs170 -- Rich wolski
3
+ * producer-consumer example
4
+ * uses condition variables for fule/empty conditions
5
+ * uses condition variable to fulfill order
6
+ * uses separate lock for each stock
7
+ */
8
+ #include <unistd.h>
9
+ #include <stdlib.h>
10
+ #include <stdio.h>
11
+ #include <pthread.h>
12
+ #include <string.h>
13
+
14
+ #include "c-timer.h"
15
+
16
+ #define RAND() (drand48())
17
+
18
+ struct order
19
+ {
20
+ int stock_id;
21
+ int quantity;
22
+ int action; /* buy or sell */
23
+ int fulfilled;
24
+ pthread_mutex_t lock;
25
+ pthread_cond_t finish;
26
+ };
27
+
28
+ struct order_que
29
+ {
30
+ struct order **orders;
31
+ int size;
32
+ int head;
33
+ int tail;
34
+ pthread_mutex_t lock;
35
+ pthread_cond_t full;
36
+ pthread_cond_t empty;
37
+ };
38
+
39
+ struct stock
40
+ {
41
+ pthread_mutex_t lock;
42
+ int quantity;
43
+ };
44
+
45
+ struct market
46
+ {
47
+ struct stock *stocks;
48
+ int count;
49
+ };
50
+
51
+ struct order *InitOrder(int id, int quantity, int action)
52
+ {
53
+ struct order *order;
54
+
55
+ order = (struct order *)malloc(sizeof(struct order));
56
+ if(order == NULL) {
57
+ return(NULL);
58
+ }
59
+ order->stock_id = id;
60
+ order->quantity = quantity;
61
+ order->action = action;
62
+ order->fulfilled = 0;
63
+ pthread_mutex_init(&order->lock,NULL);
64
+ pthread_cond_init(&order->finish,NULL);
65
+ return(order);
66
+ }
67
+
68
+ void FreeOrder(struct order *order)
69
+ {
70
+ free(order);
71
+ }
72
+
73
+ struct order_que *InitOrderQue(int size)
74
+ {
75
+ struct order_que *oq;
76
+
77
+ oq = (struct order_que *)malloc(sizeof(struct order_que));
78
+ if(oq == NULL) {
79
+ return(NULL);
80
+ }
81
+ memset(oq,0,sizeof(struct order_que));
82
+
83
+ oq->size = size+1; /* empty condition burns a slot */
84
+ oq->orders = (struct order **)malloc(oq->size*sizeof(struct order *));
85
+ if(oq->orders == NULL) {
86
+ free(oq);
87
+ return(NULL);
88
+ }
89
+ memset(oq->orders,0,size*sizeof(struct order *));
90
+
91
+ pthread_mutex_init(&oq->lock,NULL);
92
+ pthread_cond_init(&oq->full,NULL);
93
+ pthread_cond_init(&oq->empty,NULL);
94
+
95
+ return(oq);
96
+ }
97
+
98
+ void FreeOrderQue(struct order_que *oq)
99
+ {
100
+ while(oq->head != oq->tail) {
101
+ FreeOrder(oq->orders[oq->tail]);
102
+ oq->tail = (oq->tail + 1) % oq->size;
103
+ }
104
+
105
+ free(oq->orders);
106
+ free(oq);
107
+ return;
108
+ }
109
+
110
+ struct market *InitMarket(int stock_count, int init_quantity)
111
+ {
112
+ struct market *m;
113
+ int i;
114
+
115
+ m = (struct market *)malloc(sizeof(struct market));
116
+ if(m == NULL) {
117
+ return(NULL);
118
+ }
119
+ m->count = stock_count;
120
+
121
+ m->stocks = (struct stock *)malloc(stock_count*sizeof(struct stock));
122
+ if(m->stocks == NULL) {
123
+ free(m);
124
+ return(NULL);
125
+ }
126
+
127
+ for(i=0; i < stock_count; i++) {
128
+ m->stocks[i].quantity = init_quantity;
129
+ pthread_mutex_init(&(m->stocks[i].lock),NULL);
130
+ }
131
+
132
+ return(m);
133
+ }
134
+
135
+ void FreeMarket(struct market *m)
136
+ {
137
+ free(m->stocks);
138
+ free(m);
139
+ return;
140
+ }
141
+
142
+ void PrintMarket(struct market *m)
143
+ {
144
+ int i;
145
+ for(i=0; i < m->count; i++) {
146
+ printf("stock: %d, quantity: %d\n",
147
+ i,m->stocks[i].quantity);
148
+ }
149
+
150
+ return;
151
+ }
152
+
153
+ struct client_arg
154
+ {
155
+ int id;
156
+ int order_count;
157
+ struct order_que *order_que;
158
+ int max_stock_id;
159
+ int max_quantity;
160
+ int verbose;
161
+ };
162
+
163
+ struct trader_arg
164
+ {
165
+ int id;
166
+ struct order_que *order_que;
167
+ struct market *market;
168
+ int *done;
169
+ int verbose;
170
+ };
171
+
172
+ void *ClientThread(void *arg)
173
+ {
174
+ struct client_arg *ca = (struct client_arg *)arg;
175
+ int i;
176
+ int next;
177
+ struct order *order;
178
+ int stock_id;
179
+ int quantity;
180
+ int action;
181
+ int queued;
182
+ double now;
183
+
184
+
185
+ for(i=0; i < ca->order_count; i++) {
186
+ /*
187
+ * create an order for a random stock
188
+ */
189
+ stock_id = (int)(RAND() * ca->max_stock_id);
190
+ quantity = (int)(RAND() * ca->max_quantity);
191
+ if(RAND() > 0.5) {
192
+ action = 0; /* 0 => buy */
193
+ } else {
194
+ action = 1; /* 1 => sell */
195
+ }
196
+ order = InitOrder(stock_id,quantity,action);
197
+ if(order == NULL) {
198
+ fprintf(stderr,"no space for order\n");
199
+ exit(1);
200
+ }
201
+ /*
202
+ * queue it for the traders
203
+ */
204
+ queued = 0;
205
+ while(queued == 0) {
206
+ pthread_mutex_lock(&(ca->order_que->lock));
207
+ next = (ca->order_que->head + 1) % ca->order_que->size;
208
+ /*
209
+ * is the queue full?
210
+ */
211
+ while(next == ca->order_que->tail) {
212
+ pthread_cond_wait(&(ca->order_que->full),
213
+ &(ca->order_que->lock));
214
+ next = (ca->order_que->head + 1) % ca->order_que->size;
215
+ }
216
+ /*
217
+ * there is space in the queue, add the order and bump
218
+ * the head
219
+ */
220
+ if(ca->verbose == 1) {
221
+ now = CTimer();
222
+ printf("%10.0f client %d: ",now,ca->id);
223
+ printf("queued stock %d, for %d, %s\n",
224
+ order->stock_id,
225
+ order->quantity,
226
+ (order->action ? "SELL" : "BUY"));
227
+ }
228
+ ca->order_que->orders[next] = order;
229
+ ca->order_que->head = next;
230
+ queued = 1;
231
+ pthread_cond_signal(&(ca->order_que->empty));
232
+ pthread_mutex_unlock(&(ca->order_que->lock));
233
+
234
+ /*
235
+ * spin waiting until the order is fulfilled
236
+ */
237
+ pthread_mutex_lock(&order->lock);
238
+ while(order->fulfilled == 0) {
239
+ pthread_cond_wait(&order->finish,&order->lock);
240
+ }
241
+ pthread_mutex_unlock(&order->lock);
242
+ /*
243
+ * done, free the order and repeat
244
+ */
245
+ FreeOrder(order);
246
+ }
247
+ }
248
+
249
+ return(NULL);
250
+ }
251
+
252
+ void *TraderThread(void *arg)
253
+ {
254
+ struct trader_arg *ta = (struct trader_arg *)arg;
255
+ int dequeued;
256
+ struct order *order;
257
+ int tail;
258
+ double now;
259
+ int next;
260
+ struct stock *stock;
261
+
262
+ while(1) {
263
+ dequeued = 0;
264
+ while(dequeued == 0) {
265
+ pthread_mutex_lock(&(ta->order_que->lock));
266
+ /*
267
+ * is the queue empty?
268
+ */
269
+ while(ta->order_que->head == ta->order_que->tail) {
270
+ /*
271
+ * if the queue is empty, are we done?
272
+ */
273
+ if(*(ta->done) == 1) {
274
+ pthread_cond_signal(&(ta->order_que->empty));
275
+ pthread_mutex_unlock(&(ta->order_que->lock));
276
+ pthread_exit(NULL);
277
+ }
278
+ pthread_cond_wait(&(ta->order_que->empty),
279
+ &(ta->order_que->lock));
280
+ }
281
+ /*
282
+ * get the next order
283
+ */
284
+ next = (ta->order_que->tail + 1) % ta->order_que->size;
285
+ order = ta->order_que->orders[next];
286
+ ta->order_que->tail = next;
287
+ pthread_cond_signal(&(ta->order_que->full));
288
+ pthread_mutex_unlock(&(ta->order_que->lock));
289
+ dequeued = 1;
290
+ }
291
+ /*
292
+ * have an order to process
293
+ */
294
+ stock = &(ta->market->stocks[order->stock_id]);
295
+ pthread_mutex_lock(&(stock->lock));
296
+ if(order->action == 1) { /* BUY */
297
+ stock->quantity -= order->quantity;
298
+ if(stock->quantity < 0) {
299
+ stock->quantity = 0;
300
+ }
301
+ } else {
302
+ stock->quantity += order->quantity;
303
+ }
304
+ pthread_mutex_unlock(&(stock->lock));
305
+ if(ta->verbose == 1) {
306
+ now = CTimer();
307
+ printf("%10.0f trader: %d ",now,ta->id);
308
+ printf("fulfilled stock %d for %d\n",
309
+ order->stock_id,
310
+ order->quantity);
311
+ }
312
+ /*
313
+ * tell the client the order is done
314
+ */
315
+ pthread_mutex_lock(&order->lock);
316
+ order->fulfilled = 1;
317
+ pthread_cond_signal(&order->finish);
318
+ pthread_mutex_unlock(&order->lock);
319
+ }
320
+
321
+ return(NULL);
322
+ }
323
+
324
+ #define ARGS "c:t:o:q:s:V"
325
+ char *Usage = "market1 -c clients -t traders -o orders -q queue-size -s stock-count -V <verbose on>\n";
326
+
327
+ #define INIT_COUNT 5000
328
+
329
+ int main(int argc, char **argv)
330
+ {
331
+ int c;
332
+ int client_threads;
333
+ int trader_threads;
334
+ int orders_per_client;
335
+ int que_size;
336
+ int max_stock;
337
+ int verbose;
338
+ struct client_arg *ca;
339
+ struct trader_arg *ta;
340
+ pthread_t *client_ids;
341
+ pthread_t *trader_ids;
342
+ struct order_que *order_que;
343
+ struct market *market;
344
+ int i;
345
+ int done;
346
+ int err;
347
+ double start;
348
+ double end;
349
+
350
+
351
+ /*
352
+ * defaults
353
+ */
354
+ client_threads = 1;
355
+ trader_threads = 1;
356
+ orders_per_client = 1;
357
+ verbose = 0;
358
+ que_size = 1;
359
+ max_stock = 1;
360
+
361
+ while((c = getopt(argc,argv,ARGS)) != EOF) {
362
+ switch(c) {
363
+ case 'c':
364
+ client_threads = atoi(optarg);
365
+ break;
366
+ case 't':
367
+ trader_threads = atoi(optarg);
368
+ break;
369
+ case 'o':
370
+ orders_per_client = atoi(optarg);
371
+ break;
372
+ case 'q':
373
+ que_size = atoi(optarg);
374
+ break;
375
+ case 's':
376
+ max_stock = atoi(optarg);
377
+ break;
378
+ case 'V':
379
+ verbose = 1;
380
+ break;
381
+ default:
382
+ fprintf(stderr,
383
+ "unrecognized command %c\n",
384
+ (char)c);
385
+ fprintf(stderr,"usage: %s",Usage);
386
+ exit(1);
387
+ }
388
+ }
389
+
390
+ client_ids = (pthread_t *)malloc(client_threads*sizeof(pthread_t));
391
+ if(client_ids == NULL) {
392
+ exit(1);
393
+ }
394
+
395
+ ca = (struct client_arg *)malloc(client_threads*sizeof(struct client_arg));
396
+ if(ca == NULL) {
397
+ exit(1);
398
+ }
399
+
400
+ trader_ids = (pthread_t *)malloc(trader_threads*sizeof(pthread_t));
401
+ if(trader_ids == NULL) {
402
+ exit(1);
403
+ }
404
+
405
+ ta = (struct trader_arg *)malloc(trader_threads*sizeof(struct trader_arg));
406
+ if(ta == NULL) {
407
+ exit(1);
408
+ }
409
+
410
+ order_que = InitOrderQue(que_size);
411
+ if(order_que == NULL) {
412
+ exit(1);
413
+ }
414
+
415
+ market = InitMarket(max_stock,INIT_COUNT);
416
+ if(market == NULL) {
417
+ exit(1);
418
+ }
419
+
420
+ start = CTimer();
421
+ for(i=0; i < client_threads; i++) {
422
+ ca[i].id = i;
423
+ ca[i].order_count = orders_per_client;
424
+ ca[i].max_stock_id = max_stock;
425
+ ca[i].max_quantity = INIT_COUNT;
426
+ ca[i].order_que = order_que;
427
+ ca[i].verbose = verbose;
428
+ err = pthread_create(&client_ids[i],NULL,
429
+ ClientThread,(void *)&ca[i]);
430
+ if(err != 0) {
431
+ fprintf(stderr,"client thread create %d failed\n",i);
432
+ exit(1);
433
+ }
434
+ }
435
+
436
+ done = 0;
437
+ for(i=0; i < trader_threads; i++) {
438
+ ta[i].id = i;
439
+ ta[i].order_que = order_que;
440
+ ta[i].market = market;
441
+ ta[i].done = &done;
442
+ ta[i].verbose = verbose;
443
+ err = pthread_create(&trader_ids[i],NULL,
444
+ TraderThread,(void *)&ta[i]);
445
+ if(err != 0) {
446
+ fprintf(stderr,"trader thread create %d failed\n",i);
447
+ exit(1);
448
+ }
449
+ }
450
+
451
+ /*
452
+ * wait for the clients to finish
453
+ */
454
+ for(i=0; i < client_threads; i++) {
455
+ err = pthread_join(client_ids[i],NULL);
456
+ if(err != 0) {
457
+ fprintf(stderr,"client join %d failed\n",i);
458
+ exit(1);
459
+ }
460
+ }
461
+
462
+ /*
463
+ * tell the traders we are done
464
+ */
465
+ pthread_mutex_lock(&order_que->lock);
466
+ done = 1;
467
+ pthread_cond_signal(&order_que->empty);
468
+ pthread_mutex_unlock(&order_que->lock);
469
+
470
+ for(i=0; i < trader_threads; i++) {
471
+ err = pthread_join(trader_ids[i],NULL);
472
+ if(err != 0) {
473
+ fprintf(stderr,"trader join %d failed\n",i);
474
+ exit(1);
475
+ }
476
+ }
477
+ end = CTimer();
478
+
479
+ if(verbose == 1) {
480
+ PrintMarket(market);
481
+ }
482
+
483
+ printf("%f transactions / sec\n",
484
+ (double)(orders_per_client*client_threads) / (end-start));
485
+
486
+ free(ca);
487
+ free(ta);
488
+ free(client_ids);
489
+ free(trader_ids);
490
+ FreeMarket(market);
491
+ FreeOrderQue(order_que);
492
+
493
+ return(0);
494
+ }
495
+
496
+
497
+
498
+
499
+
500
+
501
+
502
+
503
+
504
+
505
+
506
+
507
+
508
+
509
+