이 구조적 테스는 black box testing 기술의 대체를 의미하지는 않는다. 

이것은 일종의 White box 또는 code-based testing의 일 부분이라고 할 수 있다.


5.1 The structured testing criterion.

 


5.4 Structured testing example



어떤 문자열이 주어졌을때, C 문자의 총 빈도를 카운트하는 프로그램이다.
만약, A로 스트링이 시작되어 진다면, -1을 리턴 한다.


'Computer Science' 카테고리의 다른 글

python으로 mysql 조작하기  (0) 2013.04.22
False positive and False negative  (0) 2013.03.05

□ 분사구문 만드는법


1. 일반문에서 분사구문 만드는 법입니다.

1. 첫번째로 접속사를 지운다.
단, 화자인 speaker가 표현하고 싶으면 그대로 쓴다.

아래의 문장과 같이, 주절의 주어와 분사구문의 행위 주체가 달라 분사구문의 의미상 주어가 필요할 경우 '명사' 또는 '주격 대명사'를 분사구문 앞에 쓴다.

Ending late, the staff decided to get dinner together. [x]
The meeting ending late, the staff decided to get dinner together. [o]



2. 둘째로 부사절인 종속절의 주어와 주절의 주어가 동일하면

부사절인 종속절의 주어를 생략한다.

만일 서로 주어가 다른 경우 지우지 않으면 독립분사구문이 되고

만일 서로 주어가 달라도 주어가 we와 같은 일반인 경우는 생략하더라도

독자가 알아들을 수 있으므로 생략하게 되면 비인칭독립분사구문이 된다.



3. 셋째로 부사절인 종속절과 주절의 동사의 시제가 동일시제인 경우


부사절의 동사원형에 -ing 또는 p.p 형의 분사로 만든다.

이때, -ing 와 p.p를 구별하는것은 능동과 수동관계를 파악해야 가능하다. 그 방법은 아래와 같다.


1) 분사가 명사를 수식하는 경우, 수식받는 명사와 분사가 능동 관계면 현재분사, 수동 관계면 과거분사가 와야 한다.


I received a letter informing/informed me to pick up a package at the post office.

-> 나는 우체국에서 소포를 가져가라고 알리는 편지를 받았다.

수식받는 명사(a letter)와 분사가 '편지가 알려주다'라는 의미의 능동 관계이므로, 과거분사(informed)가 아니라 현재분사(informing)가 와야 한다.


2) 분사가 주격 보어이거나 목적격 보어일 경우, 주어와 보어 또는 목적어와 보어가 능동 관계면 현재분사, 수동관계면 과거분사가 와야한다.


The lecture on evolution seems interesting/interested. 전화에 대한 강의는 흥미로운 것 같다.

주어(The lecture)와 분사가 '강의가 흥미롭게 하다'라는 의미의 능동 관계이므로, 과거분사(interested)가 아니라 현재분사(interesting)가 와야 한다.


3) 분사 구문의 경우, 주절의 주저와 분사구문이 능동 관계면 현재분사, 수동 관계면 과거분사가 와야 한다.


Rescued/Rescuing a child from a well, the man broke this arm. 우물에 빠진 아이를 구하다가, 그 남자는 팔이 부러졌다.

-> 주절의 주어(the man)와 분사구문이 '그가 아이를 구하다'라는 의미의 능동 관계이므로, 과거분사(Rescued)가 아니라 현재분사 (Rescuing)가 와야 한다.


Decorating/Decorated in lights, the tree looked beautiful. 조명으로 장식되어 있기 때문에, 그 나무는 아름다워 보였다.

-> 주절의 주어(the tree)와 분사구문이 '나무가 장식되다'라는 의미의 수동 관계이므로, 현재분사(Decorating)가 아니라 과거분사(Decorated)가 와야 한다.



4. 시제가 다른 경우: 주절의 동사보다 부사절의 동사가 더 과거에 일어난 일이라면, having + p.p로 나타낸다.


Having taken a vacation, she came back refreshed and energized. 휴가를 갔다온 후, 그녀는 원기가 회복되고 활기가 넘쳐서 돌아왔다.

-> 휴가를 간 시점이 돌아온(came back) 시점 보다 이전이므로 분사의 완료형(Having taken)을 쓴다.


종속절이 보통 더 과거인 것만 있고 종속절이 주절보다 더 미래인 경우 그런 문장은 쓰지 않는다. 뜻도 애매 모호해서 분사구문으로 만드는것은 적절 하지 않다.


5. 시제가 다른 경우 After ~ing를 많이 사용하기도 한다.

왜냐하면 의미전달이 어렵기 때문이다.


6. 분사구문 앞에서는 새로운 종속절이 오지 않는다. 그저 문장 전체를 수식하는 부사만 올 수 있다.

Every six months, bringing update of ~, we use ~/

이렇게는 쓰지 않는다.





분사구문은 어렵게 생각할 것이 아니라, 

그냥 단순히 부사절이 부사구로 간단하게 변화되어 표현하는 방식이라고 생각하면 됩니다.


위와 같이 분사 구문 만드는법에 보는 봐와 같이 분사구문이리고 부르는 것은 그 부사구가 분사로 

시작되는 문형 구조를 같고 있기 때문입니다.


즉 이렇게 표현할 수가 있습니다.

분사구문 = 분사구 = 부사구


예문,

While you are drunk, you must not drive.

-> Being drunk, you must not drive.


When night came on, we started home.

-> night coming on, we stated home.


if we speak generally, Korean students study hard.

-> Generally speaking, Korean students study hard.


간단하게 다시 한번 분사구문 만드는법을 정리하면

1. 접속사 생략

2. 주어 동일: 생략

    주어 다름: 그대로 씀

3. 시제 동일: 단순형 분사 ( ing, p.p )

    시제 다름: 완료형 분사 ( having + p.p )




Given의 사용법



Wearing a red hat, the guy  is my friend.

The guy, wearing a red hat, is my friend



Given a sandwich, my friend seems to be hungry.





분사구문 give의 뜻이 주다 라면 "주어진", "고려된" 으로 해석할 수 있다.

given이 가정형이라면 "~이 주어졌을 때"로 볼 수도 있다.









'영어 > 영문법' 카테고리의 다른 글

부정관사와 정관사의 사용 방법.  (0) 2013.08.18
which와 , which (콤마 which)의 차이점.  (4) 2013.08.18
Anyone과 Someone의 차이점.  (0) 2013.08.18
가주어  (0) 2013.08.17
사역동사  (0) 2013.08.16

동격의 that: 명사절 that vs 관계대명사 that


동격의 that은 명사절 접속사로써의 that이다.

관계대명사 that은 제한적 용법으로 쓰일때의 that이다.


관계대명사 that의 간단한 요약


This is the item that i want.


- that 절 불완전

- that은 which로 바꿀 수 있음

- that 생략 가능

- that = 관계 대명사, that절 = 형용사절


동격의 That


They have the belief that the economy will get better.


- that 절 완전

- that은 which로 바꿀 수 없음

- that 생량 불가

- idea, fact, opinion, belief, thought 등등 다음에 that이 오면 동격의 that일 가능성이 높음 (반드시 그런 것은 아님)

- that = 접속사, that 절 = 접속사절 또는 동격절 또는 명사절 (문법상 동격 that 절은 명사절로 분류)




** 자세한 설명 **

 

목차 : 1. 개념차이 / 2. 구조차이 / 3. 선행사차이 / 4. which로 바꾸기 및 생략여부 / 5. 문법차이

 

 

1. 개념 차이

 

(1) 관계사 that

 

자! '꽃'과 '빨간 꽃'의 차이는 무언가요?

 

빨간이란 형용사 수식어가 옴으로써, 범위가 줄어드는 효과가 생깁니다.

 

꽃 주세요.. 라는 것보다.. 빨간 꽃 주세요 라고 말하면,

점원이 보여줄 수 있는 꽃의 범위가 한정이 됩니다.

 

그런데, 관계사 that은 형용사절을 이끕니다.

따라서 선행사 뒤에 관계사 that절이 붙어 수식을 하면 범위가 한정되는 느낌이 생깁니다.

 

item vs item that I want 는 어떤 차이가 있을까요?

 

그냥 item은 범위가 넓은데,

내가 원하는 item은 범위가 좁겠죠?

 

(2) 동격의 that

 

They have the belief that economy will soon get better.

 

위의 문장을 읽다보면, 아래와 같은 느낌이 납니다.

 

그들은 믿음이 있는데.. 그 믿음이란 무엇이냐면 바로 다음에 나오는 내용과 같다~~

그들은 믿음이 있는데.. 그 믿음이란 바로 '경제가 금방 좋아진다는 것' 이다.

 

믿음이란 바로 다음 내용과 같다, 믿음이란 바로 ~~ 이다 에서 수학 기호 =(등호)가 연상되지 않나요?

 

이 등호의 역할을 that이 하고 있는 것입니다.

 

belief = economy will soon get better

 

그래서 동격의 that이라고 합니다.

 

 

2. 구조 차이

 

많은 분들이 알고 있을텐데요~

 

관계대명사 that절은 불완전한 구조이고,

동격 that절은 완전한 구조입니다.

 

그렇다면 불완전한 구조란 무엇이고, 완전한 구조란 무엇이냐??

 

이 것을 이해하려면 문장의 다섯 형식을 모두 잘 알고 있어야 합니다.

기본적으로 문장 구성 요소로서 어떤 것들이 필요한지 알아야.. 거기서 뭐가 빠졌는지 안 빠졌는지 보이고,

그래야 완전한지 불완전한지 판단이 가능하겠죠?

 

완전 구조, 불완전 구조 구분에 대해서는 다음에 다시 포스팅을 하겠습니다.

 

일단, that I want는 want의 목적어가 없는 불완전한 구조입니다. 따라서 that은 관계대명사로 판단하며,

that economy will get better는 완전한 구조입니다. 따라서 that은 동격의 that으로 판단합니다.

 

 

3. 선행사 차이

 

관계사 that절의 선행사는 별다른 특징이 없습니다.

 

그런데 동격 that절의 선행사는 idea, fact, opinion, belief, thought 등등이 자주 옵니다.

아이디어란 무엇이냐면.. 의견이란 무엇이냐면.. 이런 식으로 =(등호)의 느낌이 이어지기에 딱 좋기 때문입니다.

 

그런데 그렇다고 해서 idea, fact, opinion, belief, thought 뒤에 무조건 동격의 that이 오는 것은 아니니 주의하시고,

일단 idea, fact, opinion, belief, thought 다음에 that이 있다면 동격의 that일 가능성이 크다고 생각만 하시고, 

그 다음 that절의 구조도 살피세요.

 

 

4. which로 바꾸기 및 생략 여부

 

관계대명사 that은

선행사가 사람이라면 who, 사물이라면 which로 바꿀 수 있으며,

that S V 처럼 목적격이라면, that의 생략도 가능합니다.

 

하지만

 

동격 that은

who, which 등으로 바꿀 수 없으며, 생략도 불가능합니다.

 

 

5. 문법 차이

 

사실, 영어 활용면에선 중요한 지식은 아닙니다.

문법 학자들이 그렇게 분류한다는 정도로만 알아두세요.

 

관계사 that절은 형용사절

동격 that의 품사는 접속사, 동격 that절은 명사절

'영어' 카테고리의 다른 글

Part 1: 주요 동사 관련 숙어 익히기.  (0) 2013.05.22
영어에서 콤마의 사용법  (0) 2013.03.30

5. DISTRIBUTED OBJECTS AND REMOTE INVOCATION


이 장에서는 분산 객체간의 Remote method invocation에 의한 커뮤니케이션을 소개 한다. Remote method invocation을 받을 수 있는 이러한 객체들은 Remote 객체들에 의해서 호출되어 질수 있으며 remote interface로 구현 되어 질 수 있다. Invoker invoked object들의 실패에 독립적이기 때문에 RMI들은 local call들과 다른 의미를 기진다. RMI는 아주 local invocation들과 비슷해 보이지만, 그러나 Total Transparecny는 다르다. Marshalling unmarshalling을 위한 코드는 자동으로 interface compiler에 의해서 remote interface definition으로부터 생성 되어 진다.

 

5.1. Introduction

Middleware: Software that provides a programming model above the basic building blocks of processes and message passing is called middleware.

 

Location transparency: RPC에서 client의 호출은 그것이 같은 process인지 다른 process인지 알 수 없다. 마찬가지로, Client server location을 알 필요가 없다. 이와 비슷하게 RMI에서도 그것의 invocation local인지 또는 location의 위치에 대해서 알 필요가 없다. 분산 환경에서의 event-based 프로그램에서도 이와 마찬가지로 발생된 이벤트의 위치를 알 필요가 없다.

Communication protocols: protocol들은 middleware의 추상화를 transport 프로토콜과 독립적으로 지원 한다. For example, request-reply protocol UDP 또는 TCP위에서 구현 되어질 수 있다.

Computer hardware: 이것은 message들을 marshaling하고 unmarshalling 할 때 사용되어 진다. 이것은 하드웨어 아키텍쳐 이기 때문에 감춰져 있다. 에를들면, byte ordering이 있다.

Operating Systems: 높은 레벨의 추상화는 underlying operating system과 독립적으로 middleware에 의해서 제공 된다.

Use of several programming languages: 몇몇 middleware는 분산 어플리케이션이 하나 이상의 programming 언어를 사용할 수 있도록 디자인 되었다. 특히 CORBA는 하나 이상의 언어로 작성되었다. 특히 server의 구성 언어가 다르다. 이러한 것이 가능한 이유는 Interface definition language 또는 IDL이 정의되어 있기 때문이다. IDL은 다음 장에서 논한다.

 

 

5.1.1 Interfaces

모듈 사이의 인터렉션을 위해서 명시적으로 interface가 각각의 모듈에 정의가 되어 있다. 모듈의 interface procedure들과 variable들로 구성되어 진다. 이것은 다른 모듈로들로부터 접근이 가능하다. Interface를 통해서 접근 가능한 정보를 제외하고 기본적으로 module은 모든 정보를 숨긴다.

Interfaces in distributed system: 분산 프로그램에서 모듈들은 separate process들에서 실행 될 수 있다. 하나의 process에 있는 module에서 다른 process의 모듈로의 직접적인 변수 접근은 가능하지가 않다. 따라서 RPC거나 RMI intended 되어 진다. variable들에 대한 direct access를 정의 할 수는 없다. 하지만 CORBA IDL interface에서 attribute를 정의할 수 있다. 이것은 룰을 깨트리는것 처럼 보인다. 하지만 attribute들은 직접적으로 접근되어 지지 않는다. 하지만 getter setter procedure가 자동으로 interface에 추가되어 이것을 통해서 제어 된다.

Parameter-passing 매커니즘은 하나의 예로 call by value call by referece가 있지만, 이것은 local에서만 적합하고 caller procedure가 다른 process들에 있을 경우에는 적합하지 않다. Input 이나 output 혹은 둘다는 분산환경에서의 모듈 인터페이스에 있는 procedure 또는 moethod에 명세되어져 있다.

 분산 환경에서의 remote module에서의 또 다른 특징은 pointer를 사용할 수 없다는 것이다. 따라서 pointer를 이용해서는 결과값을 받아오기 힘들다.

   다음 두개의 패러그램에서는 original client –server에서 사용되는 RPC와 분산 object model에서 사용되는 RMI에서의 interface에 대해서 논한다.


Service interfaces: 클라이언트 서버 모델에서 각각의 서버는 프로지서들의 셋을 제공한다. 이것은 클라이언트에 의해서 사용되어 질수있다. For example, 파일 서버는 파일을 읽고 쓸수 있는 procedure들을 제공 한다. service interface라는 텀은 정의된 input output 아규먼트들로 각각의 프로시저들을 사용할 수 있는 것들을 말한다.


Remote interfaces: Distributed object model에서 remote interface는 object들의 method들로 정의된다. 그것은 invocation이 가능하다 다른 프로세서들에서의 오브젝트들에 의해서, 정의된 input output을에 의해서. 이것이 metohod들과의 큰 차이점은 야규먼트와 결과가 오브젝트를 통과할수 있다는 것이다. 더구나, reference들 또한 그냥 통과댈수 있다. 이것은 포인터 충돌을 발생시키지 않는다. 이것은 상세한 메모리 위치를 참조한다. 


remote interface나 service interface 모두 직접적으로 변수에 접근 하는 것은 아니다. 그것은 object variable들의 인스턴스에 직접적으로 접근 하는 것이 된다. 


Interface definition languages: RMI 매커니즘은 통합되었다 실제적인 프로그래밍 랭기지에, interface 정의를 위해서 충분히 설명이 되어 있다면, Input and output 파라메터들을 랭기지가 가지는 기본적인 사용 파라메터로 일대일 맵핑 시킬 수 있다. Java RMI의 RMI에 대한 예제이며, 이 게념에 객체지향 개념을 추가한 것이다. 이 방법 분산 어플리케이션의 모든 부분에 대해서 같은 랭기지쥐로  사용할때 유용하다. 그것은 local과 remote invocation시 하나의 랭기지로 작성을 할 수 있기 때문에 프로그래머에게 편리함을 재공 한다. 

  하지만, 많은 많은 존재하는 유용한 서비스들은 C++ 그리고 다른 언어로들로 작성되어져 있다.



5.2 Communication between distributed objects

 



콤마(,)는 전세계 어느 글에서든 나오는 문장 부호입니다.
하지만 영어에서 콤마는 여러 규칙이 있어서 제대로 알고 쓰지 않으면 큰일납니다.

 

 

1. 콤마는 문장에서 이어지는 단어들에 쓰이고 마지막 단어에는 쓰이지 않습니다. 

 

- You are so cleaver, nice, and handsome.

이 문장에서 cleaver, nice, and handsome 이렇게 이어지는데요.
대부분은 nice 와 and 사이에 콤마를 찍지 않습니다. 
그러나 마지막 handsome빼고는 다 찍어야 한답니다. 

 

그러나 이어지는 단어가 두개라면 찍지 않아도 됩니다.


- I am smart and funny.

 

 

2. 콤마는 두 문장이 접속사때문에 연결 될 때 접속사 앞에 씁니다.

 

- She is nice, and she is hot.

She is nice와  she is hot 은 서로 따로 쓸 수 있는 문장이기 때문에 서로 연결시키려고

and, or, but 를 쓸 때 그 앞에 콤마가 필요합니다.

 

그러나 

- Mike drinks coffee and eats bread.
위 문장같은 경우, and 앞에 콤마가 쓰이지 않습니다.
그럼 eats 앞에는 주어가 없기 때문입니다.

 

 

3. 콤마는 한 문장을 시작하는 종속절 뒤에 사용합니다.

- While she was sleeping, I went outside.

 

(종속절: 주어와 동사를 가지고 있지만 혼자서 문장이 되지는 못하는 절)


 

4. 콤마는 문장을 시작하는 긴 구에 쓰입니다.

- Even though the game was not fun, I did not stop playing it.

 

 

5. 콤마는 문장의 흐름을 잠시 중단하는 단어, 구, 절 등을 분리 할 때 쓰입니다.

- My first excuse, wild as it was, didn't sound convincing.

위 문장의문장의 흐름을 잠시 중단하는 내용을 분리하기 위해서 콤마를 찍습니다.


6. 보충 설명이 추가된 문장 사이의 콤마

문장 사이에, 완전한 표현을 삽입하기 위해 콤마를 쓴다. 동격어문, 직접적으로 설명하는 단어


1. 예문: Sir Horace Walpople, the youngst son of the youngest son of the first Brithsh Prim Minister, was a prolific letter writer 

2. e.g: His corrspondenc, in fact, inculd at last 7,000 letters. 

 

6. 콤마는 접속 부사를 분리하기 위해 사용합니다.

접속 부사란 however, nevertheless, still, then 등에 해당하는 단어들 입니다.

- It was a beautiful day. However, she was sad.

 

7. 콤마는 다른 사람에게 직접적으로 내용을 전달할때 전달받는 사람을 분리하기 위해 사용합니다.

 

- Tom, are you going home?

http://minjang.egloos.com/1148299 

'Computer Science' 카테고리의 다른 글

python으로 mysql 조작하기  (0) 2013.04.22
Structured Testing.  (0) 2013.04.15

http://iptime.co.kr/bbs/view.php?id=faq_setup&no=525 


공유기 설정은 위의 것을 참조 한다.




'일상 > 정보 수집' 카테고리의 다른 글

markdown 사용법  (0) 2016.03.25
[Highlight.js] Tistory 소스코드 하이라이트  (0) 2015.09.30
[SyntaxHighlighter] Tistory 소스코드 하이라이트  (0) 2015.06.29
원격  (0) 2013.11.20
소스코드 하이라이트  (0) 2013.06.04

1 먼저 USB로 디바이스를 인식한다
2 adb tcpip 명령어로 tcp로 접속할 것을 셋팅한다.
3 adb connect 명령어로 바로 접속한다.
4 adb 명령어를 사용한다. 몽키를 돌리든 시스템을 죽이던 install을 하던 맘대로!!!!!!! USB 없이!!



Adb connect your_ip:port

 

디바이스의 wifi가 접속되어 있는 상태어야 하고 ip는 디바이스의 ip이다.

Port는 5555 가 기본이고.. adb tcpip 명령어를 통해 port를 바꿀수 있다.



출처: http://sailerya.tistory.com/13 



Android Debugging - ADB over Network

참고 사이트: http://geekyogi.tumblr.com/post/24456172929/android-debugging-adb-over-network 


Android.mk variables


These are the variables that you'll commonly see in Android.mk files, listed alphabetically.


But first, a note on variable naming:


    LOCAL_ - These variables are set per-module. They are cleared by the include $(CLEAR_VARS) line, so you can rely on them being empty after including that file. Most of the variables you'll use in most modules are LOCAL_ variables.

    PRIVATE_ - These variables are make-target-specific variables. That means they're only usable within the commands for that module. It also means that they're unlikely to change behind your back from modules that are included after yours. This link to the make documentation describes more about target-specific variables. Please note that there are a couple of these laying around the tree that aren't prefixed with PRIVATE_. It is safe, and they will be fixed as they are discovered. Sorry for the confusion.

    INTERNAL_ - These variables are critical to functioning of the build system, so you shouldn't create variables named like this, and you probably shouldn't be messing with these variables in your makefiles.

    HOST_ and TARGET_ - These contain the directories and definitions that are specific to either the host or the target builds. Do not set variables that start with HOST_ or TARGET_ in your makefiles.

    BUILD_ and CLEAR_VARS - These contain the names of well-defined template makefiles to include. Some examples are CLEAR_VARS and BUILD_HOST_PACKAGE.

    Any other name is fair-game for you to use in your Android.mk. However, remember that this is a non-recursive build system, so it is possible that your variable will be changed by another Android.mk included later, and be different when the commands for your rule / module are executed.


LOCAL_ASSET_FILES


In Android.mk files that include $(BUILD_PACKAGE) set this to the set of files you want built into your app. Usually:


LOCAL_ASSET_FILES += $(call find-subdir-assets)


This will probably change when we switch to ant for the apps' build system.

LOCAL_CC


If you want to use a different C compiler for this module, set LOCAL_CC to the path to the compiler. If LOCAL_CC is blank, the appropriate default compiler is used.

LOCAL_CXX


If you want to use a different C++ compiler for this module, set LOCAL_CXX to the path to the compiler. If LOCAL_CXX is blank, the appropriate default compiler is used.

LOCAL_CFLAGS


If you have additional flags to pass into the C or C++ compiler, add them here. For example:


LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1

LOCAL_CPPFLAGS


If you have additional flags to pass into only the C++ compiler, add them here. For example:


LOCAL_CPPFLAGS += -ffriend-injection

LOCAL_CPPFLAGS is guaranteed to be after LOCAL_CFLAGS on the compile line, so you can use it to override flags listed in LOCAL_CFLAGS.

LOCAL_CPP_EXTENSION


If your C++ files end in something other than ".cpp", you can specify the custom extension here. For example:


LOCAL_CPP_EXTENSION := .cc

Note that all C++ files for a given module must have the same extension; it is not currently possible to mix different extensions.

LOCAL_NO_DEFAULT_COMPILER_FLAGS


Normally, the compile line for C and C++ files includes global include paths and global cflags. If LOCAL_NO_DEFAULT_COMPILER_FLAGS is non-empty, none of the default includes or flags will be used when compiling C and C++ files in this module. LOCAL_C_INCLUDES, LOCAL_CFLAGS, and LOCAL_CPPFLAGS will still be used in this case, as will any DEBUG_CFLAGS that are defined for the module.

LOCAL_COPY_HEADERS


This will be going away.


The set of files to copy to the install include tree. You must also supply LOCAL_COPY_HEADERS_TO.


This is going away because copying headers messes up the error messages, and may lead to people editing those headers instead of the correct ones. It also makes it easier to do bad layering in the system, which we want to avoid. We also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any headers.

LOCAL_COPY_HEADERS_TO


This will be going away.


The directory within "include" to copy the headers listed in LOCAL_COPY_HEADERS to.


This is going away because copying headers messes up the error messages, and may lead to people editing those headers instead of the correct ones. It also makes it easier to do bad layering in the system, which we want to avoid. We also aren't doing a C/C++ SDK, so there is no ultimate requirement to copy any headers.

LOCAL_C_INCLUDES


Additional directories to instruct the C/C++ compilers to look for header files in. These paths are rooted at the top of the tree. Use LOCAL_PATH if you have subdirectories of your own that you want in the include paths. For example:


LOCAL_C_INCLUDES += extlibs/zlib-1.2.3

LOCAL_C_INCLUDES += $(LOCAL_PATH)/src


You should not add subdirectories of include to LOCAL_C_INCLUDES, instead you should reference those files in the #include statement with their subdirectories. For example:


#include <utils/KeyedVector.h>

not #include <KeyedVector.h>


There are some components that are doing this wrong, and should be cleaned up.

LOCAL_MODULE_TAGS


Set LOCAL_MODULE_TAGS to any number of whitespace-separated tags. If the tag list is empty or contains droid, the module will get installed as part of a make droid. Modules with the tagshell_$(TARGET_SHELL) will also be installed. Otherwise, it will only get installed by running make <your-module> or with the make all pseudotarget.

LOCAL_REQUIRED_MODULES


Set LOCAL_REQUIRED_MODULES to any number of whitespace-separated module names, like "libblah" or "Email". If this module is installed, all of the modules that it requires will be installed as well. This can be used to, e.g., ensure that necessary shared libraries or providers are installed when a given app is installed.

LOCAL_FORCE_STATIC_EXECUTABLE


If your executable should be linked statically, set LOCAL_FORCE_STATIC_EXECUTABLE:=true. There is a very short list of libraries that we have in static form (currently only libc). This is really only used for executables in /sbin on the root filesystem.

LOCAL_GENERATED_SOURCES


Files that you add to LOCAL_GENERATED_SOURCES will be automatically generated and then linked in when your module is built. See the Custom Tools template makefile for an example.

LOCAL_JAVACFLAGS


If you have additional flags to pass into the javac compiler, add them here. For example:


LOCAL_JAVACFLAGS += -Xlint:deprecation

LOCAL_JAVA_LIBRARIES


When linking Java apps and libraries, LOCAL_JAVA_LIBRARIES specifies which sets of java classes to include. Currently there are two of these: core and framework. In most cases, it will look like this:


LOCAL_JAVA_LIBRARIES := core framework


Note that setting LOCAL_JAVA_LIBRARIES is not necessary (and is not allowed) when building an APK with "include $(BUILD_PACKAGE)". The appropriate libraries will be included automatically.

LOCAL_LDFLAGS


You can pass additional flags to the linker by setting LOCAL_LDFLAGS. Keep in mind that the order of parameters is very important to ld, so test whatever you do on all platforms.

LOCAL_LDLIBS


LOCAL_LDLIBS allows you to specify additional libraries that are not part of the build for your executable or library. Specify the libraries you want in -lxxx format; they're passed directly to the link line. However, keep in mind that there will be no dependency generated for these libraries. It's most useful in simulator builds where you want to use a library preinstalled on the host. The linker (ld) is a particularly fussy beast, so it's sometimes necessary to pass other flags here if you're doing something sneaky. Some examples:


LOCAL_LDLIBS += -lcurses -lpthread

LOCAL_LDLIBS += -Wl,-z,origin

LOCAL_NO_MANIFEST


If your package doesn't have a manifest (AndroidManifest.xml), then set LOCAL_NO_MANIFEST:=true. The common resources package does this.

LOCAL_PACKAGE_NAME


LOCAL_PACKAGE_NAME is the name of an app. For example, Dialer, Contacts, etc. This will probably change or go away when we switch to an ant-based build system for the apps.

LOCAL_PATH


The directory your Android.mk file is in. You can set it by putting the following as the first line in your Android.mk:


LOCAL_PATH := $(my-dir)


The my-dir macro uses the MAKEFILE_LIST variable, so you must call it before you include any other makefiles. Also, consider that any subdirectories you inlcude might reset LOCAL_PATH, so do your own stuff before you include them. This also means that if you try to write several include lines that reference LOCAL_PATH, it won't work, because those included makefiles might reset LOCAL_PATH.

LOCAL_POST_PROCESS_COMMAND


For host executables, you can specify a command to run on the module after it's been linked. You might have to go through some contortions to get variables right because of early or late variable evaluation:


module := $(HOST_OUT_EXECUTABLES)/$(LOCAL_MODULE)

LOCAL_POST_PROCESS_COMMAND := /Developer/Tools/Rez -d __DARWIN__ -t APPL\

       -d __WXMAC__ -o $(module) Carbon.r

LOCAL_PREBUILT_EXECUTABLES


When including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these to executables that you want copied. They're located automatically into the right bin directory.

LOCAL_PREBUILT_LIBS


When including $(BUILD_PREBUILT) or $(BUILD_HOST_PREBUILT), set these to libraries that you want copied. They're located automatically into the right lib directory.

LOCAL_SHARED_LIBRARIES


These are the libraries you directly link against. You don't need to pass transitively included libraries. Specify the name without the suffix:


LOCAL_SHARED_LIBRARIES := \

    libutils \

    libui \

    libaudio \

    libexpat \

    libsgl

LOCAL_SRC_FILES


The build system looks at LOCAL_SRC_FILES to know what source files to compile -- .cpp .c .y .l .java. For lex and yacc files, it knows how to correctly do the intermediate .h and .c/.cpp files automatically. If the files are in a subdirectory of the one containing the Android.mk, prefix them with the directory name:


LOCAL_SRC_FILES := \

    file1.cpp \

    dir/file2.cpp

LOCAL_STATIC_LIBRARIES


These are the static libraries that you want to include in your module. Mostly, we use shared libraries, but there are a couple of places, like executables in sbin and host executables where we use static libraries instead.


LOCAL_STATIC_LIBRARIES := \

    libutils \

    libtinyxml

LOCAL_MODULE


LOCAL_MODULE is the name of what's supposed to be generated from your Android.mk. For exmample, for libkjs, the LOCAL_MODULE is "libkjs" (the build system adds the appropriate suffix -- .so .dylib .dll). For app modules, use LOCAL_PACKAGE_NAME instead of LOCAL_MODULE. We're planning on switching to ant for the apps, so this might become moot.

LOCAL_MODULE_PATH


Instructs the build system to put the module somewhere other than what's normal for its type. If you override this, make sure you also set LOCAL_UNSTRIPPED_PATH if it's an executable or a shared library so the unstripped binary has somewhere to go. An error will occur if you forget to.


See Putting modules elsewhere for more.

LOCAL_UNSTRIPPED_PATH


Instructs the build system to put the unstripped version of the module somewhere other than what's normal for its type. Usually, you override this because you overrodeLOCAL_MODULE_PATH for an executable or a shared library. If you overrode LOCAL_MODULE_PATH, but not LOCAL_UNSTRIPPED_PATH, an error will occur.


See Putting modules elsewhere for more.

LOCAL_WHOLE_STATIC_LIBRARIES


These are the static libraries that you want to include in your module without allowing the linker to remove dead code from them. This is mostly useful if you want to add a static library to a shared library and have the static library's content exposed from the shared library.


LOCAL_WHOLE_STATIC_LIBRARIES := \

    libsqlite3_android

LOCAL_YACCFLAGS


Any flags to pass to invocations of yacc for your module. A known limitation here is that the flags will be the same for all invocations of YACC for your module. This can be fixed. If you ever need it to be, just ask.


LOCAL_YACCFLAGS := -p kjsyy

Implementation Details


You should never have to touch anything in the config directory unless you're adding a new platform, new tools, or adding new features to the build system. In general, please consult with the build system owner(s) (android-build-team) before you go mucking around in here. That said, here are some notes on what's going on under the hood.

Environment Setup / buildspec.mk Versioning


In order to make easier for people when the build system changes, when it is necessary to make changes to buildspec.mk or to rerun the environment setup scripts, they contain a version number in the variable BUILD_ENV_SEQUENCE_NUMBER. If this variable does not match what the build system expects, it fails printing an error message explaining what happened. If you make a change that requires an update, you need to update two places so this message will be printed.


    In config/envsetup.make, increment the CORRECT_BUILD_ENV_SEQUENCE_NUMBER definition.

    In buildspec.mk.default, update the BUILD_ENV_SEQUENCE_DUMBER definition to match the one in config/envsetup.make


The scripts automatically get the value from the build system, so they will trigger the warning as well.


Additional makefile variables


You probably shouldn't use these variables. Please consult android-build-team before using them. These are mostly there for workarounds for other issues, or things that aren't completely done right.

LOCAL_ADDITIONAL_DEPENDENCIES


If your module needs to depend on anything else that isn't actually built in to it, you can add those make targets to LOCAL_ADDITIONAL_DEPENDENCIES. Usually this is a workaround for some other dependency that isn't created automatically.

LOCAL_BUILT_MODULE


When a module is built, the module is created in an intermediate directory then copied to its final location. LOCAL_BUILT_MODULE is the full path to the intermediate file. See LOCAL_INSTALLED_MODULE for the path to the final installed location of the module.

LOCAL_HOST


Set by the host_xxx.make includes to tell base_rules.make and the other includes that we're building for the host. Kenneth did this as part of openbinder, and I would like to clean it up so the rules, includes and definitions aren't duplicated for host and target.

LOCAL_INSTALLED_MODULE


The fully qualified path name of the final location of the module. See LOCAL_BUILT_MODULE for the location of the intermediate file that the make rules should actually be constructing.

LOCAL_REPLACE_VARS


Used in some stuff remaining from the openbinder for building scripts with particular values set,

LOCAL_SCRIPTS


Used in some stuff remaining from the openbinder build system that we might find handy some day.

LOCAL_MODULE_CLASS


Which kind of module this is. This variable is used to construct other variable names used to locate the modules. See base_rules.make and envsetup.make.

LOCAL_MODULE_NAME


Set to the leaf name of the LOCAL_BUILT_MODULE. I'm not sure, but it looks like it's just used in the WHO_AM_I variable to identify in the pretty printing what's being built.

LOCAL_MODULE_SUFFIX


The suffix that will be appended to LOCAL_MODULE to form LOCAL_MODULE_NAME. For example, .so, .a, .dylib.

LOCAL_STRIP_MODULE


Calculated in base_rules.make to determine if this module should actually be stripped or not, based on whether LOCAL_STRIPPABLE_MODULE is set, and whether the combo is configured to ever strip modules. With Iliyan's stripping tool, this might change.

LOCAL_STRIPPABLE_MODULE


Set by the include makefiles if that type of module is strippable. Executables and shared libraries are.

LOCAL_SYSTEM_SHARED_LIBRARIES


Used while building the base libraries: libc, libm, libdl. Usually it should be set to "none," as it is in $(CLEAR_VARS). When building these libraries, it's set to the ones they link against. For example, libc, libstdc++ and libdl don't link against anything, and libm links against libc. Normally, when the value is none, these libraries are automatically linked in to execu

시간이 중요하다.


결국 경과시간과 CPU시간은 다르다.


CPU 시간 = CPI * 명령어 수 * CPU 클럭 이다.



컴퓨터의 성능을 비교하는 기준으로 MIPS를 사용하는데는 세 가지 문제가 있다.


1) MIPS는 단순히 명령어를 실행하는 속도를 나타낼 뿐이지, 그 명령어 하나가 얼마나 많은 일을 수행하는지는 반영하지 못한다. 


명령어의 집합이 다르면 명령어 개수가 달라지기 때문에 단순히 MIPS 값으로만 성능을 비교할 수는 없다.


2) 같은 컴퓨터에서도 어떤 프로그램을 실행하느냐에 따라 MIPS값은 달라진다. 그러므로 컴퓨터의 MIPS 값은 하나가 아니다.


3) MIPS가 컴퓨터 성능과 정반대로 나타나는 경우가 있다는 것이다.(FALSE)가 존재한다.


인스트럭션을 많이 실행한다고해서 실행시간이 빨라지는것은 아니기 때문이다.


실행시간이 20 초인게 350MIPS

실행시간이 30초인게 400MIPS


위와 같을 수 있다.

인스트럭션은 아래의 것이 훨씬더 많이 실행하지만, 그래봐야 느리다는것이다.

근본적인 이유는 instruction은 모두 실행시간이 다 다르다. pipeline stall이나 cache miss와 같은 이유에서, 또한 MIPS는 프로그램마다 다르게 측정 되기 때문이다.


따라서 2개의 컴파일러를 비교할때 결국 다르고, 컴파일러가 다르면 같은 컴퓨터에서라도 제대로 측정이 안된다.




요점 정리


성능을 종합하는 측도라면 반드시 실행시간을 반영 해야 한다. 가중 산술평균은 실행 시간을 잘 반영하는 성능 측도이다. 각 프로그램의 실행시간이 다르더라도 가중치를 사용하면 모든 프로그램이 같은 비율로 반영되게 할 수 있다.




참고사이트: Wikipedia




'Computer Science > 컴퓨터 구조' 카테고리의 다른 글

Amdahl's law  (0) 2015.03.18
Purpose of memory alignment  (0) 2014.11.25
4. 멀티 프로세서  (0) 2013.06.09

Cyanogen Mode Full Update Guide Site


<CWM 모드를 Nexus-one에 설치하는 방법이 나와 있다.>


http://wiki.cyanogenmod.org/wiki/Nexus_One:_Full_Update_Guide 



<cyanogen mod 7을 받아서 nexus one으로 compile 하는 방법>


http://wiki.cyanogenmod.org/wiki/Nexus_One:_Compile_CyanogenMod_(Linux) 

http://dlwpals001.blog.me/60154562600

위 방법을 모두 충실히 따라 해야한다.

RomManager도 설치를 해야 한다. 그래야 build option에 passion이 나온다.

extract.sh를 꼭 실행해서 .so 파일을 모두 추출 해야 한다.



< compile시 문제가 생긴다. 카메라 공유 라이브러리 관련해서 >


참조사이트: http://forum.cyanogenmod.org/topic/35075-qundefined-reference-to-opencamerahardware-on-cm7/


핵심 수정사항

The provided solution to set "USE_CAMERA_STUB := false" in device/htc/passion/BoardConfig.mt did not work for me. However I found the config-file device/htc/passion-common/BoardConfigCommon.mk which contains an option BOARD_USE_FROYO_LIBCAMERA which was set to true. So I assume it expected an outdated libcamera (from FroYo release), but my libcamera.so was already updated and on GIngerbread level. So setting this option tofalse, running make clean and re-starting the build succeeded!


Confirmed.
I had the same problem in my ViewSonic.

Solved by:
cd home/lior/android/system/device/malata/smb-common/
gedit BoardConfigCommon.mk 
And setting:
BOARD_USE_FROYO_LIBCAMERA to false


위와 같이 3군대를 false로 변경하면 정상적으로 컴파일이 이루워 지게 된다.

7장 클래스와 객체지향 프로그래밍

 

 

self

 

클래스에서 유효 범위가 생성되지 않는 점은 파이썬이나 C++나 자바와 다른 점 중 하나이다.

C++나 자바를 써본 적이 있으면 파이썬의 self 매개변수를 this 포인터와 같다고 생각하면 된다.

파이썬에서는 변수를 명시적으로 선언할 수 있는 방법(즉, C에서 int x나 flot y 같은 선언)이 없기 때문에 self를 써주어야 한다. 그렇지 않으면 메서드에서 변수에 값을 대입할 때 이 값이 지역 변수에 대입되어야 하는 지 인스턴스 속성에 저장되어야 하는지 알 수 있는 방법이 없다. self를 직접 써줌으로써 이 문제를 해결한다. Self에 저장되는 값은 모두 인스턴스의 일부가 되고 나머지는 모두 지역 변수에 저장 된다.

 

 

'Computer Science > Python' 카테고리의 다른 글

GUI 프로그래밍  (0) 2013.06.23
ImageMagick for Python  (0) 2013.05.07
3장 타입과 객체  (0) 2012.07.01
2장 어휘 규약과 구문  (0) 2012.07.01
1장 파이썬 맛보기  (1) 2012.06.21

3장 타입과 객체

 

 

'Computer Science > Python' 카테고리의 다른 글

GUI 프로그래밍  (0) 2013.06.23
ImageMagick for Python  (0) 2013.05.07
7장 클래스와 객체지향 프로그래밍  (0) 2012.07.03
2장 어휘 규약과 구문  (0) 2012.07.01
1장 파이썬 맛보기  (1) 2012.06.21

 

파이썬은 특이하게도 세미콜론(;) 따위의 것들을 사용하지 않는다.

 

따라서 줄 바꾸기를 매우 잘 해주어야 구문해석이 정확하게 진행되어 진다.

 

 

문서화 문자열

 

def fact(n):

"This function computes a factorial"

if (n <= 1): return 1

else: return n * fact(n-1)

 

fact.__doc__ 하면

This function computes a factorial"가 출력 된다.

 

 

'Computer Science > Python' 카테고리의 다른 글

GUI 프로그래밍  (0) 2013.06.23
ImageMagick for Python  (0) 2013.05.07
7장 클래스와 객체지향 프로그래밍  (0) 2012.07.03
3장 타입과 객체  (0) 2012.07.01
1장 파이썬 맛보기  (1) 2012.06.21

우선 파이썬에서 한글을 쓰기 위해서는

#coding: euc-kr

위 문법을 맨위에 삽입해 준다.

 

 

문자열

 

+연산은 오로지 문자열만 연결한다.

 

수리 계산은 init(), float() 함수로 반드시 변환해야 한다.

z = init(x) + init(y)

 

str()

print시 문자열 변환 함수: str()는 3.4입력시 3.4가 나온다.

 

 

repr()

print는 문자열 변환 함수: repr()는 3.4입력시 3.39999가 나온다.

 

 

format()

 

foramt은 정해진 ofrmat으로 출력을 한다.

format(x,"0.5f ")

 

리스트(List)

 

names = ["a", "b", "c", "d"]

a = names[2]

 

names.append("Paula") # 리스트 가운데의 항목을 교체 한다.

 

b = names[0:2]

 

리스트 연결시 플러스(+)연산자를 사용 한다.

 

빈 리스트 생성

names = []

names = list()

 

import sys
if len(sys.argv) != 2 :
    print "Please supply a filename"
    raise SystemExit(1)

f = open(sys.argv[1])
lines = f.readlines()
f.close()

fvalues = [float(line) for line in lines]

print "min", min(fvalues)
print "max", max(fvalues)

 

 

튜플(tuple)

 

stock = ('GOOG', 100, 490.10)

stock = 'GOOG', 100 ,490.10

 

튜플과 리스트의 가장 큰 차이점은 한번 정의되면 수정 되어질 수 없다는 것이다.

 

하지만 성능 최적화를 위해서는 튜플을 사용하는것이 더 좋다.

왜냐하면 튜플은 수정이 되지 않기 때문에 over memory alloacate를 하지 않는다.

 

List와 Tuple의 코드상에서 구분하는 방법은 대괄호와 소괄호의 차이점으로 구별 한다

 

튜플과 리스트를 함께 사용하는 예제)

#coding: euc-kr

filename = "int"
portfolio = []
for line in open(filename):
    fields = line.split(",") #줄을 분할해서 , 단위로 리스트를 만든다.
   
    #리스트를 각 타입에 맞게 변환 한다.
    name = fields[0]
    shares = int(fields[1])
    price = float(fields[2])
   
    #튜플을 만든다.
    stock = (name, shares, price)
   
    #투플을 리스트에 추가 한다.
    portfolio.append(s 

 

 

 

집합(set)

 

집합은 객체들의 순서 없는 모음을 담는데 사용된다. 집합은 다음과 같이 set()함수에 일련의 항목들을 넘겨 주어 생성 한다.

 

s = set ([3,5,9,10])

리스트나 튜플과는 달리, 집합은 순서가 없기 때문에 숫자로 색인될 수 없다. 게다가, 집합은 요소가 중복되는 일이 없다.

 

즉, t = set("Hello")

set(['H','e','l','o']) 이와 같이 l이 한번만 나타나게 되는 것이다.

 

집합 연산자를 사용 할 수 있다.

 

또한 집합에 아이템이 추가될수도 삭제될 수도 있다.

add()

update()

remove()

 

사전(dictionary)

 

사전은 키로 색인되는 객체들을 담는 연관 배열 혹은 해시 테이블이다.

다음과 같이 값들을 중괄호({})로 둘러싸서 사전을 생성 한다.

 

stock = {

"name" : "GOOG",

"shares" : 100,

"price" : 490.10

}

 

키로 접근해서 자료를 꺼내오거나 갱신 한다.

객체 추가 및 수정은

stock["shares"] = 75

stock["date"] = "June 7, 2007"

주로 문자열이 키로 사용되지만, 숫자나 튜플 같은 다른 파이썬 객체도 키로 사용될 수 있다.

 

사전은 이름 있는 필드들로 구성되는 객체를 정의하는 데 유용하게 쓰인다.

하지만, 사전은 순서 구분 없는 데이터를 빠르게 검색하기 위한 용도의 컨테이너로도 사용 된다.

 

빈사전을 만드는 방법

 

prices = {}

prices = dict()

 

사전에 어떻게 키가 들어있는지 확인 하는 방법

1) 방법 in 연산자의 활용

if "SCOX" in prices:

p = prices["SCOX"]

else:

p = 0.0

2) 방법

p = prices.get("SCOX",0.0)

 

사전의 키 목록을 얻고 싶으면 사전을 리스트로 변환하면 된다.

syms = list(prices)

# syms에는 "AAPL", 등..이 연속해서 저장되어진다.

 

del prices["MSFT"]

 

사전은 파이썬의 꽃이다. 따라서 이것을 잘 사용하는것이 좋다.

 

 

반복과 루프

 

for를 이용해서 가장 간단하게 루프를 도는 형태는 간단히 문자열, 리스트, 튜플 같은 순서열의 모든 구성요소에 대해 루프를 도는 것이다. 다음은 한 예이다.

 

#coding: euc-kr

f = open("int")
for line in f:
    print line

 

 

 

함수

 

다음 예처럼 함수는 def문을 사용해 생성한다.

 

#coding: euc-kr

def remainder(a,b):
    q = a // b
    r = a - q*b
   
    return r

result = remainder(37,15)

print result 

 

 

 

특이한점

리턴이 2개 이상일 수 있다.

 

return (a,b)

 

a,b = func()

 

인자의 초기 값이 있을 수 있다.

 

저역 변수를 수정 할 때에는 global이라는 keyword를 사용 한다.

 

생성기

 

함수는 단일 값을 변환하는 대신, yield문을 사용해 일련의 결과 값을 생성할 수도 있다.

def countdown(n):
    print "Counting down!"
    while n > 0:
        yield n # 값(n)을 생성한다.
        n -= 1

c = countdown(5);

for i in countdown(5):

 

 

yield를 사용하는 함수를 생성기(generator)라고 부른다. 생성기 함수를 호출하면, next() 메서드를 호출 하면 일련의 결과를 반환하게 된다.

 

 

생성기는 처리 파이프라인, 스트림, 데이터 흐름에 기반한 프로그램을 작성할 때 강력한 위력을 발휘 한다. 예를 들어, 다음 생성기 함수는 로그 파일을 검토하는 데 흔히 사용되는 유닉스의 tail -f 명령의 동작을 흉내낸다.

 

리눅스 명령어중 grep을 흉내낸 파이썬 코드이다.

 def grep(lines, searchtext):
    for line in lines:
        if searchtext in line: yield line

       
f = open("int")

lines = f.readlines()

c = grep(lines,"MS")

print c.next() 

 

 

리눅스 명령어 "tail -f | grep python"를 구현 하겠다.

즉 2개의 generatior를 연결 시켜서 리눅스의 파이프라인을 구현한 간단한 예이다.

 

#coding: euc-kr
import time

def tail(f):
    f.seek(0.2)
    while True:
        line = f.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line

def grep(lines, searchtext):
    for line in lines:
        if searchtext in line: yield line
       
#f = open("int")
#lines = f.readlines()
#c = grep(lines,"MS")
#print c.next()

wwwlog = tail(open("int"))
#f = open("int")
#lines = f.readlines()
pylines = grep(wwwlog,"MS")

for line in pylines:
    print line,

 

 

 

 

 

 

코루틴

 

보통 함수는 입력으로 주어진 인수에 대해서 한 번만 실행된다. 하지만, 일련의 입력을 처리하도록 함수를 작성할 수도 있다. 이런 종류의 함수를 coroutine이라고 한다.

 

yield는 그냥 쓰면 generator이지만, ()를 양 옆에 달게 되면 coroutine이 된다.

 

 

def print_matches(matchtext):
    print "Looking for", matchtext
    while True:
        line = (yield)
        if matchtext in line:
            print line

#matchtext로 초기화 한다음

#matcher.send()를해서 해당 문자열이 있는지 검사하게 만들 수 있다.

 

 

 코루틴은 send()로 값이 도착할 때까지 멈춰 있는다.

send()가 호출되면, 코루틴 안에서 yield 표현식을 만날 때까지 계속되고, 그 순간 함수가 다시 멈춘다.

앞의 예에서 보았듯이, 이 과정은 close()가 호출될 때까지 이어진다.

 

코루틴은 프로그램의 한 곳에서 생성된 데이터를 다른 곳에서 소비하는 생성자 소비자 모델이 기반한 병행 프로그램을 작성할 때 유용하게 쓰인다. 이 모델에서 코루틴은 데이터 소비자의 역할을 수행한다. 다음은 생성기와 코루틴을 결합하는 예이다.

 

 

객체와 클래스

객체에 정의된 메서드를 살펴 보고 싶을 경우

dir(object)를 하면 알 수 있다.

 

이렇게해서 메서드를 확인할 경우 __메서드__ 와 같이 이중 언더바로 시작하고 끝나는 특수한 메서드들을 볼 수 있다.

 

 

 

 

 #coding: euc-kr

