728x90

TypeCast.h

#include <iostream>
using namespace std;

#pragma region TypeList

template<typename... T>
struct TypeList;

template<typename T, typename U>
struct TypeList<T, U>
{
	using Head = T;
	using Tail = U;
};

template<typename T, typename... U>
struct TypeList<T, U...>
{
	using Head = T;
	using Tail = TypeList<U...>;
};

#pragma endregion

#pragma region Length

template<typename... T>
struct Length;

template<>
struct Length<TypeList<>>
{
	enum { value = 0};
};

template<typename T, typename... U>
struct Length<TypeList<T, U...>>
{
	enum { value = 1 + Length< TypeList<U...>>::value };
};

#pragma endregion

#pragma region TypeAt

/*
TypeAt< TypeList<Tail...>, index - 1 >::Result 가 타입을 의미 하는지
값을 의미 하는지 컴파일러는 알지 못 함.

때문에 이런 모호함 때문에 템플릿 인자에 의존적인 이름은 기본적으로 '타입'
이 아닌 '값'으로 컴파일러가 처리하게 되는데,
'타입'을 명시 하려면 typename 붙여 줘야 한다.
*/

template<typename TL, int index>
struct TypeAt;

template<typename Head, typename... Tail>
struct TypeAt<TypeList<Head, Tail...>, 0>
{
	using Result = Head;
};

template<typename Head, typename... Tail, int index>
struct TypeAt<TypeList<Head, Tail...>, index>
{
	using Result = typename TypeAt<TypeList<Tail...>, index - 1>::Result;
};

#pragma endregion



#pragma region IndexOf

template <typename TL, typename T>
struct IndexOf;

template <typename... Tail, typename T>
struct IndexOf<TypeList<T, Tail...>, T>
{
	enum { value = 0 };
};

template <typename T>
struct IndexOf<TypeList<>, T>
{
	enum { value = -1 };
};

template <typename Head, typename... Tail, typename T>
struct IndexOf<TypeList<Head, Tail...>, T>
{
private:
	enum { temp = IndexOf<TypeList<Tail...>, T>::value }; 

public:
	enum { value = (temp == -1) ? -1 : temp + 1 };
};

#pragma endregion




#pragma region Conversion

template<typename From, typename To>
class Conversion
{
private:
	using Small = __int8;
	using Big = __int16;

	///  ... 매개변수 우선순위가 낮음.
	static Small Test(const To&) { return 0; }
	static Big Test(...) { return 0; }
	static From MakeFrom() { return 0; }
public:
	enum { exists = ( sizeof(Test(MakeFrom())) == sizeof(Small) ) };
};

#pragma endregion


#pragma region TypeCast


	template<typename TL>
	class TypeConversionBefore
	{
	public:
		enum
		{
			length = Length<TL>::value
		};

		// 런타임에 정해지는 변수와 컴파일에 정해지는 값이 혼용되어 컴파일 불가능.
		TypeConversionBefore()
		{
			for (int i = 0; i < length; i++;)
			{
				for (int j = 0; j < length; j++;)
				{
					using FromType = typename TypeAt<TL, i>::Result;
					using ToType  = typename TypeAt<TL, j>::Result;

					if (Conversion<const FromType*, const ToType*>::exists)
						s_convert[i][j] = true;
					else
						s_convert[i][j] = false;
				}
			}
		}
	};


// v 값 별로 별도의 클래스
template<int v>
struct Int2Type
{
	enum { value = v};
};

template<typename TL>
class TypeConversion
{
public:
	enum
	{
		length = Length<TL>::value
	};

	TypeConversion()
	{
		MakeTable(Int2Type<0>(), Int2Type<0>());
	}

	template<int i, int j>
	static void MakeTable(Int2Type<i>, Int2Type<j>)
	{
		using FromType = typename TypeAt<TL, i>::Result;
		using ToType = typename TypeAt<TL, j>::Result;

		if (Conversion<const FromType, const ToType>::exists)
		{
			s_convert[i][j] = true;
		}
		else
		{
			s_convert[i][j] = false;
		}

		MakeTable(Int2Type<i>(), Int2Type<j + 1>());
	}

	template<int i>
	static void MakeTable(Int2Type<i>, Int2Type<length>)
	{
		MakeTable(Int2Type<i + 1>(), Int2Type<0>());
	}

	template<int j>
	static void MakeTable(Int2Type<length>, Int2Type<j>)
	{
	}
		
