Operating Systems Homework #2 김현준 (2012003954), 한양대학교

2015-05-07

The Dining Philosophers Problem Comments on this homework: 유명한 철학자 문제를 직접 구현해볼 수 있어 즐거운 과제였습니다. 처음에는 강의 시간에 교수님 께서 예로 들어주신 것처럼 짝수번째 철학자와 홀수번째 철학자가 서로 다른 방향의 젓가락을 먼저 차지하는 전략으로 구현했고, 이후에는 최대 N - 1명의 철학자만 동시에 젓가락을 집으려고 시도할 수 있도록 제한하는 방법으로 다시 구현하였습니다(https://github.com/yoloseem/os-homeworks/ commit/682dbaf643b1028d4823e4239e0d96e48c8c21d8). 이와 같이 여러 방법을 시도해보면서 문제 를 해결하는데에는 다양한 방법이 존재할 수 있음을 다시금 경험할 수 있었고, 그와 동시에 여러 해결책을 생각해내기 위해서는 기반 지식과 경험 역시 탄탄해야하겠다고 생각했습니다. 예컨대, 최대 N - 1명을 허용하는데에 Semaphore를 사용하는 방법은, 단순히 단일 트랜잭션에 대한 Lock으 로만, 즉 Binary Semaphore로서만 이해하고 있던 저로서는 이번 과제를 하면서 제대로 알 수 있게된 부분입니다. 과제 내용과 별개로 기억에 남는 것은, 과제 구현을 시작할 때부터 Makefile을 만들어두었더니 매 코드 변경시마다 컴파일 및 실행을 간편하게 할 수 있어서 좋았습니다.

References: 1. Full HW description: https://github.com/yoloseem/os-homeworks/blob/master/hw2/README.md 2. Raw source codes: https://github.com/yoloseem/os-homeworks/tree/master/hw2 3. Commit history: https://github.com/yoloseem/os-homeworks/commits/master

Homework #2

Page 1

Screenshot:

Source codes: Makefile 1

# Makefile

2

#

3

all: philo

4 5

clean: ${RM} philo

6 7 8 9

philo: ${CC} -o philo philo.c -lpthread

philo.c (Main source code) 1

/* philo.c */

2

#include

Homework #2

Page 2

3

#include

4

#include

5

#include

6

#include

7

#include

8

#include

9 10

#define MAX(a, b) (a)>(b)?(a):(b)

11

#define MIN(a, b) (a)<(b)?(a):(b)

12 13

#define HUNGRY 0

14

#define EATING 1

15

#define THINKING 2

16 17

#define NUM_PHIL 5

18

#define EXEC_TIME 600

19 20

typedef struct philosopher {

21

unsigned short numEat;

22

int state;

23

long wait;

24

} philosopher;

25

philosopher phil[NUM_PHIL];

26

char *verboseStates[] = {"HUNGRY", "EATING", "THINKING"};

27 28

// chopstick semaphores: Binary semaphores for each chopsticks

29

sem_t chopstick[NUM_PHIL];

30

// counting semaphore: Keep up to n -1 philosophers trying to acquire chopstick

31

sem_t lock;

32 33

int idlewait ()

34

{

// 10~500 msec wait

35

int sleepTimeMS = (rand() % 491 + 10);

36

usleep(sleepTimeMS * 1000); return sleepTimeMS;

37 38

}

39 40

unsigned int tick () {

41

struct timeval tv;

42

gettimeofday(&tv, (void*)0); return tv.tv_sec * (unsigned int)1000 + tv.tv_usec / 1000;

43 44

// get current time (msec)

}

45 46

void initPhil (void) {

47

// 1. Set up philosophers’ initial states as specified in HW description

48

// 2. Initialize chopstick semaphores

49

unsigned short i;

50

for (i=0; i
51

phil[i].numEat = 0;

52

phil[i].state = THINKING;

53

phil[i].wait = 0;

Homework #2

Page 3

sem_init(&chopstick[i], 0, 1);

54

}

55 56

}

57 58

void* dining (void* arg) {

59

unsigned short i;

60

unsigned short left, right;

61

unsigned int start_time;

62

unsigned int start_hungry, end_hungry;

63

unsigned short phil_i = (int)(intptr_t)arg;

64

philosopher* curphil = &phil[phil_i]; // reference to current philosopher

65

left = phil_i;

66

right = (phil_i + 1) % NUM_PHIL;

67 68

start_time = tick();

69

// Repeat think-hungry-eating cycle during given execution time in secs

70

while ((tick() - start_time) / 1000 < EXEC_TIME) {

71

// initially or still in THINKING state

72

idlewait();

73 74

// Got into HUNGRY state

75

curphil->state = HUNGRY;

76

start_hungry = tick();

77

// To eat, acquires chopsticks

78

// 1. Wait for my turn

79

//

80

sem_wait(&lock);

81

// 2. Wait and acquire both chopsticks

82

sem_wait(&chopstick[left]);

83

sem_wait(&chopstick[right]);

84

// 3. Timing

85

end_hungry = tick();

(up to n-1 philosophers are permitted to acquire chopsticks)

86 87

// Got into EATING state

88

curphil->state = EATING;

89

curphil->wait += (end_hungry - start_hungry);

90

curphil->numEat++;

91

idlewait();

92

// To think(and not hungry), release chopsticks

93

sem_post(&chopstick[left]);

94

sem_post(&chopstick[right]);

95

sem_post(&lock);

96 97

// Stop EATING and go to THINKING state again

98

curphil->state = THINKING; }

99 100

return (void*)NULL;

101 102

}

103 104

int main (void) {

Homework #2

Page 4

105

pthread_t t[NUM_PHIL];

106

unsigned short i, args[NUM_PHIL], minCount = USHRT_MAX, maxCount =0;

107

long start, end, minWait = LONG_MAX, maxWait = 0, waitAVG = 0, waitVar = 0;

108

double countAVG = 0, countVar = 0;

109

void *t_return = NULL;

110 111

srand(time(NULL));

112

start = tick();

113

initPhil();

114

// Initialize philosopher-counting semaphore

115

sem_init(&lock, 0, NUM_PHIL - 1);

116 117

// Spawn philosopher threads

118

for (i=0; i
119

pthread_create(&t[i], NULL, dining, (void*)(intptr_t)args[i]);

120 121

}

122

for (i=0; i
123 124

}

125

end = tick(); // Timing

126 127

// Destory all used semaphores

128

for (i=0; i
129 130

sem_destroy(&lock);

131 132

for (i=0; i
133

printf("Philosopher %d eating count : %d\n", i, phil[i].numEat);

134

printf("Philosopher %d waiting time in HUNGRY state : %ld.%03ld sec", i, phil[i].wait / 1000, phil[i].wait % 1000);

135 136

printf("\n\n");

137

countAVG += phil[i].numEat;

138 139

minCount = MIN(minCount, phil[i].numEat);

140

maxCount = MAX(maxCount, phil[i].numEat);

141

waitAVG += phil[i].wait;

142

minWait = MIN(minWait, phil[i].wait); maxWait = MAX(maxWait, phil[i].wait);

143 144

}

145

countAVG /= NUM_PHIL;

146

waitAVG /= NUM_PHIL;

147 148

for (i=0; i
149

waitVar += (waitAVG - phil[i].wait) * (waitAVG - phil[i].wait);

150 151

}

152

countVar /= (NUM_PHIL - 1);

153

waitVar /= (NUM_PHIL - 1);

154 155

printf("Min count : %d\n", minCount);

Homework #2

Page 5

156

printf("Max count : %d\n", maxCount);

157

printf("AVG count : %.3f\n", countAVG);

158

printf("Count variance : %.3f\n\n", countVar);

159

printf("Min wait time in HUNGRY state : %ld.%03ld sec\n", minWait / 1000, minWait % 1000);

160

printf("Max wait time in HUNGRY state : %ld.%03ld sec\n",

161

maxWait / 1000, maxWait % 1000);

162

printf("AVG wait time in HUNGRY state : %ld.%03ld sec\n",

163

waitAVG / 1000, waitAVG % 1000);

164

printf("Variance wait time in HUNGRY state : %ld.%06ld sec\n\n",

165

waitVar / 1000000, (waitVar % 1000000) / 1000);

166

printf("Total run time : %ld.%03ld sec\n\n",

167

(end - start)/ 1000, (end - start)% 1000);

168

return 0;

169 170

}

Homework #2

Page 6

Operating Systems Homework #2 - GitHub

May 7, 2015 - #include ... unsigned int tick () { // get current time (msec) ... Repeat think-hungry-eating cycle during given execution time in secs.

950KB Sizes 10 Downloads 342 Views

Recommend Documents

Operating Systems Homework #3 - GitHub
May 14, 2015 - (Integer) Number indicating scheduling algorithm. 27 int policy;. 28. // Enum values for policy. 29 const short FCFS=0, SJF=1, PRIOR=2, RR=3;.

CSCI 305 Homework 2 - GitHub
Feb 23, 2018 - Describe how Fortran common blocks work and give an example. What happens if two named common blocks with the same name contain different variables? What is the difference between a blank common and a named common? What does the linker

Homework #1 - GitHub
Please select either bus 2 or 3 as reference bus, calculate the line flows, and check if the results are the same. 2. Come up with a case study of LP, and solve it in ...

Homework 12 - Magnetism - GitHub
region containing a constant magnetic field B = 2.6T aligned with the positive ... With what speed v did the particle enter the region containing the magnetic field?

CSCI 305 Homework 1 - GitHub
Feb 9, 2018 - 2. What is the name of the paradigm that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data? (1 pt) a. event-driven b. concurrent c. scripting d. object-oriented e. logic f. imperat

Homework 22 Physics 2220 - GitHub
Dec 2, 2014 - In order to determine y-component of E-vector, we need to use right-hand rule, which will give us negative sign and for the size we will have.

CSCI 305 Homework 5 - GitHub
Apr 16, 2018 - The following code fragment uses arrays in Java. The first line declares and allocates an array of two integers. The next two lines initialize it. int[] A = new int[2];. A[0] = 0;. A[1] = 2; f(A[0], A[A[0]]);. Function f is defined as:

Homework 2
Recall the unitary group U1 = {z ∈ C | |z| = 1}. Find all the one dimensional continuous complex representations of U1. 5. Let G be a finite group. Let ρ : G −→ GLn(R) be an n-dimensional real representation. Prove that there exists a matrix Ï

Homework 2.pdf
Self-checkout lines at grocery stores are fairly commonplace these days. Describe what happened to. the demand for cashiers when these devices became ...

Semester 2 Homework 2
Dec 9, 2006 - Fill in the blanks using the words shown. One word is extra. thinking think buy buying would should work home. NELEGTRO SHOP. I'm about.

History of Operating Systems
Mar 5, 2001 - business to science – customers who did a lot of mathematical calculations as well as those who did .... Some of these ideas included ... Control Protocol/Internet Protocol) started to become widely used especially in military.

History of Operating Systems
Mar 5, 2001 - Throughout the history of computers, the operating system has continually ... charged for all of the resources whether or not the job used these resources. ... application, including the highly detailed machine level input/output .... m

02 Securing Operating Systems Lession 2 By HackerStair.pdf ...
Sep 6, 2017 - Saat saya cek melalui website, disebutkan bahwa paket sudah. diterima oleh pembeli. Saya telah mengirimkan komplain ke Wa- hana melalui ...

02 Securing Operating Systems Lession 2 By HackerStair.pdf ...
infection rate on Windows 7 rose over 30% in H2‐2010, while that on Windows XP dropped over 20%. Says Principal Group Program Manager Jeff Williams for ...

systems programming and operating systems
Think os a brief. introduction to operating systems free. ... Browser homepage be,mca notes question papers resus online fm. ... programming course by anthony joseph. ... Types of computer programmers codestart blog. ... dhamdhere pdf free.

Semester 2 Homework 1
Brad. ( I'm / I'll ) going home. ( lt / It's ) looks dangerous! Len, don't worry. (I / I've ) been lots of times. ( You'll / You ) won't get hurt. And ( you'll / you ) love it!

523354 operating systems
User IDs identify users, allowing permissions and protections to be per-user. ◦ Group IDs allow users to be in groups, permitting group access rights. 2. Remote File Systems. Files are shared on network. FTP, world wide web, distributed file system