[운영체제] 프로세스(Process),쓰레드(Thread),커널쓰레드(Kerne

gyxor의 이미지

프로세스란....
(Operating System Concepts (sixth edition) 96p에)
Informally, a process is a program in execution.
실행중인 프로그램이라고 정의가 되어 있습니다.

(위키백과에서는..)
In computing, a computer process is a running instance of a program.
라고 되어있습니다.
(C++의 클래스와 인스턴스 관계와도 비슷한거 같습니다.)

쓰레드란....
(위키백과에서..)
A thread in computer science is a sequence of instructions which may execute in parallel with other threads.
명령어의 시퀀스라고 되어있습니다.

이러한 정의는 잘 알겠습니다.
그런데..

멀티프로그램 과 멀티쓰레드의 차이점이 정리되어 나온자료가 없습니다.

책을 읽고서 나름대로 정리를 해봤습니다.

-멀티프로그램은 OS에서 지원하고 프로세스사이에서 context switch가 일어난다.
프로세스의 생성과 context switch 비용은 크다

-멀티쓰레드는 프로세스에 의해서 지원되고 쓰레드사이에서 context switch가 일어난다.
쓰레드의 생성과 context switch 비용은 크다

첫째,
즉, OS에 의해서 지원되느냐.. 프로세스에 의해서 지원되느냐가 가장 큰 차이점으로 생각됩니다.(직접적 언급은 없었습니다...)
맞는지 검토부탁합니다.

둘째,
멀티쓰레드를 사용하는 응용프로그램의 예를 찾고 싶은데요..
한글이나 MS Word도 단일 쓰레드인것 같구요..
카트라이더 같은 게임이 멀티쓰레드를 사용하는 것인가요?
프로세스와 쓰레드의 개념을 확실히 할 수 있는 적절한 예시 부탁드립니다.

셋째,
커널쓰레드 란 무엇인가요?
(커널쓰레드=프로세스 )는 아니라고 하던데요..
프로세스에 기본적으로 존재해야 하는 쓰레드를 말하는것인가요?
실례를 들어서 설명해주시면 감사하겠습니다.

세가지 답변부탁드립니다.

lovemyin의 이미지

1. 멀티 스래드를 사용하는 응용프로그램의 예
기본적으로 프로그램을 개발할 때에는 멀티 스래드 방식을 많이 이용합니다. 말씀하신 MS-Word 또한 멀티 스래드 프로그램입니다. 예를 들어 제가 한글문서를 작성하고 있습니다. 그때 마다 바로바로 맞춤법 검사를 하지요... 두 작업은 멀티 스래드 방식을 이용해서 구성했을 것입니다. 이와 같이 대부분의 프로그램에선 멀티 스래드 방식을 사용하고 있습니다. 그렇다고 무조건 멀티 스래드를 사용해야 한다는 건 아니고요...^^
현재 어떤 일을 하시는진 모르겠지만 개발을 하게되면 멀티 스래드라는 것이 몸에 와닿을것입니다. 왜 이 방법을 써야할지...
멀티스래드를 사용하는 응용프로그램은 너무 많아서 예로 들기가....

2. 커널 쓰래드란 무엇인가요...
스래드는 크게 커널 스래드와 사용자 스래드 두가지로 나누어집니다.
Operating System Concepts 책을 보셨다고 하셨는데 5장에 보시면 스래드를 주제로 다룹니다. 그곳에 커널 스래드와 사용자 스래드를 정의해 놓았습니다.
간단히 한줄로만 요약한다면
- Kernel thread Supported by the Kernel
- User level thread thread management done by user-level threads library

참고로 리눅스의 pthread는 kernel thread입니다.
스래드는 내부적으로 clone()이라는 system call 을 이용해 생성됩니다.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

sangwoo의 이미지

유명한(!) '사용자 수준 쓰레드와 커널 수준 쓰레드의 차이?' 글타래를 읽어 보시는 것도 좋을 것 같습니다. :)

http://bbs.kldp.org/viewtopic.php?t=349

----
Let's shut up and code.

익명 사용자의 이미지

운영체제는 단지 프로세스나, 쓰레드로 표현할 수 없습니다.
그래서, 비유가 적절하지 않으나, 이 글의 주제와 관점이
운영체제, 프로세스, 쓰레드이므로 다음과 같이 예시합니다.

1) 운영체제=프로세스의 모임
2) 프로세스= 스케쥴링의 단위, 쓰레드의 모임, 1개 이상의 쓰레드로 구성
3) 쓰레드 = 스케쥴링의 가장 작은 단위(반드시 특정 프로세스에 포함)

