( ) 3 1 ( ), ( ).. 1

Similar documents
スレッド

スレッド

Linux on ITRON-ハイブリッド構造の実装

slide4.pptx

メモリ管理

ファイルシステム

メモリ管理

C言語におけるファイル入出力の高速化

Linux 仮想メモリについて

Microsoft Word - Cプログラミング演習(10)

PowerPoint プレゼンテーション

tutorial_lc.dvi

メモリ管理

メモリ管理

memo

Microsoft PowerPoint - dev1.ppt

POSIXプログラミング Pthreads編

13 I/O

PowerPoint プレゼンテーション

ファイル入出力と プロセス間通信 \(1\)

Quartus II ハンドブック Volume 5、セクションIV. マルチプロセッサの調整

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

FreeBSD 1

1) // 2) I/O 3) Japan Advanced Institute of Science and Technology 2013/07/26 1

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

memo

O(N) ( ) log 2 N

Microsoft PowerPoint ppt [互換モード]

Java updated

memo

: Nonblocking I/O readpartial read EOF Solaris FILE 256 ungetc SEGV errno stdio considered harmful p.

スレッド

program.dvi

10-vm1.ppt

Microsoft Word - no204.docx

etrust Access Control etrust Access Control UNIX(Linux, Windows) 2

untitled

mstrcpy char *mstrcpy(const char *src); mstrcpy malloc (main free ) stdio.h fgets char *fgets(char *s, int size, FILE *stream); s size ( )

Presentation title (on one or two lines)

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Microsoft Word - Cプログラミング演習(12)

1 C STL(1) C C C libc C C C++ STL(Standard Template Library ) libc libc C++ C STL libc STL iostream Algorithm libc STL string vector l

04-process_thread_2.ppt

POSIXスレッド

Microsoft Word - no15.docx

program7app.ppt

PowerPoint プレゼンテーション

