2016년 10월 9일 일요일

식사하는 철학자

#include <stdio.h>       
#include <pthread.h>   
 
#define NUM_THREADS 5
 
pthread_mutex_t mutexes[NUM_THREADS];
pthread_cond_t conditionVars[NUM_THREADS];
 
int permits[NUM_THREADS];
pthread_t tids[NUM_THREADS];
 
void pickup_forks(int philosopher_number) {
    pthread_mutex_lock(&mutexes[philosopher_number%NUM_THREADS]);
    while (permits[philosopher_number%NUM_THREADS] == 0) {
        pthread_cond_wait(&conditionVars[philosopher_number%NUM_THREADS], &mutexes[philosopher_number%NUM_THREADS]);
    }
    permits[philosopher_number%NUM_THREADS] = 0;
    pthread_mutex_unlock(&mutexes[philosopher_number%NUM_THREADS]);
}
 
void return_forks(int philosopher_number) {
    pthread_mutex_lock(&mutexes[philosopher_number%NUM_THREADS]);
    permits[philosopher_number%NUM_THREADS] = 1;
    pthread_cond_signal(&conditionVars[philosopher_number%NUM_THREADS]);
    pthread_mutex_unlock(&mutexes[philosopher_number%NUM_THREADS]);
     
}
 
void* Philosopher(void * arg) {
    int philosopher_number;
    philosopher_number = (int)arg;
 
    // pickup left fork
    pickup_forks(philosopher_number);
    printf("philosopher(%d) picks up the fork(%d).\n", philosopher_number, philosopher_number);
     
    // pickup right fork
    pickup_forks(philosopher_number+1);
    printf("philosopher(%d) picks up the fork(%d).\n", philosopher_number, (philosopher_number + 1) % NUM_THREADS);
     
    printf("philosopher(%d) starts eating \n", philosopher_number);
    sleep(2);
    printf("philosopher(%d) finishes eating \n", philosopher_number);
 
    // putdown right fork
    return_forks(philosopher_number + 1);
    printf("philosopher(%d) put down the fork(%d).\n", philosopher_number, (philosopher_number + 1) % NUM_THREADS);
 
    // putdown left fork
    return_forks(philosopher_number);
    printf("philosopher(%d) put down the fork(%d).\n", philosopher_number, philosopher_number);
 
    return NULL;
}
 
void * OddPhilosopher(void * arg) {
    int philosopher_number;
    philosopher_number = (int)arg;
 
    // pickup right fork
    pickup_forks(philosopher_number + 1);
    printf("philosopher(%d) picks up the fork(%d).\n", philosopher_number, (philosopher_number + 1) % NUM_THREADS);
 
    // pickup left fork
    pickup_forks(philosopher_number);
    printf("philosopher(%d) picks up the fork(%d).\n", philosopher_number, philosopher_number);
 
    printf("philosopher(%d) starts eating \n", philosopher_number);
    sleep(2);
    printf("philosopher(%d) finishes eating \n", philosopher_number);
 
    // putdown left fork
    return_forks(philosopher_number);
    printf("philosopher(%d) puts down the fork(%d).\n", philosopher_number, philosopher_number);
 
    // putdown right fork
    return_forks(philosopher_number + 1);
    printf("philosopher(%d) puts down the fork(%d).\n", philosopher_number, (philosopher_number + 1) % NUM_THREADS);
 
    return NULL;
}
 
int main() {
    int i;
 
    for (i = 0; i < NUM_THREADS; i++) {
        pthread_mutex_init(&mutexes[i], NULL);
        pthread_cond_init(&conditionVars[i], NULL);
        permits[i] = 1;
    }
 
    for (i = 0; i < NUM_THREADS; i++) {
        if (i % 2) {
            pthread_create(&tids[i], NULL, OddPhilosopher, (void*)(i));
        }
        else{
            pthread_create(&tids[i], NULL, Philosopher, (void*)(i));
        }
    }
 
    for (i = 0; i < NUM_THREADS; i++) {
        pthread_join(tids[i], NULL);
    }
 
    for (i = 0; i < NUM_THREADS; i++) {
        pthread_mutex_destroy(&mutexes[i]);
        pthread_cond_destroy(&conditionVars[i]);
    }
 
    return 0;
}