* 쓰레드 vs. 프로세스
- 쓰레드는 프로세스의 구성원이다.
- 프로세스는 생성시(fork) 텍스트, 데이터, 스택을 위한 영역이 필요하며,
동일 프로세스(예를 들어, ls를 다수개 실행)인 경우 데이터와 스택만을 새로
생성하고 텍스트는 공유한다.
- 쓰레드는 생성시(posix의 경우: pthread_create) 텍스트, 데이터, 스택이 필요하나,
이중 텍스트와 데이터는 이미 해당 쓰레드를 내포하고 있는 프로세스에 있는 것을 사용하며, 단지,
스택만을 새로 할당받는다. (비용이 프로세스에 비해 조금 작다)
- 프로세스간의 통신은 전형적인 IPC(signal, pipe, fifo, semaphore, shared memory, socket등)에
의하며, 쓰레드는 그외에도 프로세스의 데이터를 마치 공유메모리처럼 사용할 수 있고, 뮤텍스라는
동기화 메카니즘을 지원한다.
- 동일 프로세스내의 쓰레드간에 시그널은 무방하나, 다른 프로세스의 특정쓰레드에게 시그널을 보낼
방법은 기본적으로 제공되지 않는다.

(질문에 대해)
1) 1번질문
* 쓰레드가 프로세스에서 지원되는 것이 필수/기본는 아닙니다.
- 쓰레드에 대한 규약은 그 구현에 대해 명세하지 않습니다. 즉, 커널레벨쓰레드냐?
사용자 수준에서 구현한 쓰레드냐?를 명시하지 않습니다. 구현자 맘입니다.

2) 2번질문
* 멀티쓰레드로 동작하는 프로그램 확인
2-1) 리눅스(Fedora Core 3)
$ ps -eL <==== L(Light-weight process == thread)
PID .... LWP ....
1 1 init
.......................
4436 4436 ? 00:00:00 server
4436 4437 ? 00:00:00 server
4436 4438 ? 00:00:00 server
4436 4439 ? 00:00:00 server
4436 4440 ? 00:00:00 server
4436 4441 ? 00:00:00 server
4436 4442 ? 00:00:00 server
4436 4443 ? 00:00:00 server
4436 4444 ? 00:00:00 server
4436 4445 ? 00:00:00 server
...........
위에서 server의 메인 쓰레드 PID(TID)는 4463이며,
그외(4437~4445)는 주쓰레드로 부터 파생된 자식쓰레드들이다.
프로세스는 동일하나, 쓰레드는 고유ID를 가지며, 스케쥴링은 커널쓰레드에서는
쓰레드 ID(위에서 LWP)를 키값으로 스케쥴링된다.

2-2) 윈도우
윈도우작업관리자>보기>열선택> 쓰레드 수'
를 체크한 후 '프로세스' 탭을 보면 현재 프로세스별 쓰레드 개수가 디스플레이됨(디버그시 필수)

응용으로는 '워드'뿐 아니라, 많은(대부분) 윈도우 응용이 멀티쓰레드로 구현되어 있으며,
심지어 답변하는 사람(손님)이 짠 테스트 프로그램도 보통 10여개 이상의 쓰레드를 사용한다.
윈도우는 이벤트기반방식의 cooperative scheduling이 기본이므로, 단일쓰레드로
프로그래밍할때, 특정 이벤트 콜백에서 무한루프에 빠지거나/오랫동안 블록되지
않도록 짜야한다.
참고1) 오래 걸리는 연산수행시 한10년전에는 중간 중간에 메시지 후킹을 해줘서 이
이를 극복하기도 했다. 현재도 특정 버튼누르면, 화면이 리프레쉬되지 않아(WM_PAINT메시지가 처리안됨),
윈도우 화면 이미지가 깨지는 경우가 발생하는 프로그램들이 흔히 보여진다. 이는 2가지 방식으로
극복되는데, 메시지후킹루프를 적절히 넣어주거나, 블록될만한 부분은 쓰레드를 새로만들어 돌리는 것이
그 방법이다.
참고2) 쓰레드는 스택을(만) 새로 만드는데, 윈도우의 경우 1메가를 기본으로 준다. 그래서, 윈도우의
쓰레드함수에서(char buffer[1024*1024])등으로 1메가를 선언하면 스택어쩌구 한다.(에러라는...)
쓰레드 프로그래밍시 스택크기는 적절히 줄이거나, 늘려서 해당프로그램이 무리없이 돌도록 짠다.

3) 3번질문
* 커널쓰레드는 보통 쓰레드 개념의 지원을 커널에서 하는 것을 의미한다. 즉, 커널이 스케쥴링하는 단위로
쓰레드가 되는 것을 의미한다.

