bionote.net


'피플웨어' - 프로젝트를 성공으로 이끄는 가장 큰 힘, 사람!


 소프트웨어 개발은 사람에 의해서 직접 진행되는 일이기 때문에 개발 프로젝트의 성공과 실패도 인적자원의 경영방식에 따라 크게 달라질 수 있다. '피플웨어'는 효율적인 인적자원 관리에 대한 내용을 다룬 책이다. 프로젝트의 성공을 좌우하는 가장 큰 요인이 사람인만큼 사람에 대한 투자가 중요하다. 다음 두 가지 내용은 이와 관련해 특히 관심을 가지고 본 내용이다.
  • 생산적인 사무 환경은 감시와 비용에 대한 고려보다는 직원들이 정신없이 일에 집중(flow)할 수 있도록 배려가 필요하다.
  • 건전한 자극(무질서)을 통해서 일이 재미있어 진다.
이 책은 다양한 데이터와 분석을 바탕으로 현상의 문제점을 파악하면서 동시에 현실적인 해결방법을 제시하고 있다. 책의 말미에 이야기하듯이 제시된 방법들이 프로젝트의 성공을 보장해주지는 않는다. 더욱이 최신 장비를 구입하는 것과는 다르게 사람에 대한 투자는 당장 티가 나지 않는다. 하지만 진정한 이노베이션을 원한다면 몇가지 방법들을 시도해보는 것을 고려해보아야만 할 것이다.
2007/06/13 00:09 2007/06/13 00:09
top

 

Python으로 데몬(daemon) 프로세스 생성하기


데몬 프로세스는 백그라운드 모드로 실행되면서 사용자의 요청이 있을 때마다 적절한 작업을 수행해주는 프로세스를 말한다. 데몬이 단순한 백그라운드 프로세스와 구분되는 것이 데몬의 경우에는 부모 프로세스가 1번 init으로 세팅되어 있고 터미널을 가지고 있지 않다는 점이다. 따라서 다음의 과정을 따르면 POSIX 인터페이스를 이용해서 데몬을 작성할 수 있다 [1].
  1. fork()로 자식프로세스를 생성하고 부모 프로세스를 종료한다.
  2. 자식 프로세스에서 새로운 세션을 생성한다.
파이썬 코드로 다음과 같이 쓸 수 있다 [2].

def Daemon():
  try:
       pid = os.fork()
       if pid > 0: sys.exit(0)
  except OSError:
       print >>sys.stderr, "fork() failed"
       sys.exit(1)
  os.setsid()
  os.umask(0)
  try:
      pid = os.fork()
      if pid > 0: sys.exit(0)
  except OSError:
      print >>sys.stderr, "second fork failed"
      sys.exit(1)

  # REDIRECT STDOUT/STDERR TO OUT/ERR FILES #
  out_log = file("log/out",'a+')
  err_log = file("log/error",'a+',0)
  os.dup2(out_log.fileno(), sys.stdout.fileno())
  os.dup2(err_log.fileno(), sys.stderr.fileno())

  # DO WHAT YOU WANT HERE #

이 코드에서 첫번째 fork()는 부모 프로세스를 죽이고 새로운 세션을 생성한다. 두번째 fork()는 새로운 세션에서 데몬이 세션리더가 되는 것을 피하기 위해서 사용된다. os.setsid()에 의해서 데몬은 세션리더가 되는데, 세션리더가 터미널의 파일 기술자(file descriptor)를 열게 된다면 그 열린 터미널이 현재 세션의 터미널이 된다. 터미널을 가지면 데몬이 아니기 때문에 이런 경우를 안전하게 피하기 위해서 두번째 fork()를 사용해서 데몬 프로세스가 세션리더가 되는 것을 방지한다 [2].

References
[1] C로 간단한 데몬(daemon)제작하기, http://data.oss.or.kr/sw/view.html?sort=&num=649&page=1
[2] Fork a daemon process on Unix, http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012
2006/07/18 09:54 2006/07/18 09:54
top

 

큐잉(queueing) 기능의 구현


단백질의 구조를 자동으로 예측해주는 서버를 구축해서 시험 가동하던 중 한가지 문제가 생겼다. 한꺼번에 다수의 쿼리가 수행될 경우에 전체 시스템이 느려지는 현상이 발생한다. 따라서 큐잉 기능을 추가할 필요가 생겼다.

요구사항은 다음과 같다.
  1. 다수의 작업이 입력되더라도 가장 먼저 입력된 하나의 작업만을 프로세서에서 처리되도록 한다.
  2. 현재 작업큐의 상태를 모니터링할 수 있어야 한다. 이때 보여주는 정보는 작업명, 인덱스, 입력시간을 반드시 포함한다.
  3. 작업이 큐에 대기하는 시간을 최소한이 되도록 효율적이어야 한다.

조사해 본 바로는 UNIX의 named pipe를 이용하면 큐잉 기능을 구현하는 것이 가장 간편해 보였다. 실제로 병철 선배가 같은 방식으로 큐잉을 구현해봤는데 간단하고 지금도 정상적으로 작동하고 있다고 한다. 파이썬에서도 mkfifo() 함수를 제공하고 있어서 일반파일처럼 read(), write() 함수로 다룰 수 있다 [조성준, [예제] FiFO(Named Pipe), http://www.openphp.com].

사용자로부터 입력을 받으면 1) 웹프로그램은 작업큐에 작업을 입력한다. 각각의 정보를 '\0'로 구분해서 하나의 작업이 하나의 라인에 저장되도록 한다. 2) 서버 프로그램은 데몬처럼 돌면서 FIFO에 read()를 수행하고 read()가 성공하면 실제 구조 예측 프로그램에 의해서 작업이 수행되도록 한다. 3) 구조 예측 작업이 끝나면 다시 read()를 시도하는 일부터 루프를 돈다.

2006/07/17 00:28 2006/07/17 00:28
top