2016년 10월 6일 목요일

명사구 part2

앞서  5문형을 기억해보자.
5문형은 주어+동사+목적어+보어로 구성된다고 했다. 여기의 보어는 명사와 형용사가 쓰인다. 이미 말했겠지만 내가 기억이 잘 안나서.... 아무튼 명사와 형용사이니 to부정사도 당연히 쓰일수 있지 안겠는가.  이때 목적어는 to부정사의 의미상 주어역할을 할 수 있다.
이게 무슨말인가  하면 약간 4문형이랑 비슷한데

Bill wanted me to lend him some money.

이 문장을 빌은 나를 원하고 돈을 빌려줬어요 이렇게 해석하지 말라는 거다.

빌은 내가 돈을 빌려주기를 원했다.라고 해석을 하라는 거다.

I told you to store the data

이것도 데이터를 저장하라고 내가 말했잖아요.이렇게 해석 해야한다.

의미상의 주어는 다른게 아니라 주어역할을 하지 않지만 문장 의미상 핵심이 되는 의미를 저장 했다는 것이다.

조심 해야할 것이 사역동사 have,make,let과 같은 경우와 지각동사 sww,hear,feel은 원형을 받으며 지각동사는 현재분사가 올 수 있다.


그런데 to 부정사가 왔는데 ing가 빠지면 섭섭하다. 바로 분사다. 근데 이런 용어 외우진 말고 그냥 동사적인 성질을 가진 형용사로 받아 들이자.  현재는 ing를 쓰며 과거는 ed를 붙여 표현한다. 의미는 ~는(은)로 해석을 할 수 있다.

I saw paul talking with her.

이 표현은  폴이 그녀와 대화하는 것을 봤어요.로 해석 하고

Sorry that i've kept you waiting for a long time

이 표현은 오랜 시간 기다리게 해서 죄송합니다. 이렇게 해석 된다.

히 분사는 현재분사 과거분사 이렇게 나뉘어지고 현재분사는 능동,진행을 나타애고 과거분사는 수동을 나타내고 이러지 말라는 거다. 자연스럽게 받아들일 줄 알도록 하자.

그러면 이제 이걸 보자.

boiling water

a running man

Do you know the man standing there?

The man answering the phone is peter.


a stolen painting

a fried egg

What is the language spoken in mexico

The man called jack is a lawer

각 문장을 어떻게 이해 하였는가.

괜히 능동 수동 이렇게 나눠서 주체가 스스로 할 수 있는가 아니면 받는가 이걸로 풀면 맞지 않는 것도 분명히 있음을 알것이다.
제발 그렇게 하지 말자,

대상의 상황을 살펴보자. 시제를 보란 말이다.

water은 스스로 끓여질수 없다, boiled water이렇게가 맞다고 하는 사람이 있을게다.

그런데 ing를 쓰는 이유는 끓여지고 있는 물이라는 의미니 현재 진행의 의미를 가지고 있기때문이다.  이렇게 문장을 볼 줄 알아야지 괜히 문법적으로 가려하면 틀리기 십상이다.

to부정사도 마찬가지다. 괜히 미래지향적인 의미가 있어 ~을 할 이렇게 해석하지 말라는거다. 예를 들면

The man  at the bus stop

The man singing over there

The man to marry Ally

이 세문장을 비교해보자

첫번째 문장은 버스정류장에 있는 남자. 두번째 문장은 저기서 노래하는 남자
그렇다면 마지막 문장은 어떻게 해석되는가. 엘리와 결혼 할 남자이다. 근데 왜 그렇게 해석했는가. 미래여서? 제발 그러지 말자. 왜냐하면 그게 자연스러운 해석이니까이다.
해석은 자연스러워야한다. 억지로 만들면 더 이상하다.

2016년 10월 5일 수요일

명사구 part1

우리말에서 동사를 명사화할 때 ~하다란 말을 ~하기로 바꾼다.
예를 들면 먹다 eat은 동사이지만 to eat이 되면 먹기가 된다. to부정사는 동사에서 명사로 역할을 달리 했지만 동사의 속성은 그대로 가지고 있다.
그래서 동사때 처럼 목적어,보어,수식어를 여전히 대리고 다닌다.