만일, 사용자 수준에서 구현하면, 해당 프로세스가 수행될때, 해당 프로세스 내에서 스케쥴러를 만들고 등등해서,
해당 쓰레드에게 스케쥴링을 하게된다. 커널쓰레드에 비해 효율이 별로다. 요즘은 대부분의 운영체제가 대체로 커널쓰레드를 지원한다. 특히, SMP에서 쓰레드로 만든 프로그램은 효과가 더욱 좋다(Hyperthreading지원하는 PC.....)
윈도우의 경우는 1987년 카네기멜른대학에서 만든 mach microkernel을 사서 짜집기좀 해서,
NT(1992년인가 나왔지?)를 구현할때, 쓰레드를 도입했다.
솔라리스가 *닉스계열에서 가장 빠르게 접근했으나, 초기에 버그가 많아서 피봤다는(??) 카더라 통신도 있다.
리눅스는 몇가지 형태(?)로 구현된 쓰레드모델들 지원하다가 최근 NPTL을 지원한다.(검색해보자)

* 혹시나 해서, Pentium 4의 하이퍼쓰레딩은 CPU를 뻥튀기는(2개처럼) 것이다.

** 결론 : 그냥 이글은 참고나 하고(믿지말고), KLDP의 토론등을 찾아서 보자. 시간있으면 책도 열심히보고....

gyxor의 이미지

한글에서 맞춤법교정은 멀티쓰레드 방식이겠군요..

Quote:

* 쓰레드가 프로세스에서 지원되는 것이 필수/기본는 아닙니다.
- 쓰레드에 대한 규약은 그 구현에 대해 명세하지 않습니다. 즉, 커널레벨쓰레드냐?
사용자 수준에서 구현한 쓰레드냐?를 명시하지 않습니다. 구현자 맘입니다.

Thread = User Level Thread + Kernel Level Thread
이기 때문에.. 어느 한가지로 국한시켜서 얘기할 수 없다는 말씀이신가요?

Quote:

만일, 사용자 수준에서 구현하면, 해당 프로세스가 수행될때, 해당 프로세스 내에서 스케쥴러를 만들고 등등해서,
해당 쓰레드에게 스케쥴링을 하게된다. 커널쓰레드에 비해 효율이 별로다.

첫째,
범위를 줄여서
User-Level Thread 는 프로세스에서 스케쥴링을 담당
Process는 커널에서 스케쥴링을 담당
이렇게 해야 맞나요?

Kernel-level Thread는 여전히 의문입니다.
Operating System Concepts 6th
132page에
Kernel Threads are supported directly by the operating system.
The kernel performs thread creation,scheduling,management in kernel space. ...
이렇게 나와있습니다.
그리고 나서..
user thread와 kernel thread의 관계를

[Many to one model ]
: user thread를 맘것 생성할 수 있지만,
하나의 Thread가 block system call을 요청하면 전체 Process가 block되고 Multiprocessor 환경에서 in parallel하게 수행을 못한다..

[One to One model]
: Multiprocessor 환경에서 in parallel하게 수행할 수 있다.
하지만 user thread 마다 kernel thread를 생성해야 하는 단점

[Many to Many model]
: 위 두 모델을 보완

위 세가지가 그림과 함께 설명되어 있습니다.

kernel level thead = process
인것은 분명 아니라고 들었습니다.

Quote:

2) 프로세스= 스케쥴링의 단위, 쓰레드의 모임, 1개 이상의 쓰레드로 구성

둘째,
그렇다면
kernel level thread란 프로세스 상에서 적어도 한개 이상 존재해야하는
필수 쓰레드인가요?
즉,
Os에서 커널이 (프로세스의) 생성 과 스케쥴링을 담당하듯이
프로세스에서는kernel level thread 가 (쓰레드의) 생성 과 스케쥴링을 담당하나요?

다시말하면..
Many to one model을 예로 들어서..
kernel thread한개에 여러개의 user thread가 매칭되어 있는 그림인데요
이 모두가 한개의 Process 안에 속하는것이 아닌가 해서요..

이 모든게 맞다면

셋째,
kernel thread가 한개인 경우 user thread에서 block 요청시 프로세스전체가 block되고 kernel thread가 여러개이면 그렇지 않은 이유가..
block은 커널에서 실행을 해주는것인데 커널에서 알아보는것은 kernel thread밖에 없으므로 커널에서 (한개밖에 없던) kernel thread를 막아버리기 때문인가요?

세가지 답변부탁드립니다.