	static bool CanConvert(int from, int to)
	{
		static TypeConversion conversion;

		return s_convert[from][to];
	}

public:
	static bool s_convert[length][length];
};

// s_convert는 멤버 변수 같지만 전역 변수 이기 때문에 클래스 외부에 전역 변수 선언 하듯 선언 해야 한다.
// 다만 해당 클래스 네임스페이스를 이용해서만 접근 가능 하도록 변수를 선언한다.
template<typename TL>
bool TypeConversion<TL>::s_convert[length][length];

#pragma endregion

 

TypeCast.cpp

#include "TypeCast.h"



class Player
{

};

class Knight : public Player
{

};

class Mage : public Player
{

};

class Archer : public Player 
{

};


int main()
{
    // TypeList
    {
        TypeList<Knight>::Head;
        TypeList<Knight>::Tail;

        TypeList<Knight, Mage>::Head;
        TypeList<Knight, Mage>::Tail;

        TypeList<Knight, Mage, Archer>::Head;
        TypeList<Knight, Mage, Archer>::Tail::Head;
        TypeList<Knight, Mage, Archer>::Tail::Tail;
    }

    // Length
    {
        Length<TypeList<Knight>>().value;
        Length<TypeList<Knight, Mage>>().value;
        Length<TypeList<Knight, Mage, Archer>>().value;
    }

    // TypeAt
    {
        using TL = TypeList<Knight, Mage, Archer>;

        TypeAt<TL, 0>::Result;
        TypeAt<TL, 1>::Result;
        TypeAt<TL, 2>::Result;
    }

    // IndexOf
    {
        using TL = TypeList<Knight, Mage, Archer>;

        IndexOf<TL, Knight>().value;
        IndexOf<TL, Mage>().value;
        IndexOf<TL, Archer>().value;
    }

    // Conversion
    {
        Conversion<Knight, Player>().exists;
        Conversion<Player, Knight>().exists;
        Conversion<Mage, Knight>().exists;
    }

    // TypeCast
    {
        using TL = TypeList<Player, Mage, Archer>;


        bool can1 = TypeConversion<TL>().CanConvert(1, 1);
        bool can2 = TypeConversion<TL>().CanConvert(0, 2);
        bool can3 = TypeConversion<TL>().CanConvert(2, 0);

    }
}

 

728x90
728x90

1.나는 그가 열심히 살도록 격려하기 위해 약간의 돈을 기부한다.

더보기

I donate some money in aid to encourage him to live hard.   

*  in aid to + R, in aid of + N : ~를 돕기 위해

* aid + (목) + in sth : ~를 돕다

 

2. 너와 대화하는 것은 항상 나를 기쁘게 할 뿐만 아니라 열심히 공부하도록 격려해 준다.

더보기

Talking with you always doesn't only make me pleased but also encourages me to study hard. 

 

3. 우리 회사는 창립기념일을 기념하여 직원들에게 기념할 만한 휴일을 제공했습니다.

더보기

Our company marked the foundation day by offering a memorable holiday to its employees.

 

4. 기밀 자료 창고는 사람들이 접근할 수 없다.

더보기

The confidential materials storage is inaccessible to people.

* (in)accessible to N 

 

5. 당신은 그 건물에 접근할 수 있습니다

더보기

You can have access to the building.

* access가 명사로 쓰일 땐 불가산 명사

 

6. 방해해서 죄송합니다. (끼어 들어서 죄송합니다.)

더보기

I am sorry to interrupt you.

 

7. 나는 새 직장을 구할 준비 때문에 매우 바쁘다.

더보기

I am so imminent because of preparing to get a new job.

 

8. 그 지역의 수자원이 고갈되어 생산물이 떨어졌다.

더보기

The area's water resources have been depleted, causing a drop in produce.

*deplete 고갈시키다

 

9. 연료 자원이 거의 고갈되었다.

더보기

The resource of fuel is almost exhausted.

*exhaust 고갈시키다

 

10. 그들은 멸종 위기에 처한 종들을 보호하기 위해 싸우고 있다.

더보기

They are fighting to protect threatened species.

*endangered = threatened

 

11. 공룡은 멸종되었다.

더보기

Dinosaurs had become extinct.

 

12. 새 직장을 구했는데도 월급은 이전과 같았다.

더보기

Even though I got a new job, My salary was the same as my previous one.