eat hambugers every day

-> To eat hambugers every day

보듯이 동사일 때 목적어와 보어, 수식어를 달고 다녔는데 to부정사가 되도 똑같이 대리고 다닌다. to부정사는 명사(구)이기 때문에 문장에서 명사로서 제 몫을 한다.

먼저 문장에서 주어로 쓰이는 경우를 보자.

To eat hambugers every day is bad for your health.

한데 주어로 저렇게 쓰이는 경우는 많지 않다. to부정사는 두 단어 이상의 구 형태이기 때문인데 주어가 길면 문장의 구조가 분명하게 드러나지 않기 때문이다. 영어는 그런거 싫어한다.그래서 주어를 뒤로 보내고 주어 자리에 it을 넣어서

It is bad for your health to eat hambugers every day.

이렇게 표현한다.

동사를 주어로 표현할 수 있는건 To부정사만 하는게 아니다. ing를 붙여서 동사를 명사로 만들어 줄 수 있다. 흔히 말하는 동명사가 그것이다.

walk는 걷다로 동사이지만 walking은 걷는 것이라는 명사가 된다.

왜 이렇게 to부정사와 동명사가 같이 쓰이는이유는 to부정사가 동명사만큼의 역할을 못해주기 때문이다. 실제로 주어 역할은 to부정사보다 동명사가 더 많이 쓰인다.  to부정사 같은 경우는 길어지면 it을 쓰고 뒤로 보내야 하지만 동명사는 ing만 붙이고 쓰일수 있지 않는가 귀찮게 뭐하러 그렇게.......


이번엔 목적어로 쓰이는 것을 확인해보자.
to부정사는 명사의 역할로 쓰이는건 알겠는가. 때문에 목적어로 쓰일 수 있다.
예를 들면 want to dance에서보면 to dance가 to 부정사로서 want의 목적어로서 역할을 한다. 그런데 여기서 우리의 한계를 알수 있는데

want to dance의 의미를 생각해보자. 어떻게 해석이 되는가?

10중 8,9는 춤추기를 원한다로 해석을 한다. 그러면 춤추고 싶다는 어떻게 표현해야 할까?

want to dance이다.  hope to see 도 보기를 바란다도 되지만 보고 싶다,보면 좋겠다. 이렇게 해석이 된다. 해석을 딱 틀에 박혀 하기보단 좀 자유롭게 했으면 하는 바람에서 말하는 것이다.

목적어를 필요로하는 동사들 중에서 to부정사를 좋아하는 동사들이 있다.

wish,decide,plan,refuse,promise같은 동사들인데 대체적으로 미래지향적인 의미가 많다.

to부정사가 목적어로 쓰였는데 동명사라고 못할쏘냐. 할수 있다.

그렇다면 목적어로 동명사만 취하는 동사는 뭐가 있을까?

stop,quit,keep,mind,avoid,give up,put off같은 동사들인데.....한도 끝도 없겠지?

한가지 특이한건 전치사의 목적어로 동명사가 쓰인다는 것이다.
왜냐하면 to부정사가 쓰이면 전치사의 to와 같아지기 때문이다. 그리고.....

Thank you for to coming, 이상하잖아.......

2016년 10월 4일 화요일

5강 os

하벤더의 교착 상태 예방 연구에서 기본 전제가 되는것은?
: 상호 배제 문제는 고려하여 프로세스가 원하는 자원을 배타적으로 사용하는 것은 제외한다.

점유과 대기 조건의 방지 방법과 문제점은?
:프로세스가 작업을 수행하기전에 필요한 자원을 모두 요청하고 획득해야하며 대기상태에서 프로세스가 자원을 점유하지 않아야한다. 또한 필요한 자원을 실행 후 다른 호출에 자원을 할당 하는 것이다. 하지만 자원 효율성이 너무 떨어지며 기아상태가 발생할 수 있다.