superwtk의 이미지

한글이나 MS워드도 멀티쓰레딩을 이용한 응용프로그램입니다.

인쇄하면서 문서 작업 가능하지 않습니까? :)

익명 사용자의 이미지

gyxor wrote:

...
Thread = User Level Thread + Kernel Level Thread
이기 때문에.. 어느 한가지로 국한시켜서 얘기할 수 없다는 말씀이신가요?

두가지로만 표현하시면 안되고....
(Thread = User Level Thread 또는 Kernel Level Thread 또는 짬뽕(Hybrid) 또는 구현자 마음대로)
이기 때문입니다.

gyxor wrote:

...
첫째,
범위를 줄여서
User-Level Thread 는 프로세스에서 스케쥴링을 담당
Process는 커널에서 스케쥴링을 담당
이렇게 해야 맞나요?

* 유저레벨쓰레드의 스케쥴링
- 커널이 프로세스(Pi)에게 스케쥴링
- 프로세스는 자체적으로 스케쥴러를 가지고 있으며(쓰레드를 스케쥴링하기위해)
(물론, 이 스케쥴러도 유저가 구현한것임)
- 프로세스는 자신이 CPU를 할당받은 시간을 또 잘게 나누어 자신소유의
쓰레드에게 스케쥴링함

gyxor wrote:

...
Kernel-level Thread는 여전히 의문입니다.
Operating System Concepts 6th
132page에
Kernel Threads are supported directly by the operating system.
The kernel performs thread creation,scheduling,management in kernel space. ...
이렇게 나와있습니다.

* 쓰레드의 구현 관점
- 커널레벨쓰레드 : 커널에서 쓰레드를 관리(생성, 스케쥴링등)
- 유저레벨쓰레드 : 사용자가 라이브러리등으로 구현( 생성, 스케쥴링등을 직접구현)
* 쓰레드로 구성된 프로세스 p1(t1,t2,t3,t4)와 비쓰레드로 구현된 프로세스 p2의 가상 스케쥴링 시나리오.
1) 커널레벨쓰레드인경우
p1(t1),p1(t2),p1(t3),p1(t4),p2, .. , p1(t1),p1(t2),p1(t3),p1(t4),p2,
2) 유저레벨쓰레드인경우
p1(t1), p2, p1(t2), p2, p1(t3), p2, p1(t4), ... p1(t1), p2, p1(t2), p2, p1(t3), p2, p1(t4),
* 커널레벨쓰레드가 스케쥴링에서 유리함
(스케쥴링에서 각 쓰레드를 프로세스와 동급으로 행함)

gyxor wrote:

...
[Many to one model ]
: user thread를 맘것 생성할 수 있지만,
하나의 Thread가 block system call을 요청하면 전체 Process가 block되고 Multiprocessor 환경에서 in parallel하게 수행을 못한다..

[One to One model]
: Multiprocessor 환경에서 in parallel하게 수행할 수 있다.
하지만 user thread 마다 kernel thread를 생성해야 하는 단점

[Many to Many model]
: 위 두 모델을 보완

위 세가지가 그림과 함께 설명되어 있습니다.
...


- 맘것보다는 많이.. 보다 융통성있는 숫자만큼정도가 좋겠습니다.
- 블록될수 있기때문에 가급적 논블록킹모드로 블록킹 호출을 구현하는게 옳습니다.(read라면 read를 먼저 nonblocking으로 세팅하고, 이후 이를 이용해서 블록킹콜을 다시 구현)
- 전체프로세스가 블록된다기 보다는 그 프로세스가 블록된다(프로세스내의 쓰레드도 같이 블록된다.)가 더 맞겠습니다.
- 멀티프로세서, 소위 다수개의 CPU를 가진 컴퓨터에서 커널레벨 쓰레드를
사용하면 parallel processing에 유리합니다.
그러나, 유저레벨 단일 프로세스는 sequential하게 수행될것이므로, 그 내부에
유저레벨쓰레드는 병렬처리가 불가합니다.(다수 CPU가 있어도 해당 프로세스-이를테면 서버?-를 돌리는데는 별 보탬이 안된다는...)
gyxor wrote:

...
kernel level thead = process
인것은 분명 아니라고 들었습니다.

쓰레드라는 용어를 이렇게 해석해보세요.
* 구분되는 제어의 흐름 : " a flow of control"
이렇게 할 경우,
프로세스(쓰레드 없는) = 플로우가 1개(커널관점) = 싱글쓰레드
프로세스(쓰레드 구성된) = 플로우가 다수개(커널관점) = 멀티쓰레드

gyxor wrote:

...
둘째,
그렇다면
kernel level thread란 프로세스 상에서 적어도 한개 이상 존재해야하는
필수 쓰레드인가요?
즉,
Os에서 커널이 (프로세스의) 생성 과 스케쥴링을 담당하듯이
프로세스에서는kernel level thread 가 (쓰레드의) 생성 과 스케쥴링을 담당하나요?

다시말하면..
Many to one model을 예로 들어서..
kernel thread한개에 여러개의 user thread가 매칭되어 있는 그림인데요
이 모두가 한개의 Process 안에 속하는것이 아닌가 해서요..

쓰레드는 기본적으로 프로세스내에 속하도록 구현됩니다.
커널레벨 쓰레드를 지원하는 운영체제에서, 만일 쓰레드를 하나도 생성하지
않은 프로세스가 있다면 이를 쓰레드관점으로 볼때는 싱글쓰레드 응용으로 봅니다.

gyxor wrote:

...
이 모든게 맞다면

셋째,
kernel thread가 한개인 경우 user thread에서 block 요청시 프로세스전체가 block되고 kernel thread가 여러개이면 그렇지 않은 이유가..

...


- 책에서 이렇게(커널 쓰레드가 한개...) 설명하고 있는 것을, 지금 게시판상에서는 유저레벨쓰레드로 보고 있습니다.
- 또, 책에서 "커널쓰레드가 여러개"를 이 게시판에서는(제 답글) 커널레벨 쓰레드로 보고 있습니다.
다시 정리하자면,
- many(유저)-to-one(커널) : 제 답글에서는 유저레벨쓰레드
- many(유저)-to-many(커널) : 제 답글에서는 짬뽕(하이브리드)
- one(유저)-to-one(커널) : 제 답글에서는 커널레벨쓰레드
음... 제가 답글로 쓴것을 참고하시고 책의 정리를 받아들이시는게 좋겠습니다.

* 쓰레드에 대해 한때(10여년전) 관심(?) 가진적이 있으나, 책에서 훨씬~ 잘~ 정리된것같습니다. 저도 운영체제 관련서적을 수십권(?) 가지고 있으나, 장식용인지? ㅎㅎ


gyxor wrote:

...
block은 커널에서 실행을 해주는것인데 커널에서 알아보는것은 kernel thread밖에 없으므로 커널에서 (한개밖에 없던) kernel thread를 막아버리기 때문인가요?
...

- 블록은 하나의 제어 흐름을 조건이 맞을때까지 멈추게 하는것입니다. 소위 스케쥴링 단위하나(프로세스?쓰레드?)를 멈추게 하는 것이지요. 조건이 맞을때까지.....

그래서, 만일 커널이 "a flow of control"을 멈추게 하면, 그에 연관된 플로우는 멈추게 될것입니다. 이 게시판에서 해왔던 답변 스타일이라면, "블록킹 시스템호출을 (액면가로?) 호출하는 라이브러리로 구현된 유저레벨쓰레드는 모두 멈추게 될것이다." 라고 하면 되겠군요.

gyxor의 이미지

책에서 나온 세가지 모델의 그림 표현은
커널쓰레드 한개당...
한개 또는 여러개의 유저쓰레드가 달려있는 모습이었습니다.

따라서 이것으로 판단해 보기로는..
유저쓰레드를 가지려면 커널쓰레드가 반드시 있어야 되는 것으로 생각됩니다.
그런데..

Quote:

커널레벨 쓰레드를 지원하는 운영체제에서, 만일 쓰레드를 하나도 생성하지
않은 프로세스가 있다면 이를 쓰레드 관점으로 볼때는 싱글쓰레드 응용으로 봅니다.

Quote:

프로세스(쓰레드 없는) = 플로우가 1개(커널관점) = 싱글쓰레드

커널의 관점에서..
커널 쓰레드없는 프로세스 <- 커널 관점에서 플로우 1개
1개의 커널 쓰레드를 가진 프로세스 <- 커널 관점에서 플로우 2개
2개의 커널 쓰레드를 가진 프로세스 <- 커널 관점에서 플로우 3개

이렇게 되나요?
유저쓰레드가 없는 경우엔..
커널쓰레드도 없는 것인가요?

위에서 어느분이..

Quote:

2) 프로세스= 스케쥴링의 단위, 쓰레드의 모임, 1개 이상의 쓰레드로 구성

이렇게 말씀을 하셔서요..

유저쓰레드와 커널쓰레드가 없는 프로세스
유저쓰레드 1개와 커널쓰레드1개가 있는 프로세스
무슨차이가 있는것인지 모르겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.