*the same (+N) as ~ : ~와 같은

 

13. 휴가를 내도 될 것 같은데, 부서장이 아니라 팀장의 승인을 받아야 해요.

더보기

I think you can take a leave, but you need to be approved by your team leader rather than by the department manager.

 

14. 나는 이전에 내가 한 일에 대한 태만함을 사과한다.

더보기

I apologize for the negligence in what I did before.

728x90

'English > Writing' 카테고리의 다른 글

With Corona  (0) 2021.11.22
How would you respond?  (0) 2021.10.26
Do you like your job?  (0) 2021.10.25
What do you think about being rich?  (0) 2021.10.22
Dieting  (0) 2021.10.19
728x90

To whom it may concern (관계 있을지 모를 누군가에게 / 익명의 단체에게)

Dear sir or madam (선생님 또 사모님에게 / 익명의 개인에게)

 

하지만 현재는 대부분 스팸메일에서 사용된다고 한다.

 

더 자세한 이메일에서의 첫인사 및 서두인사 법은 아래 링크를 참고

https://business-english.tistory.com/2

 

영어 이메일 첫인사 서두인사 호칭 Dear sir or madam, To whom it may concern, Hi, Hello, Dear

비즈니스영어 이메일 1 편 영어 이메일 첫인사,서두인사,호칭 선택 사다리 타기 영어 이메일을 작성할 때 처음 시작 인사를 To whom it may concern ? Dear sir or madam ? Hello ? Hi ? 어떤 것을 써야하는지 헷.

business-english.tistory.com

 

728x90

'English' 카테고리의 다른 글

관계 대명사 that을 쓰는 경우  (0) 2021.10.17
Filler  (0) 2021.08.25
728x90

멀티 프로세스 -> 멀티 스레드

select -> epoll(리눅스), iocp(window)

 

멀티 프로세스 서버의 단점

- 프로세스의 빈번한 생성은 성능은 저하

- 멀티 프로세스의 흐름을 고려해서 구현해야 하기 때문에 구현이 쉽지 않다.

- 프로세스간 통신이 필요한 상황에서는 서버의 구현이 더 복잡해진다.

 

멀티 프로세스 서버의 대안

- 하나의 프로세스가 다수의 클라이언트에게 서비스 할 수 있도록 한다

- 이를 위해서는 하나의 프로세스가 여러 개의 소켓을 핸들링 할 수 있는 방법이 존재 해야 한다.

- 바로 이것이 IO 멀티플렉싱이다.

 

 

멀티 플렉싱의 의해

- 기존 멀티 프로세스에서는 클라이언트 갯수 만큼 프로세스를 1대1로 대응 시켰지만, 멀티 플렉싱은 하나의 프로세스에서 다수의 클라이언트 접속을 처리 한다(하나의 리소스를 통해서)

 

select 모델 flow

-> 멀티플렉싱

-> 다수 클라이언트 fd를 하나의 프로세스가 관리 해야 한다

-> 게임을 예로 들면 서버-클라이언트 사이에서 처리할 데이터의 크기가 굉장히 작기 때문에 하나의 프로세스에서도 충분히 처리가 가능하다 때문에 하나의 프로세스가 모든 클라이언트 요청을 처리하는 것이 '프로세스를 여러개 만드는 것보다' 효율적일 수 있다.

-> 다수의 클라이언트 소켓 fd를 저장할 fd_set 자료구조가 존재

-> fd_set에 클라이언트 소켓 fd를 등록

-> select() 함수를 통해서 fd_set에 변경된 데이터가 있으면  값을 반환한다(그전 까진 블로킹 상태)

-> 변경된 fd 정보 하나에는 나머지는 다 리셋된다.

-> 해당되는 fd를 찾아서)(fd_set을 반복문을 통해서 찾아야 한다.) 이용 read/write

-> 다시 fd_set에 fd를 등록하고 다시 select() 함수 호출 후 대기(블로킹)

 

fd_set 관련 함수

FD_ZERO

FD_SET

FD_CLR

FD_ISSET

 

 

 

728x90
728x90

프로세스 별로 별도의 메모리 공간을 가지기 때문에 기본적으로 프로세스 간의 데이터 공유는 불가능 하다.

 

solution

OS가 별도의 메모리 공간(프로세스들이 접근 가능한)을 만들어 준다.

 

step

1. 부모프로세스가 os에게 자식프로세스와 통신할 것이라고 한다