다음과 같은 자원 할당 그래프에 대한 물음에 답하시오.



  1. 시스템은 교착 상태에 있는가: 교착상태에 있다.
  2. p2자원에 p1요청을 먼저 제공 할 때 시스템 상태는 안전한가: 안전하지 않다
  3. p2자원에 p2요청을 먼저 제공할 때 시스템 상태는?:안전하다
교착 상태를 회복하는 해결 방법을 간단히 설명 하시오.
:첫번째 방법은 프로세스를 한개 이상 중단 하는 방법으로 정지된 프로세스에 할당된 모든 자원의 해제를 요청하는 것이다. 그 다음으로 교착상태의 프로세스들에서 자원을 선점하는 방법이다. 이것은 교착 상태가 해결될때까지 선점한 자원을 다른 프로세스에 할 당해야한다.

교착 상태를 벗어나려고 중단(종료)시킬 프로세스를 선정할 때 고려할 기준을 나열하시오,
:프로세스의 우선순위, 수행된 시간과 앞으로 종료하는데 필요한 시간, 사용한 자원 형태와 수, 종료하는데 필요한 자원 수, 종료하는데 필요한 프로세스 수, 대화식인지 일괄식인지 여부.

컴퓨터 시스템 환경과 관련 되지 않은 교착 상태의 실례를 세 가지만 들어보시오.
: 원수가 왜다리에서 만날때, 지하철 사람 많을때 서로 나가고 들어가려고 할때.

  

하벤더의 교착 상태를 예방하는 세 가지의 기본 방법은?
:첫번째는 각 프로세스는 필요한 자원을 한번에 모두 요청하며 모두 제공 받기전까지 작업 진행을 하지 않는다 이며 두번쨰는 점유하고 있는 프로세스의 요청을 더 이상 필요하지 않으면 점유한 자원을 모두반납하고 필요할 때 다시 요청한다. 마지막은 프로세스에 자원을 유형별로 순서를 부여한 후 순서대로 할당해야 한다. 

교착상태와 기아 상태의 주요 차이점은?
:교착 상태는 일어날수 없는 상태라면 기아상태는 딜레이로 현재는 일어나지 못하지만 언젠가는 일어날 상태이다.

시스템 상태가 다음과 같다고 가정할때 은행가 알고리즘을 이용하여 다음 물음에 답하시오
:
프로세스
Allocation
Max
Available
ABCD
ABC
ABCD
P0
3011
5111
1020
P1
0100
0212
 
P2
1110
4210
 
P3
1101
1111
 
P4
0000
2110
 

  1. 배열 need의 내용은?

    A
    B
    C
    D
    P0
    2
    1
    0
    0
    P1
    0
    1
    1
    2
    P2
    3
    1
    0
    0
    P3
    0
    0
    1
    0
    P4
    2
    1
    1
    0
  2. 이 시스템은 안정 상태인가?  P3->P0->P1->P4->P2
  3. 프로세스 p1에서 요청이 (0,4,2,0)이면 이 요청은 즉각 받아 들여질 수 있는가?             받아들여진다.
프로세스 2개와 자원 2개가 교착 상태에 있다는 것을 나타내도록 자원 할당 그래프를 그리시오
:



경쟁 상태와 교착 상태의 차이점은?
:교착 상태가 자원을 자유롭게 할당한 자원 부족의 결과라면 기아 상태는 교착상태를 예방하려고 자원을 할당 할 떄 발행하는 결과이다.

자원 할당 그래프에 주기가 있는 시스템을 가정한다. 이떄 교착 상태라고 정의(단정)할 수 있는가?
:프로세스에 제공되는 자원과 공급자원에 대해 알수 없는 상태에서 단정 할 수 없는게 작동을 하지 않는다고 가정하자. 그래프에 있는 주기가 너무 많은 프로세스를 거치다 보면 딜레이가 생기기 마련이다. 그렇지만 그 그래프의 끝이 작업할 프로세스라면 언젠가는 작업하기 마련이니 기아 상태일수 있고 교착 상태일수도 있다.

기본시제 동사,완료시제 동사,비교구문 형용사 부사.

