달력

2

« 2025/2 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
2011. 10. 11. 23:28

리눅스의 스레드 구현 OS이야기2011. 10. 11. 23:28

리눅스에서는 프로세스나 스레드나 똑같은 개념으로 본다.
하지만 다른 OS(윈도우나 , Sun Solaris)들은 스레드를 따로 구현하였다.
그러므로, 리눅스는 스레드에 대한 별도의 프로세스 서술자가 필요하지 않다.

스레드는 공유할 자원을 표시하는 플래그를 사용한다는 점을 제외하고는, 일반 태스크와 마찬가지로 clone() 시스템 콜을 사용하여 생성된다.

** clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0); **
위의 코드는 주소공간, 파일 시스템 자원, 파일 서술자, 시그널 핸들러를 공유한다는 점을 제외하면 , 일반 fork()문과 동일하다.

한편, 일반 fork는 다음과 같이 구현된다.
clone(SIGCHLD, 0);

/*
 * cloning flags:
 */
#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
#define CLONE_VM 0x00000100 /* set if VM shared between processes */
#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
#define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */
#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
#define CLONE_THREAD 0x00010000 /* Same thread group? */
#define CLONE_NEWNS 0x00020000 /* New namespace group? */
#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
#define CLONE_DETACHED 0x00400000 /* Unused, ignored */
#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
/* 0x02000000 was previously the unused CLONE_STOPPED (Start in stopped state)
   and is now available for re-use. */
#define CLONE_NEWUTS 0x04000000 /* New utsname group? */
#define CLONE_NEWIPC 0x08000000 /* New ipcs */
#define CLONE_NEWUSER 0x10000000 /* New user namespace */
#define CLONE_NEWPID 0x20000000 /* New pid namespace */
#define CLONE_NEWNET 0x40000000 /* New network namespace */
#define CLONE_IO 0x80000000 /* Clone io context */
 

'OS이야기' 카테고리의 다른 글

프로세스 종료  (0) 2011.10.11
커널 스레드  (0) 2011.10.11
프로세스 생성  (0) 2011.10.11
container_of 매크로  (1) 2011.10.11
커널  (0) 2011.10.11
:
Posted by НooпeУ


Code Start Code End