More Related Content
Similar to ラボユース最終成果報告会(Web公開版)
Similar to ラボユース最終成果報告会(Web公開版) (20)
ラボユース最終成果報告会(Web公開版)
- 1. サイボウズ・ラボユース
最終成果報告
∼現役高校生の考えるクラウドOSの設計と実装∼
粟本 真一
注:WEBで公開するために一部のスライドを編集しています。
- 16. make
クライアントプログラム
サーバープログラム ×2
サーバープログラム ×4
Allba system Demo
- 18. 計測データ
make (オプション無し) : 45s
make -j2 : 26s
Allba : 11s
(Mac Book Air 2proc, ASUS K53E 4proc)
Allba system Demo
- 31. そもそも、複数ノードとの
接続をAPI化した方が良い
foreach(node n : node_list)
{
error = connect(n); 新しいAPIを
}
- 32. list < string > ip_list;
list<Node>::iterator it = server_list.begin();
while (it != server_list.end()) {
int server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (server_sockfd < 0) {
cout << (*it).ip_addr << "(" << (*it).port << "): failed (1)"
<< endl;
++it;
continue;
}
struct sockaddr_in address;
address.sin_family = AF_INET;
この70行のコード
address.sin_addr.s_addr = inet_addr((*it).ip_addr.c_str());
address.sin_port = htons((*it).port);
int len = sizeof(address);
int result = fcntl(server_sockfd, F_SETFL, O_NONBLOCK);
if (result < 0) {
cout << "fcntl returned error(1)." << endl;
close(server_sockfd);
return -1;
}
result = connect(server_sockfd, (struct sockaddr *) &address, len);
if (result < 0) {
if (errno == EINPROGRESS) {
fd_set set;
struct timeval tv;
tv.tv_sec = 5; //5秒でタイムアウト
tv.tv_usec = 0;
- 33. 分散処理に最適化されたAPI
を作れば、この3行で済む
list<Node> node_list;
list<int> server_sockfd = grid_socket(AF_INET, SOCK_STREAM, 0);
vector<int> error = grid_connect(server_sockfd, node_list);
- 52. // 同期 // 同期が必要かどうかを伝達
if (is_need_to_sync == 1) { server->WriteNumber(server->IsNotLocalHost());
while (true) { server->ReadString(tmp, ok.size());
int fn_size = client.ReadNumber(); if (tmp != ok) {
if (fn_size == 0) { cout << "Allba: error: system error" << endl;
break; return -1;
} }
client.WriteString(ok);
bool is_need_sync = true;
この、クライアントと
string sync_filename; list<string>::iterator it2 = ip_list.begin();
client.ReadString(sync_filename, fn_size); while (it2 != ip_list.end()) {
if (*it2 == (*it).ip_addr) {
struct stat stat_tmp; is_need_sync = false;
int stat_status = stat(sync_filename.c_str(), &stat_tmp); break;
}
サーバー合わせて150行
client.WriteString(ok); ++it2;
}
time_t time = (time_t) client.ReadNumber(); server_list_.push_back(server);
if (time <= stat_tmp.st_mtime && stat_status !=
-1) { if (server->IsNotLocalHost() == 1) {
client.WriteString(ok); if (!is_need_sync) {
continue; server->WriteNumber(0);
のコードなんて、
} ++it;
cout << "refreshing " << sync_filename << endl; continue;
string no = "no"; }
client.WriteString(no);
cout << "sync starting..." << endl;
int outputfile_length = client.ReadNumber(); list<string>::iterator it3 = sync_list_.begin();
while (it3 != sync_list_.end()) {
client.WriteString(ok); server->WriteNumber((*it3).size());
server->ReadString(tmp, ok.size());
string outputfile; if (tmp != ok) {
cout << "Allba: error: system error" << endl;
char *file_data = new char[outputfile_length]; return -1;
}
client.ReadString(file_data, outputfile_length);
tmp = *it3;
FILE *fp = fopen(sync_filename.c_str(), "wb"); server->WriteString(tmp);
fseek(fp, 0, SEEK_SET); server->ReadString(tmp, ok.size());
fp);
fwrite(file_data, sizeof(char), outputfile_length, if (tmp != ok) {
cout << "Allba: error: system error" << endl;
return -1;
- 53. ノードA
プロセス
仮想ファイル経由でアクセスすれば
ノードB
プロセス
仮想ファイル
- 60. • メモリ管理
• システムコール
• ファイルシステム
• デバイスドライバ
• スケジューリング