동사의 기본시제는 현재,과거,미래 시제이다.
현재 시제는 습관처럼 '반복적이고 지속적인 일'에 주로 쓴다. 동사의 기본 형태를 그대로 쓰는데, 주어가 3인칭 단수 일 경우에만 s(es)를 붙인다.

He often eats out for dinner

이 처럼 3인칭인 he에 단수이니 동사 eat에 s를 붙여준다. 만일 복수이면 동사는 원형이다.

과거시제는 현재와의 단절을 나타낸다. 이는 과거에는 그 상태였지만 현재는 그렇지 않다는 말이다. 가장 좋은 예시가 군대이다. 군 복무를 마친 남자는 완벽한 과거 이지만 그렇지 않은 남자는 미래이거나 현재 진행이다. 너무 상심하지 마라 누군가는 해야하는 일이니까.
규칙적인 동사는 ed를 붙일 수 있지만 불규칙인 동사는 그 형태를 외워야 하는 귀찮은 일이 있다.

I had a really hansome boyfriend.

가장 대표적인 불규칙 동사인 have이다. 아마 화자는 여자일 것이다. 아마이다. 세상은 넓고특이취향은 많으니까. 만약 have가 규칙적인 동사였으면 haved가 되겠지만 그렇지 않으니 had가 되었다.


미래는 앞으로 일어날 일에 대한 정보에 사용 된다. 미래가 없거나 곧 죽을 사람이 아니고서야 누구에게나 통용된다. 표현은 will이나 be going to를 붙여서 사용된다. 사실 그 말이 그말인데 이렇게 말하기도 그렇다. be going to가 가고있는 의미를 지니니 미래지 않는가 이쯤은 상식도 아니다.

I'm going to move next month.

다음 달의 일을 말하니 미래 표현을 사용하는데 will이 아닌 be going to 를 사용한다.

기본시제 만큼이나 많이 사용하는 표현이 진행형이다.
지금 현재 하는 일을 나타낸다. 즉 일시적인 일을 나타낸다.  be ing 로 표현한다.

I love meat but I'm eating fruit these days

화자는 고기성애자이지만 요즘 과일을 먹고있다. 즉, 늘 고기만 먹다가 문제가 생겨 과일로 끼니는 떄우는 일시적인 일을 말하고 있다. 언제든지 다시 돌아갈 날을 기다리는 중이라 하겠다.

완료시제는 과거의 일이 현재에도 지속되고 있는 상태이다. 그런데 이 현재라는 게 말하는 것 마다 달라질 수 있다. 과거의 현제 일 수 있고 실제 현재 일 수 있고 미래의 현재 일 수 있다. 미래는 잘 안쓰고........ 예시 2개를 말해보도록 하겠다.

I lived in Anyang 9years age.

I have lived in Anyang for nine years ago.

이 두 시제는 각각 과거와 현재완료이다.

현재완료시제는  앞서 말했듯이 과거의 일이 현재에도 지속 되고 있거나 영향을 미치고 있을 때 사용된다. 우리 말로는 그냥 했었는데 하고있다 이쯤으로 이해하면 쉽다. 이 시제는 과거부터 지금까지의 경험을 강조한다. 따라서 확실한 과거 시점을 나타내는  시간관련 어구를 쓰면 사용이 용이하다.

비교구문은 어떤 대상을 다른 대상과 비교할 때 사용된다. 즉, 형태나 상태, 모습을 묘사하는 것이니 명사를 꾸며주는  형용사나 부사가 사용된다. 단순 비교급일 때는 er 과 est로 최상급 까지 사용할 수 있다. 참고로 best는 be + est로 최고의 것이라는 의미라는 학설도 있다. 믿거나 말거나.......

2음절  이상의 형용사나 부사는 more과 most를 사용해 최상까지 비교한다.

My daughter is as pretty as IU

참고로 난 연예인에 관심 없다. 아무튼 여기서 자신의 딸을 IU만큼 비교를 했는데 As를 사용해서 ~만큼을 표현했다.

My son is younger than you

이 표현에서는 er을 사용하여 비교를 했는데 than으로 ~보다를 말해주었다.

My daughter is the most beautiful girl i've ever seen

