CATEGORY

분류 전체보기 (73)
세상사는이야기 (27)
회사이야기 (7)
친구들이야기 (6)
공부이야기 (33)
프로그래밍 (3)
Network (23)
개인적인이야기 (0)

RECENT ARTICLE

RECENT COMMENT

ARCHIVE

LINK



  1. 2008.11.28
    품앗이(PUMASI) 세미나
  2. 2008.09.26
    Cron
  3. 2008.09.26
    PORT 번호
  4. 2008.09.05
    Folder Server 설명
  5. 2008.06.12
    Unix 입출력 PPT
  6. 2008.06.09
    IPC(interProcessCommunication)의 이해(2)
  7. 2008.06.09
    IPC(interProcessCommunication)의 이해(1)
  8. 2008.06.04
    P2P 종류
  9. 2008.05.26
    fork 설명 2
  10. 2008.05.21
    Nagle 알고리즘_2

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

 

[ cron 이란 ? ]

 

  특정 시간에 특정한 작업을 수행할 있게 해주는 프로그램이다.

  대부분의 리눅스 배포판에 기본적으로 설치되어 있다.

  내가 만약 매일 새벽 5시에 DB 백업을 받아야 한다고 가정한다면, 매일 DB 백업을

  받기 위해 새벽 5시에 출근할 수는 없는 일이다. 이럴때 CRON 으로 작업을 스케줄링

  으면 cron 데몬이 알아서 백업을 받아준다.

 

[cron 설정하기 ]

 

  RedHat 경우 /etc/crontab 이란 파일있다.

  기본적으로 cron 데몬은 파일을 최초로 읽어 들인다.

 

  [root@soma] vi /etc/crontab

 

  SHELL=/bin/bash

  PATH=/sbin:/bin:/usr/sbin:/usr/bin

  MAILTO=root

  HOME=/

 

  # run-parts

  01 * * * * root run-parts /etc/cron.hourly

  02 4 * * * root run-parts /etc/cron.daily

  22 4 * * 0 root run-parts /etc/cron.weekly

  42 4 1 * * root run-parts /etc/cron.monthly

 

  기본적인 crontab 내용이다.

 

  [] [] [] [] [요일] [실행명령] 형식으로 이루어졌다.

 

  위의 내용을 보면 /etc/crontab 읽어 들이면서 crontab 내용 안의 4 가지 파일을

  설정된 시간에 맞춰서 실행한다.

 

  1. 01 * * * * root run-parts /etc/cron.hourly

     -> 매월,매일,매시,01 분에 /etc/cron.hourly 실행한다.

  2. 02 4 * * * root run-parts /etc/cron.daily

     -> 매월,매일 4 02 분에 /etc/cron.daily 를 실행한다.

  3. 22 4 * * 0 root run-parts /etc/cron.weekly

     -> 매주일요일 4 22 분에 /etc/cron.weekly 실행한다.

  4. 42 4 1 * * root run-parts /etc/cron.monthly

     -> 매월 1 4 42 분에 /etc/cron.monthly 를 실행한다.

 