2. os는 부모프로세스와 자식프로세스가 공유 가능한 메모리 공간(파이프)를 생성하고 파이프에 읽고 쓰기가 가능한 파일스크립터를 부모프로세스에게 제공한다.

3. 자식프로세스가 생성된다.

4. 자식프로세스는 부모프로세스의 모든 걸 복사하기 때문에 자식프로세스 역시 읽고 쓰기가 가능한 파일스크립터를 얻는다.

5.이로써 읽고 쓰기가 가능한 파일스크립터를 이용한 파이프 사용을 통해 부모-자식간에 통신이 가능하다.

 

 

pipe()

파이프 생성

송수신 가능한 디스크립터 반환

 

주의점

파이프가 하나 일 때 부모 프로세스는 본인이 파이프에 wirte하고 본인이 직접 read가 가능하기 때문에 문제가 된다.

이를 해결하기 위해 애초에 부모->자식, 자식->부모용 파이프를 두개 생성하여 사용하는 것이 일반적이다.

728x90
728x90

https://www.youtube.com/watch?v=2BCYPanHIRo 

 

'by + 수치' 표현이 접할 떄 마다 '~까지'라고 해석하게 되는 경우가 많아서..

[차이의 정도]를 나타낼 때의 by의 쓰임을 찾아봤다.

 

We won the game by two points.

우리는 2점 차이로 게임을 이겼다.

 

I am older than my sister by 6years.

나는 내 여동생 보다 6살 많다.

 

Housing prices rose by 10 percent.

집값이 10 퍼센트 올랐다. (이런 경우 10퍼센트까지 올랐다... 라고 해석하는 경우가 자주 있었음)

 

728x90

'English > ETC' 카테고리의 다른 글

will, 'll 발음  (0) 2021.10.01
live,reside,dwell  (0) 2021.09.30
Would, Could  (0) 2021.09.20
Mr / Miss Mrs Ms  (0) 2021.09.17
envy vs jealous  (0) 2021.09.17
728x90

둘 이상의 프로세스는 운영체제의 의해 실행 된다.

이때, CPU 스케줄링 -> context switching 발생 -> 이전 데이터 스왑영역에 이동(하드디스크에 보관 됨)

 

이런 작업의 부담으로 경량화 된 프로세스 등장 (스레드)

 

다중 접속 서버의 구현 방법들

1) 멀티 프로세스 기반 서버 : 다수의 프로세스를 생성하는 방식

2) 멀티 플렉싱 기반 서버 : 입출력 대상을 묶어서 관리하는 방식으로 서비스 제공

3) 멀티 쓰레딩 기반 서버 : 클라이언트 수만큼 쓰레드를 생성하는 방식으로 서비스 제공

 

프로세스란

- 간단하게는 실행 중인 프로그램을 뜻한다.

- 실행중인 프로그램에 관련된 메모리, 리소스 등을 총칭하는 의미이다.

- 멀티프로세스 운영체제는 둘 이상의 프로세스를 동시에 생성 가능하다.

 

프로세스 ID

운영체제는 생성되는 모든 프로세스에 id를 할당한다.

 

fork()

함수가 호출되면 호출한 프로세스가 복사되어 fork함수 호출 이후를 각각의 프로세스가 독립적으로 실행하게 된다.

부모 프로세스 에서는 자식 프로세스의 ID(0이 아닌 값). 자식  프로세스에서는 0값을 반환.

 

좀비 프로세스

프로세스 간에는 부모-자식 계층 관계를 갖는다. 

자식 프로세스가 종료되면 실제로 메모리 상에서 사라지지 않고 OS에게 값을 반환하게 된다. 부모 프로세스가 자식 프로세스가 반환한 값을 확인 할 때 비로서 자식 프로세서는 사라진다. 그 값이 int main 함수의 return 값이다. 

 

자식 프로세스가 종료되었지만 아직 소멸되지 않은 상태(부모 프로세스가 자식 프로세스가 종료하면서 반환한 값을 확인하지 않은 상태)

 

자식 프로세스가 좀비 상태에서 부모 프로세스가 소멸 되면 자식 프로세스도 자동으로 같이 소멸 된다.

 

wait()

자식 프로세스의 반환값을 확인한다. 

자식 프로세스가 종료되지 않았으면 블로킹 상태에 놓인다.

 

waitpid()