class Stack(list):
    def push(self,object):
        self.append(object)

s = Stack() # 스택을 생성한다.
s.push("Dave")
s.push(42)
s.push([3,4,5])

print s.pop()
print s.pop()

 

 

C++ / java 프로그래밍에서 쓰는 정적 메서드 또한 사용 할 수 있다.

@staticmethod

 

예외

 

try이와 except문으로 예외를 잡아서 처리 할 수 있다.

 

#coding: euc-kr

try:
    f = open("int2","r")
except IOError as e:
    print e 

 

 

IOError가 발생하면, 에러의 원인에 대한 내용이 e에 담기고 except 블록으로 제어가 넘어간다.

 

 

모듈

 

프로그램 크기가 커지면 손쉬운 관리를 위해 프로그램을 여러 파일로 나누고 싶어 질 것이다.

파이썬에서는 정의들을 파일에 넣어 다른 프로그램이나 스크립트에 Import할 수 있는 모듈의 형태로 사용할 수 있다.

 

모듈을 생성하려면 관련문장과 정의들을 모듈과 동일한 이름을 가지는 파일에 넣으면 된다.

 '''
Created on 2012. 6. 30.

@author: root
'''

def divide(a,b):
    q = a/b
    r = a -q*b
    return(q,r)

 

 

 #coding: euc-kr

import div as foo

a,b = foo.divide(2305,29)

print "%d %d" %(a,b)   

 

 

 

도움

 

dir(package name)

 

print packagename.__함수__

 

위와 같이 입력하면 해당함수의 사용법을 알 수 있다.

 

 

 

 

'Computer Science > Python' 카테고리의 다른 글

GUI 프로그래밍  (0) 2013.06.23
ImageMagick for Python  (0) 2013.05.07
7장 클래스와 객체지향 프로그래밍  (0) 2012.07.03
3장 타입과 객체  (0) 2012.07.01
2장 어휘 규약과 구문  (0) 2012.07.01

원격 저장소를 이용하여 작업하기

 

이번에는 원격 저장소의 프로젝트와 상호작용하는 방법을 다루게 될 것이다.

 

어떠한 형태의 원격 저장소가 있는가?

어떻게 원격 저장소 복사본을 생성하는가?

어떻게 원격 저장소의 변경 사항을 가져와 최신 상태로 유지하는가?

어떻게 자신의 변경 사항을 푸싱하여 원격 저장소에 공유하는가?

어떻게 원격 브랜치와 작업하는가?

어떻게 새로운 원격 저장소를 추가 하는가?

 

□ 네트워크 프로토콜

 

Git는 SSH, git, HTTP/HTTPS 이렇게 3개의 프로토콜로 원격 저장소와 통신을 하게 된다.

 

□ SSH(Secure Shell)

git@github.com/tswicegood/mysite-chp6.git

 

git는 사용자 명이다.

github.com은 서버이름이다.

맨마지막은 저장소의 경로를 의미한다.

 

□ git

속도를 위해서 설계되어진 전용 프로토콜이다.

주로 read only로 저장소를 공유할 때 사용 한다.

하지만 네트워크 9418번 port를 사용하기 때문에 방화벽으로 인해서 막히는 현상이 자주 발생 한다.

 

git://github.com/tswicegood/mysite-chp6.git

 

SSH와 가장큰 차이점은 git가 사용자 아이디가 아니라, 그냥 git 프로토콜을 나타내는 접두어 git일 뿐이라는 것이다. 즉 임의의 사용자의 접근을 허용한다는 의미이다. 따라서 읽기전용만 된다는 것이다.

 

□ HTTP/HTTPS

최후의 수단이다. 따라서 느리고, 네트워크에 부담도 많이 준다.

하지만 방화벽 문제는 거의 발생시키지 않는다. well-known port를 사용하기 때문이다.

 

http[s]://github.com/tswicegood/mysite-chp6.git

 

□ 원격 저장소 복제하기

 

git clone [저장소 주소]

 

복제 명령어 clone을 통해서 생성된 복사본은 git init으로 직접 생성한 저장소처럼 동작 한다.

 

 

변경이력을 최신으로 만들기

 

방법 1) 아직 미완성

git fetch // branch의 이력을 최신으로 업데이트한다.

 

fetch를 실행하면 지역 저장소의 원격 브랜치가 갱신된다. 즉 -r이나 -a를 해서 보면 목록이 갱신된것을 볼 수 있다. 하지만 이때, 지역 브랜치에 가져온 원격 브랜치의 변경 사항들은 merge 되지 않는다. 즉 변강사항들이 반영되지 않는다는 말이다.

 

git branch -r // r option은 remote branch의 목록을 보는것이다.

 

아직 불안전한 방법이다.

 

방법 2) 완성된 방법

 

git remote //원격 저장소의 별칭을 알아낸다.

git remote show [원격 저장소 별칭] // 원격 저장소의 별칭에 대한 주소와 remote branch의 정보를 알아온다.

git pull [원격저장소 별칭] // 원격 저장소의 별칭을 이용해서 변경이력을 가져와 현재 브랜치와 합병한다. 

git remote add [원격 저장소 별칭] [원격저장소 full address] // 원격 저장소의 풀주소(git://, ssh://, http[s]://)를 해당 별칭으로 등록 한다.

 

그러닌까 pull은 원격저장소의 내용을 현재 branch로 합병 시켜버린다.

 

만약 원격 저장소의 이름이 origin/next라고하면

git pull origin next 이렇게해야한다.

'/'를 쓰면 안된다.

 

pull을 반영 시킬 현재 브랜치를 설절하고 싶다면 <참조>를 이용한다.

git pull origin next:current_next // current_next라는 현재 지역 저장소의 브랜치에 원격 저장소의 next 브랜치의 내용을 합병 시킨다.

 

즉, git pull이란 아래의 명령어를 사용한 효과와 동일하다.

git fetch orgin

git merge origin/next

 

 

변경 사항 푸싱하기

 

git push

매개 변수 없이 실행하면, origin 저장소에 푸싱한다고 생간한다. 또한 지역 저장소의 현재 브랜치를 원격의 같은 이름의 브랜치에 푸싱한다고 여긴다. 이때, 원격 저장소에 같은 이름의 브랜치가 존재해야한다.

 

git push <저장소> <참조>

사용 형태는 pull과 비슷하다. pull을 이해했다면 모든것을 반대로만 생각해주면 쉽게 사용 할 수 있다.

 

Google에서는 Version Control을 위한 Repo와 Git 


android source code를 작업하려고 할 때 어쩔수 없이 Repo Git를 이용해야할 것이다.

즉, 안드로이드의 경우 많은 프로젝트들이 합쳐진 형태이다. 따라서 git가 1개만 쓰인것이 아니라. 매우 많이 쓰인것이다. 따라서 이러한 서로 흐터져 있는 저장소의 코드를 받아오기위해서 repo를 이용하게 된다.

 

repo의 정채는 그냥 git 명령어를 조합해서 실행하는 Pthyon 프로그램이다.

이렇게 Android Open source Project를 모두 다운 받은 다음에는 git와 repo를 사용해서 소스코드를 관리해야한다. 여기서 중요한것은 git은 각각의 프로젝트에 맞게 설정되어 있다는 것이다

무슨 말이냐하면

system, build .. 이런 각각의 디렉터리가 프로젝트가 된다.

필자의 경우 모든 프로젝트를 git 하나로 관리해보려고 했으나, 속도문제도 있고, commit이 잘 안되는 문제가 발생 했다.

그래서 그냥 기존에 있는 git의 구조를 사용하기로 했다. 이 글을 보는 사람도 그렇게 할 것을 추천 드린다.

 

그런 의미에서 구글에서 설명한 Version Corntorl 문서를 정리해 보도록 한다.

 

대부분의 경우에 대해서 Repo 대신에 Git를 사용할 수 있다. 또한 복잡한 Command들에 대해서는 Repo Git를 혼용해서 사용할 수 있다.

하지만 basic한 작업에 대해서는Repo만을 사용하는 것이 당신의 작업을 보다 간단하게 만들 것이다.

Git : open-source-version-control을 위한 시스템으로 이것은 아주 큰 프로젝트를 관리하기 위해서디자인 되어졌다.

우리는 Android context에 대해서 git local opertion들을 사용한다. 예를 들면, branching, commits, diffs, edits이다.

android project를 셋업 하는데의 하나의 도전적 과제는안드로이드 프로젝트를 어떻게 쉽게 배포하는가 이다. 이것을 위해서GIT를 선택 했다.

Repo : 이것은 repository management tool이며, 이것은 GIT위에서 개발 되었다.

Repo는 많은 Git Repository들을 통합했다. 즉, Android project는 여러 개발 프로젝트가 통합된 것이기 때문에 서로 다른 Git Repository가 사용되어져 왔다.

그리고 repo를 통해서 우리의 Revision Contro System으로 upload 되어 진다.

이것은 필요에 따라 Git repositroies들을 통합한다. 개발 작업 흐름과 같은것들을 자동으로 관리할 수 있다.

Repo Git를 대신하는것이 아니다. 그것은 단지 GIT를 이용해서 Android 프로젝트를 좀 더 쉽게 관리하기 위해서 만들어진 것이다.

repo 명령어들은 Pythonscript들을 실행하는 것이다.

Repo command를 이용해서download file multiple 저장소에서 할 수 있다.

Gerrit : 이것은 git를 사용하는 프로젝트에대한 웹 기반의 코드 리뷰 시스템이다. Gerrit는 권한히있는 사용자가 submit 변경 Git를 통해서 집중화 하는 것을 장려한다. 이것은 코드 리뷰가 통과한경우 자동으로 병합되어 진다. 게다가 Gerrit는 뭐 뭐가 변경 되었는지 브라우저를 통해서 귑게 알 수 있게 한다.

 

Basic Workflow

저장소화 인터렉팅 하는 기본적인 패턴은 다음과 같다.

1) repo start 명령어를 이용해서 새로운 branch를 생성한다.

2) file을 추가하거나 수정을 한다.

3) git add를 사용해서 변화를 스테이징 한다.

4) git commit을 이용해서 스테이징된 것을 commit 한다.

5) repo upload를 통해서 변화된 정보를 server로 보낸다.

 

Task reference

Synchronizing your client

원격 저장소와 클라이언트 작업 디렉터리를 모든  Project들에 대해서 동기화 시킨다.

>repo sync

 

선택적인 프로젝트만 동기화 시킨다.

>repo sync project_name

 

Creating topic branches

언제든지 로컬 작업 공간에 변화를 주고자 할 때 새로운 이슈를 저장하고 있는 Branch를 생성한다.

 이렇게 생성된 각각의 branch들은 고립되어져 있다.

> repo start BRANCH_Name

새로 생성한 branch를 확인 하는 방법

>repo status

 

브랜치에 특별한 프로젝트의 내용을 담을 수도 있다.

> git start BRANCH_NAME Project

특정 브랜치로 이동하는 방법

> git checkout BRANCH_NAME

현재 존재하는 Branch들을 확인 한다.

> git branch or repo branches

 

Note: A bug might be causing repo sync to reset the local topic branch. If git branch shows * (no branch) after you run repo sync, then run git checkout again.

 

Stating files

commit하기전에 스테이징 작업을 해야한다.

즉 어떤 버퍼에 커밋할 파일을 등록 해주는 작업이다. 불필요해 보이지만 꼭 필요한 작업이다.

>git add

파라메터로는 파일 또는 디렉터리를 받는다.

그리고 스테이징 되어진 파일은 삭제될 수도 있고 수정 될 수도 있다.

 

Viewing client status

작업 공간에서의 파일들의 상태를 볼 수 있다.

> repo status

 

커밋 되지 않은 파일과 HEAD의 파일을 비교해서 차이점을 보여 준다.

repo diff

 

cd ~/WORKING_DIRECTORY/PROJECT

git diff --cached

이것은 즉, 안드로이드 플랫폼 소를 몽땅 다 받으면 그 하나하나의 디렉터리가 프로젝트가 된다.

즉, 그 디렉터리 안에가면 .git가 또 있다.

--cached 옵션은 스테이징 영역과 저장소의 차이점을 보여 준다.

그냥 git diff하면 작업트리와 스테이징 영역과의 차이점을 보여준다.

저장소(HEAD) // 스테이징 // 작업트리

이렇게 3개의 구조로 되어 있을 것이다.

 

committing changes

commit 이라는 것은 revision control system에서 아주 기초적인 명령이다.

git에서 commit은 간단하게 실행 할 수 있다.

> git commit

만약 do not add a log message가 나온다면 commit은 거부 된것이다.

새로 추가되어저야할 파일은 스테이징 한다음 commit을 해야 한다.

 

Uploading changes to Gerrit

 

업로딩 이전에 가장 최신 버전의 revision들로 업데이트 하자.

>repo sync

그다음 실행한다.

repo upload

 

이 변화 모록들은 이 때까지 commit을 헀었던 것들이다.

review server로 업로드할 branch를 선택 하여야 할 것이다.

 

□ Recovering sync conflicts

만약 repo sync가 충돌 현상을 보인다면

 

status code =U, 즉 파일들이 합병되지 않는 상태를 보이는 것이다.

충돌 지역의 수정이 절대적으로 필요 하다.

일단 관련 프로젝트 디렉터리로 가서 변경을 해야하는데,

그 곳에 있는 git의 기능을 최대한 활용 하자.

즉 파일을 추가하고

commit을 하고

rebase --continue를 한다. 예제는 다음과 같다.

> git add .

> git commit

> git rebase --continue

 

rebase가 완료되면 repo sync를 다시 한다.

 

Cleaning up your client files

변경된 부분을 통합해 준다.

repo sync

안전하게 추가된 branch들을 제거 한다.

repo prune

 

Deleting a client

> rm -rf

 

Git and Repo cheatsheet 

 

 

□ Repo command reference

 

repo 명령어 사용의 기본적인 패턴은 아래와 같다.

repo command options

 

일단 Repo가 설치되어 있다면 도움말 명령어를 실행 할 수 있다.

repo help command

 

repo의 많은 명령어들은 Project 이름을 아규먼트로 받고 있다.

이것은 특별한 project의 이름 일 수도 있고, 아니면 로컬 디텍터리의 프로젝트 경로를 입력해도 된다.

repo sync [project0 project1 ... projectN]

repo sync [/PATH/TO/PROJECT0... /PATH/TO/PROJECTN]

 

 

repo의 커맨드 종류

  abandon      Permanently abandon a development branch

  branch       View current topic branches
  branches     View current topic branches
  checkout     Checkout a branch for development
  cherry-pick  Cherry-pick a change.
  diff         Show changes between commit and working tree
  download     Download and checkout a change
  grep         Print lines matching a pattern
  init         Initialize repo in the current directory
  list         List projects and their associated directories
  prune        Prune (delete) already merged topics
  rebase       Rebase local branches on upstream branch
  smartsync    Update working tree to the latest known good revision
  stage        Stage file(s) for commit
  start        Start a new branch for development
  status       Show the working tree status
  sync         Update working tree to the latest revision
  upload       Upload changes for code review

 

abandon

 

branch

 

branches

 

checkout

 

cherry-pick

 

diff

 

download

 

grep

 

init

> repo init -u URL [OPTIONS]

 

repo를 현재 디렉터리에 설치 한다. git 저장소를 위한 repo 소스코드와 Standard Android Manifest.files를 담고 있는 .repo를 현재 디렉터리에 생성 한다.

The

.repo/ directory also contains manifest.xml, which is a symlink to the selected manifest in the .repo/manifests/ directory.

 

Options:

  • -u: specify a URL from which to retrieve a manifest repository. The common manifest can be found at https://android.googlesource.com/platform/manifest

  • -m: select a manifest file within the repository. If no manifest name is selected, the default is default.xml.

  • -b: specify a revision, i.e., a particular manifest-branch.

Note: For all remaining Repo commands, the current working directory must either be the parent directory of .repo/ or a subdirectory of the parent directory.

 

 

prune

 

rebase

 

smartsync

 

stage

 

start

 

status

 

sync

>repo sync [PROJECT_LIST}

Downloads new changes and updates the working files in your local environment. If you run repo sync without any arguments, it will synchronize the files for all the projects.

When you run repo sync, this is what happens:

  • If the project has never been synchronized, then repo sync is equivalent to git clone. All branches in the remote repository are copied to the local project directory.

  • If the project has already been synchronized once, then repo sync is equivalent to:

git remote update
git rebase origin/BRANCH

 