[ 예제]

 

  매일, 매시간10, 20 분에 /home/imsi/public_html/ 내의 모든 파일 및 디렉토리를

  imsi.tar.gz 파일명으로 압축하고 나서 imsi.tar.gz 파일을 /home/imsi/back 이란

  디렉토리로 이동하는 것을 설정해 보도록 하겠다.

 

  1. /etc/crontab 설정하기

 

     [root@tgs] vi /etc/crontab

 

     SHELL=/bin/bash

     PATH=/sbin:/bin:/usr/sbin:/usr/bin

     MAILTO=root

     HOME=/

 

     # run-parts

     10,20 * * * * root run-parts /etc/cron.hourly

     02 4 * * * root run-parts /etc/cron.daily

     22 4 * * 0 root run-parts /etc/cron.weekly

     42 4 1 * * root run-parts /etc/cron.monthly

 

  2. /etc/cron.hourly 스크립트 만들기

 

     [root@tgs]vi /etc/cron.hourly/imsi

 

     #!/bin/sh

 

     tar cvfz /home/imsi/imsi.tar.gz /home/imsi/public_html/*

     mv /home/imsi/imsi.tar.gz /home/imsi/back/

 

[ 옵션 사용하기 ]

 

  1. crontab -l : 현재 설정되어있는 cron 리스트를 출력한다.

 

  2. crontab -e : 옵션으로도 cron 설정할 수 있다.

 

  3. crontab -r : 옵션은 현재 설정되어있는 모든 cron 설정을 지운다.

                  etc/crontab 설정된 내용은 지워지지 않는다


And

7 TCP echo Echo

7 UDP echo Echo

9 TCP discard sink null Discard

9 UDP discard sink null Discard

13 TCP daytime Daytime

13 UDP daytime Daytime

17 TCP qotd quote Quote of the day

17 UDP qotd quote Quote of the day

19 TCP chargen ttytst source Character generator

19 UDP chargen ttytst source Character generator

20 TCP ftp-data File Transfer

21 TCP ftp FTP Control

23 TCP telnet Telnet

25 TCP smtp mail Simple Mail Transfer

37 TCP time Time

37 UDP time Time

39 UDP rlp resource Resource Location Protocol

42 TCP nameserver name Host Name Server

42 UDP nameserver name Host Name Server

43 TCP nicname whois Who Is

53 TCP domain Domain Name

53 UDP domain Domain Name Server

67 UDP bootps dhcps Bootstrap Protocol Server

68 UDP bootpc dhcpc Bootstrap Protocol Client

69 UDP tftp Trivial File Transfer

70 TCP gopher Gopher

79 TCP finger Finger

80 TCP http www, http World Wide Web

88 TCP kerberos krb5 Kerberos

88 UDP kerberos krb5 Kerberos

101 TCP hostname hostnames NIC Host Name Server

102 TCP iso-tsap ISO-TSAP Class 0

107 TCP rtelnet Remote Telnet Service

109 TCP pop2 postoffice Post Office Protocol - Version 2

110 TCP pop3 postoffice Post Office Protocol - Version 3

111 TCP sunrpc rpcbind portmap SUN Remote Procedure Call

111 UDP sunrpc rpcbind portmap SUN Remote Procedure Call

113 TCP auth ident tap Authentication Sevice

117 TCP uucp-path UUCP Path Service

119 TCP nntp usenet Network News Transfer Protocol

123 UDP ntp Network Time Protocol

135 TCP epmap loc-srv DCE endpoint resolution

135 UDP epmap loc-srv DCE endpoint resolution

137 TCP netbios-ns nbname NETBIOS Name Service

137 UDP netbios-ns nbname NETBIOS Name Service

138 UDP netbios-dgm nbdatagram NETBIOS Datagram Service

139 TCP netbios-ssn nbsession NETBIOS Session Service

143 TCP imap imap4 Internet Message Access Protocol

158 TCP pcmail-srv repository PC Mail Server

161 UDP snmp snmp SNMP

162 UDP snmptrap snmp-trap SNMP TRAP

170 TCP print-srv Network PostScript

179 TCP bgp Border Gateway Protocol

194 TCP irc Internet Relay Chat Protocol

213 UDP ipx IPX over IP

389 TCP ldap Lightweight Directory Access Protocol

443 TCP https MCom

443 UDP https MCom

445 TCP Microsoft CIFS

445 UDP Microsoft CIFS

464 TCP kpasswd Kerberos (v5)

464 UDP kpasswd Kerberos (v5)

500 UDP isakmp ike Internet Key Exchange (IPSec)

512 TCP exec Remote Process Execution

512 UDP biff comsat Notifies users of new mail

513 TCP login Remote Login

513 UDP who whod Database of who's logged on, average load

514 TCP cmd shell Automatic Authentication

514 UDP syslog

515 TCP printer spooler Listens for incoming connections

517 UDP talk Establishes TCP Connection

518 UDP ntalk

520 TCP efs Extended File Name Server

520 UDP router router routed RIPv.1, RIPv.2

525 UDP timed timeserver Timeserver

526 TCP tempo newdate Newdate

530 TCP,UDP courier rpc RPC

531 TCP conference chat IRC Chat

532 TCP netnews readnews Readnews

533 UDP netwall For emergency broadcasts

540 TCP uucp uucpd Uucpd

543 TCP klogin Kerberos login

544 TCP kshell krcmd Kerberos remote shell

550 UDP new-rwho new-who New-who

556 TCP remotefs rfs rfs_server Rfs Server

560 UDP rmonitor rmonitord Rmonitor

561 UDP monitor

636 TCP ldaps sldap LDAP over TLS/SSL

749 TCP kerberos-adm Kerberos administration

749 UDP kerberos-adm Kerberos administration


And

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

IPC(Inter Process Communicaiton) 이해 (2)


IPC란 무엇인가?

정의:
IPC는 프로그램들간의 데이터를 공유하고 동기화하기 위해 사용되는 방법을 뜻한다. 이때 프로그램은 보통 프로세스를 의미한다. IPC를 할 수 있게 해주는 일반적인 도구는 세마포어, 공유메모리( Shared memory), 내부 메시지큐등이 있다. 이런 방법이 갖는 이점은 디스크를 통한 파일공유와 관련IO를 통한 공유하는 방법의 오버헤드를 줄일 수 있다는 것이다.

IPC를 쓰는 이유

Use IPCs when you need to talk between programs, you want the talking to be 프로그램들간에 데이터를 빠르게 공유하고 싶을 때, 혹은 전하고 싶을 때, 또한 프로세스간의 통신의 복잡한 하부구조를 알지 않아도 되는 경우 등이다. IPC는 커널이 세부적인 통신을 맡아서 해주기 때문이다. 예룰 들어 당신의 프로세스가 세마포어에 의해 보호되는 자원을 기다리고 있다고 한다면 커널은 당신의 프로세스를 대기행렬( Waiting gueue )에 넣어 버린다. 그리고 자원을 쓸 수 있는 순간이 되면 커널은 프로세스에게 자원을 할당하게 된다. 또한 커널은 이런 오퍼레이션이 원자적(atomic)일 것을 확인한다. 이것은 데이터의 무결성을 위해 세마포어를 세팅하는 오퍼레이션은 어떠한 경우에도 방해 받지 않는다는 것이다.

 IPC calls의 유사성과 차이점

IPC 통신 루틴상의 모든 자원은 비슷한 방법과 매우 유사한 함수 콜을 이용한다.
   기능    메세지큐    세마포어    공유메모리
   1.IPC할당방법    msgget    semget    shmget
   2.IPC제어방법    msgctl    semctl    shmctl
     (상태변경,해제)
   3.IPC작동방법    msgsnd    semop    shmat
     (send/receive)    msgrcv        shmdt

IPC루틴은 다루는 데이터의 양에 따라 다르다.
- 세마포어는 long integer이며 단일숫자를 나타낸다.
- 메시지큐는 4096문자를 가질 수 있다.
- 공유메모리 세그먼트는 256MB이다.

현재 활동중인 상태를 보는 방법

다음 두개의 명령어를 활용할 수 있다.

Ipcs: 세마포어와 메시지큐, 공유메모리의 상태를 볼수 있다.
ipcs -m ( shared memory )
ipcs -q ( message gueues )
ipcs -s ( semaphore )

Ipcrm: 세마포어, 메세지큐,공유메모리부분을 시스템에서 제거한다. Ipcrm 명령은 shmctl,semctl,msgctl system call의 front end명령(사용자가 직접 부르는)으로서 적절한 실행관한과 옵션을 사용하면 자원을 D(deletion)상태로 마크하게 된다. 그러나, 자원을 사용하고 있는 모든 프로세스가 detach를 해야만 완전히 ipcs를 통해 보면 사라지게 된다.

Fields common to each of the IPC types
Ipcs명령의 결과에서 보면 일부는 공통적으로 사용된다. 다음부분이 그러하다.
  T Type= m (shared memory), s (semaphore) or q (message queues)
  ID This is the identifier for the entry similar to a file descriptor. It is used by the operations function calls to access the resource after a get is performed on it.
  KEY Similar to a file name, this is what the routine uses to get, or open, the resource. When you get this name, the return value is the ID. If the key is 0x00000000 (IPC_PRIVATE), this entry can only be used by related, parent/child processes.
  MODE Permissions and status. The meaning of the field is different for each of the IPC types.


The first two characters can be one of these: RSCD
  R and S These are for the message queues and indicate a process is waiting on a message send or receive call.
  D Indicates the shared memory segment has been deleted but will not disappear until the last process attached to it releases it.(NOTE: The key will be changed to ipc_private, that is, all zeros (0) when the segment has been marked for removal but still has attached processes.)
  C This shared memory segment will be cleared when the first process attaches to it.Flag not set. The next nine characters are permission bits with r indicating read access for this position; w indicating either write or alter access, depending upon the IPC facility it is attached to. No permissions for this operation.


IPCs need permissions for owner, group and other.
  OWNER The login name of the owner
  GROUP The name of the group that owns the entry
  CREATOR The login name of the creator of the entry
  CGROUP The group of the creator of the entry
  CTIME The time when the associated entry was created or changed


Headings that are special to message queues
  CBYTES The current total byte count of all messages in the queue
  QNUM The number of messages currently in the queue
  QBYTES The maximum number of bytes allowed for all messages in the queue
  LSPID The ID of the last process that sent a message to the queue
  LRPIC The ID of the last process that received a message in the queue
  STIME The time the last message was sent to the queue
  RTIME The time the last message was received, or read, from the queue


Headings that are special to semaphores
  NSEMS The number of semaphores in the set for this entry
  OTIME The time the last operations was done for this semaphore entry


Headings that are special to shared memory
  NATTCH The current number of processes attached to this segment
  SEGSZ The size of the segment in bytes
  CPID The process ID of the creator of the segment
  LPID The process ID of the last process to either attach or detach from this segment
  ATIME The time of the last attach to the segment
  DTIME The time of the last detach from the segment

And
IPC(InterProcessCommunication)의 이해 (1)

IPC는 프로그램들간의 데이터를 공유하고 동기화하기 위해 사용되는 방법을 뜻한다. 이때 프로그램은 보통 프로세스를 의미한다. IPC를 할 수 있게 해주는 일반적인 도구는 세마포어, 공유메모리( Shared memory), 메시지큐등이 있다. 이런 방법이 갖는 이점은 디스크를 통한 파일공유와 관련IO를 통해 공유하는 오버헤드를 줄일 수 있다는 것이다.

Semaphore

세마포어는 공유 할 수 없는 자원을 액세스하는 것을 제어하는 특화된 데이터 구조체이다. 자원을 놓고 협력하거나 혹은 경쟁하는 프로세스는 그 자원이 사용 가능한가에 대한 결정을 세마포어를 통해서 하게 된다. 자원이 사용 가능하지 않다면 기본적으로 운영체제는 요청한 프로세스를 관련한 큐에 대기 시킨다. 그리고 자원이 사용 가능한 상태가 되면 그 프로세스에게 알려주고 실행시키게 된다. 이것은 자원의 사용가능성에 대한 처리를 간편하게 해주는 역할을 하게 된다. 실생활에서 예를 든다면 교차되는 선로에서 반대 방향으로 진행하는 열차를 대기 시키는 신호등과 같은 역할을 하게 된다. 대부분 세마포어는 프로세스 동기화나 lock을 위해 사용된다. 보통 세마포어는 이진수(Binary)이거나 Counting으로 이루어졋다. 한 binary세마포어는 한 자원을 제어한다. 가령 0이면 자원이 사용 중이라는 뜻이고, 1이면 사용 가능하다는 뜻이 된다

Message queues

메시지큐는 프로세스간에 크지 않은 양의 데이터를 구조화된 방식으로 넘겨주는데 사용된다. 전달되는 정보는 미리 지정된 메시지 구조체를 통하게 된다. 메시지를 발생시키는 프로세스는 사용자 정의의 형을 명시하고 메시지를 시스템이 유지시키는 메시지 큐에 위치 시킨다. 그 메시지 큐를 액세스하는 프로세스는 FIFO(선입선출)방식으로 특정 타입의 메시지를 선택적으로 읽기 위해 메시지 타입을 이용하게 된다. 메시지큐는 프로그램에게 여러 프로그램으로부터 오는 데이터를 멀티플렉싱을 할.수 있도록 해준다.

Shared memory

공유메모리는 다중프로세스들이 가상메모리를 공유할 수 있도록 해준다. 이 방법은 메모리 공유를 위한 가장 빠른 수단이긴 하지만 가장 간편한 수단은 아니다. 일반적으로 한 프로세스는 공유메모리 세그먼트를 생성하고 할당하게 된다. 생성시점에서 사이즈와 사용허가권에 대한 설정이 된다. 그리고 프로세스는 세그먼트를 어태치(attach)하고 연다. 이것이 현재의 데이터 영역으로 맵핑을 발생시킨다. 또한 필요하다면 세그먼트를 초기화한다. 이렇게 발생된 공유영역은 다른 프로세스가 허가권이 설정되어 있다면 접근할 수 있게 되고 그 영역을 자신의 데이터 영역으로 맵핑을 하고 쓰게 된다. 보통은 세마포어가 공유영역에 대한 접근을 제어하는데 이용된다. 하나의 프로세스가 작업을 끝내게 되면 공유영역을 지우는 것이 아니라 detach하게 된다. 그리고 자신의 소유권을 다른 프로세스에게 이양하게 된다. 그리고 공유영역을 쓰던 모든 프로세스가 죽게 되었을 때 일반적으로 영역을 생성시킨 프로세스가 제거에 대한 책임을 지게 된다. 데이터는 공유 영역을 통해 전달이 되는데 이것이 가장 빠른 IPC방법이다. 그러나 현재 64bit가 아닌 32bit 컴퓨팅에서 발생되는 대용량 데이터 ( 256MB ) 처리하기 위해서는 새로운 옵션으로 프로그램을 컴파일 할 것을 요구한다.

Memory mapping 에 대한 이해

응용프로그램의 명령이 수행되는 속도는 보통 프로그램addressable 메모리 영역밖을 얼마나 많이 접근하느냐에 달려있다고 해도 과언이 아니다. 즉 많을수록 속도는 늦어 질 수 밖에 없다. 이런 메모리 외부영역을 접근하는 트랜잭션 오버헤드를 줄이기 위해 OS는 두가지 방식을 제시하고 있다. 하나는 파일을 프로세스 메모리영역에 맵핑하는 것이 있다. 흔히 파일 메모리맵핑기법으로 불리기도 한다. 두번째는 협력하는 프로세스간에 사용하는 공유영역을 둠으로서 오버헤드를 줄일 수 있다 메모리팹핑화일은 프로세스로 하여금 직접적으로 데이터를 접근할 수 있는 메커니즘을 제공한다. 이것은 파일을 열고 읽으면서 데이터를 자신의 데이터 버퍼로 복사하는 작업을 없애 줌으로서 상당한 I/O이동을 줄여준다. 한 파일을 맵핑하는 프로세스가 하나 이상 일 때는 공유를 하게 된다. Mapped memory영역 ( 또한 shared memory 영역으로도 불리는)은 프로세스간에 데이터를 교환하는 대규모 풀(pool)을 제공한 것이다. 그러나 락킹이나 접근제어에 대한 부분은 signal이나 semaphore를 사용하여 설정하여야 한다. 이렇게 하여야 한 프로세스가 사용중인 데이터를 변경하는 것과 같은 접근 충돌을 막을 수 있다. 공유메모리 영역은 메시지로 보내기에는 큰 공용데이터베이스의 데이터를 여러 프로세스가 공유하는 경우에 특히 유용하다. 맵핑은 파일을 읽고 쓰는데에 따르는 오버헤드를 줄일 수 있다고 했다. 파일의 내용이 유저영역으로 올라오게 되면 (맵핑) 다른 프로세스들은 마치 메모리에 올라 온 것처럼 시스템콜(I/O)를 사용하지 않고 포인터를 이용해 직접 접근하게 되는 것이다. 또한 디스크에 있는 파일은 마치 paging 영역처럼 활용됨으로써 페이징 공간을 줄일 수있다. 프로그램은 어떠한 정규파일에 대해서도 맵핑을 할 수 있다. 이런 특징은 실행코드를 가지는 오브젝트코드에도 적용 가능하다. 이렇게 하면 일반 파일보다 좀더 빠르게 액세스 할 수 있게 되기 때문에 실행파일을 좀더 빨리 load할 수 있다. 보다 자세한 사항은 shmat서브루틴을 참고 한다.
And

    P2P (peer-to-peer)

    혼합형 P2P : 서버가 개입되는 혼합형

    개방형 P2P : 서버 간섭이 없는


  1. 냅스터 : 혼합형 P2P
    • 냅스터 서버는 사용자가 중앙 서버에 접속하는 순간 PC MP3, WMA 음악파일을 서버에 전송해 이것을 목록화 하는 방식
    • 접속한 모든 사용자 음악 파일은 중앙 서버에 모두 데이터화됙, 파일을 다운 받고자 하는 컴퓨터와 제공하는 컴퓨터를 1:1 연경하여 파일을 전송하는 방식
    • 국내 대표적인 냅스터 방식 프로그램 - 소리바다, 브이쉐어
    • 스타형 : 하나의 네트워크 장치에 별처럼 다른 여러대의 네트워크 장치가 붙은 형태. 보통 다른 네트워크장치들을 중재하는장치는 허브/스위치 또는 멀티포트랜카드가 장착된 서버가 된다. 허브/스위치 같은 중심이 되는 네트워크 장치의 성능에 큰 영향을 받는다.

    사용자 삽입 이미지


  2. 그누텔라 : 개방형 P2P
    • 서버 간섭이 없고 파일 형식에 따른 제약이 없어 인터넷의 가장 원초적인 형태
    • 중앙 통제창치를 거치지 않고 개인간의 파일 교환이기 때문에 냅스터에 비해 훨씬 자유롭게 정보를 주고 받을 있다.
    • 서버가 없기 때문에 서비스 업체는 저작권 소송 문제를 피할 있다.
    • 단점 :
      • 서버에 등록된 목록만 검색하는 것이 아니라 각각의 연결된 컴퓨터에 직접 들어가 자료를 검색하고, 자료가 없으면 다시 다른 컴퓨터로 들어가 검색하는 작업을 반복하기 때문에 시스템 과부하를 일으킬 있는 문제
      • 보안에 치명적인 결함
      • 검색과 다운로드 속도가 냅스터에 비해크게 떨어지고, 이용자와 파일 추적이 불가능해 음란물, 불법 소프트웨어의 유통을 막을 있는 보안쳬계는 갖추고 있지 않다.

    • 그물형 : 각 네트워크장치끼리 모두 연결된 형태. 하나의 네트워크 장치는 다른 모든 네트워크장치와 각각 케이블로 연결하게 된다. 어느 한선이 단선되더라도 다른 케이블로 통신이 되고, 각 장치식별로 통신이 간단한, 가장 신뢰할 수 있는 형태이지만 비용 문제로 현실에서 거의 사용되지 않는다.

    사용자 삽입 이미지


And
 

우선 예재 프로그램을 대충 만들어 보겠습니다.

각 section은 어떤 특정한 일을 하는 부분이고, pid, pid2는 미리 선언했다고 가정합시다.


// section A


pid = fork();

if (pid != 0) {

    // section B

}

else {

    // section C

    pid2 = fork();

    if (pid2 != 0) {

        // section D

    }

    else {

        // section E

    }

    // section F

}


section G



자.. 이제 이 프로그램을 컴파일해서 실행파일을 만들구요...

실행 파일을 실행 시키면 우선 첫 프로세스가 뜨겠죠? 이놈을 P1이라고 부릅시다.

P1은 프로그램이 짜여진대로 section A를 실행하고 pid = fork()문을 만납니다.

그리고 fork()를 실행하지요... 그러면 새로운 프로세스가 만들어지는데 P2라고 부릅시다.


P2는 P1의 환경을 그대로 가져옵니다. 즉, 지금 프로그램이 어디까지 실행되었는가라는

정보까지 그대로 가져오지요.. 그래서 P1도 P2도 모두 fork())이후의 pid = (fork()의 return 값)

pid에 대입하는 부분부터 실행합니다.

자.. 문제는 P1은 fork로부터 P2의 프로세스 ID를 받습니다.

새로 프로세스가 만들어졌으니 당연히 프로세스 ID가 있겠죠?

P2는 자기가 새로 만들어진 놈이므로 그냥 0을 return 받습니다.

따라서 똑같은 부분부터 시작은 하되.... fork()의 return값은 다른 놈을 가지고 P1, P2가 실행됩니다.

이 때, 우리는 주로 P1을 부모, P2를 자식이라고 설명합니다.


바로 다음 if문에 의해서

P1은 section B를 실행하게 되고 P2는 section C를 실행하게 됩니다. 

return 받은 pid가 다르니까 if의 조건이 달라지죠?

P1은 section B를 실행한 후에 당연히 section G를 실행하고 끝납니다.

P2는 section C를 실행하고 다시 fork()를 만납니다.

fork를 실행하면 아시다시피 fork를 호출한 프로세스와 똑같은 프로세스가 하나 더

만들어 집니다.

즉 P2와 똑같은 놈 P3가 만들어지고 fork()로 부터 return을

P2는 P3의 프로세스 ID를 받고

P3는 자신이 fork되었으니 0을 받습니다.

그리고는 똑같은 위치인 pid2 = (fork의 return값) 을 실행합니다.

이때는 P2가 부모이고 P3가 자식이죠?

P2는 section D, F, G를 차례로 수행하고 끝날테구요..

P3는 section E,F,G를 수행하고 끝납니다.


여기서 주의할 점은 각 프로세스가 어느 놈이 먼저 수행될지는 아무도 모른다는 것이고,

이를 위해서 동기화 방법들이 있는 것입니다.


원본 위치 <http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10203&eid=n8OK2wWtO3/UXmPooNhPW2sdQgvDEWQz&qb=Zm9yaw==&pid=fvpKRloQsClssaVBrfdsss--408388&sid=SDpMUhYpOkgAAFsjn@k>

And
Nagle 알고리즘


- 작은 data를 tcp layer차원에서 모으고 있다가 ACK에 같이 실려서 보낸다.
- 이 알고리즘은 ACK가 빠르게오면 올수록 packet을 빨리 보낼 수가 있기 때문에
LAN에 적합하다.



이것은 TCP의 동작 메카니즘에서 발생하는 문제이다. TCP에서 interactive data flow인 경우에 하나의 TCP 연결 속에서 클라이언트와 서버 사이에 서로 주고받고 하는 패킷 교환이 일어나게 된다. 이때 1 바이트의 데이타와 20 바이트의 헤더로 구성되는 매우 작은 TCP 패킷들로서 상호간 동작이 연속적으로 일어난다면 트래픽의 혼잡을 가중시킬 수 있다.

이러한 문제를 해결하기 위한 방법이 Nagle 알고리즘이라 하는 것이다. 이미 전송한 패킷이 있을 때 이 패킷에 대한 수신 성공을 알리는 ack 패킷이 도착하기 전까지는 다른 패킷을 전송하지 않고 버퍼에 대기시키도록 한다. 이렇게 기다리는 동안에 몇 개의 패킷이 전송을 위해 대기하게 될 수 있고, ack가 도착했을 때 이들 전송 대기 패킷들을 하나의 세그먼트로 묶어서 전달하도록 할 수 있다.

이러한 메카니즘은 파이프라인 동작에서 문제를 일으킬 수 있다. 왜냐하면 파이프라인을 통해 연속적으로 요구 메시지가 전달되어야 하는데 Nagle 알고리즘에 의해 즉시 전송되지 못하고 잠깐 대기해야 하는 문제가 생기기 때문이다. 이의 해결책은 Nagle 알고리즘을 사용하지 않는 것으로 TCP 동작을 설정하고 패킷 전송을 하면 된다.



TCP_NODELAY는 Nagle 버퍼링 알고리즘을 중지시킬 특별한 목적으로 사용된다. 이것은 전송은 작은 단위로 자주 이루어 지지만 즉각적인 응답은 필요 없는 어플리케이션에서만 사용 되어야 한다.(마우스 움직임 같은)

사용자 삽입 이미지
And