최상급의 표현인건 the most를 보면 알것이다. 여기서 girl을 뒤에서 부연설명해주었다는 것을 좀더 주의깊게 보자.

2016년 10월 1일 토요일

영어문법 4~5형, 명사와 관사.

4문형은 동사가 두개의 목적을 취하는 문형으로 ~에게 ~을 의 뜻을 가진다.
우리말이 대응 되기때문에 그렇게 어렵게 활용이 가능하다.
형태로는 주어+동사+간접목적어+직접 목적어의 구조를 가진다.
해석이 해석인 만큼 동사가 give계열이 많다. 흔히 말하는 수여동사들이 그것인데.
괜히 따로 외우지 말고 자연스럽게 물흘러 가듯이 받아들이자.
대표적인 것이 give, buy, get ,tell,show가 있다.

5문형은 주어+동사+목적어+보어  형태의 문형이다.

우리나라에서 희안하게 2문형을 변형해서 해석을 하곤 하는데 그 이유는 우리말과 대응이 안되서 그런 것이리라.

예를 들면 My joke made Annie angry를 해석해보자.

우리말로 직역하면 제 농담이 애니를 화나게 만들었어요가 된다.
하지만 희안한 의역기술을 배운 사람은 제 농담 때문에 애니가 화났어요. 이렇게 해석한다.
이러지 말자.


명사에서 제일 중요한 계념은 셀수 있느냐, 없느냐 이다.
원어민들이 셀수 있는 명사를 판단하는 기준은 두가지다.
첫번째는 셀 필요가 있는가 두번째는 구체적인 하나를 떠올릴수 있는가 이다.

예를 들면 rice,sand,hair을 보면 셀 수 없는 명사이다.  세기도 힘들고.....셀 필요도 느끼지 못하는 명사이다. 하지만 bean,pebble,noodle은 셀수 있는 명사이다.
money,water,furniture은 역시 셀 수 없는 명사이다. 이 명사들은 셀 수 없는 명사이다.
매우 추상적인 의미를 지니기 떄문이다. 하지만 desk,chair,wardrobe 등은 여러가지 단어로 구체적인 하나를 떠올릴 수 있어 셀 수 있다.

셀 수 있는 명사는 단수/복수가 있고 단수형 앞에는 부정관사 a/an을 써야하며 many,few,a few로 대강의 수를 나타낼 수 있다.  또한 전체에 대한 대표성을 띌때는 복수형을 쓴다.
셀 수 없는 명사는 복수형이 따로 없고 관사를 쓰지 않으며 much,little,a little로 대강의 양을 나타낼수 있다. 또한 a piece of , a cup of, a pair of와 같은 단위 표현을 이용해 양을 나타내기도 한다.

관사는 부정관사(a/an)와 정관사(the)가 있다. 부정관사는 셀 수 있는 명사의 단수 앞에 쓰고 주로 '정해지지 않은 막연한 어떤 것(하나)'을 나타낸다. 당연히 셀 수 없는 명사 앞에 쓸 수 없다.  정관사는 우리 말 '그'에 해당하는 말로, 이미 서로간에 알고 있는 정보를 말할때 사용한다. 모든 명사 앞에 모두 쓸 수 있다.

예를 들면 I saw a man yesterday. The man looked like your boyfriend.
이 문장에서 보면 이 여자가 말하는 a man은 어제 봤던 한 남자를 지칭하는 것이고 그 뒤에 말하는  the man은 앞서 말했던 a man을 지칭하는 것이다.

이처럼 정해지지 않은 어떠한 대상을 말 할때는 부정관사를 사용할 수 있고 이미 알고 있는 정보를  지칭할 때는 정관사를 사용한다.

또한 명사 앞에는 관사외에도 소유격이나 지시어를 붙여 명사에 대한 정보를 한정 할 수 있다. 또한 셀 수 있는 명사의 단수 앞에는 관사나 다른 한정해 주는 단어가 반드시 필요하다.

예를 들어 she is a young girl 과 she is young girl은 전혀 다른 말이다.
앞의 말은 그녀는 어린 소녀에요 이지만 뒷 말은 그녀의 (이름은) 영걸이에요. 라는 전혀 다른 말이 된다.