I. Backus-Naur BNF : N N 0 N N N N N N 0, 1 BNF N N 0 11 (parse tree) 11 (1) (2) (3) (4) II. 0(0 101)* (

並行システムの検証と実装

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

ohp11.dvi

r11.dvi

lexex.dvi

PowerPoint プレゼンテーション

slide5.pptx

r07.dvi

ohp07.dvi

PowerPoint プレゼンテーション

1 1.1 C 2 1 double a[ ][ ]; 1 3x x3 ( ) malloc() malloc 2 #include <stdio.h> #include

IntelR Compilers Professional Editions

memo

Microsoft Word - Training10_プリプロセッサ.docx

untitled

スレッドとプロセス

:30 12:00 I. I VI II. III. IV. a d V. VI

Java演習(4) -- 変数と型 --

Taro-リストⅠ(公開版).jtd

slide6.pptx

I. Backus-Naur BNF S + S S * S S x S +, *, x BNF S (parse tree) : * x + x x S * S x + S S S x x (1) * x x * x (2) * + x x x (3) + x * x + x x (4) * *

para02-2.dvi

V850Jx3-U SPボード向けサンプルプログラム操作説明書


1 1.1 C 2 1 double a[ ][ ]; 1 3x x3 ( ) malloc() 2 double *a[ ]; double 1 malloc() dou

オペレーティングシステム

02: 変数と標準入出力

Microsoft PowerPoint - kougi11.ppt

ikuo/enshu/keisanki/ GUI(Graphica

AV Boardソフトウェアマニュアル

LIFO(last in first out, ) 1 FIFO(first in first out, ) 2 2 PUSH POP : 1

An Introduction to OSL

Microsoft PowerPoint ppt [互換モード]

02: 変数と標準入出力

プログラミングI第10回

PowerPoint Template

For_Beginners_CAPL.indd

スライド タイトルなし

POSIXスレッド

thesis.dvi

ex14.dvi

組込み Linux の起動高速化 株式会社富士通コンピュータテクノロジーズ 亀山英司 1218ka01 Copyright 2013 FUJITSU COMPUTER TECHNOLOGIES LIMITED

Microsoft Word - Cプログラミング演習(11)

RX600 & RX200シリーズ アプリケーションノート RX用仮想EEPROM

Prog1_15th

Microsoft PowerPoint - kougi9.ppt

新・明解C言語 ポインタ完全攻略

memo

Microsoft PowerPoint - 05.pptx

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

memo

Transcription:

30 2019 1 22 ( ) 3 1 ( ), 2-9 5 ( ).. 1

1. ( T):,? ( O):, T:,? O:!?,!?,... T:,,,? O:!?,,, OS? T:,, SSD, OS, CPU, OS SSD,? O:,,...? T: : OS,,, ( ) (1),. Linux, Unix OS. (2), (permission), (owner)., ( : ).,,. (3),, ID (effective user ID, euid)., ( ) ( ) euid.,, ID euid,. (4) sudo su, (root). root, sudo su, root euid. sudo su, root euid. Unix, euid root, root.? 2

2 N M vectors t. 1 typedef struct { 2 long a[m][n]; 3 vectors_t;. int search(vectors t * u, long q[n]); u N q 1, 0. void swap(vectors t * u, long i, long j); u i j.,.,. u p 0,, p M 1, swap search, q p i, search(u, q) 1., 1 (, ). 1 int search(vectors_t * u, long q[n]) { 2 int found = 0; 3 for (long i = 0; i < M; i++) { 4 if (vec_eq(u->a[i], q)) found = 1; 5 if (found) break; 6 7 return found; 8 1 void swap(vectors_t * u, long i, long j) { 2 if (i == j) return; 3 long * p = u->a[i]; 4 long * q = u->a[j]; 5 for (long k = 0; k < N; k++) { 6 long t = p[k]; 7 p[k] = q[k]; 8 q[k] = t; 9 10 veq eq(p, q) 2 1, 0,. 1 int vec_eq(long p[n], long q[n]) { 2 for (long k = 0; k < N; k++) { 3 if (p[k]!= q[k]) return 0; 4 5 return 1; 6. (1),,. 3

(2),? (3) (Pthread mutex), vectors t, search, swap... search, swap, mk vectors. Pthread mutex API (pthread mutex init 2 0 ). 1 int pthread_mutex_init(pthread_mutex_t * m, pthread_mutexattr_t * a); 2 int pthread_mutex_lock(pthread_mutex_t *m); 3 int pthread_mutex_unlock(pthread_mutex_t *m);, search, swap,. read-write lock. read-write lock,, 1 void rwlock_init(rwlock_t * l); /* */ 2 void rwlock_rdlock(rwlock_t * l); /* read lock */ 3 void rwlock_wrlock(rwlock_t * l); /* write lock */ 4 void rwlock_unlock(rwlock_t * l); /* read (write) lock */,,. 1 read-write lock write lock 2, write lock read lock ( read lock )., read-write lock, write lock W, read lock R, (W = 0) (W = 1 R = 0)., (T ) read-write lock (l ) write lock ( read lock), T rwlock wrlock(l) ( rwlock rdlock(l)) (return), rwlock unlock(l). (4), read-write lock. (5) read-write lock, mutex. Pthread API. 1 int pthread_cond_init(pthread_cond_t * cond, pthread_condattr_t * attr); 2 int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex); 3 int pthread_cond_broadcast(pthread_cond_t *cond);., rw, 1 write lock ( W ), 31, read lock ( R) ( 2 31 ). 1 typedef struct { 2 int rw; 3 pthread_mutex_t m; 4 pthread_cond_t c; 5 rwlock_t; 4

( ), rwlock rdlock, rwlock wrlock, rwlock unlock.,. rwlock unlock, write lock read lock ( ). :,,. 1 void rwlock_init(rwlock_t * l) { 2 l->rw = ; 3 4 1 void rwlock_rdlock(rwlock_t * l) { 2 3 while (1) { 4 int rw = l->rw; 5 if ( ) { 6 7 else { 8 l->rw = ; 9 break; 10 11 12 13 1 void rwlock_wrlock(rwlock_t * l) { 2 3 while (1) { 4 int rw = l->rw; 5 if ( ) { 6 7 else { 8 l->rw = ; 9 break; 10 11 12 13 1 void rwlock_unlock(rwlock_t * l) { 2 3 int rw = l->rw; 4 if ( ) { 5 l->rw = ; 6 else { 7 l->rw = ; 8 9 10, pthread mutex t. pthread mutex lock pthread mutex unlock,. 5

1 typedef struct { 2 int locked; 3 pthread_mutex_t; 4 5 /* pthread_mutex_lock */ 6 int pthread_mutex_lock(pthread_mutex_t * l) { 7 if (l->locked == 0) { 8 l->locked = 1; 9 else { 10 block(&l->locked); 11 12 return 0; 13 14 15 /* pthread_mutex_unlock */ 16 int pthread_mutex_unlock(pthread_mutex_t * l) { 17 l->locked = 0; 18 wake_all(&l->locked); 19 return 0; 20, block(p), wake all(p), p block(p) ( ). (6), 2.. (a) 2 lock. (b) lock, lock. (7) 3,. cas(int * p, int a, int b) (compare-and-swap) : p (*p) a, b 1. a 0. *p a atomic. cab(int * p, int a) (compare-and-block) : p (*p) a,. return. *p a atomic. wake all(int * p) : (8) (4) mutex read-write lock., mutex, 3, read-write lock. 6

3 2,,., ( long ), (n), (l), l < n ( ) (n), (r), n < r ( ) 2. ( ),, ( )... node (sizeof(node)) 32 1 typedef struct { 2 long key; /* */ 3 long val; /* */ 4 long l; /* ( ) */ 5 long r; /* ( ) */ 6 node; l (r) ( ),. 1 2, node 25 13 32 7 18 28 40 3 9 15 48 12 key val l r 0 1 2 3 4 5 6 7 8 9 10 11 25 13 18 32 7 28 9 40 3 12 48 15.................................... 1 3 4 2 11 5 7 8 6 9 10 1: 2 ( ) 2 (nodes), (n),. 1 typedef struct { 2 node * nodes; /* node */ 3 long n; /* */ 4 bstree_t; 7

2,, ( ).,. 2 0. 1 long search_rec(long n, long k, bstree_t * t, long * np) { 2 node * p = &t->nodes[n]; 3 *np = *np + 1; 4 if (k == p->key) { 5 return p->val; 6 else if (k < p->key) { 7 if (p->l == ) { /* */ 8 return ; /* not found */ 9 else { 10 return search_rec(p->l, k, t, np); 11 12 else { 13 if (p->r == ) { /* */ 14 return ; /* not found */ 15 else { 16 return search_rec(p->r, k, t, np); 17 18 19 20 21 long bstree_search(bstree_t * t, long k, long *np) { 22 if (t->n == 0) { /* */ 23 return ; /* not found */ 24 else { 25 return search_rec(0, k, t, np); 26 27. 1: 2, n, (F ). 2: F. 3: F, m. m T.. 1 T0 = ; 2 bstree_t t[1]; 3 t->n = n; 4 t->nodes = read_nodes(f, n); /* node */ 5 for (long i = 0; i < m; i++) { 6 long k = ; 7 bstree_search(t, k); 8 9 T1 = ; 10 T = T1 - T0; read nodes. 1: n malloc, fread 2: mmap 8

1GB ( 10 9 ),. N = 32n ( node n N ). (1) 1, 2. ( ). 1 node * read_nodes(char * F, long n) { 2 3 node * nodes = 4 5 return nodes; 6 ( ). 1 void *malloc(size_t size); 2 int open(const char *pathname, int flags); 3 ssize_t read(int fd, void *buf, size_t count); 4 FILE *fopen(const char *pathname, const char *mode); 5 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 6 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);,. (2), 1, 2, T m, n,..., 1 2,.,,,,, 2 ( 2 ).,.. P : (4096 ) A : 1 2. 1 2. a : 2, 1 (A ). (a) N = 2GB, m 1 n/100 T ( m, T ). (b) N = 300MB, m 1 n/100 T ( m, T ). (c) m 100 (n ), N 32KB 2GB T ( N, T ). 9

,,.. 86 ( 100 ).. 80 (93%), 8 (9%), 39.33 (45%). 1

30,, ( 86 ) 学生証番号 氏名 スーパーユーザモード, 特権命令 1 (1) 6 点 (2) 2 点 許可属性を変更するシステムコール chmod 2 点 許可属性を変更できるユーザ 所有者, root 2 点 所有者を変更するシステムコール chown 2 点 所有者を変更できるユーザ root (3) 6 点 ログインを受け付けるプロセスがeuid = root として実行されており, 認証が済んだところで seteuid, setreuid で認証されたユーザに euid を変更する (4) 6 点 ファイルに 1 属性として setuid bit があり, それ は exec されるとそのファイルの所有者に euid が 変更される 2

(1) ( 0.57) (2) ( chmod 0.67, root 0.63, chown 0.51, root 0.66) (3) ( 0.34) (4) ( 0.1) root, su sudo root,. su sudo,. sudo su ( ). 3

正しく動作しない実行系列の説明 swap(u, 0, 1) を実行しているスレッドをA, search(u, q) を実行しているスレッドをBとする. 2 (1) 4 点ただしq = u[0] だったとする. [1] Aが7 行目までを実行する [2] B が search を実行する (2) 2 点競合状態 (3) 4 点 (4) 4 点 typedef struct { pthread_mutex_t l; long a[m][n]; vectors_t; int search(vectors_t * u, long q[n]) { int found = 0; pthread_mutex_lock(&u->l); for (long i = 0; i < M; i++) { if (vec_eq(u->a[i], q)) found = 1; if (found) break; pthread_mutex_unlock(&u->l); return found; typedef struct { rwlock_t l; long a[m][n]; vectors_t; vectors_t * mk_vectors() { vectors_t * u = malloc(sizeof(vectors_t)); pthread_mutex_init(&u->l); /* u->a[*][*] を初期化 ( 省略 ) */ return u; void swap(vectors_t * u, long i, long j) { if (i == j) return; long * p = u->a[i]; long * q = u->a[j]; pthread_mutex_lock(&u->l); for (long k = 0; k < N; k++) { long t = p[k]; p[k] = q[k]; q[k] = t; pthread_mutex_unlock(&u->l); vectors_t * mk_vectors() { vectors_t * u = malloc(sizeof(vectors_t)); rwlock_init(&u->l); /* u->a[*][*] を初期化 ( 省略 ) */ return u; 4

int search(vectors_t * u, long q[n]) { int found = 0; rwlock_rdlock(&u->l); for (long i = 0; i < M; i++) { if (vec_eq(u->a[i], q)) found = 1; if (found) break; rwlock_unlock(&u->l); return found; void swap(vectors_t * u, long i, long j) { if (i == j) return; long * p = u->a[i]; long * q = u->a[j]; rwlock_wrlock(&u->l); for (long k = 0; k < N; k++) { long t = p[k]; p[k] = q[k]; q[k] = t; rwlock_unlock(&u->l); (5) 6 点 void rwlock_init(rwlock_t * l) { l->rw = 0; pthread_mutex_init(&l->m, 0); pthread_cond_init(&l->c, 0); void rwlock_wrlock(rwlock_t * l) { pthread_mutex_lock(&l->m); while (1) { int rw = l->rw; if (rw) { pthread_cond_wait(&l->c, &l->m); else { l->rw = 1; break; pthread_mutex_unlock(&l->m); void rwlock_rdlock(rwlock_t * l) { pthread_mutex_lock(&l->m); while (1) { int rw = l->rw; if (rw & 1) { pthread_cond_wait(&l->c, &l->m); else { l->rw = rw + 2; break; pthread_mutex_unlock(&l->m); void rwlock_unlock(rwlock_t * l) { pthread_mutex_lock(&l->m); int rw = l->rw; if (rw == 1) { l->rw = 0; else { l->rw = rw - 2; pthread_cond_broadcast(&l->c); pthread_mutex_unlock(&l->m); (6) (a) 4 点 2 つのスレッドが同時に lock を取得できてしまう実行系列の説明 pthread_mutex_lock を呼び出している二つのスレッドを A, B とする [1] A が 7 行目までを実行 [2] B が 7 行目までを実行 lock が解放された状態であるにもかかわらず, lock が取得できずにスレッドがブロックしてしまう実行系列の説明 lock を呼び出しているスレッドを A, unlock を呼び出しているスレッドを B とする. (b) スレッドBがすでにロックを取得しているとする 4 点 [1] Aが7 行目までを実行 (l->locked == 1を読み出す ) [2] Bが19 行目までを実行 [3] A が 10 行目を実行 5

tint pthread_mutex_lock(pthread_mutex_t * l) { int * p = &l->locked; while (1) { int locked = *p; if (locked == 0) { if (cas(p, 0, 1)) { (7) 6 点 break; else { cab(p, 1); void rwlock_init(rwlock_t * l) { l->rw = 0; (8) 6 点 void rwlock_wrlock(rwlock_t * l) { while (1) { int rw = l->rw; if (rw) { cab(&l->rw, rw); else { if (cas(&l->rw, 0, 1)) { break; tint pthread_mutex_unlock(pthread_mutex_t * l) { int * p = &l->locked; int locked = *p; *p = 0; wake_all(p); void rwlock_rdlock(rwlock_t * l) { while (1) { int rw = l->rw; if (rw & 1) { cab(&l->rw, rw); else { if (cas(&l->rw, rw, rw + 2)) { break; void rwlock_unlock(rwlock_t * l) { int rw = l->rw; if (rw == 1) { l->rw = 0; wake_all(&l->rw); break; else { assert((rw & 1) == 0); if (cas(&l->rw, rw, rw - 2)) { wake_all(&l->rw); break; 6

(1) ( 0.71). ( search ), (2) ( 0.66) (3) ( 0.66)., 1 pthread_mutex_t * m; mutex,., 1 pthread_mutex_init(&u->m); pthread mutex init..., 1 pthread_mutex_t m; 1 pthread_mutex_init(&u->m);, 1 pthread_mutex_t m; 1 u->m = malloc(sizeof(pthread_mutex_init)); 2 pthread_mutex_init(u->m);.. 1 pthread_mutex_t m[1]; 1 pthread_mutex_init(u->m); (4) ( 0.58) (2). (5) ( 0.32).. 1 lock(m); 2 /* */ 3 while (! ) { 4 cond_wait(c, m); 5 6 /* */ cond_broadcast(c); 7 unlock(m); 7

(6) ( (a) 0.84, (b) 0.47). (b), block block,. (7) ( 0.17).,,. 1 while (1) { 2 if (lock ) { 3 block 4 else { 5 lock 6 7. 1 int * p = &l->locked; 2 while (1) { 3 if (cas(p, 0, 1)) { 4 break; 5 else { 6 cab(p, 1); 7 8 (8) ( 0.03) read-write lock.. rdlock 1 while (1) { 2 if (wrlock ) { 3 block 4 else { 5 rdlock (rw = rw + 2) 6 7 8

方法 1: nnodes * read_nodes(char * F, long n) { int fd = open(filename, O_RDWR); nodes * nodes = malloc(t->sz * sizeof(node)); size_t rd = 0; 3 (1) 4 while (rd < count) { 点 size_t x = read(fd, buf + rd, count - rd); x2 if (x == ) { err(1, "read"); else if (x == 0) { err(1, "premature EOF"); else { rd += x; return nodes; 方法 2: nodes * read_nodes(char * F, long n) { int fd = open(filename, O_RDWR); nodes * nodes = mmap(0, t->sz * sizeof(node), PROT_READ PROT_WRITE, MAP_SHARED, fd, 0); return nodes; (2) (a) 式 : ( 方法 1) T = a N / P + A m log(n) ( なお方法 1, 2の式が正しければ両者の直線は並行になるはずだが実測結果はなっていない. 以下の注参照 ) グラフ ( 実測値は右のようになったが, 以下の解説を参照 ) ( 方法 2) T = A m log(n) 4 点 x2 理由 ( 方法 1) 全ページを一旦読み込む (an/p) がその後の search の際にも各ページへのアクセスでページフォルトが 生ずる ( 一回の検索で約 log(n) ページに触るので A m log(n)) ( 方法 2) mmap の場合ページを一旦読み込む必要がないので (b) 式 : ( 方法 1) T = a N / P ( 方法 2) T = A max(m log(n), N / P) グラフ ( 実測値は右のようになったが, 以下の解説を参照 ) ( 実際はもう少し複雑. 以下のグラフを参照 ) 4 点 x2 9

理由 ( 方法 1) 全ページを一旦読み込み (an/p) その後はほぼページフォルトが生じない (c) 式 : ( 方法 1) T = a N / P グラフ ( 方法 2) (a) と途中までは同じだが徐々にメモリ上にデータ が埋まってくるのでほとんどページを新たに取得する必要がなくなる ( 方法 2) T = A m log (N) 4 点 x2 理由 : ( 方法 1) 全ページを読み込むのにかかる時間そのもの ( 方法 2) m が小さいため一回の探索でだいたい log(n) の 異なるページを触る 10

(1) ( read 0.77, mmap 0.49) mmap, mmap malloc mmap. mmap ( )., (PROT PRIVATE ). read, open, malloc, read ( fread). mmap, open, mmap. (2) ( read 0.48, mmap 0.52)., m, (m < n/3000 ) (, m = n/100, m = n/3000 )., read y, mmap y 0. mmap y 0, mmap,. read y > 0, read. >,.., read., m mmap... OK. (3) ( read 0.49, mmap 0.12), 0.,, 0. read, read,, ( m. ). 11

mmap., 1,,., m,. (4) ( read 0.24, mmap 0.31), read N, mmap log N. read, N ( N/2. read, OS, ),,.. 12