특정 프로세스 id를 지정하여 반환값을 얻는다.

블로킹 상태가 되지 않는다.

 

시그널 핸들링

좀비 프로세스가 생성되는 것을 os가 부모 프로세스에게 알려 줄 수 있다.

부모 프로세스 -> os (요구) => 등록

os -> 부모 프로세스 (알림) => 콜백함수 호출

 

시그널 종류

SIGALRM : alarm 함수호출을 통해서 등록된 시간이 된 상황

SIGINT : crtl + c 가 입력된 상황

SIGCHILD : 자식 프로세스가 종료된 상황

 

signal(), 

시그널 등록 함수

타입과, 함수포인터 전달

 

sigaction() 

운영체제와 상관 없이 동일한 인터페이스 제공

실제로 signal() 대신 sigaction() 함수 사용

 

프로세스 기반 다중접속 서버 모델

1단계 - 에코서버(부모프로세스)는 accpet 함수 호출을 통해서 연락 요청을 수락한다.

2단계 - 이때 얻게 되는 소켓의 파일 디스크립터를 자식 프로스에게 생성해서 넘겨준다.(실제로 fork 함수로 프로세스가 생성되면 부모프로세스의 모든 정보가 자식프로세스에도 복사 된다.)

3단계 - 자식 프로세스는 전달 받은 파일 스크립터(클라이언트와 연결에 필요한)를 바탕으로 서비스를 제공한다.

4단계 - 부모 프로세스는 클라이언트 소켓을 자식 프로세스는 리스닝 소켓을 제거한다(필요 없으므로) => 하나의 커널 오브젝트를 두개의 디스크립터가 가리키게 되면 모든 디스크립터가 제거되야 커널 오브젝트가 소멸 되므로 미리 관리 해주는 것이 좋다.

 

 

728x90
728x90

http://www.kocw.net/home/search/kemView.do?kemId=1226304 

 

운영체제

<교재 및 출처><br/><br/>- A. Silberschatz et al., Operating System Concepts, 9th Edition, John Wiley & Sons, Inc. 2013.<br/><br/>- A. Silberschatz et al., Operating System Principles, Wiley Asia Student Edition<br/><br/>- 반효경, 운영체제와

www.kocw.net

 

 

무료 운영체제 강의 중에서 제일 만족스러운 강의였다. 다른 무료 강의들은 내용이 너무 함축적이라 설명이 부족한 느낌이 들거나... 무료 강의다 보니 전체적인 강의 질이 떨어진다고 느꼈는데..

 

이 수업은 공룡책의 전반적인 내용을 너무 함축하지 않게 설명하고 반효경 교수님 수업 전달력 굉장히 깔끔했다.

무턱대고 공룡책을 봤을 땐 새로운 개념 + 부자연스러운 번역 등으로 내용이 제대로 들어오지 않았는데, 이 강의는 공룡책 내용을 훨씬 쉽게 이해 시킨다.

 

운영체제를 직접 개발하는 수준이 아니라면 전공자, 프로그래머에게 충분히 좋은 운영체제 강의인 것 같다. 

 

혹시나 공룡책을 볼 계획이라면 전에 이 강의를 한번 훑고 보는 걸 추천!!

 

나는.. 일단 공룡책 읽기를 멈추고 해당 수업을 몇 차례 반복하고 이후에 실전에서 좀 더 운영체제 지식이 필요한 시기가 오면 공룡책을 직접 참고할 것 같다.

 

강의 목차 (완강 : 0회)

1.운영체제 개요

2.운영체제 개요

 

3.컴퓨터 시스템의 구조

4.컴퓨터 시스템의 구조

5.컴퓨터 시스템의 구조

6.컴퓨터 시스템의 구조

 

7.프로세스 관리

8.프로세스 관리

9.프로세스 관리

10.프로세스 관리

11.프로세스 관리

 

12.CPU 스케줄링

13.CPU 스케줄링

14.CPU 스케줄링

15.CPU 스케줄링

 

16.병행제어1

17.병행제어1

18.병행제어1

 

19.병행제어2

20.병행제어2

21.병행제어2

 

22.데드락

 

23.메모리 관리

24.메모리 관리

25.메모리 관리

 

26.가상 메모리

27.가상 메모리

 

28.파일 시스템

29.파일 시스템

30.파일 시스템

 

31.입출력 시스템

32.입출력 시스템

 

728x90

+ Recent posts