where BRANCH is the currently checked-out branch in the local project directory. If the local branch is not tracking a branch in the remote repository, then no synchronization will occur for the project.

  • If the git rebase operation results in merge conflicts, you will need to use the normal Git commands (for example, git rebase --continue) to resolve the conflicts.

  • After a successful repo sync, the code in specified projects will be up to date with the code in the remote repository.

    Options:

    • -d: switch specified projects back to the manifest revision. Helpful if the project is currently on a topic branch, but the manifest revision is temporarily needed.

    • -s: sync to a known good build as specified by the manifest-server element in the current manifest.

    • -f: proceed with syncing other projects even if a project fails to sync.

     

    upload

     

     

     

     

    □ Git 이력 이용하기

     

    이력을 보는 방법은 git이다.

     

    > git log -p -1

     

    -p 옵션은 코드가 변경된 부분까지 보여 주는 것이다.

    -1 옵션은 변견이력의 수를 표시해 주는 것이다.

     

     

    □ 리비전 범위 지정하기

     

    변경이력을 확일 때 범위를 지정해서 해당 기간에 맞는 변경 이력만을 찾아 주는 기능이다.

     

     

    > git log --since="5 hours" // 지난 5다섯 시간 동안의 커밋만 볼 때 사용 한다.

    > git log --before="5 hours" // 5시간 이전에 변경한 그러닌까 오래전의 변경 이력을 본다.

     

    점(.)과 하이픈(-)를 사용해서도 날짜를 입력 할 수 있다.

     

    예) "오래된-리비전..최신-리비전"의 형식으로 범위를 지정할 수도 있다.

     

    이 밖에도 많은 조합 들이 존재 한다.

     

    □ 버전 간의 차이점 자세히 보기

     

    그냥 git difff를 사용할 경우 작업 복사본과 저장소 간의 차이를 볼 수 있게 된다.

     

    git diff 18f822e // 특정 리비전과의 비교이다,

    git diff --stat 1.0 // 통계적으로 특정 TAG와의 차이를 보여 준다.

     

    태그를 하나만 지정할 경우 비교 대상은 무조건 HEAD가 된다.

     

     

    □ 누구의 책임인지 찾기

     

    git blame은 파일의 각 줄앞에 커밋명, 커밋한 사람, 시간 정보를 추가해서 보여 준다.

     

    다음은 hello.html 파일에 대한 git blame 출력의 처음 두줄이다.

     

    >git  blame index.html

    ^d5fde6e (Jemin Lee 2012-06-03 00:58:42 -0700  1) <html>
    a67525a7 (Jemin Lee 2012-06-03 01:53:19 -0700  2) <head>
    a67525a7 (Jemin Lee 2012-06-03 01:53:19 -0700  3) <title>Hello World in Git</tit
    8b2a7580 (Jemin Lee 2012-06-03 04:26:53 -0700  4) <meta name="description" conte
    a67525a7 (Jemin Lee 2012-06-03 01:53:19 -0700  5) </head>
    a67525a7 (Jemin Lee 2012-06-03 01:53:19 -0700  6)
    ^d5fde6e (Jemin Lee 2012-06-03 00:58:42 -0700  7) <body>
    ^d5fde6e (Jemin Lee 2012-06-03 00:58:42 -0700  8) <h1>Hello World!</h1>
    8d1f9954 (Jemin Lee 2012-06-03 04:21:20 -0700  9) <ul>
    8d1f9954 (Jemin Lee 2012-06-03 04:21:20 -0700 10)       <li><a href="bio.html">B
    8d1f9954 (Jemin Lee 2012-06-03 04:21:20 -0700 11) </ul>
    ^d5fde6e (Jemin Lee 2012-06-03 00:58:42 -0700 12) </body>
    a67525a7 (Jemin Lee 2012-06-03 01:53:19 -0700 13)
    ^d5fde6e (Jemin Lee 2012-06-03 00:58:42 -0700 14) </html>
    ^d5fde6e (Jemin Lee 2012-06-03 00:58:42 -0700 15)

     

    ^(캐럿)이 문작 존재하는 것은 해당 커밋이 저장소에서 첫 번째 임을 의미한다.

    정보시스템 개론 시험문제 Pool

     

     

    A-1.

    A-1-1). System을 정의하시오.

     

    시스템은 어떤 목적과 기능을 수행하기 위하여 유기적인 관계를 맺으며 힘께 작용하는 요소들의 집합.

     

    A-1-2). 시스템공학과 소프트웨어공학의 차이점을 라이프사이클을 중심으로 설명하라.(이상)

    시스템공학

    • 시스템분석 or 요구사항분석
    • 시스템설계
    • 시스템구현
    • 시스템테스트,
    • 시스템유지보수 

    소프트웨어공학

    • 요구사항분석
    • S/W 설계
    • S/W 구현
    • S/W 시험(Testing)
    • S/W 유지보수

     

     

    A-1-3). 객체지향과 구조적 방법론의 차이점을 시스템 관점에서 설명하시오.

     

    각 객체지행 방법론은 시스템에 객체를 정의한다. 

    객체 사이의 연관을 규명한다. 

    각 시스템 요소들을 독립적이고 수평적인 관점에서 정의한다.

     

    이에 반해, 구조적 방법론은 시스템을 기능 중심으로 파악한다.

    그리고 각 기능을 세분화 시칸다.

    즉, top-down 의 형태로 분석하는 것이 특징이다.

     

    A-2. 소프트웨어 개발에 사용되는 대표적인 패러다임 4가지를 설명하고 각 패러다임의 단계별 활동을 설명하시오.

    소프트웨어 개발에 사용되는 대표적인 패러다임 4가지는

    폭포수 모델,

    원형 패러다임,

    나선형 패러다임,

    4세대 기법이 있다.

     

    폭포수 모델은 하향식 접근 방법을 이용한다.

     

    원형 패러다임은 고객에게 간단한 시제품을 만들어서 보여주면서 진행 하는 것을 말한다.

     

    나선형 패러다임은 시스템을 개발하면서 생기는 위험을 관리하기 위해

    위험 분석 단계를 추가한 것이다.

     

    4세대 기법은 CASE를 비롯한 자동화 도구들을 이용하여 요구사항 명세서로부터 실행 코드

    자동으로 생성할 수 있게 하는 방법이다.

     

    각 패러다임의 단계는 다음과 같다.

    1. 폭포수 모델

    1) 요구사항 분석 - 사용자 요구사항을 정의하기 위해 시스템의 요구사항을 모은다.

    2) 설계 - 요구사항을 설계도면에 옮기는 것이며 설계 과정은 물리적 실현의 첫 단계이다.

    3) 구현 - 구현은 앞의 설계 단계에서 나온 결과를 시스템의 실제 모습으로 변환시키는 것이다.

    4) 시험 - 품질보증 활동의 중요한 일부분이며 사용자 요구사항, 설계, 구현의 전 과정에 대한 최종 점검을 포함한다.

    5) 유지보수 - 사용중 발생하는 여러 변경 사항에 대해 적응하는 활동이며 변화에 대비하는 과정이다. 수정 유지보수, 적응 유지보수, 기능 추가 유지보수, 관리 유지보수 등 4가지로 나뉜다.

     

    2. 원형 패러다임

    1) 요구사항 분석 - 폭포수 모델의 요구사항 분석단계와 비슷하나 고객으로부터 받은 일부 요구사항만 정의하고 완전하지 않은 요구사항에 대해 윤곽을 잡아놓는다.

    2) 시제품 설계 - 원형에 대한 설계를 한다.

    3) 시제품 개발 - 시제품 개발.

    4) 고객의 시제품 평가 - 이 단계에서 시제품은 고객에 의해 평가되고, 개발될 소프트웨어의 요구사항을 구체적으로 정제한다.

    5) 시제품 정제 - 고객이 원하는 것을 만족시키기 위해 시제품에 대한 조율을 한다.

    6) 완제품 생산 - 원하는 시스템을 개발. 기존의 시제품을 확장하여 완제품을 만들 것인지 시제품을 버리고 완제품을 만들 것인지 결정한다. 만약 시제품을 버리고 완제품을 만든다면 이 단계에서 완전한 폭포수 모델, 4세대 기법의 적용이 가능하다.

     

     

     

    3. 나선형 패러다임

    1) 계획 및 정의 - 요구사항을 모으고 프로젝트 계획을 수립한다.

    2) 위험 분석 - 초기 요구사항에 근거하여 위험을 규명한다.

    3) 개발 - 어떤 패러다임을 적용하여 시스템을 개발할 것인가 하는 개발 모델을 결정하고, 시제품을 개발하거나 최종 제품을 만든다.

    4) 고객 평가 - 개발 과정에서 나온 결과를 사용자가 평가한다. 고객의 평가에 의해 다음 결과물이 계획된다.

     

     

     

    4. 4세대 기법 - 단계 없음

     

     

    A-3. 나선형 모델(spiral model)의 각 진행 과정에 대하여 설명하고, 프로토타입 기법과의 차이점을 설명하시오.

     

    나선형 모델은 폭포수 모델과 원형 패러다음의 장점에 위험 분석을 추가하여 만든 것으로 나선형 모델은 나선을 돌면서 점진적으로 완벽한 모델을 구축하게 된다.

     

    1) 계획 및 정의 단계에서 목표, 요구사항, 제약등을 규명

    2) 위험 분석단계에서는 프로젝트의 중단을 결정한다.

    3) 개발 단계에서 어떠한 패러다음으로 시스템을 개발할 것인지 결정해서 시제품을 만든다.

    4) 고객 평가 단계에서 다음 나선의 목표 및 요구 사항이 반영된다.

     

    겉으로 보기엔 비슷해 보이지만,

    나선형 모델에는 위험 분석 단계가 들어가서 위험에 대한 평가가 가능해서 위험 분석을 필요로 하는 프로젝트에 적합하다.

     

    A-4. 객체지향 질문

    (a) 객체를 정의하고 객체지향을 설명하시오.

    객체란 물리적으로 식별 가능한 것을 말한다,

     

    객체의 표현은 두칸으로 이루어져 있는데, 첫째 칸은 객체를 구별할 수 있는 이름을 표시하고 둘째 칸은 각 속성에 대응하는 속성값을 표시한다.

     

     

    객체 지향 방법론은 데이터행위를 하나로

    묶어 객체를 정의내리고 객체를 추상화시키는 작업이다.

     

    (b) 객체지향과 구조적 기법의 차이를 설명하시오.

    [ 객채지향 방법론 ]

    객체지향 방법은 시스템에 필요한 엔티티(객체)들을 정의하고

    이들 엔티티 사이의 연관성을 규명.

    시스템을 구성하고 있는 객체를 중심으로 객체의 특성을 정의.

    시스템을 구성하는 요소들을 독립적이고 수평적인 관점에서 정의.

     

    [ 구조적 방법론 ]

    시스템을 기능 중심으로 파악하고 이를 세분화된 기능으로 나눈다.

    시스템을 하향식(top-down)의 형태로 나타낸다.

     

    (c) 개발 방법이 통합 기술이라는 이유를 설명하고 통합과정을 기술하시오.

    객체지향 방법은 데이터와 행위를 통합하여 개발하기 때문에 통합 기술이라고 말한다.

    또한 객체지향 방법은 소프트웨어 시스템의 3가지 관점을 체계적으로 통합하여

    유연성과 적응력을 가진 우수한 품질의 소프트웨어를 만들 수 있는 최적의 방법으로 여겨진다.

     

    객체지향 개발 방법의 통합 과정은 다음과 같다.

    객체 모델(객체 규명 객체간의 관계 규명) +

    동적 모델(객체의 행위와 상태를 규명) +

    기능 모델(동적 모델에서 정의한 상태들의 동작들을 기술 한다.)

     

     

     

    (d) 객체지향 개발 방법이 하향식 접근 방법을 택하는지 또는 상향식 접근 방법을 택하는지 (또는 혼합형인지) 그 이유를 들어 설명하시오.

    객체지향 방법론은 객체 중심의 상향식 접근 방법이 도입된다. 객체지향 방법론은 기능 중심이 아닌 객체 중심, 데이터 중심으로 시스템 개발이 이루어진다.

     

     

    A-5. 일정에 쫓기거나 눈 앞의 이익으로 인해 기술적 부채(technical debt)를 진 경험이 있으면 기술하시오. 또한 기술적 부채로 인하여 추후 새로운 기능을 개발하는데 어려움이 발생한 경험을 말하고 해결하려고 노력한 경험에 대하여 기술하시오.

     

    A-6. 리팩토링(Refactoring)을 정의하고 기술적 부채(technical debt)와의 연관성을 설명하시오.

    리팩토링- 소프트 웨어를 보다 쉽게 이해 할수 있고, 적은 비용을호 수정할수 있도로록 겉으로 보이는 동작의 변화 없이 내부 구조를 변경하는 것.

     

    동작의 변화없이 내부 구조를 수정할시 코드를 처음부터 다시 작성해야 할때는 하지 않는 것이 좋으며, 또한 마감일이 얼마 남지 않은 시점에서는 리팩토링을 기술적 부채 개념으로 생각해야 한다.

     

     

    A-7. 애자일 기법이 프로토타입이나 나선형 모델과 다른 점을 설명하시오.

    애자일 이 추구하는 목적은 고객개발 팀원들이 서로 끊임없이 교류를 통하여 변화에 빠르고 유연하게 대응해야 한다는 것이다.

     

    하지만 나선형 모델은 소프트웨어를 개발하면서 발생할수 있는 위험을 관리하고 최소화하는 것을 목적으로 둠 반복적으로 개발을 지원하며프로토타이밍 기법을 이용한다. 나선형 모델은 중앙에서 시작하여 나선형으로 진행 되는 반복 진화형의 확장 형태임. 대형 소프트웨어에 적합하다. 이것이 애자일 기법과 다른 점이다.

     

    나선형 모델은 프로젝트 수행시 발생하는 위험을 관리하고 최소화 하려는 목적을 가지지만, 애자일 방법은 품질의 저하 없이 변화를 수용하고 협업을 강조하고 '제품의 빠른 인도'를 강조하는 반복적 방법이다.

     

    요구사항 분석

     

    B-1. 분석과 설계 질문

    (a) 분석과 설계의 차이점 기술.

    분석: 요구사항을 세분화하고, 결과를 통합하여 원하는 시스템을 기술하는 것이다.What에 초점을 맞춘 단계이다.

    설계: 시스템을 어떻게 만들것인가에 초점을 맞춘 단계이다. How to에 초점을 둔 과정이라고 할 수 있다.

    (b) 소프트웨어 요구사항 분석과 개발 업무의 차이점을 설명하시오.

    요구사항 분석: 시스템의 목표를 확립하는 과정을 말하며, 행동을 취하기 전 문제에 대하여 상세화 하는 것을 말한다.  

    개발: 이것은 설계와 코딩, 시험이 모두 포함된 것을 말하며, 요구사항을 정확하게 해결해 나가기만 하면 된다.

     

    (c) 요구사항 분석에 요구되는 능력을 기술하시오.

    고객들과 협상하여 공동의 목표를 끌어내야 하는데,

    이 것을 잘하기위해서 의사소통 능력이 중요하다.

     

    (d) 소프트웨어 요구사항을 분석하는 사람(직업군)을 일컷는 단어 .

     

    시스템 분석가

     

    B-2. 시스템 분석가가 진행하는 주요한 임무는 무엇이며 이러한 임무를 수행함에 있어서 소요되는 자질은 무엇인가?

     

    시스템 분석가는 사용자와 전문가 사이에서 의사 소통을 원할하게 해주는 사람이다.

    사용자의 요구사항과 전문가의 전문지식을 뽑아내는 것이 분석가의 임무이다.

     

     

     

    시스템 분석가의 자질

    1) 응용분야에 대한 지식

    2) 컴퓨터에 대한 기술의 이해

    3) 의사소통능력

    4) 모순되는 요구사항 해결

    5) 고객관점에서 문제를 볼 수 있는 눈이다.

     

    1) 응용분야에 대한 전문지식 없이 요구사항 분석은 거의 불가능하다.

    2) 현재의 컴퓨터 기술로 실현 가능한 수준을 알고 있어야 한다.

    3) 분석가는 사용자, 고객, 전문가와 대화를 나눌 수 있어야 하므로, 의사소통 능력이 시스템 분석가의 첫 번째 요건이 된다.

     

     

    B-3. 요구사항을 분석하는 모델링 작업 중에 빠져서는 안 될 중요한 요소는 도표를 사용해야 한다는 점이다. 모델링을 정의하고 모델링의 기본요소에 대해 기술하시오.

     

    모델링이란 개발대상 시스템의 성능분석이나 동작과정 등을 알아보기 위하여 간단한 물리적 모형, 도해를 만들거나 또는 그 시스템의 특징을 수학적으로 표현하는 과정

     

    모델링의 기본요소로서

    Representation,

    Convention,

    Specification이 있으며,

    내용은 다음과 같다.

     

    Representation: 문자가 아닌 시각적인 표현

    예시:

     

     

     

     

    Convention: 시각적인 표현에 대한 설명

     

     

     

    Specification: 시각적인 표현을 문자로 확증하는 과정으로

    모델링 과정에서 나타난 도표의 구체적인 정의

     

    B-4. 소프트웨어 시스템을 바라보는 3가지 관점에 대해 설명하고, 현금자동인출기를 예로 3가지 관점에서 모델링하시오.

     

     

    기능 관점은 시스템이 어떠한 기능을 수행하는가의 관점에서 시스템을 기술하고, 주어진 입력에 대하여 어떤 결과가 나오는가를 보여주는 관점이다.

    동적관점은 시간에 변화에 따른 시스템의 동작과 제어에 초점을 맞추어 시스템의 상태를 변하게 하는 원인들을 묘사하는 것이다.

    정보관점은 시스템에 사용되는 정보 객체를 찾아내고, 이들 객체의 특성, 객체들 사이의 연관성을 규명한다.

     

    기능 모델(Activity Diagram)

    동적 모델(Sequence Diagram)

    정보 모델(Class Diagram)

    3개의 다이어그램으로 모델링 한 것을 그린다.

     

    B-8. 현금자동인출기(ATM)를 다음 순서에 의해 모델링 하시오.

    (1) 문제설명서 (5줄 이내)

     

     

    ATM은 은행직원의 도움없이 고객이 입금, 출금, 조회, 이체와 같은 은행 거래를 할 수 있게 해주는 장치이다.

    ATM은 현금카드를 받아들여 고객이 가지고 있는 계좌를 바탕으로 위에서 언급한 네 가지 은행 거래중 하나를 수행 한다.

    ATM은 은행 소속되어 있으며 고객의 계좌는 은행에서 관리 한다.

     

     

    (2) Actor use-case 도출

     

     

     

     

     

     

     

    Actor 1: Operator

    Actor 2: Customer

    Actor 3: Bank

     

    (3) “현금인출에 대한 use-case 시나리오 작성

     

    유발자: Customer

    UseCase 개괄: customer가 자신의 account에서 현금을 인출 한다.

    사건흐름

    A. 기본 흐름

    1) Bank Client는 자신의 account 정보가 기록된 Bank CardATM 기계에 삽입한다.

    2) Bank ClientATM 기계에 자신의 account password를 입력한다.

    3) Bank Client는 현금인출할 금액을 입력한다.

    4) 전액 현금으로 출금 한다.

    5) Bank Client는 현금과 Bank CardATM 기계에서 꺼내 온다.

     

    B. 대안 흐름

    4-1) 현금과 수표 중에 선택 한다.

    1.1) 수표로 출금 한다.

     

    C. 예외 흐름

    2-1) password가 잘못 입력 된 경우

    1.1) 다시 password를 입력하라는 메시지를 출력한다.

    2-1) pawword3번 잘못 입력된 경우

    1.1) 해당 account가 블록되었다는 메시지를 출력한다. 가까운 지점에가서 해결하라는 안내문을 출력 한다.

    3-1) account가 보유한 balance보다 많은 금액을 withdraw할 경우

    1.1) balance가 부족하다는 메시지를 출력한다.

     

     

    (4) 객체(정보) 모델링(Class Diagram)

     

     

     

     

     

    (5) “현금인출를 중심으로 동적 모델링(Sequence Diagram)

     

     

     

    (6) “현금인출를 중심으로 기능 모델링 또는 Activity Diagram

     

     

     

     

    설계(c)

     

    1. 소프트웨어 설계단계에서 품질에 영향을 미치는 요소들에 대해 정의를 내리고 소프트웨어 품질과의 관계를 설명하라.

     

    설계단계에서 품질에 영향을 미치는 요소들은 모듈 독립성, 응집도, 결합도, 이해도, 적응도가 있다.

     

    모듈의 독립성은 각 모듈이 하나의 기능만을 수행하며 다른 모듈들과의 상호교류와 결합을 최소화 시킬 때 모듈의 기능적 독립성은 극대화 된다.

     

    응집도모듈 내부가 얼마나 단단히 뭉쳐져 있는 성숙도의 측정치이다. 모듈의 응집도를 높이면 모듈사이의 낮은 결합도를 얻을수 있어 바람직하다.

     

    결합도모듈들 사이의 상호 연관성의 복잡도를 일컫는다. 결합도가 높을수록 한 모듈의 변화가 다른 모듈에도 영향을 주어 파문효과가 많이 일어 시스템을 유지보수하기가 어려워진다. 시스템 설계시 가능한 최하위의 결합도를 갖게 시스템을 설계하는 것이 이상적이다.

     

    이해도다른 프로그램 요소나 정보를 참조하지 않고, 이해할 수 있는 용이성이다. 시스템의 응집도가 높을수록 쉽게 쉽게 이해 할 수 있게 해준다.

     

    적응도새로운 환경에 적절히 대응할 수 있도록 소프트웨어를 변경시킬 수 있는 용이성이다. 적응도를 높이기 위해서는 결합도를 낮추고, 문서는 이해하기 쉽고 프로그램과 일치하게 관리하여야 한다.

     

     

     

    2. 트랜잭션 흐름 중심의 설계변환(Transform) 흐름 중심 설계의 과정과 차이점을 기술하시오.

     

     

    변환흐름중심설계는 시스템이 정보를 받아들여 이를 변환시키고 출력을 만들어 낸다. 출력은 입력이 변환된 가공물이라 볼 수 있다.

     

    트랜잭션 흐름 중심 설계는 시스템이 정보를 받아들여 정보의 값을 기초로 어떤 특정 경로의 일을 진행시킬 것인가를 결정한다. 이 경우 입력값에 의해 어떤 임무를 수행 할 것인가가 결정된다.

     

    변환흐름 중심 설계에서의 설계 과정은

    첫째, 요구사항 명세서로부터 하나의 자료흐름도를 만든다.

    둘째, 자료흐름도의 유형을 조사한다.

    셋째, 입력 경계출력 경계를 정한다.

    넷째, 최상위 수준에서 자료흐름 중심 프로그램 구조를 개발한다.

    다섯째, 자료흐름도를 프로그램 구조로 전환한다.

    여섯째, 프로그램 구조를 정제한다.

     

    트랜잭션 흐름의 설계 과정은 변환흐름설계과정과 약간 차이가 있다.

    두 번째에서 자료흐름이 트랜잭션 흐름으로 결정나면,

    셋째 트랜잭션 흐름과 동작 경로를 파악한다.

    넷째 트랜잭션 흐름의 프로그램을 개발한다.

    다음단계는 다섯째, 자료흐름을 프로그램 구조로 매핑하여

    여섯째, 프로그램 구조를 정제한다.

     

     

    3. 소프트웨어 설계를 관리적 관점기술적 관점으로 나누어 각 관점에서 이루어지는 설계 기법을 기술하시오.

     

    관리적 관점에서는 크게 기본 설계상세설계로 나눌 수 있다.

    기본 설계에서는 시스템의 구조와 데이터를 규명하며, 사용자의 인터페이스를 정의하고,

    상세설계에서는 각 모듈의 구체적인 알고리즘에 초점을 맞춘다.

     

    기술자 관점은 크게 네가지로 나눌 수 있다.

    첫째, 데이터 설계에서는 자료구조와 데이터 베이스를 설계한다.

    둘째, 구조설계에서는 모델링 결과를 이용하여 각 모듈들 사이의 관계를 기술한다.

    셋째, 프로시져 설계에서는 모듈 내부의 알고리즘을 선택한다.

    넷째, 사용자 인터페이스 설계에서는 인터페이스 정의를 만족하기 위해 시스템의 기능분할이 필요할 것이라고 생각 할 수 있다. 인터페이스 설계는 구조설계 이전에 한다.

     

     

    4. 상세설계에서 사용되는 기법들을 간략하게 설명하시오.

    상세설계에서 알고리즘을 표현하는 기법으로는 순서도, N-S도표, 프로그램설계언어(PDL)등이 있다.

     

    순서도는 직사각형, 다이아몬드 화살표를 기본요소로 제어흐름을 표시한다. 간단하고 표현력이 높지만, 복잡한 시스템을 설명하는데 부적합하다.

     

    N-S도표의 특징은

    순서도의 표현력을 높인 것으로

    첫째, 순서, 조건분기, 순환 등 기본적 구조를 서로 다른 도표로 표시해 쉽게 이해 할 수 있다.

    둘째, 프로그램을 구조적으로 작성해야만 한다.

    셋째, 임의로 goto문을 작성 할 수 없다.

    넷째, 순환 구조를 쉽게 표시할 수 있다.

     

    PDL은 고급언어와 저급언어를 통합하여 사용 할 수 있는 알고리즘 표기언어이다.

    , PDL은 프로그램의 알고리즘 구조를 정확히 표기하기 때문에 자동적으로 다른 표기법으로

    변환 할 수 있다.

     

     

    5. 분석에서 설계로 넘어가며 나타나는 문제점어려움의 원인에 대하여 기술하고 이를 극복할 수 있는 방법을 설명하시오.

    요구사항 분석 단계에서는 응용분야의 관점, 사용자 관점에서 시스템을 기술한 반면,

    설계 단계에서는 소프트웨어의 관점, 엔지니어의 관점에서 시스템을 기술하게 된다.

     

    즉, 요구사항은 분석하는 단계는 개념적인 것이라면,

    설계과정은 물리적인 것이라 할 수 있다.

     

    또한 요구사항 분석에서 생긴 문제점들을 해결하기 위한 방법을 설계 단계에서 구상하여야 하므로 최소한 한가지 이상의 해결 방법을 고안해 내야 하는 어려움이 있다. 따라서 설계를 하기 위해선 문제에 대해 여러 가지 각도에서 문제를 바라볼 수 있는 눈이 있어야 하며 날카로운 안목을 기르기 위해 많은 훈련과 경험을 쌓아야 한다. 또한 추상화와 모듈화 기법을 적용하여 초기 설계과정에서 나타나는 시스템의 추상적인 모습을 계속 정제하여 구체적인 설계 모습이 나올 수 있도록 세련화 시키는 방법을 통해 고품질의 설계를 이룩할 수 있다.

     

    구현

    D-1 코드검사의 목적을 설명하고 검사팀의 역할 5가지를 기술하시오.

     

    코드 검사의 목적은 오류를 적은 비용을 들여 신속하게 찾아내고, 유지보수 비용을 줄이는데 있다. 검사팀은 저자, 사회자 , 낭독자, 기술자, 검사자가 있다.

    1) 저자는 코드 저자로 코드에 대한 정보를 제공하고 문제점에 대한 답변을 한다.

    2) 사회자는 제시간에 검토가 이루어지도록 준비한다.

    3) 낭독자는 코드를 읽으면서 이를 해석한다.

    4) 기록자는 검토도중 문제점이나 오류를 기록하고, 결과를 배포한다

    5) 검사자는 사전과 진행 중에 코드를 구체적으로 검사한다.

     

    시험

     

    E-1 검증과 확인을 정의하고 그 기법을 설명하시오. 또한 이 기법들이 소프트웨어 분석 및 개발과정에서 어떻게 적용되는지 설명하라.

     

    a) 차이점

    검증이란 소프트웨어가 고객의 요구사항을 만족시키는가의 여부를 밝히는 활동이고

    (검증이란 사용자가 원하는 올바른 제품을 만들었는지, 요구사항 분석의 결과가 사용자가 바라는 요구를 반영한 만족할 만한 것인지를 검사하는 것이다.)

     

    확인이란 소프트웨어가 요구사항 명세서에 지정된 기능 혹은 성능을 정확히 수행하는지 조사하는 것이다.

     

    b) 검증과 확인에 사용되는 기법

     

    블랙박스(예: 통합시험 등), 화이트박스(예: 단위 시험 등)

     

    C) 또한 이 기법들이 소프트웨어 분석 및 각 개발 과정에서 어떻게 적용되는지 단계별로 설명하시오.

    소프트웨어 개발의 세 단계

    1) 요구사항 분석: 검증 시험

    2) 설계: 통합 시험

    3) 코딩: 단위 시험

     

    설계와 코딩 단계: 화이트 박스 시험을 주로 사용 한다.

    설계 단계: 블랙박스

     

    검증을 위해 시제품 개발, 기술적 검토, 시뮬레이션을 이용해 고객의 요구사항을 명확히 한다. 확인은 개발주기상에서 현제 단계의 산출물이 바로 이전 단계의 산출물과 일치하는가를 결정하는 과정 (책참조)

     

     

    품질

     

    F-1. 소프트웨어의 품질 질문

    (a) 생산자 관점, 고객 관점에서 각각 정의하시오.(책참조)

     

    품질은 사용자만족 사용하기에 적합함,규격에 맞음,등과 같이 다양하게 정의를 내릴수 있다. 품질은 구체적인 기능 및 성능에 만족해야하고 소프트웨어에 기대되는 사용자의 요구 수준을 만족시키는 것이다.

    생산자의 관점에서는 사용자가 만족할 수 있는 품질의 소프트웨어를 가장 경제적으로 만드는 것이 목표이고, 고객의 관점에서는 각 공정과정을 이해하고 감독하는 것이 필요하다. 즉 내용을 모르고 좋은 품질의 제품을 만들어 달라고 할 수만은 없다. 고객 만족은 고객이 내용을 잘 알아야 비로소 가능하다.

     

    (b) 소프트웨어 품질 요소에 대하여 설명하시오.

     

     

     

     

    소프트웨어 품질요소로는

    운영측면에서 정확성, 신뢰성, 효율성, 유용성, 무결성이 있다.

    수정측면에서는 유연성, 시험성, 유지보수성이 있다.

    적응측면에서는 이식성, 재사용성, 상호운용성이 있다.

     

    (c) 소프트웨어의 품질을 보증하기 위해 요구되는 중요한 작업(활동)들을 5 가지만 기술하시오.

     

    1) 각 공정과정의 결과물에 대한 공식적인 기술검토가 이루어져야 한다.

    2) 다단계 시험전략이 필요하다.

    3) 문서화 과정과 문서관리를 확실히 한다.

    4) 기록유지와 보고가 체게적으로 이뤄져야한다.

    5) 개발표준의 확립이 이루어져야 한다.

     

    (d) 품질에 드는 비용을 설명하는 지랫대의 효과에 대하여 기술하시오.

     

    1온스를 들여 예방을 하면 치료에 드는 1파운드를 절약할 수 있다.는 말처럼 예방 활동을 강화할수록 소프트웨어의 실패비용을 크게 줄일 수 있다는 말이다.

     

     

    F-2. ISO 9001, 9002, 9003 인증에 대하여 차이점을 중심으로 설명하고 적용 가능한 분야의 예를 하나씩 드시오.

     

    ISO 9001 : 제품설계 개발에서부터 제조, 설치, 서비스에 이르는 품질보증체제 (소프트웨어 적용 가능)

    ISO 9002 : 설계, 개발 부문의 품질시스템이 존재하지 않는 품질보증체제, 한마디로 제조, 설치, 서비스만 존재한다.

    ISO 9003 : 최종검사 및 시험에 관한 품질보증체제

     

    간단한 제품은 출하시 확인만 하면 되는 ISO 9003만으로도 충분하며,

    제품의 설계에서부터 출하까지의 전 과정에 대한 체제인증이 필요한 경우는 ISO 9001을 선택하면 된다.

    일반적으로는 ISO 9002 규격에 의한 인증이 가장 많다.

     

    적용분야

    ISO9001 은 설계/개발,제조,부대서비스에 관한 보증품질 ,

    ISO9002 제조 설치에 관한 품질체제

    ISO 9003 지극히 단순한 제품의 최종검사 의 품질보증 ,

     

    F-3. CMMI(관리하는거)에 대한 질문

    (a) 5단계 성숙도를 기술하시오.

     

       

    성숙도 수준 5단계는 소프트웨어프로세스를 정의하거나 개선하기 위하여 조직에 의하여 수행되는 활동, 각 프로젝트에 수행되는 활동, 얻어지는 프로세스 능력들로 특징짓는다.

     

    1단계는 초기(Initial) 단계로 가장 낮은 성숙도 수준을 나타낸다. 초기 단계에서 조직은 소프트웨어의 개발과 유지에 안정적인 환경을 제공하지 못한다.

     

    2단계는 반복(Repeatable) 단계로, 1단계에서와 같이 프로세스에 대한 가시성(Visibility)이 전혀 없는 상태에서 개선되어야 할 프로젝트 관리(Project Management)를 포함한다.

     

     

    3단계는 정의(Defined) 단계로서, 2단계에서 관리되는 프로세스 중 효율적이고 조직과 잘 맞는 프로세스들을 선택하여 조직 차원의 표준소프트웨어프로세스(Organization's Standard Software Process)정의 한다.

     

    관리(Managed) 단계인 4단계에서는, 소프트웨어 제품과 프로세스에 대한 정량적인 품질목표(Quantitative Quality Goals)를 설정하고 관리한다.

     

    마지막 5단계인 최적화(Optimizing) 단계는, 프로세스개선이 전조직구성원으로 확대되고, 지속적 프로세스개선(Continuous Process Improvement)을 위해 노력한다.

     

     

    (b) 프로세스 영역 4가지를 기술하시오.

    프로세스 관리영역,

    프로젝트 관리영역,

    엔지니어링 영역,

    지원영역

     

    (c) 각 단계의 성숙도에 요구되는 Key Process Area 를 각 단계(level 2에서 level 5 까지) 별로 2 가지씩 드시오.

     

    2단계: 요구사항관리, 프로젝트계획수립, 프로젝트추적관리 , 외주관리, 품질보증등

    3단계: 조직프로세스 포커스, 조직프로세스 정의, 교육훈련, 통합소프트웨어 관리 등

    4단계: 계량적 프로세스관리, 소프트웨어 품질 관리

    5단계: 결함예방관리, 기술변화관리, 프로세스 변화 관리

     

    (d) 단계적 표현(Staged Representation) 과 연속적 표현(Continuous Representation)의 차이점을 설명하시오.

    단계적 표현은 5단계의 성숙도를 나타내며 연속적 표현은 6단계의 능력으로 나누고 있다. 단계적인 표현은 점진적으로 ProcessArea(PA)단계를 수행하며 연속적 표현은 선택적으로 PA를 수행하는 방법이다. 또한 표현구조는 단계적인 표현방법은 Bottom-up 구조이며 연속적 표현방법은 TOP-DOWN 구조이다.

     

    (e) specific goal generic goal 의 차이점을 기술하시오.

     

    Specific Goal 은 해당 프로세스 영역을 만족하기 위해 수행해야 하는 유일한 특성을 정의 하며 Generic Goal 프로세스 분야를 구현하는 프로세스를 체계화하기 위해 존재해야 하는 특성의 활동을 기술한다.

     

    F-4. ISO 9000 인증과 CMM을 비교하여 인증 수준을 평가하여 보시오.

     

    ISO9001에서는 간략한 요구사항만을 평가하지만 CMM은 매우 엄격한 평가 지침을 갖고 있다. ISO9001의 기업은 CMMI 레벨2를 대부분 만족하고있으며, 레벨3의 많은 부분을 축족시키지만 CMM의 모든 부분은 충족시키지는 못하기 때문에 때로는 레벨1 조직이 ISO9001 인증을 받기도한다. 레벨2또는 레벨3의 조직은 ISO 9001에 대부분 만족하나 CMM에 존재하지 않는 ISO 특성의 요구사항을 만족해아만 한다.

     

    F-5. 소프트웨어 형상관리(software configuration management) 질문

    (a). 소프트웨어의 형상을 정의하시오.

     

    소프트웨어의 개발유지보수 과정에서 발생하는 각종 결과(문서)에 대한

    계획, 개발, 운용 등을 종합하여 시스템의 형상을 만들고 이에 대한 변경

    체계적으로 관리 제어하기 위한 활동이다.

     

    (b) 형상항목을 설명하고 그 예를 드시오.

     

    원래 형상이란 사물의 형체나 생긴 모양을 의미한다.

    소프트웨어 개발 라이플 사이클 각 단계마다 만들어지는 문서를 포함한다.

    소프트웨어 형상 항목은 형상관리의 목표물이 된다.

    소프트웨어를 구성하는 소프트웨어 형상 항목에는 정의 단계의 문서,

    개발단계의 문서프로그램, 시험계획과 절차, 사용자 매뉴얼,유지보수 단계의 변경사항,

    표준 및 절차 등이 있다.

     

    (c) 문서의 Baseline 에 대하여 설명하시오.

     

    소프트웨어 개발의 특정 시점에서 형상 항목이 소프트웨어 개발에 하나의 완전한 산출물로써

    쓰여질 수 있는 상태의 집합을 말하며, 책임이 있는 관리를 통해 공식적으로 검토 및

    동의 되었고, 추후 개발의 기초가 되며, 오직 공식적인 변경 통제 절차에 의해서만

    변경될 수 있는 상태를 나타낸다.

     

    (d) 형상항목의 변경 과정에 대하여 Flowchart 를 이용하여 기술하시오.

     

     

     

     


    'Computer Science > 소프트웨어 공학' 카테고리의 다른 글

    Coverage domian과 Criterion  (0) 2014.04.14

    한국의 악성코드 변천사

     

    1986~1998

    Brain Virus

    DOS 바이러스 ~ Windows 바이러스

    예루살렘(1987), 미켄란젤로((1992)

    몽키 바이러스(1994), 매크로 바이러스(1995)

    단말 보안으로 충분, 기업 보안 요구

     

     

    1996~1997

     

    1996: 새로운 플랫폼으로 이동

    "Win95/Boza" 바이러스 공개

    • 오스트레일리아의 바이러스 제작 그룹인 "VLAD(Virus Laboratory And Distribution)"에서 제작
    • 최초의 윈도우 95 기반 바이러스

     

    최초의 엑셀 매크로 바이러스인 "XM/Laroux" 발견

    VLAD에서 최초의 윈도우 95 상주형 바이러스인 "Win95/Punch"발표

     

    1997: 리눅스 바이러스 등장

    2월 "Linux/Bliss" 바이러스 발견: 최초의 리눅스 바이러스

    3월 "WM/ShareFun" 바이러스 발견: 마이크로소프트사의 Word 6/7에서 감염되며 MS-Mail로 자신을 전송

    "Homer" 웝 발견: FPT(File Transfer Protocol)로 전파

    "Esperanto" 발견: DOS와 Windows, Mac OS에 감염, 실제로는 버그로 감염되지 않음

    매크로 바이러스 발견 2년 만에 1000개가 돌파

     

    많은 사람들이 리눅스 바이러스가 없다고 믿고 있는데, 그것은 사실이 아니다.

    안철수연구소 조시행 연구소장의 강연 말씀으로는 바이러스라는것은 만들려고하면 어느 플랫폼이서든지 만들어 질 수 있는것이다. 그것이 리눅스고 윈도우고는 상관 없는 것이다.

    컴퓨터좀 한다는 사람들도 이런 사실과 다른 정보를 믿고 있다고 한다.

     

     

    1998: 매크로, 윈도우 바이러스 극성

    • 한국에서 바이러스 제작 그룹인 'CVC(corean Virus Club)멤버들 검거
    • 다형성 윈도우 바이러스인 "Win95/HPS"와 'Win95/Marburg" 발견
    • 엑세스 매크로 바이러스 발견: 이후 여러 오피스 문서를 감염시키는 바이러스들 등장
    • "RedTeam" 바이러스 발견: 윈도우 실행파일을 감염시키고 유도라(Eudora)의 E-mail로 자신을 첨부
    • "Win95/CIH" 바이러스 발견: 6월 대만에서 발견되었고 이후 전 세계적으로 퍼짐, 1999년 4월 26일 CIH 대란 발생
    • 9월에 백오리피스 발표-> 원격 제어 트로이목마 대거 등장
    • 자바 실행 파일을 감염시키는 "java/StrangeBrew" 바이러스 등장
    • 연말엔 비주얼베이직 스크립트(Visual Basic Script)로 작성된 바이러스나 웜 등장-> 2000년에 대대적으로 확산
    • 최초의 파워포인트용 바이러스인 "PP97M/Vic" 바이러스 등장

     

    1999~2002

    CIH Virus (러시아 채르노빌 사건을 기념하기 위해서 제작한 Virus라고 한다.)

    보안위협의 패러다임 변화: 코드레드웜, 님다웜(2001), 안티바이러스와 네트워크 보안이 통합된 새로운 보안 솔루션 요구

     

    2003~2008

    1.25 인터넷 대란(슬래머웜)

     

    보안위협의 패러다임 변화

    • Adware/Spyware,
    • 금전적 이득 목적,
    • BotNet
    • 웹 해킹 등장
    • 트로이목마 등장,
    • 네트워크 관제 요구

    즉, 이제 본격적으로 금전을 갈취하기 위해서 시작된 해라고 볼 수 있다.

     

    2009~2010

    7.7 DDos, TDL3

    보안위협의 패러다임 변화

    • 해킹의 필수요소로 악성코드가 활용
    • 사회적 이슈를 노린 해킹 증가
    • 민, 관, 군 합동 공조 체계 및 컨트롤 타워 요구

     

    2011

    3.4 DDos

    APT(Advanced(지능형) Persistent(지속적인) Threat(위협)): 지능형 지속 위협은 기존의 단순한 외부침입 해킹 형태가 아닌 지능적으로 접근해 악성코드를 감염시키거나 내부 정보를 유출시키는 형태의 해킹 이다.

     

     

     

     

    악성 코드의 변천사

     

     

     

     

    앞으로 나올 Virus의 전망

    • 모바일, x64
    • 부트킷, 사회공학 기법

     

    APT 형태의 보안 위협 대응 방안

    사내 모든 파일의 움직임에 대한 '가시성' 확보와 '실시간 행위 분석'

    - 네트워크 관제와 내부 관제가 통합된 Convergence 관제 요구

    - 클라우드 기반의 보안 기술 연구

     

     

    소장님의 말에 의하면 대부분의 보안회사들이 해커들은 고용을 할 수도 있으나, 크래커나 바이러스 제작자들은 고용하지 않는다고 한다.

    그 이유는 실제로 보안기술과 바이러스 제작 기술은 많이 틀리며 그다지 도움이 되지 않는다고한다.

    설사 도움이 된다고 해도 일단 한번 윤리의식에 문제가 있는 사람은 채용하진 않는다.

    가장 큰 이유로 백신 프로그램은 완벽하지 않다. 따라서 모든 백신 프로그램에는 헛점이 있다. 이런 헛점은 한번 공개가 되면 맊이 어렵다. 따라서 윤리의식에 문제가 있는 사람은 보안 회사로서 그다지 큰 매력을 가지지 못한다는 것이다.

    따라서 영화에서 처럼 바이러스제작자가 보안회사에 거액의 스카웃 비용으로 고용되는 일들은 잘 잃어나지 않는다.

    국내외 시장변화 및 NHN의 개발 Practice    

     

    세계시장의 변화

    A.     스마트폰
    -
    전체 36%, 휴대폰 사용자중 44%
    - 2
    년 사이에 스마트폰 사용자의 변화=> 26% 사용자 증가

    빠른 속도록 변화하고 있음을 확인 할 수 있다.
    -
    미국 스마트폰 OS: 안드로이드
    44%, iOS 29%, Rim Blackberry 17%
    -
    스마트 폰을 통한 가장 많은 접속 사이트: 공통
    Google, facebook.
    -
    마켓 다운 로드 수 변화: 안드로이드 시장의 급성장. iOS은 제자리, 이외는 후퇴중

    B.      Cloud의 사용화
    -Cloud
    클라우드 컴퓨팅 회사에 사용한 만큼 가격을 지불하는 정책
    - Cloud
    서비스를 통해서 다양한 형태의 서비스가 제공 되고있다.(Iaas, Paas,SaaS)
    -
    개인의 99%, 전산센터의 95% idle상태이다
    .
    - facebook: 8
    억 사용자 3 5천 모바일 사용자, 하루 2 5천개 사진 업그레이드, 70개국어 이상 언어 지원

    한국 시장의 변화

    A.     인터넷 인구의 포화è 사용연령의 증가 진행
    스마트폰을 사용하는 인구 증가 è PC인터넷 대체, 인터넷 접근 확장

    B.   40대 이상 인터넷 이용자 급증: 전체 인터넷 이용자중 36% (즉, 이제는 더 이상 인터넷이 젊은 세대들의 전유물이 아니다.)

    C.  스마트폰의 PC와는 다른 인터넷 이용시간을 가지고 있다. 즉, Mobile은 이동성과 휴대성이라는 고유의 가치를 기반으로 인터넷 접근 범위를 확장시킴과 동시에, PC 인터넷 이용시간을 대체하는 현상을 나타낸다.

    □ Cloud Computing의 상용화

    • IaaS: infra as a service: hardware를 설치 할 필요없이 사용한 대로 계산하는 방식, 이용자는 단지 기타 software는 본인이 빅접 설치하여 사용한다.

    • PaaS: Platform as a service: hardware에서 부터 Dev tools까지 제공된다. 이용 회사는 Application만 개발하면 된다.

    • SaaS: Software as a service: Hardware에서 Application 제공

     

    NHN의 소프트웨어 품질 관리

    A.     기존 방식(폭포수 개발 방식의 문제점 발견)
    -
    문제점 해결(코드 완성도, 단계적 빌드 반복 점진 개발
    )
    -
    리펙토링(코드 이해도 증가)및 테스트 자동화 실행

    B.      생산 지원 인프라 BTS(Bug Tracking System): 빠른 피드백 가능
    BDS(Build & Deployment System),
    다양한 환경으로 릴리즈 빌드 및 배포 수행.
    마틴 파울러: 컴퓨터가 이해할 수 있는 코드는 어느 바보나 짤 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다.

     

    반복 점질 개발의 구성 요소

    • SVN: Source code control system
    • BTS: bug tracking test
    • Refactoring(리팩토링): 프로그램 전체 동작은 그대로 유지하면서, 프로그램의 논리적 구조만을 개선하는 것을 지칭한다.
    • 테스트 자동화: 대부분의 결함은 코드를 작성할 때 발생한다. 이러한 결함은 개발 시간이 지날수록 수정에 많은 비용을 발생 시킨다. 따라서 개발자가 코드를 작성할 때 부터 매번 스스로 결함을 검사하는 것이 바람직하다고 볼 수 있다. 이러한 매커니즘을 제공하기 위해서 나온 것이 테스트 자동화 이다.

     

     

     

     

    □ Quality Practice: 리팩토링 및 테스트 자동화

     

    • Coding Convention: 코드의 가독성 유지보수성 향상을 위해 코딩 표준을 준수하여 동일한 스타일로 코드를 작성해야함
    • Code Review: 주요 코드에 대해서는 코드 리뷰를 수행- 중요한 기능, 중요도가 높거나 복잡한 로직/알고리즘, 테스트가 어려운 예외처리부분, 신규 개발자가 작성한 코드, 기존에 장애 및 결함 발생이 빈번한 코드 등
    • Code Coverage: 작성한 코드의 완성도를 높이기 위해 개발자 테스트를 수행하고, 테스트가 충분한지 커버리즈 확인- 테스트는 측정 가능하며, 반복적으로 수행 가능해야함
    • Static Analysis: 정적분석 도구를 활용하여 테스트에 검출하기 어려운 잠재오류를 사전에 제거해야 함
    • Code complexity: 작성한 코드의 복잡도를 확인- 복잡한 코드는 리팩토링 필요한지, 테스트가 충분히 수행되었는지 커버리지 확인해야 함
    • Duplicate Analysis: [특히 래거시 코드의 가독성을 높이고 유지보수가 용이하도록] Copy & Paste로 인한 중복코드를 식벽하여 리팩토링 수행

     

    C.      오픈 소스의 사용 및 개발
    -
    운영비 절감, 사회적 기여

     

    '공학실무' 카테고리의 다른 글

    한국의 악성 코드 변천사  (0) 2012.06.10
    특허의 중요성 및 IT분야 주요 특허 분쟁 사례  (0) 2012.06.10
    게놈 프로젝트  (0) 2012.06.10
    프로젝트 매니지먼트  (0) 2012.06.10

     

    □ 특허의 중요성 및 IT분야 주요 특허 분쟁 사례

     

    특허법 제1조 [특허의 목적]

    : 발명을 보호 장려하고, 그 이용을 도모함으로써 기술발전을 촉진하여 산업발전에 이바지함

     

     

    국지 주의란: 특허를 등록받은 국가에 한해 제한적으로 효력 발생.

    반드시 해당 국가에 특허 출원을 해야한다.(미국, 유럽, 일본, 중국 등)

     

    국제 출원의 종류

    파리조약에 의한 국제출원

    • 보호 받고자하는 국가에 개별적으로 직접출원
    • 국내출원일로 부터 1년이내에 우선권 주장 출원

     

    PCT 국제 출원

    • 국제협력조약(PCT)에 가입한 국가 간에 적용
    • 국제사무국(WIPO)에 출원하고, 국제공개 후 30개월 이내에 지정국에 개별 출원.

     

     

     

     

     

     

     

     

     

     

    □ 특허권의 발생

    특허 요건(신규성, 진보성 등)에 대한 흠결 여부를 판단, 등록 결정에 의해 특허권(독점/베타적 권리)이 발생

     

    • 특허 받은 국가에서 업으로서 실시(제조,판매,사용,대여,수입)할 권리를 20년간 독점
    • 제 3자가 특허권자의 허락 없이 권리를 실시할 경우, 경고 후 민사상 조치 (ex: 손해 배상구권, 침해금지청구권(생산중지, 압류 등) 고의냐 과실이냐 그런거 구분 안한다.
    • 형사상 침해죄 성립(7년 이하의 징역 또는 1억 이하의 벌금, 친고죄)
    • 실시할 권리를 특허권자로부터 허락(통상실시권, 전용실시권): 라이센싱 후 로열티 지불

     

    □ 특허 분쟁 발생 및 대응 전략

    대응전략 수립

     

    좋은 결과

    • 무효 소송
    • 회피설계
    • 크로스라이센스

    힘든 결과

    • 생산포기
    • 손해배상(로열티 지급)
    • 특허권 매입

     

    □ 사례 분석

    CDMA: 퀄컴

    GSM: 인터디지탈(특허 괴물)

    LTE: 관련특허 5,300 여건 중 인터디지털 780건(1위), 삼성전자 679건(2위), 퀄컴 625건(3위)

     

     

    특허 풀(Pool): 특허권자들이 자신들의 특허를 공동 라이센싱을 목적으로 결상한 단체(MPEG LA, 3G3P, LLC 등)

    특허권자들을 대신하여 특허권자 간에 사용계약(cross-licensing), 제3자에 대한 특허사용계약, 특허료징수 및 배분

     

     

    표준특허: MPEG, 3GPP, 3GPP2 등의 표준 규격을 기술적으로 구현하는 과정에서 필수적으로 실시되는 특허

    "표준을 지배하는 자가 세상을 지배한다." = Winner Takes All

     

    디자인 보호법: 물품의 외간 디자인을 보호하여 디자인 창작을 장려하고 산업 발전을 도모, 창작된 디자인 보호가 아니라 디자인이 적용된 물품을 보호, 존속기간은 20년

     

    FRAND 원칙 (Fair, Reasonable & Non-Discriminatory)

    • 특허권자의 독점 및 권리남용 방지 규정: 표준특허 기술에 적용
    • 특허가 없는 업체가 표준특허로 우선 제품을 만든 다음 나중에 특허사용료를 낼 수 있는 권리
    • 표준특허권자가 무리한 요구로 경쟁사의 제품 생산이나 시장 진입을 방해하는 것을 막기 위한, 일종의 약자 보호제도

     

    관련 도서

    No Patent No Future

    특허색약

     

    '공학실무' 카테고리의 다른 글

    한국의 악성 코드 변천사  (0) 2012.06.10
    국내외 시장변화 및 NHN의 개발 Practice  (0) 2012.06.10
    게놈 프로젝트  (0) 2012.06.10
    프로젝트 매니지먼트  (0) 2012.06.10

     

    게놈 정보, 미래의학, IT융합

     

    Facts on The Human Genome Project

     

    • period : 1990~2003
    • cost : 3 billion dollars (30억 달러 = 약 3조 이상)

     

     

    What is Omics ?

    omics : 어떤 대상을 모두 모아서 연구하는 학문

    유래 : 'ome' = mass 'ics' = study

    모든 component들을 동시에 measure하는 방법이 필요하다.

    • High throughput technologies
    • Nanotechnologies(NT) are important contributors
    • Made posiible by the technology breakthrough during the last decade (microarrays, next-generation sequencing, etc)

     

    이러한 Omics에서 우리가 필요한것은 방대한 data를 어떻게 분석하냐하는 것이다.

    이를 위해서 2개의 학문이 결합했다.
    • Informatics technologies(IT): 즉 Information Technology
    • BT: Biotechnology
    • Bioinformatics = BT(Biotechnology) + IT(Information Technology) 

    Bioinformatics 정의: 복잡한 생물학적 실험과정, 단순하지 않은 대용량의 바이오 데이터를 다루는 학문이다. 

    즉, Bioinformatics 이것은 The key to the future biotechnology 될 것이다(Bill Gates).

     

     

     

    Systems Biology: 생명 현상을 시스템 차원에서 이해하고 조절하고자 하는 것.

    즉, 고장난 Radio를 단순히 시스템 차원에서 이해하는 수준으로도 고칠 수 있는 것인지에 대한 연구

     

     

    2개의 Technologies를 이용해서 21세기형 환자 맞춤형 의학이 도래했다. 이러한 기술이 없으면 Bioinformatics 학문은 발전할 수 없다. 왜냐하면 Massive data를 분석 할 수 없기 때문이다. 결정적으로 아래의 2 Technologies가 발절 했기 때문에 현실에서 Bioinformatics 학문이 꽃을 피울 수 있는 것이다.

    • sequencing: DNA 염기서열 정보의 해독, 즉 genome sequencing의 핵심은 개인차 및 민족적 특성을 파악하거나 유전자 이상과 이상과 관련된 질환에서 염색체 이상을 포함한 선천성 원인의 규명과 당뇨병, 고혈압과 같은 복합질병의 유전자 결함을 찾기 위한 것이다.
    • microarrays: Genome-wide expression profiling at mRNA level 즉, 모든 유전자의 활동을 mRNA 수준에서 한꺼번에 측정 한다.

     

     

    Applications of Microarray Techniques

    • Clustering
    • 유전자의 미지기능 예측
    • 분자적 진단: 질병의 상세분류, 조기 진단, 예후 예측

     

     

    □ Personal Genome 시대의 도래

    차세대 Sequencing(NGS)의 도래로 sequencing기술이 비약적으로 성장 하였다.

    따라서 Personal Genome의 시대가 도래 하게 되었다.

    2014년에는 100달러로 5분 내에 자신의 Genome을 분석할 수 있을 것이다.

     

    Entertainment Genomics: Genom을 사업으로 확장한 사례다.

     

     

     

    □ Data Analysis Challenges

     

    Disk Capacity와 Genome Data를 비교해보면 Genome Data가 급격하게 늘어 남으로써 더 이상 Disk가 수용하지 못하는 상황이 발생 되었다.

    따라서 cacer(암)과 같이 매우 다양한 Data를 분석하기 위해선

    Computer Cloud 시스템이 필요하다.

     

     

     

    프로젝트 매니지먼트

     

    내용

    PM Overview

    PM Framework

    Scheduling

    Communication Management

    Risk Management

    Lessons Learned

     

     

    □ PM Overview

     

    프로젝트란? : 고유 제품, 서비스 또는 결과물을 창출하기 위해 한시적으로 투입하는 노력이다.

     

    프로젝트의 3대 특징

     

    Temporary(한시적)

    Unique(독창적)

    Progressive Elaboration(점진적 구체화)

     

     

    프로젝트 매니지먼트란?: 프로젝트 관리란 프로젝트 요구사항을 충족시키기 위해 지식, 기술, 도구, 기법 등을 프로젝트 활동에 적용 하는 것이다.

     

     

    프로젝트와 & 상품의 Lifecycle?

    1. 아이디어 도출( 각팀으로 부터 아이디어가 도출 된다.)

    2. 개발 단계 (이 단계에서 Project가 생성 된다.)

    3. Launch ( 이 단게에서 product가 생성 된다.)

     

    정리하면 :  Ideas -> projects -> products

     

     

    Project Management Standards?

    1. Project management Institute: 1969년 실립, 매년 25%씩 성장, 330,000맴버(2009년기준)
    2. Project managment Professionals(PMP): 매년 25% 성장
    3. ANSI/PMI 99-001-2004: 프로젝트 메니지먼트에대한 가이드 지식을 담고 있다. 이것은 IEEE에 프로젝트 메니지먼트 표준으로 받아들여 졌다.

     

    자격증 : PMP(Project management Professionals) Certified가 있다.

     

     

    □ PM Framework

     

    Proejct Managment Insitute에서 발행한 책이 있다 그것이 바로 PMBOK Guide (3 Edtion)이다.

    이책에는 일반적으로 어떻게해야 좋은 프로젝트 관리가 되는지에 대한 설명이 있다.

    Generally recognized: 즉 정해신 시간내에 목표가치와 유용성을 달성하는 적용 가능한 방법을 기술하고 있는 것이다.

    Good practice: 일반적으로 프로젝트 메니지먼트 도구를 다루는 방법에 대해서 설명하고 있다. 하지만 이런 도구들이 모든 프로젝트에 대해서 같은 방식으로 모두 다 사용할 수 있는 것은 아니다. 

     

    결국, 이 가이드 북을 통해서 공통된 프로젝트 메니지먼트 기법을 전파 하려는게 핵심 의도인 것이다.

     

    PM Knowlege Areas

     

    Integration, Scope, Time, Cost, Quality, Human Resource, Communications, Risk, Procurement

     

    시험에 나올 확률적기 때문에 PMBOK Guide (3 Edtion)책에 있는 상세한 내용은 생략 한다.

    각자 ppt를 참조한다.

     

    □ Scheduling

     

    Porject Charter: 프로젝트 착수와 인적, 물적자원에 대한 자금지원을 공식화한 문서이다.

    WBS: work breakedown structure: 각 작업을 최소단위로 쪼개서 작업의 리스트를 관리하는 기법이다.

    Network Diagram: 프로젝트가 가지는 각 엑티비티에 대한 논리적인 관계를 나타낸다.

     

     

    프로젝트 스케쥴링에 사용되는 유용한 용어

    Critical Path

    프로젝트 일정에서 가장 긴 경로를 말한다. 이것에 의해서 전체 프로젝트 기간이 결정 되어 진다.

     

    Crashing

    최소 원가 투입으로 최대 기간을 단축하는 기법을 말한다.

    즉, 일정을 분석 할때 어떻게 해서든지 프로젝트의 전체 일정을 단축 시켜야 한다는 것이다.

    그러기 위해서는 각 일정상의 활동들에 대해서 압축을 단행 해야한다.

    또한 이러한 작업을 효율적으로 하기 위해서는 Critical Path를 명확히 파악해서 Critical한 활동들 부터 압축하는 것이 올바르다고 할 수 있다.

     

    Fast Tracking

    이것 또한 일정을 압축하기 위한 특별한 기술 이다.

    즉, Network logic을 이용해서 어떤 작업이 중첩되어 있을 경우 그것을 해소 시키거나,

    각 활동들의 종속성을 분석해서 병렬로 처리할 수 있는것은 병렬로 처리 한다.

     

     

    □ Communication Management

     

    1. Commnucications Planning: requirements, Type of information, Responsiblility, Method, Frequency, Escalation
    2. Information Distribution: Reporting, Updates, Minutes, Project Documents, Lessons learned, etc
    3. Performance Reporting: Bar chart, Project server, Milesone preorts, Earned value, S-curves
    4. Manage Stakeholders: Objective clarification, Resolved issues, Change management, etc

     

    International Project communication을 위해서는 아래의 수칙을 지켜주는 것이 좋다.

     

    1. Ground rule: set up conf. call. invitation
    2. Cultures: Who brings up issues?
    3. Relationships: Building vs Task Execution
    4. Laws
    5. Political Environment

     

     

    Benefits of Project Server on Web. : 즉 Web을 통해서 Porejct 사항을 관리하면 관리자, 팀 맴버 모두에게 이익이 된다는 의미이다. (ppt에 자세한 porfit가 정리되어 있다.)

     

    □ Risk Management

     

    Risk : 예상치 못한 이벤트나 사황을 가리킨다. 만약 이러한 것들이 발생한다면,

    그것은 프로젝트의 목표에 극정적 혹은 부정적인 영향을 미친다.

     

    즉 위기 = 위험 + 기회

     

    Risk Management의 절차

    1) Risk management Planning

    2) Risk Idnetification

    3) Qualitative Risk Analysys (리스크의 성질을 분석 하는 것이다.)

    가능성, 임팩트 등을 분석 한다.

     

    4) Quantitative Risk Analsys (리크스의 양을 분석 하는 작업이다.)

    Risk간의 관계성을 파악하기 위해서 분포와 모델링을 이용한다.

     

    5) Risk Reposne Planning

    6) Risk Monitoring and Contorol

     

     

    □ Lessons Learned

     

    프로젝트를 수행하면서 배움을 얻는다는 뜻이다.

     

    Lessons learned라는 것은 결국 프로젝트들을 수행한것을 기록함으로서 배움을 얻는다는 것이다. 이것들은 Lessons Learned Knowledge base에 결국 들어가 쌓이게 된다.

     

    Lessons Learned Knowledge Base : 이전 프로젝트 선정 과정의 의사결정과 이전 프로젝트의 성과, 두가지 모두에 관한 선례 정보와 교휸이 들어 있는 저장소.

     

    그러닌까 이전 프로젝트를 통해 어떤 문제를 들을 극복 했을 것이다. 이러한 극복 사례들을 모아 놓은 것을 말한다.

     

     

     

    이책의 저자 지승룡 사장의 민들레 영토라는 1세대 국내 프란치즈 카페의 성공 스토리를 담고 있는 책이다.

     

    저자의 목회자라는 특이한 타이틀 때문인지 더욱더 새롭게 느껴지는 책이다.

     

    참고로 필자의 종교는 무교이며, 공학도로서 매우 공대틱한 마인드를 가진 사람이다. 따라서 신앙적 배경을 가졌기 때문에 이책을 좋게보는것은 전혀 아니다.

     

    컴퓨터공학 석사과정으로써 뼈속까지 0과1의 컴퓨터의 마인드로 무장된 사람이다.

     

     

    1장: 가장 안좋을 때가 가장 좋을 때이다.

     

    이혼 경력 때문에 목회자의 길을 포기하고, 도서관에 짱박혀서 3년동안 2천권의 책과 매일 조선,중앙,동아 신문을 읽은 그는 자신이 정말 하고싶언던 일인 차가운 대도시에 따듯한 문화공간을 설립할 자금 마련을 위해 장사를 시작한다.

     

    보통 장사를 처음시작하면 시련을 겪기 마련인데, 아무래도 신문을 통해 현재 시점에서 필요한것이 무엇인지를 아는 눈과 목회활동을 통해서 다져진 인간관계의 능력, 또한 수많은 경영, 경제, 창업 지침서를 토대로한 이론적 배경으로 성공 스토리를 이어간다.

     

    그 첫번째가 바로

     

    강남 고급 아파트에서의 가래떡 장사이다.

    강남 고급 주부들의 마음을 사로잡는 추억의 가래떡

     

    성공 요인 1: 바로 방아간에서 뽑아온 신선도와 추억의 가래떡을 자극한다.

    성공 요인 2: 복장을 정장으로해서 믿음이 가는 인상을 준다.

    성공 요인 3: 최대한 깔끔하게 처리해서 경비원들에게 적대감을 주지않는다.

    성공 요인 4: 입지선점이 최고로 중요한대, 아무도 생각하지 못한 강남 고급 아파트에서의 저가 아이템인 가래떡 판매. 이러한 역발상적 사고가 가장 핵심적인 성공 요인이 아닌가 싶다.

     

    즉, 역발상도 중요하지만, 그 역발상의 원초적인 장애물인 고급스러움의 부족을 정장과, 가래떡의 신석도를 통해서 해결 했다는 점을 나는 높이 산다.

     

    또한 그가 가지고 있었던 목회자로서의 사람을 대하는 태도에서 일반 잡상인과 다른 높은 신뢰성을 줬다고 나는 본다. 연세대를 나올 정도의 고학력에 목회자로서의 신뢰감 , 2천권 이상의 독서량과, 신문 탐독량 이런 모든 인성이 결합되서 강한 신뢰감이 더해진것 같다.

     

    아무리 가래떡이 신선해보이고, 정장을 입었다고해도 사람이 그냥 평범한 잡상인이었다면, 절대로 고급 아파트 경비원들이나, 강남 아주머니들에게 신뢰감을 형성하지 못했을 것이다.

    결국 그는 자신의 강점역량을 최대한 활용해서 아무도 들어오지 못했던 강남 고급아파트를 뚤었던 것이다.

     

    즉, 오고 싶어도 거긴 장사를 못한다. 일반 잡상인의 퀄리티로는 결국 그만이 할 수 있었던 장사의 입지였던 것이다. 따라서 이것을 일반 잡상인들이 시도하기에는 무리가 있다.

     

     

     

    두 번째 사업 아이템은 의류였다.

     

    성공 요인 1: 신물을 통해 정확히 의류회사들이 비시즌기 옷들에 대해서 골머리를 썩고 있다는 것을 파악한다.

    성공 요인 2: 완벽한 거래조건을 성립한다. 즉 아래의 이야기다.

     

    재고품을 공급 받아 판매되는 물건에 대해서만 결제를 하고 팔리지 않는 물건은 반품을 하는 조건

     

    그래서 결국 6개월 만에 2천만원을 벌었다.

     

    여기서 주의점

     

    절대로 이게 쉬운일이아니다.

     

    우선은  의류회사가서 말로 저런 거래조건을 얻어내는것이 가장 중요하다.

    장사는 분명 초보이다. 최소한 1달은 해야 옷장사 언변을 획득할 수 있다.

    그런대 저런 조건을 못해버리면 그 1달동안 손해가나고 결국 실패한다.

     

    이 성공의 핵심은 옷장사 연습 기간에 대한 보험을 스스로 의류 공급업체와의 협상을 통해서 얻어 냈다는 점이다. 그게 없으면 불가능하다.

     

    또한 목회자의 언변이 가장 중요하다. 장사는 아무나 쉽게 하는게 아니다.

     

    책에서는 그냥 훅 2천만원 번것처럼 나오지만, 괜히 잘못 따라하면 훅간다. 그러니 독자들은 이부분에대해서 비판적인 사고로 볼 필요성이 있다.

     

    그리고 책에 잠깐 나오지만.

     

    밤낮없이 뛰었다. <-- 이 구절 이게 가장 중요하다.

    신화는 없다. 이명박 자서전에 나오듯이 신화같은건 없다. 오로지 현실에서의 처절함과 남보다 2~3배의 노력만이 있을 뿐이다. 이사람이 6개월간 2천만원 번것은 물론 책에서말하는 또한 내가 분석한 성공 요인의 도움이 있다. 하지만 저 위의 말 "밤낮없이 뛰었다." 이게 가장 중요하다.

    그리고 밤낮없이 뛰기 위해서 Motivation이 가장 중요한대.

     

    최소한 나이 30대 후반에 실패를 정말 제대로하고, 사회로부터 배척받고, 직업 훅 잃고,

    연세대까지 나온 고학력자에, 도서관에서 3년간 혼자 지내면서 우울한 마음 극복하고

    책 한 2천권 읽어서 마인드 개혁좀하고, 신문을 3년동안 조중동 정독 3시간씩하고

    친구 80명한테 돈빌려 달라고 부탁했는데 전부다 거절당해서 10원도 못받고,

    카페에서 차마시다가 30분만에 쪼껴 나봐야~ 아.. 세상 XX같구나 하면서 밤낮없이 뛸 수 있는 것이다.

     

    이 몸에서부터 엄청난 분노와 성공애대한 강한 at most motivation이 generation 되어서

    밤낮없이 뛰었다. <-- 이게된다. 이게 그냥 문학적 표현으로 밤낮없이 뛴게 아니라. 진짜 아마 밤낮없이 뛰엇을 것이다.

     

    혹시라도 이 책읽고 그냥 이런 신화가 있구나 나도 해봐야지 하지 말기를.. 신화 그런건 없다. 오로지 지독하고 처절한 현실만이 있을 뿐이다.

     

     

     

    부동산 중개소 -> 억대

    포기하지않고 직접 알아본다.

     

    그리고 최적의 장소를 찾는다.

    그리고 게속 설득한다.

     

    책을 읽은것이 도움이 된다. 그곳에 창업을 하려면은

    건축대장과 등기부등본을 확인하라는 내용이 나왔기 때문이다.

     

    결국 무허가 건물이므로 그것을 피해야함을 안다.

    하지만 더 깍아버리고 장사를 시작하기로 마음 먹는다.

     

    결국, 1500만원에 70만원을 제안하고 그것을 받아 드리게 한다.

     

     

    여기서 핵심은 책의 지혜와 말빨의 결합이다. 그리고 역시나 신뢰감을 형성했다는 점을 높이 사야 한다.

    그리고 부동산 중개소나 주변 의 시세에 굴하지않고 3개월간 꾸준히 노력한 결과이다.

     

    무허가 장소라서 음식을 팔 수 없는 한계

     

    보통사람: 그냥 법규를 무시하고 음식을 판다. 결국은 걸려서 낭패를 본다.

     

    성공한사람: 어떻게든 다른 방식으로 수익모델을 창출한다. 이사람은 문화비라는 새로운 개념을 창설한다. 이것을 통해서 자연스럽게 다른 카페와의 차별성이 성립하게 되며, 관련 법규의 한계성 또한 극복한다.

     

    그리고 이사람의 목화자적 태도로 인해 구청 직원에게 많은 협력을 받으며, 중요한 자판기를 통해 음료수를 파는 아이디어도 제안 받게 된다.

     

    교수님이 하시는 말씀: 항상 실험결과에 문제가 발생 했을 때 조작을 해버리는 유혹을 받는다. 또는 쉬운 꼼수 스러운 방법을 도입하려한다. 하지만 그것은 단기적으로는 논문 기한에 맞추어 성공하는 것 처럼 보이지만, 결국에는 더 크고 새로운 발견을 스스로 포기하는 길이라고 하셨다.

    결국 여기서 나오는 이야기도 어렵지만 그길이 정당하기에 노력해서 찾았기에 그것이 성공을 가져다 준것은 아닐까....

     

    교훈 : 문제가 닥쳤을 때 비하거나 꼼수를 쓰거나 불법을 저지르지말고... 힘들지만 어떻게는 방법을 찾아내라.. 그 시간에 대한 보상은 반드시 온다.

     

     

     

     

     

    저자의시련 리스트

     

    가게 임대문제

    인테리어 문제 : 3년 정독 정독한 화가들의 책들 덕분이다. 여기서 핵심은 정독을 했다는 것이 중요 하다.

    가게 사라질 문제

     

    자칫 다양하고 번잡스러운 서비스가 될 수 있지만, 카페라는 특색도 없어지고,

    마치 주로 판매할 음식이 없어서 이것저것 찔러 보는 그런 형태의 판매가 이루워 질 수 있지만,

    사장은 집중적으로 하나의 메뉴 마다 집중 했기 때문에 그것이 성공 했던것 같다. 이 점이 가장 중요 하다.

     

     

     

     

    민들레 영토 만의 특별함을 주기위해서

    저자는 고객 스스로 주인공이 되고 싶어하는 감성을 자극 했다.

    즉, 카네기 인간관계론에 나오듯이 사람은 누구나 자기존재감을 실현 하기 위해서 살아간다는 말 처럼 나 자신을 특별히 귀히 여겨주는 장소에 반드시 끌리게 된다.

    이러한 운영 전략이 고객들로 하여금 그 카페를 특별하게 보도록 만드는 것은 아닐까?

     

     

    4장: 먼저 직원에게 서비스 하라.

     

    죽을만큼 서비스 하라. !

     

    2끼는 컵라면 2개

    하루에 2~3시간 잠

    말을 수도없이만이 한다.

    100명을 2명이서 커버한다.

    링거 맞으면서도 일을한다.

     

    그러나 이 길은 내가 택한 길이었다. 어쨋든 내가 필요한 곳이 있다는게 다행이었다.

     

    이러한 생활을 할 수 있는 원천적인 힘은 아무리 생각해봐도 저자가 겪었던 엄청난 실패의 세월이 그를 지지하는것 같다. 그 시절의 고뇌하며 보낸 도서관에서의 3년의 세월 그동안 그는 그토록 자신을 필요로하는 공간을 찾기 위해 그렇게도 울부 짖었나 보다.. 그렇지 않고서는 이토록 모질개 살 수는 없다.

     

     

    " 그래, 죽을 각오로 서비스하자.!  "

     

    직원 교육,

     

    나는 도우미들에게 손님을 감동 시키라고 말하기 전에, 내가 먼저 도우미들을 감동시켜 주기로 마음먹었다.

    저자는 직원들이 서비스에 충실하도록 하기 위한 방법을 숙지하고있다.

    그것은 임금이다. 경영타산을 위해 모든 비용을 낮추는것에 고심할 수 있지만, 결코 건드려서는 안될것이 직원들의 급료이다.

     

    직원들은 항상 타 업종대비, 그것이 안된다면 상대적으로라도 높은 급여를 주도록 해야한다. 그렇지않으면 어떤 노력을 하더라도 사상누각이다. 아무리 교육시키고 말을 해봐야 직원들은 자신의 일에 자부심을 가지지 않는다.

     

    동종 업계대비 최고의 급여는 직원들로 하여금 자부심을 느끼게하고 그 자부심으 곳 서비스로 이어진다는 것이다. 성공한 기업들은 모두다 이러한 원칙을 가지고있다.

     

    MS의 창업주 빌게이츠는 공식성상에서 이런말을 한적이 있다. 내가 세상에서 가장 두뤄아하는 일은 우리 MS 직원에게 급여를 주지 못하는 일이다. 나는 그래서 10조이상의 돈을 항상 은행에 보관하고있다. 이 금액의 양은 우리 MS 직원들에게 1년간 지급할 수 있는 봉급의 양이다.

    위기가 닥쳤을때 급여가 줄어들거나 끈킨다면 그 기업은 절대로 위기를 해처나갈수 없다. 급여야말로 기업에서 가장 중요한 요소이다.

     

    안철수시도 가장 두려워하는 것이 직원들에게 월급을 주는 것이라고 했다.

     

     

    직원들의 가족들과 유대감을 가져라.

    사소한것이지만 직원들로 하여금 자신의 일과 직장에대한 자긍심을 가지게 하는 것이 가장 중요하다. 스스로 직장에 대한 자긍심이 없다면, 애정이없고 애정이없다면 결코 진심으로 고객에게 서비스 할 수 없기 때문이다.

     

    대기업에 처음 입사를 하면 부모님에게 케익이 배달된다. 훌륭한 자제를 우리회사에 보내주셔서 감사하다는 인사를 드리기 위해서이다. 이것부터 중소기업가 차이가 나는 것이다.

     

    민들레 영토는 이러한 원리를 그대로 실천 하고 있다. 어버이날 부모님들을 자신의 일터인 카페로 초대해서 식사와 차를 대접하게 하는 것이다.

     

     

     

    대접 받고 싶으면 먼저 대접하라.

     

    군대에서 처럼 부하직원이 알아서 따라주는 그런것은 Follow-ship이라고 할 수 있다. 리더는 사람 위에 군림한는게 아니라 사람들이 마음으로 믿고 따르는 것이다.

     

    리더십은 조직이 한 방향으로 갈 수 있도록 지원하고 격려하는 것이다. 리더는 명령하는 사람이 아니라 같이 행동하고 모범을 보이는 사람이다.

     

    지승룡 사장의 생각은

     

    먼저 자신이 직원에게 서비스를 하면 직원은 손님에게 마음에서 우러나오는 서비스를 할 것이고 결국 이러한 선순환 관계에 의해서 결국 자신이 이익을 얻는 구조라고 생각한다.

     

    리더란 나를 따르라고 요구하지 않고, 다른 사람들이 알아서 다르게 만드는 사람이다. 리더는 계급이나 직책이 높은 사람이 아니라, 따르는 자가 결정하는 존재이다.

     

    이렁말이 있지 않은가. 진정한 친구를 찾으려 한다면 단 한명의 친구도 찾지 못할 것이다. 하지만 내가 진정한 친구가 대려고 한다면 진정한 친구가 될 수 있다.

     

     

     

     

    5장 : 하루를 두 번 사는 디지털 전략

     

    Chapter 9. Process Address Space

     

    As seen in the previous chapter( this is 8)

     

    a kernel function gets dyanamic memory in a fairly straightforward manner by invoking one of a variety of functions

     

    • Get_free_pages() or alloc_ages(): To get pages from the zoned page frame allocator(buddy system algorithm 
    • kmem_cache_alloc() or kmalloc(): To use the slab allocator for specialized or general-purpose objects
    • vmalloc() or vmalloc_32(): To get a noncontiguous memory area
    •  

     

    이제 위 함수들을 이용해서 request가 정상적으로 처리가 된다면

    각각의 함수들은 page descriptor address 또는 linear address를 return 한다.

    이러한 반환되는 주소들을 이용해서 allocated dynamic memory area의 beginning을 identifying 할 수 있다.

     

    위와 같은 simple approache들은 2개의 reason이 있다.

     

    1) 커널은 운영체제에서 우선순위가 가장 높은 구성 요소이다. 커널 함수가 동적 메모리를 요청 하려면 반드시 정당한 이유가 있는 것이고, 이러한 요청을 더는 뒤로 미룰 수없다.

     

    2) 커널은 자신을 신뢰한다. 모든 커널 함수는 오류가 없다고 가정하기 때문에 프로그래밍 오류로부터 보호할 필요가 없다.

     

    When allocating memory to User Mode rpocesses, the situation in entirely different :

     

    1) 프로세스꺼는 최대한 연기된다.

    2) 사용자 프로그램은 cannot be trusted 이다. 따라서 kernel은 must be prepared to catch all addressing erros caused 해야 한다.

     

     

    이장에서는 커널이 새로운 종류의 자원을 이용하여 프로세스에 동적 메모리를 할당하는 일을 연기할 수 있게 한다.

    사용자 모드 프로세스가 동적 메모리를 요청하면 커널은 페이지 프레임을 추가로 할당해 주지 않고, 선형 주소의 새로운 범위를 사용할 수 있는 권할을 주는데, 이 범위는 프로세스 주소 공간의 일부가 된다.

     

    이장에서 다루는 내용

     

    • 프로세스가 동적 메모리를 어떻게 바라보는지 관점에 대해서 설명한다.
    • 전체 메무리 구역에서 볼때 프로세스 주소 공간이 어떤 기본 구성 요소로 이루워저 있는지를 본다.
    • 프로세스에 페이지 프레임을 할당하는 일을 미룰 때 페이지 폴트 예외 핸들러의 역할을 살펴 본다.
    • 커널이 모든 프로세스 주소 공간을 만들고 삭제하는 방법을 설명 한다.
    • 주소 공간을 관리하는 API와 System call을 설명 한다.

    User Mode의 Process가 동적 메모리를 요청하면 커널은 페이지 프레임을 추가로 할당해주지 않고, Linear address의 new range를 주게 된다. 이 범위는 프로세스 주소 공간의 일부가 된다.

    이러한 구간을 가리켜 Memory Region이라고 한다.

     

    즉, page frame들을 allocating하는 대신에 일단 range만 잡아주는 꼴이 된다.

     

    9.1 The Process's Address Space

     

    프로세스 address space는 프로세스가 사용할 수 있는 모든 linear address로 구성 된다.

    이 주소공간은 서로 배타적이므로, 프로세스 끼리 절대로 관련성이 없다.

     

    커널은 선형 주소 구간을 추가하거나 삭제하여 프로세스의 주소 공간을 동적으로 변경 할 수 있다.

     

    커널은 프로세스가 현재 소유하는 메모리 구역을 반드시 파악하고 있어야 한다. 왜나하면 페이지 폴트에 대해서 핸들링을 해줘야 하기 때문이다.

     

    Lenth of a memory region : The initial address and the lenth of a memroy region must be multipes of 4,096Byte

     

     

    9.2 The Memory Descriptor

     

    프로세스 주소 공간과 관련한 모든 정보는 "Memory Descriptor"라는 객체에 들어 있다.

    이 Object는 mm_struct type이고, Process Descriptor의 mm filed를 가리킨다.

     

    When to Get New Memory Regions

     

    1. 새로운 프로세스 생성

    2. exec 시스템 콜로 다른 프로그램을 load 한다.

    3. mmap() system call을 이용해서 "memory mapping"을 한다.  mmap() : 파일에 대한 메모리 mapping을 만들어 process address space를 enlarging 한다. 잘은 모르겠지만, 뭔가 딴거를 일단 process address space로 맵핑 시켜 버리는것 같다. 그래서 process의 주소를 키우는것 같다.

    4. Process의 User Mode stack 사이즈를 키운다.

    5. IPC를 위해 shared memory region을 생성 한다.

    6. heap 그러닌까, process's dyanamic area를 expand 한다. malloc을 이용해서

     

     

     

    Porcess Descriptor로 접근하는 방법은 위 그림과 같다.

    즉 task_struct의 mm필드로 가서 그 포인터가 지시하는 mm_struct를 가면

    memory descriptor의 정보를 알 수 있다.

     

    The Memory Descriptor

     

    pgd: 페이지 전역 디렉터리를 가리키는 포인터

     

    rss: 프로세스에 할당되어진 페이지 프레임의 수, 이것을 조사해보면 main memory가 얼마나 사용 되고 있는지를 알 수 있다.

     

    total_vm: 프로세스 주소 공간의 크기(페이지의 수)

     

    mmlist: 메모리 디스크립터 리스트에서 인접하는 항목을 가리키는 포인터

     

    start_code / end_code: 실행 코드의 시작 주소와 끝 주소

     

    brk: heap의 현재 끝 주소

     

    mm_users: 2차 사용 횟수 라고 나와있는데 자세히 설명 하면, LightWeight process가 몇게가 mm_struct를 공유하고 있는지 그 숫자를 의미 하게 된다.

     

    mm_count: 1차 사용 횟수

    즉 이것의 의미는, 메모리 디스크립터의 1차 사용 횟수로 mm_users에 있는 모든 '사용자를 즉 Light-Weight process의 사용을 mm_count에서는 한 단위로 카운트 한다.

    Kernel은 mm_count 필드를 감소킬 때마다 이 값이 0이 되는지 검사하여, 0이되면 더는 사용ㅎ지 않는 것이므로 메모리 디스크립터를 해지 한다.

     

    예를 들어 설명,

     

    LWP 1

    LWP 2

    위 2개의 프로세스가 mm_struct를 공유한다.

    따라서 mm_users = 2, mm_conunt =1이다.

     

    이떄 mm_struct를 kernel thread에게 빌려준다. 그러면 mm_count가 2로 증가한다.

    이때 LWP1,2가 모두 종료되어도 mmcount는 1만 감소해서 1이 남기 때문에 mm_struct를 유지하게 된다.

    물론 try_to_unuse() 함수를 이용해서 mm_count를 증가시켜도 동일한 결과를 얻는다.

     

     

    Memory Regions 

     

    리눅스 vm_area_struct 타임의 객체를 이용하여 메모리 구역(memory region)을 구현한다.

     

    각각의 memory region descriptor는 linear address 구간을 identifiy할 수 있도록 한다.

    이 strcut의 filed로는 다음의 것들이 있다.

    vm_start: start adress

    vm_end: end address

    vm_mm : 해당 구역을 소유하는 메모리 디스크립터를 가리키는 포인터

    프로세스의 mm_struct 즉, 프로세스가 가지고 있는 memory descriptor를 포인팅 한다.

     

    프로세스들은 결고 서로의 memory region을 overlap하지 않는다.

     

     

     

    위 그림에서 볼 수 있듯이, 새로운 선형 주소 범위를 프로세스의 주소 공간에 추가할 때 커널은 기존의 메모리 구역을 확장할 수 있는지 검사한다. (a 경우) 가능하다면 확장을 한다.

     

    그렇지 않으면 b의 경우 처럼 새로운 메모리 구역을 생성 한다. (b의 경우)

     

    마찬가지로 프로세스의 주소 공간에서 선형 주소 범위를 제거할 때 커널은 이에 영향을 받는 메모리 구역의 크기를 조정한다. (c의 경우)

     

    어떤 경우에는 크기를 조정할 때 한 메모리 구역이 작은 구역 두개로 나뉘기도 한다. (d의 경우)

     

     

     

     

     

     

    Memory Region Data Structures

     

    위 그림은 프로세스의 address space와 memory desscriptor, memory region list 사이의 관계를 보여 준다.

     

    커널이 자주 하는 일 중 하나는 특정 선형 주소를 포함하는 메모리 구역을 찾는 것이다. 리스트는 정렬 되어 있으므로 메모리 구역의 끝이 지정한 선형 주소 이후에 있는 구역을 찾는 즉시 검색을 종료 한다.

     

     

    이러한 리스트 구조는 일반적인 상황에서는 큰 문제가 없지만,

     

    객체지향 데이터베이스, malloc() 사용과 관련된 특수한 디버거처럼 수백 내지 수천 구역을 소유하는 큰 응용 프로그램에서는 메모리 구역 리스트를 관리하는 것은 매우 비효율 적이고, 메모리와 관련한 시스템 콜의 성능은 참을 수 없을 만큼 떨어 진다.

     

    그래서 리눅스 2.6은 Red_Black Tree라는 자료구조에 Memory descriptor를 저장 한다.

    여기서 Node는 보통 left child와 Right child이라는 두 child를 가진다.

     

    Read Black tree는 다음과 같은 네가지 규칙을 준수 한다.

     

    1) 모든 노드는 빨강이나 검정 중 하나이다.

    2) 트리의 Root는 검정이다.

    3) Read node의 child는 black이다.

    4) 어떤 Node에서 Leaf에 이르는 모든 길에는 같은 수의 black node가 있어야 한다. The number of black node를 셀 때 NULL pointer도 balck node로 계산 한다.

     

    Theses four rules ensure that every red0black tree with n internal nodes has a height of at most

     

     

    따라서 트리에서 필요한 Node를 찾는 시간은 트리 크기에 로그를 취한 값에 그대로 비례하기 때문에 매우 효율적이다.

     

     

    Memory Descirptor 즉 mm_struct의 필드에는

    mmap 필드가 있다. 이는 연결 리스트의 head를 포인팅 하게 된다. 모든 Memory region object는 list에서의 다음 object를 포인팅하기 위한 vm_next 필드를 가지고 있다.

     

    mm_struct에는 또한 mm_rb 필드가 있다. 이것은 red_back tree의 root를 가리킨다. 모든 memory region object는 rb_node type의 vm_rb 필드에 node의 color와 함께 parent와 left child, right cild에 대한 pointer를 store한다.

     

    일반적으로 특정 주소를 포함하는 구역을 찾을 때는 red-black tree를 사용하고, 전체 구역을 검색할 때 연결 리스트가 유용 하다.

     

     

    Memory Region versus pages

     

     

     

    Page: a set of linear addresses and the data contained in the set of linear addresses

    e.g ) the page 0 : linear address interval ranging between 0 and 4095

     

    Memory region: consists of a set of pages having consecutive page numbers(of linear addresses)

     

     

     

    Memory Region Handling

     

    do_mmap() : allocates(enlarge) a linear address interval, After a successful allocation, the memory region could be merged with other memory regions defined for the process.

     

    do_munmap(): Delete a linear address interval from the address space of the current process, the intervall to be deleted does not usually correspond to a memory region

     

    find_vma(): 지정한 주소에 가장 가까운 구역 찾기

     

    find_vma_interseciton() : 지정한 구간과 겹치는 메모리 구역 찾기

     

    get_unmapped_area() : 빈 주소 구간 찾기

     

    insert_vm_struct() : 메모리 디스크립터 리스트에 구역 삽입

     

     

    Page Falut Exception Handler

     

    이것의 원인 2가지이다.

    프로그래밍 오류

    프로세스 주소 공간에 들어 있지만 아직 할당하지 않은 페이지를 참조해서 발생

     

    do_page_fault()

    page fault interrupt service routine

    compares the linear address that caused the page fault against the memory regions of the current process.

     

     

     

     

    Page Fault Exception handler

     

    bad_area:

    do_page_fault()함수가 실행 된다.

    process address space에 들어있지 않으면 발생 한다.

    사용자 모드에서 에러가 발생하면 current process에 SIGSEGV signal을 보낸다.

     

     

    good_area:

     

    do_page _falut()는 address가 프로세스의 주소 공간에 속하면 good_area 라벨에 있는 문장 부터 실행 한다.

    쓰기 접근 때문에 예외가 발생하였다면 메모리 구역 쓰기 가능인지 검사한다. 쓰기가 가능하지 않으면 bad_area 코드로 점프하고, 쓰기가 가능하면 지역 변수 write를 1로 설정한다.

     

    Demand paging

     

    이것은 가능한 마지막 순간까지, 즉 프로세스가 램에 존재하지 않는 페이지 주소로 접근하여 페이지 폴트 예외가 발생하는 순간까지 페이지 프레임 할당을 연기하는 동적 메모리 할당 기법이다.

     

     

    Copy on Write

     

    페이지 프레임을 복사하는 대신에 부모 프로세스와 자식 프로세스 사이에 페이지 프레임을 공유하는 것이다.

    그러나 공유하는 동안은 페이지 프레임의 내용을 바꿀 수 없다.

     

     

    Process address Space의 Creating과 Deleting

     

    clone() , fork(), vfork()

     

     

     

    Managing the Heap

     

    memory descirptor의 start_brk와 brk 필드가 각각 힙의 시작과 끝주소를 저장 한다.

     

    다음 API는 프로세스가 동적 메모리를 요청하고 해지할 때 사용 한다.

     

    malloc(size): 동적 메모리를 size바이트만큼 요청한다. 성공적으로 할당하면 시작 메모리 위치의 선형 주소를 반환 한다.

     

    calloc(n, size) ; 크기가 size인 요소 n개로 구성된 배열을 요청 한다.

     

    realloc

     

    free

     

    brk(addr): 직접 힙의 크기를 변경한다. addr 매개 변수는 current->mm->brk의 새로운 값을 지정하며, 결과 값은 메모리 구역의 새로운 끝 주소이다.(프로세스는 요청한 addr 값과 결과 값이 일치하는지 검사해야 한다.)

     

    sbrk(incr): brk()와 비슷하지만 매개 변수 incr로 지정한 바이트만큼 힙의 크기를 늘리거나 줄인다는 차이가 있다.

     

     

     

     

     

     

     

    'Computer Science > Linux Kernel' 카테고리의 다른 글

    2장 메모리 주소 지정  (0) 2012.06.07
    8장 메모리 관리  (1) 2012.06.07

     

    가장 일반적인 아키텍쳐인 80x86에서의 메모리 주소 체계를 다루도록 한다.

     

    □ 메모리 주소

     

    80x86에서는 다음과 같은 3가지 주소로 구별 된다.

     

    1) 논리 주소 : 인텔의 세그먼트 구조를 체계화 한것이다.

     

    2) 선형 주소(Linear address = Virtual address) : unsigned int 주소로 즉 32bit로 4GB, 즉 메모리 셀 4,294,967,296개 까지의 주소를 지정 할 수 있다. 선형 주소(Virtual Address)는 보통 16진수로 표기한다. 0x00000000 ~ 0xFFFFFFFF

     

    3) 물리 주소 : 메모리 칩에 들어 있는 메모리 셀을 지정하는 데 사용하는 주소이다.

     

     

     

    위 그림이 설명한 3개의 주소가 하드웨어 장치 Sementation unit과 paging unit을 이용해서 최종적으로 Physical address로 변환되는 과정을 그림으로 나타낸 것이다.

     

     

    ※ Memory arbiter

     

    멀티 프로세서나 유니프로세서와 DMA간의 동시 메모리 접근을 맊기위한 중간에 중재를 해주는 장치이다. 이것은 하드웨어적으로 동작하기 때문에 프로그래밍 관점에서는 보이지 않는다. 

     

    □ 하드웨어 세그멘테이션 

     

    인텔은 286이상부터 Real ModeProtected Mode라는 서로 다른 두 가지의 방법으로 주소 변환을 하기 시작 하였다.

     

    보호모드에서 주소 변환이 발생한다.

    리얼 모드는 운영체제가 부팅할 수 있도록 하기 위함과 호환성을 위해서 남겨둔 것이다.

     

    2.2.1. Segment Selectors and Segmentation Registers

     

    논리 주소는 두 부분으로 나뉘어 진다.

     

    1) Segment Selector : 16bit

    2) offset : 32bit

     

    위 그림이 Segment selector를 나타낸다.

     

     

    Segmentation Register : 프로세서가 세그먼트 셀렉터를 빨리 읽기위한 목적으로 사용된다. 즉 세그먼트 셀렉터를 담는 목적인 것이다.

     

    여기에는 cs, ss, ds, es, fs, gs가 있다.

    위 중에서 3개는 특별한 용도가 있다.

     

    cs ( code segment register ) : 프로그램 명령어를 담고 있는 세그먼트를 가리킨다. 추가로 CPU의 현재 특권 수준(CPL, Current Privilege Level)을 나타내는 2비트의 필드가 있다.

     

    ss (stack segment register) : 현재 프로그램의 스택을 담고 있는 세그먼트를 가리킨다.

     

    ds (data segment register) : 정적인 데이터와 전역 데이터를 담고 있는 세그먼트를 가리킨다.

     

     

    Ring 0는 가장 높은 특권 수준을 Ring 3은 가장 낮은 수준을 나타낸다.

    여기서 리눅스는 0과 3만을 사용하게 된다. 이것들은 각각 커널 모드(Kernel Mode)와 사용자 모드(User Mode)로 불리운다.

     

     

    2.2.2 Segment Descriptors 세그먼트 디스크립터

     

    세그먼트의 특징을 기술하는 8바이트 크기의 '세그먼트 디스크립터로 각 세그먼트를 표현 한다.

     

    세그먼트 디스크립터는

     

    Global Descriptor Table = GDT 또는

    Local Descriptor Table = LDT에 저장 된다.

     

    보통 GDT는 단 하나만 정의한다.

     

    2.2.3 Fast Access to Segment Descriptors

     

    앞서 논리 주소는 16비트 크기의 Segment Selectors와 32비트 크기의 offset으로 구성된다.

     

    근대, 여기서 Segment Register에는 Segment Selector만 저장된다고 언급 하였다.

     

    80x86 프로세서는 논리 주소를 선형 주소로 빠르게 변환하기 위하여 아래의 레지스터들을 제공한다.

     

    프로그래밍이 가능한 레지스터 6개: cs, ss, ds, es, fs, gs

    프로그래밍이 불가능한 레지스터(Nonprogrammable)

     

     

     

     

    □ 리눅스에서의 세그멘테이션

     

    세그멘테이션과 페이징이라는 개념은 둘 다 프로세스의 물리 주소 공간을 나누기 위한 개념이므로 중복되는 것이 다소 있다.

     

    세그멘테이션 : 각 프로세스에 다른 선형 주소 공간을 할당 한다.

    페이징 : 똑같은 선형 주소 공간을 다른 물리 주소 공간과 매핑 시킨다.

     

    리눅스에서는 다음과 같은 이유로 세그멘테이션을 제한적으로 사용하며, 페이징을 널리 사용 한다.

     

    1) 모든 프로세스가 동일한 세그먼트 레지스터 값을 가지면, 즉 모든 프로세스가 동일한 선형 주소 공간을 공유하면 메모리 관리가 더 간단해 진다.

     

    2) 리눅스 설계의 목적 중 하나는 대중적인 다른 아키텍처와 호환하게 하는 것인데, RISC 아키텍처에서는 세그멘테이션을 매우 제한적으로 지원 한다.

     

    따라서 리눅스 2.6 버전에서는 80x86 아키텍처가 필요로 하는 경우에만 세그멘테이션을 사용 한다.

     

     

     

     

     

    'Computer Science > Linux Kernel' 카테고리의 다른 글

    9장 프로세스 주소 공간  (0) 2012.06.08
    8장 메모리 관리  (1) 2012.06.07

    2장에서 다룬 물리적 메모리를 논리적 주소매핑으로 관리하는 방법을 배웠다.

     

    이제 램의 남은 부분은 동적 메모리라고 부른다.

     

    이 동적 메모리는 프로세스 뿐만 아니라 커널 자신도 필요로 하는 소중한 자원이다.

     

    모든 멀티태스킹 운영체제는 동적 메모리 사용을 최적화하고 필요할 때만 할당하고, 최대한 빠르게 처리하려고 한다.

     

    [그림 8 -1] 동적 메모리

     

    위 그림은 동적 메모리로 사용된 페이지 프레임을 그림으로 보여준다.

     

    이 장에서의 핵심은 다음 3가지이다.

    커널 자신이 어떻게 동적 메모리를 어떻게 할당하는지 설명

    • 메모리 영역 관리 (연속된 메모리 여역, 불연속적인 메모리 영역)
    • 메모리 지역, 커널 매핑, 버디 시스템, 슬랩 캐시, 메모리 풀

    페이지 프레임 관리

     

    프로세서가 페이지 프레임의 크기로 4KB와 4MB라는 서로 다른 두 크기를 사용하는 방법을 살펴 보았다.

    페이지로 관리하면 장점은

    1) 프로세서 차원에서 페이지 펄트를 지원할 수 있다.

    2) 4K 4M중 작은 쪽이 디스크와 메모리사이의 데이터 전송에 유리 하다.

     

    페이지 디스크립터

     

    의미 : 커널이 각 페이지 프레임의 현재 상태를 알아야 하기 때문에 필요하 자료 구조이다.

     

    페이지 디스크립터에 있는 필드 중 2개가 중요하다.

    1) _count : 해당 페이지의 사용 참조 횟수이다.

    2)  flags : 페이지 프레임의 상태를 기술하는 플래그이다. 이것은 최대 32개 까지 포함하는 배열이다.

     

    불균등 메모리 접근 (Non-Uniform Memory

     

     

    □ 메모리 지역

     

    이상적인 컴퓨터 구조에서 페이지 프레임은 어떤 용도로 사용할 수 있는 메모리 저장 단위이다.

    하지만 실제로는 그렇지 않다.

     

    특히 80x86 아키텍쳐에서는 두가지 하드웨어 제약이 있다.

     

    1) ISA 버스용 직접 메모리 접근(DMA, Direct Memory Access) 프로세서는 램의 처음 16MB만 접근 할 수 있다는 강한 제한이 있다.

     

    2) 많은 램을 가지는 최근 32비트 컴퓨터에서는 선형 주로 공간이 너무 작아서 CPU가 모든 물리 메모리를 직접 접근할 수 없다.

     

    이러한 제한을 해결하기 위해서 리눅스 2.6에서는 모든 메모리 노드의 물리 메모리를 세 가지 Zone으로 나눈다.

     

    1) ZONE_DMA : 16MB 아래의 메모리 페이지를 포함한다.

    2) ZONE_NORMAL : 16MB 부터 896MB 까지의 메모리 페이지를 포함한다.

    3) ZONE_HIGHMEM : 896MB 이상의 메모리 페이지를 포함한다.

     

    ZONE_DMAZONE_NORMAL 지역은 커널이 선형 주소 공간의 마지막 1GB로 선형 매핑하여 직접 접근할 수 있는 일반 페이지 프레임을 포함한다.

     

    각 메모리 지역은 자신만의 디스크립터들을 가진다.

    이러한 디스크립터의 많은 필드들은 페이지 프레임 회수를 위해서 사용되어진다.(자세한것은 17장에서 설명 된다.)

     

    □ 예약된 페이지 프레임 풀

     

    메모리 할당 요청은 두 가지 방식으로 충족 될 수 있다.

     

    1) 여유 메모리가 충분한 경우 즉시 충족

    2) 메모리를 해지하고 할당하는 경우

     

    하지만 문제는 2번째 경우인데, 커널같은 경우 실행되어질 때 페이지가 할당될 수 없다고해서 메모리를 해지할 때까지 대기타는 그런 작업을 할 수가 없다. 왜냐하면 원자성을 충족 시켜야 하기 때문이다. 기다리거나 하는 그런 굼뜬(?) 작업을 하면 문제가 심각해 진다.

    따라서 그냥 에러를 반환해버려서 최대한 빨리 처리해 버린다.

     

    따라서 이러한 사태를 원천적으로 맊을 수는 없지만, 그나마 최소화 하기 위해서 커널은 페이지 프레임들의 Pool을 만들어 놓는다. 즉 미리 땡겨서 예약해 놓는다는 말이다.

     

    이러한 미리 땡겨(?)쓰는 양은 min_free_kbytes 변수에 저장 된다.

    이양은 커널 초기화 과정에서 설정되며, 물리 선형 주소의 마지막인 1G 이후에도 메모리가 얼마만큼 있는지에 따라서 가변적으로 결정된다.

     

     

    하지만 초기 min_free_kbytes는 128에서 65,536 범위의 값이어야 하다.

    (예약된 메모리의 양은 관리자가 /proc/sys/vm/min_free_kbytes 파일을 수정하거나 sysctl() 시스템 콜을 발생 시킴으로써 바꿀 수 있다.

     

    □ The Zoned page Frame Allocator

     

    Zoned Page Frame Allocator : 연속적인 페이지 프레임 그룹을 위해 메모리 할당 요청을 처리하는 커널 서브 시스템

     

    위 구송요소를 보면 이해가 안된다. 당연하다 다음에 설명할 3가지 요소가 있다는 것만 기억하자.

     

    1) 지역 할당자

    2) 버디 시스템

    3) CPU 별 페이지 프레임

     

    □ Kernel Mappings of High-Memory Page Frames

     

    결국 PAE(물리 주소 확장은) 프로세서의 핀 수를 36개로 늘려서 64GB까지 가질 수 있게 지원하지만,

    상위 메모리를 매핑 할 수 있는 선형 주소 공간은 128MB이다.

    1GB - 896MB = (1024 - 896)MB = 128MB

    커널은 상위 메모리에 페이지 프레임을 매핑 시키기 위해 세가지 다른 메커니즘을 사용한다.

     

    리눅스는 모든 RAM 영역의 접근을 아래의 방법들로 가능하게 한다. 즉 32bit 주소 체계가 표현할 수 있는 4GB 이상의 메모리 영역에 대해서 처리하는 방법을 다룬다는 것이다.

     

    1) 무조건 alloc_pages() 또는 alloc_page()를 통해서 4G이상의 상위 메모리 페이지 프레임을 할당 할 수 있다. 단, 선형주소가 없기 때문에 페이지 프레임의 선형 주소를 반환하지는 않는다. 그 대신에 그 페이지 프레임의 페이지 디스크립터의 선형 주소를 반환한다.

    이 페이지 디스크립터의 선형주소는 커널 초기화 과정에 이루어 지는 것으로 무조건 선형 주소가 존재하게 된다.

     

    2) 커널은 선형 주소를 가지지 않는 상위 메모리 내 페이지 프레임을 접근할 수 없다.

    그래서 커널 선형 주소 공간의 남는 부분은 128MB 부분을 상위 메모리 페이지 프레임을 매핑하기 위한 전용으로 사용 한다. 즉 이렇게 128mb로 돌려서 쓰는것이다. 따라서 동시에 동시에 상위 메모리에 접근 하는 것에 대해서 허용하지 않는다.

     

    세부적으로 나누면 아래와 같이 3가지 방법이 있다.

    하지만 결국 어느것도 동시에 64GB의 최대 램 영역을 동시에 접근할 만큼의 충분한 주소를 제공하지 못한다. 결국은 선형 주소공간의 남은양 128MB를가지고 이 4-64=60GB를 맵핑 하는 것이기 때문이다.

     

    1) Permanent Kenrel Mapping : 영구 커널 매핑

    2) Temporary Kernel Mapping : 임시 커널 매핑

    3) Noncontiguous Memory Allocation : 불연속적인 메모리 할당

     

     

    Permanent Kenrel Mapping : 영구 커널 매핑

    이것을 사용할 경우 현재 프로세스는 블럭 되어 질 수도 있다. 4G이상의 메모리 영역을 접근 할때 여유 페이지 테이블 엔트리가 없을 때 일어날 수 있다.

    따라서 인터럽트 핸들러나, 커널 쪽의 실행에서 이 방법을 쓸 수가 없다. 왜냐하면 블럭되면 안되기 때문이다.

     

    Temporary Kernel Mapping : 임시 커널 매핑

    이 방법의 장점은 절대로 블럭되어 지지 않는다는 것이다.

    단점은 매우 적은 수의 임시 커널 매핑만 동시에 할 수 있다는 점이다.

    이때는 반드시 다른 커널 제어 흐름이 이 방식을 사용하지 못하도록 해야 한다. 그래야 블럭이 되지 않기 때문이다.

     

    Buddy System Algorithm 버디 시스템 알고리즘

     

    External Fragmentation : 다른 크기의 연속적인 페이지 프레임 그룹을 빈번하게 할당하고 해지하여, 할당한 페이지 프레임 블록 사이에 작은 여유 페이지 프레임 여러 개가 '산재'하는 현상이다. 그 결과 나중에는 큰 크기의 연속된 페이지 프레임 할당을 요청할 때 이를 담을 충분한 여유 페이지가 있어도 메모리를 할당하지 못할 수도 있다.

     

    리눅스는 이러한 External Fragmentation을 해결하기 위해서

    그 유명한 Buddy System을 사용 한다.

    Buddy를 사용하는 이유는 다음과 같다.

    • 실제로 연속된 페이지 프레임이 필요한 경우가 종종 있기 때문이다. 전형적으로 DMA의 경우
    • 가급적이면 연속된 페이지 프레임을 사용하자. 이러면 페이지 테이블을 덜 자주 수정하게 된다. 자주 수정하면 메모리 엑세스 타임이 늘어나고 느려지게 된다.

     

    이 버디 시스테은 사용하지 않는 모든 페이지 프레임을 그룹별로 묶어서 블록 리스트 11개에 넣는다.

    각 리스트는 연속된 페이지 프레임 1,2,4,8,16,32,64,128,256,512,1024개로 구성된 그룹을 담는다.

     

     

    이제 간단한 예를 통해서 버디 시스템이 어떻게 동작하는지를 이해 해보자.

    누군가 연속된 페이지 프레임 256개로 구성된 그룹 즉 1MB를 요청 하였다고 하자.

    버디 알고리즘은 일단 256-페이지 프레임 리스트에 여유 블록이 있는지 검사한다.

    여유 블록이 없으면 다음으로 큰 블록 즉 512 페이지 프레임 리스트에서 여유 블록을 찾는다.

    페이지 프레임 512개 중에서 256개를 요청한 쪽으로 할당하고, 나머지 페이지 프레임 256개를 여유 256 페이지 프레임 블록 리스트에 추가한다.

     

    여유 512 페이지 블록이 없다면 다음으로 큰 블록, 즉 1,024 페이지 프레임에서 블록을 찾는다.

     

    여기에서 블록을 찾으면 ㅍ페이지 프레임 1,024개 중 256개를 요청한 쪽으로 할당하고, 나머지 768개 중 마지막 512개를 여유 512-페이지 프레임 블록 리스트에 남은 페이지 프레임 256개를 여유 256-페이지 프레임 블록 리스트에 넣는다. 1,024 페이지 프레임 블록 리스트가 텅 비어 있다면 할당을 포기를 하고 에러 상황을 알려 준다.

     

    그리고 버디 알고리즘에서 페이지를 통합하는 방법은 아래의 알고리즘을 따른다.

    1) 두 블록의 크기가 같다.

    2) 두 블록이 연속된 물리적 주소에 우치한다.

    3) 첫 번째 블록의 첫 번째 페이지 프레임의 물리 주소는 2 * b * 2^12의 배수 이다.

    정리하면

    Allocation = split

    Free = merge

     

     

     

     

    위에 말로 설명하는 것을 그림으로 변경하면 위와 같다.

     

     

    Buddy System : Data Structures

     

    커널 2.6에서의 버디 시스템은 각 zone에 따라 다르게 사용된다.

     

    각 버디 시스템은 다음과 같은 핵심 자료구조를 사용 한다.

    •  zone_mem_map, spanned_pages(size)fields of zone descriptor, Pointer to first page dscriptor of the zone and zone's size in pages , zone_mem_map points somewhere in the mem_map shich is the aaray to store all the page dscriptors.
    • An array having 11elements (one for each group size) of type free_area(see zone dscriptor in Table 8-4)

     

     

     

    The Per-CPU page Frame Cache

     

    당연히 커널은 페이지 프레임을 request하고 releases하는 작업을 매우 빈번히 발생 시킬것이다.

    이것에 대한 속도를 빠르게 처리하기 위해서 CPU당 페이지 프레임 캐쉬를 둔다.

     

    이 Cache는 2가지로 나뉘어 진다.

     

    hot cache

    CPU 하드웨어 캐시에 포함되어 있을 가능성이 높은 페이지 프레임을 저장하는 Cache

     

    커널 모드나 사용자 모드의 프로세스가 페이지 프레임을 할당한 후 바로 쓰기 작업을 한다면 핫 캐시에서 페이지 프레임을 얻는 것이 시스템 능률 면에서 이익이다. 보통 페이지 프레임의 하나의 메모리 셀에 접근하는 것은 다른 페이지 프레임이 사용하는 하드웨어 캐시 라인 하나를 훔치는 것이다. 하지만 하드웨어 캐시에 방금 해지시킨 핫 페이지 프레임의 셀과 매핑되었던 라인이 남아 있다면 훔치지 않아도 된다.

     

    cold cache

    페이지 프레임이 DMA 작업으로 채워진다면 콜드 캐시에서 페이지 프레임을 얻는 것이 편리하다. 이런 경우 CPU는 개입하지 않고 하드웨어 캐시의 라인도 전혀 수정되지 않는다. 콜드 캐시에서 페이지 프레임을 얻는 것은 나머지 다른 종류의 메모리 할당 요청을 위해 핫 페이지 프레임 하드웨어 캐시에 남아 있도록 한다.

     

     

    hot cache:

    page frame들을 저장 하고 있다.  이 page frame의 내용은 CPU가 가지는 하드웨어 캐쉬안에 포함되어지는 내용 이다.

    좋은 성능 가진다. 커널이나 유저모드 프로세스에서 쓰기작업을 할것이라면 allocation 이후에 page 프레임에 대해서

     

     

    cold cache:

    이것도 역시 page frame을 저장하는 것인데, 이 페이지프레임의 내용은 디스크에서의 내용이다. 이것은 CPU 캐쉬의 내용이 아니다.

    DMA 명령어를 가지고 페이지 프레임을 채울려고 할때 매우 편리하다.

     

     

    The Zone Allocator

     

     

    Zone Allocator는 커널 페이지 프레임 할당자의 시작 단계이다.

    일단 여유 페이지 프레임 수가 많은 메모리 Zone을 찾아야 하는데 이게 참 어렵다.

    그 이유는 아래와 같다.

     

    • Protect the pool of reserved page frames: 예약된 페이지 풀을 보호 해야한다. 왜냐하면 커널 같은대서 페이지가 부족하다고 회수알고리즘 가동시키고 이렇게할 블락킹의 여유 시간이 없기 때문에 이런 예약 페이지 풀들은 보호되어져야 한다.
    • Trigger the page frame reclaiming alogrithm when memory is scarce: 메모리가 모자랄때 회수 알고리즘을 발생 시켜야 한다.
    • Preserve the small, precious ZONE_DMA memory zone: 페이지 프레임을 ZONE_DMA에 할당하는것을 원치 않는다. 만약 ZONE_NOMAL과 ZONE_HIGHMEM에 할당 요청을 했다면

     

    Memory Area Management

     

    버디 시스템 알고리즘은 페이지 프레임을 기본 메모리 영역으로 채택한다.

    단점 : 상대적으로 큰 메모리 요청을 다룰 때는 좋지만 몇 십 바이트나 몇 백 바이트 처럼 작은 메모리 영역은 처리하기 어렵다.

     

    즉 내부 단편화 문제가 발생되는 것이다.

     

    이를 해결하기위해 고전 리눅스에서는 기하학적인 방법을 사용하는데

    그것은 2의 거듭제곱으로 미리 페이지를 만들어놓고 그것을 사용하는 것이다. 이럴경우 내부 단편화 비율이 최대 50%를 넘지 않는다고 한다.

     

    How to allocate small memory area within a page frame.

    Linux 2.0 - providing memory areas whoes sizes are geometrically distributed(power of 2) : at most 50% internal fragmentation

     

    Linux 2.2 applied "slab allocator" scheme

     

     

    The Slab Allocator

     

    이것의 전제

    • 자료의 타입에 따라 메모리 영역의 할당 방법이 다를 수 있다.
    • 커널 함수는 같은 유형의 메모리 여역을 반복해서 요청하는 경햠이 있다. 이때 매우 효율 적이다.
    • 메모리 영역 요청을 크기별로 나우어서 빈도를 측정 할 수 있다. 자주 발생 할것 같은 특정 크기에 대한 요청은 크기가 동일한 특수 목적의 객체 집단을 만들어 가장 효율적으로 처리함과 동시에 내부 단편화 문제도 피할 수 있다. 반면 드물게 나오는 크기는 비록 내부 단편화를 일으킬 수 있지만 기하학적으로 분포된 크기인 일련의 객체에 기반한 할당 정책을 통해 처리할 수 있다.

    결국 하는말은

    빈번하게 발생되는 영역 즉, Process Descriptor와 open file object 같은것들은 생성과 소멸이 매우 빈번한대 이런거 처리할 때 slab allocator는 빠르게 처리한다.

     

    객체를 만들어서 관리하는데, 이때 Slab allocator는 이러한 객체들은 절대로 discard 하지 않기 때문에 reinitialized 하는 overhead를 초래하지 않는다.

    classified 한 요청은 결국 frequency를 가진다. 따라서 high grequency는 미리 만들어서 to avoid internal fragmentation하고, rarely used object는 power of 2 size 정책을 이용해서 할당한다.(2.0 방식 이용)

     

     

     

     

    Slab Allocator는 Object를 모아서 Cache로 만든다.

    이러한 Each cache들은 동일한 Type object의 Store이다.

     

    e.g : 파일을 열면 해당 열린 파일 객체(Open Object)를 저장하는 데 필요한 메모리 영역을 filp(File Pointer)라는 슬랩 할당자 캐시에서 가져온다.

     

    메인 메모리 공간은 결국 이 슬랩에 의해서 나뉘어 지는 것이다.

    각각의 슬랩은 결국 하나 또는 그이상의 연속적인 페이지 프레임들로 구성된다. 그리고 이 프레임들은 alocated거나 free object들 이다.

     

    커널은 주기적으로 캐쉬를 스캔한다. 그리고 해지된 페이지 프래미은 empty slab들과 일치한다.

    kmem_freepage()를 딱 실행하면 모든 사용된 연속적인 페이지 프레임들이 리턴된다 슬랩에 의해서 그리고 이건 버디 시스템으로 간다.

     

     

    Slab descriptor 저장할 수 있는 장소는 두가지이다.

    Internal slab descriptor : storead inside the slab, at the beginning of the first page frame of the slab 슬랩 내부에 슬랩에 할당한 첫 번째 페이지 프레임의 시작 부분에 저장 한다.

    슬랩 할당자는 객체의 크기가 512바이트 보다 작거나 내부 단편화에 의해 슬랩 내에 슬랩 디스크립터와 뒤에서 설명할 객체 디스크립터를 담을 충분한 공간이 있으면 후자의 방법을 선택한다.

     

    External slab descriptor : stored outside the slab in one of the general caches

     

     

     

     

     

    8.2.5 Interfacing the Slab Allocator with the Zoned Page Frame Allocator

     

    Slab alocator는 zoned page frame allocator를 사용한다. 즉, Slab alocator가 new slab을 만들 때는 zoned page frame allocator를 사용하여 free contiguous page를 획득 한다.

     

    새로 생성한 cache는 아무런 slab도 포함하지 않으므로 free object들을 포함하지 않는다.

     

    Allocating a Slab to a cache only when

    1) new object를 할당하라는 요청이 있을 때 그리고

    2) cache에 free object가 더이상 없을 때 이다.

     

    slab allocator는 new slab을 cache로 할당한다. cache_grow()를 써서

     

     

    Cache에서 Slab 해지 하기

     

    Slab cache에 너무 많은 free object들이 있을 경우

    fully unused slabs의 경우 released 한다.

     

    slab_destory() 함수를 이용 한다. 

     

     

    Object Descriptor

     

     

    Slab Object Descriptor도 위 그림 처럼 두가지 방법으로 저장 할 수 있다.

     

    각 객체는 kmem_bufctl_t라는  type 정보에 대한 짧은 디스크립터를 포함한다.

    Object Descriptor를 해당하는 Slab Descirptor 뒤에 있는 array에 저장한다.

     

    1) External object descriptor

    Slab 외부에 Cache Desciptor의 slabp_cache가 가리키는 일반 캐시에 저장한다. 따라서 메모리 영역의 크기는 Slab에 저장하는 객체의 수에 따라 달라진다.

     

    2) Internal object descriptor

    Slab 내부에 객체 디스크립터가 기술하는 객체 바로 앞에 저장 한다.

     

     

     

    Aligning Objects in Memory

     

    마이크로 컴퓨터에스는 메모리를 셀단위로 접근해서 좀더 빠르게 처리 한다.

    이를 위해 align을 word size로 하게 된다. 4byte의 크기이다.

     

    slab allocator에 의해서 boject들은 관리 된다. aligned된 메모리에서

    물리주소는 다양한 constant이다. 즉 alignment factor에 따라 다르다.

    이 alignment factor artificially하게 increasing한다면 object size가 커지고 따라서 better cache performance를 가지게 된다.

     

    그러나 at the cost of some internal fragmentation.

     

    Slab Coloring

     

    Slab Coloring: Slab에 Color이라는 서로 다른 임의의 값을 할당하는 것을 말한다. 이것을 통해 비 효율적인 Cache 동작을 줄인다.

     

    The same hardware chache line maps many different blocks of RAM.

     

    같은 하드웨어 캐시 라인은 램의 서로 다른 여러 블록을 매핑 한다고 배웠으며, 크기가 동일한 객체를 캐시에서 동일한 오프셋에 저장하게 된다는 사실도 살펴 보았다. 다른 슬랩에서 동일한 오프셋에 있는 객체는 결국 같은 캐시라인으로 매핑될 가능성이 상대적으로 매우 높다.

    따라서 캐시 하드웨어는 램의 서로 다른 위치에 존재하는 두 객체를 같은 캐시 라인으로 번갈아 가져오면서 메모리 사이클을 낭비하고, 다른 캐시 라인을 조금밖에 사용하지 않을 수도 있다.

    슬랩 할당자는 이런 비효율적인 캐시 동작을 Slab Coloring이라는 정책으로 줄이려 한다.

     

     

     

    Slab allocator는 사용하지 않는 free 바이트를 사용하여 Slab에 컬러를 부여한다. 컬러라는 용어는 단순히 슬랩을 세분화하고 메모리 할당자가 객체를 다른 선형 주소 사이에 퍼뜨릴 수 있도록 사용 한다.

    이렇게 해서 커널은 마이크로프로세서의 하드웨어 캐시 성능을 가능한 최대화 한다.

     

     

     

    General Purpose Objects 범용 객체

     

    앞서 "버디 시스템 알고리즘:"에서 설명 했듯이 드물게 일어나는 메모리 영역 요청은 객체의 크기가 최소 32부터 최대 131,072 Byte까지 geometrically destributed 되어 있는 일반 Cache grop을 통해서 처리 한다.

     

    위와 같은 종류의 Object는 kmalloc() 함수를 호출해서 얻으며, 함수는 다음 코드와 같다.

    해지는 kfree()를 통해서 한다.

     

     

    Memory Pools

     

    메모리 풀(Memory Poll)은 리눅스 2.6의 새로운 특징이다.

    기본적으로 메모리 풀은 메모리가 부족한 긴급 상황에서 커널의 구성 요소가(블록 디바이스 파일 시스템 같은) 동적 메모리를 어느 정도 할당할 수 있게 한다.

     

    reserved page frame과는 다른 내용이다. 이전에 설명한 reserved page frame은 단지 인터럽트 핸들러나 임계 영역에서 발생한 atomic memory allocation 요청만을 satisfy하기 위한 것이다.

     

    그러나 Memory Pool은 특정 커널 구성 요소, 즉 pool의 소유자만이 사용할 수 있는 동적 메모리의 예약분이다. 소유자는 정상적으로는 예약분을 사용하지 않는다. 하지만 동적 메모리가 너무 부족해서 모든 일반적인 메모리 할당 요청이 실패할 운명에 처해질 때 커널 구성 요소는 마지막으로 예약분을 가져와 필요한 메모리를 얻는다.

     

     

    □ Noncontiguous Memory Area Management

     

    Noncontiguous한 메모리 allocation도 생각해봐야한다. 그래야 External Fragmentation을 맊을 수 있다.

    당연히 불연속적인 메모리 영역의 크기는 4,096의 배수 이다.

     

    리눅스에서 이러한 Noncontiguous memory area를 사용하는 용도는

    1) 스왑 영역용으로 자료구조를 할당할 때

    2) 모듈용으로 공간을 할당할 때

    3) 몇몇 입출력 드라이버용으로 버퍼를 할당할 때

     

    3개의 ZONE = ZONE_DMA, ZONE_NORMAL, ZONE_HIGHMEM

     

    One of 3 mechanisms to map page frames in high-memory zone(ZONE_HIGHMEM)

     

    연속적인 페이지 프레임이 할당을 선호 한다.

    이렇게 cache를 만들경우, 평균 접근 time이 적을 수 있다.

     

    noncontiguous page frame의 할당

    external fragmentation을 회피 한다.

    메모리 요청이 빈번하지 않는 여역에 대해서는 이것이 가능하다.

    e.g : module, buffers, I/O driver

     

    반드시 이 noncontiguous memory area는 4096byte 단위 이어야 한다.

     

    단점(Disadvantage): Kernel page table작업시 연속된 주소가 아니므로 overhead가 발생 한다.

     

    8.3.1 Linear Addresses of Noncontiguous Memory Areas

     

    Linear address의 빈 범위를 찾기 위해 PAGE_OFFSET 부터 시작하는 영역을 들여다 볼 수 있다.

    아래의 그림에서 PAGE_OFFSET0xc0000000이다. 즉 1GB라는 말이다.

     

     

     

    영역의 시작 부분에는 램의 처음 896MB를 매핑하는 선형 주소가 들어간다.

    high_memory 변수는 직접 매핑하는 물리 메모리의 끝에 해당하는 선형 주소를 저장한다.

     

    vmalloc()함수는 커널에 불연속적인 메모리 영역을 할당한다.

     

    8.3.2. Descriptors of Noncontiguous Memory Areas

     

    vm_struct가 각 불연속적인 메모리 영역마다 연계된다.

     

     

    Allocating / Releasing a Noncontiguous Memory Area

     

    위 그림에서 VMALLOC_START 매크로는 불연속적인 메모리 영역용으로 예약된 선형 곤간의 시작 주소를 정의하고 VMALLOC_END는 마지막 주소를 정의한다.

     

    get_vm_area() 함수는이 VMALLOC_START와 VMALLOC_END 사이에  linear address의 free range를 찾아서 반환해 주게 된다.

     

    vmalloc 사용, vmalloc_32()이도 있는데 이것은 ZONE_NORMAL과 ZONE_DMA 메모리 지역 에서만 페이지 프레임을 할당한다.

     

    vfree는 vmalloc 또는 vmalloc_32에 의해서 생성된 Noncontiguous 한 memory 영역을 해지 한다.

     

     

     

     

    'Computer Science > Linux Kernel' 카테고리의 다른 글

    9장 프로세스 주소 공간  (0) 2012.06.08
    2장 메모리 주소 지정  (0) 2012.06.07

    “실패에 익숙해져라.”

    얼마 전 한국을 찾은 `위키피디아` 설립자 지미 웨일스가 창업을 꿈꾸는 젊은이들에게 강조한 말이다. 그는 “위키피디아를 만들 수 있었던 것은 앞서 경험한 여러 실패를 바탕으로 가치 있는 교훈을 얻었기 때문”이라고 말했다. 창업을 대하는 한국 사회 분위기를 두고 그는 이런 충고를 던지기도 했다. “남들과 다른 행동을 하는 것을 두렵게 만들어 대기업 취직이 아닌 창업을 부정적으로 바라보게 한다.”

    최근 TV에선 `용감한 녀석들`이란 개그 코너가 사람들 눈길을 끈다. 유명 연예인을 `디스(다른 사람을 폄하)`하고 과감한 사회풍자를 시원하게 터뜨리기도 한다. 웃음기 가득 품은 신랄한 비판은 개그라기에는 조금 슬프기까지 하다.

    우리 벤처 생태계도 실패를 두려워하고 튀는 행동을 부정적으로 보는 사회 분위기를 조롱하듯 아이디어와 열정으로 뭉친 용감한 스타트업 기업이 조금씩 관심을 받는다. 국민 앱이 된 카카오톡이나 한국형 소셜커머스를 표방한 티켓몬스터…. 이외에도 다양한 아이디어를 가지고 제2의 페이스북이나 구글을 꿈꾸는 용감한 스타트업 기업이 우리 경제를 좀 더 살찌운다.

    이들은 지미 웨일스가 말한 실패에 익숙해지기 위해 자발적으로 나선 이들이다. 이들은 성공할 수도 있고 대열을 이탈할 수도 있다. 실패하더라도 중요한 자산으로 남을 것이다.

    학교에서 공부나 열심히 하고 회사 다니며 월급 꼬박꼬박 챙기는 것이 어느덧 중요한 미덕이 된 사회에서 스스로 흥미와 재미를 가지고 창업에 나서는 젊은이들이 있다. 이들이 어쩌면 우리 사회의 진짜 용감한 녀석들이 아닐까. 그들에게 손을 머리 위로 들고 격려의 박수를 보내고 싶다.

    조성묵 편집2부장 csmook@etnews.com

    □ 브랜치 이해하고 활용하기

     

    기본적으로는 하나의 브랜치 즉 마스터 브랜치만 사용해도 버전관리 시스템이 제공하는 모든 이점을 얻을 수 있다.

    Git을 사용하면 이력을 추적하고 다른 개발자와 협업할 수 있다. 또한, 갑자기 중요한 파일이 지워지는 상황도 대처 할 수 있다.

     

    하지만 이정도로 Git을 사용한다면 마치 경주용 자동차를 타고 출퇴근을 하는것과 같다.

     

    이 번에 다룰 내용은 아래와

    • 새로운 브랜치 생성하기
    • 브랜치 간의 변경 사항 합치기
    • 충돌 다루기
    • 브랜치 삭제하기
    • 브랜치명 변경하기
    • 릴리스 브랜치 다루기

     

    >git branch -m master mymaster

     

    -m의 매개변수는 이동을 의미한다. 결국 master라는 메인 브랜치를 mymaster로 변경 하겠다는 의미를 가진다.

     

    Git에서의 브랜치는 큰 비용을 지불하지 않아도 되는 가벼운 구조를 가진다.

    즉, 다른 버전 관리에서는 모든 파일을 새로운 디렉터리로 복사하지만, GIt에서는 해당 브랜치가 만들어진 시점부터 적용된 Commit만을 추적하기위해 파일을 생성 한다.

     

     

    브랜치를 생성 하는 시점

    • 실험적인 변경 사항 추가시
    • 새로운 기능을 추가하고 싶을때
    • 버그를 수정하고 싶을때

    이렇게 브랜치를 생성하고 언제든지 Merge할 수 있기 때문에 추후에 복잡해질 여지는 없다. 또한 변경이력 또한 쉽게 통합 되어진다. 따라서 주저하지말고 필요하다고 생각되면 브랜치를 생성해야 한다.

     

     

    □ 브랜치 생성

     

    > git branch new

    > git branch

    * master

      new

     

    *는 현재 작업 트리 디렉터리를 나타내는 것이다.

    즉 checkout을 하게 되면 현재 작업 트리로 설정 하는 것이 된다.

     

     

    브랜치 생성과 동시에 Checkout 하는 방법

    > git checkout -b alternate master // 3번째 파라매터인 master는 복사해야할 브랜치 명이다. 즉 이렇게 직접적으로 설정할 경우, 지정한 브랜치로부터 새로운 브랜치를 생성하게 된다.

     

     

    □ 브랜치 간의 변경 사항 합치기

     

    합치기는 다음 3가지로 구분된다.

    • Straight Merge: 하나의 브랜치와 다른 브랜치의 변경 이력 전체를 합치는 방법이다.
    • Squashed Commit: 한 브랜치의 이력을 압축하여 다른 브랜치의 최신 커밋 하나로 만드는 방법이다.
    • Cherry-picking: 다른 브랜치에서 하나의 커밋을 가져와서 현재 브랜치에 적용하는 방법이다.

    Straight Merge : 바로 합치기

    git add about.html // 새로운 파일 생성

    about.html에 내용 입력 // 새로운 파일에 내용 입력

    git commit -m "add the skeleton of an about page"  // commit하기 log를 입력해서

    git checkout master // merge하기전에 합병이 되어질 브랜치로 이동

    git merge alternate // master와 alternate를 merge한다.

     

     

    Squashed Commit : 커밋합치기

    Git이 브랜치 하나의 모든 이력을 압축하여 다른 브랜치에 하나의 커밋으로 만들기에 커밋 합치기라고 한다. 커밋 합치기를 할 때는 유의해야 한다.

     

    커밋 합치기는 이것저것 실험해 봐야 하는 새로운 기능을 만들거나 버그를 수정할 때 유용하다. 실험한 내용은 추적하지 않아도 되므로 커밋할 필요가 없다. 즉 마지막 결과만 필요할 뿐이다.

     

    git checkout -b contact master // master 브랜치에서 contact 브랜치를 생성하고 체크아웃 한다.

    contract.html 생성

    git add contract.html // 파일 추가 (스테이징)

    git commit -m "add contract file with email" // commit한다.

    contract.html에 새로운 내용 추가

    git commit -m "add secondary email" -a // 모든 변경사항을 commit한다. (-a 매개변수의 의미)

     

    //이제 Squashed Commit을 해서 2개의 변경이력을 하나의 이력으로 통합해서 master 브랜치에 merge를 해보자.

    git checkout master

    git merge --squash contact // --squash 매개변수를 지정한다. 지정한 브랜치의 모든 커밋을 하나의 커밋으로 밀어 넣는다.

     

    여기서 중요한점은 그냥 merge는 스테이징 되지않고 바로 적용되었지만 --squash 매개변수를 사용해서 커밋 합치기를 할경우 스테이징 단계를 거친다. 따라서 그것을 확인해보면

     

    git status // Chages to be committed 라는 메시지를 볼 수 있다.

     

    git commit -m "add contract page" -m "has primary and secondary email" // 이렇게하면 하나의 변경이력으로 통합되는것을 알 수 있다.

    git log -2 // 변경 이력이 통합 되었음을 알 수 있다.

     

    Cherry-picking: 선택하여 합치기

     

    전체를 합치는게 아니라, 부분적으로 합칠 필요성이 있을 수 있다. 아직은 해당 브랜치가 완성이 안되었기 때문에 부분적으로 합치고 싶은 경우이다. 이때 사용하는 기능이다.

     

    git checkout contact // 브랜치 변경

    git commit -m "add link to twitter" -a // 모든 변경 사항을 commit 한다.

     

    git checkout master // master로 이동

    git cherry-pick 321d76f // 321d76f가 commit하려는 선택적인 이력인 것이다.

     

     

    □ 충돌 다루기

    충돌이란 서로 다른 2개의 branch를 통합하려고 할 때 같은 파일에 동일한 위치에대해서 다른

    변경이 있을 경우이다.

     

    □ 충돌을 실습하기 위해서는 예제 만들기

    충돌을 어떻게 다루는지 확인해보자. 먼저 예제를 위해 about이라는 새로운 브랜치를 생성한다.

    > git checkout -b about master

    자신이 좋아하는 프로그래밍 언어 리스트를 기입한 about.hml을 생성한다.

    > git add about.html

    > git commit -m "a list of my favorite programming languages"

    git branch about2 about // about을 가지고 about2를 생성한다.

    브랜치 전환하기 전에 about.html 파일에 다른 언어를 추가하고 변경 사항을 커밋한다.

    > git commit -a // 새로운 언어 리스트를 추가하고 commit한다.

    > git checkout about2 // about2 brach로 이동을 한다.

    이제 about2에서는 about.html의 마지막 리스트에 아까 입력했던 값이 없다.

    여기에 새로운 값을 입력하자.

    >git commit -a // commit 한다.

    >git checkout about // about branch로 이동 한다.

    >git merge about2 // about2와 합병 한다.

    이제 당연히 충돌이 발생하게 된다. 충돌이 발생 했을 경우 소스코드를 보면

    ========= // 다른 브랜치와 충돌이 발생하는 코드

    <<<<<< // 이러한 기호 뒤에 나오는 코드는 현재 브랜치의 코드이고,

    >>>>>> // 이러한 기호 앞에 나오는 코드는 다른 브랜치의 코드라는 점이다.

    그다음에 나오는 기호는

    파일 명 앞에 합치려고 하는 브랜치명이 표시된다는 것이다.

    <<<<<< HEAD:about.html

    >>>>> about2:about.html

    □ 브랜치 삭제하기

    >>git branch -d about2로 삭제 한다.

    제한사항: 브랜치 삭제 명령은 삭제하려는 브랜치가 성공적으로 현재 브랜치에 합쳐졌을 때만 동작한다.

    합쳐지지 않았을때는 아래와 같은 에러가 생긴다.

    error: The branch 'about' is not fully merged.
    If you are sure you want to delete it, run 'git branch -D about'.

    이를 해결하기 위해서는 -D (대문자를 사용 한다.)

    □ 브랜치명 변경하기

    git branch -m contact contacts

    m명령어를 사용해서 변경을 한다.

    제한사항: 하지만 이 명령어는 존재하는 브랜치를 덮어쓰지 못하므로 새로운 브랜치명은 반드시 고유해야 한다.

    -M을 쓰면 덮어씌워 진다.

     

     

     

     

     

     

     

    + Recent posts