Friday, January 29, 2010

Design patterns : Singleton pattern

Singleton design pattern is required when you want to allow only one instance of the class to be created. Database connections and filesystems are examples where singleton classes might be required. You can also use a singleton class to store variables which need global access - thereby limiting the scope of those variables and keeping the global space variable free.

With singleton design pattern, following points need to be ensured
  • Ensure that only a single instance of the class is created.
  • Provide a global point of access to the object.
  • The creation of the object should be thread safe to avoid multiple instances in a multi-threaded environment.

An illustration in java (from wikipedia)

public class Singleton 
{
  // Private constructor prevents instantiation from other classes
  private Singleton() {}
         
  /**
   * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
   * or the first access to SingletonHolder.INSTANCE, not before.
  */
  private static class SingletonHolder 
  { 
    private static final Singleton INSTANCE = new Singleton();
  }
                                      
  public static Singleton getInstance() 
  {
    return SingletonHolder.INSTANCE;
  }
}

Another illustration in php

class singleton
{
  private static $_instance;
  
  //private constructor to prevent instantiation from other classes
  private function __construct()
  {  }

  private function __destruct()
  {  }

  // only first call to getInstance creates and returns an instance. 
  // next call returns the already created instance.
  public static function getInstance()
  {
    if(self::$_instance === null)
    {
      self::$_instance = new self();
    }
    return self::$_instance;
  }

}

How to get your passport made in simple easy steps.

Prelude : If you have the time, the patience and the ability to coerce and bribe people efficiently, you can save money by going directly to the passport office and interacting with the peon there. It seems that with good interaction skills, the passport can be had in a weeks time with a bribe of only 1000.

Preparation : If you lack the time, then, be prepared to spend around 4K. The list of documents required would be your
=> ID proof - pan card, Driving licence.
=> Residence proof - electricity bill, voter id card.
=> Age proof - school leaving certificate.
=> References - people who could vouch for you - someone who stays close by.

Step 1 : Look out for ads in newspapers for people who make passports. You can also ask people who hang around ATMs (offereing credit cards or policies). They generally work in association with the passport offices to "easily" get your form filled and application passed. When you are filling the application, remember to write your name and sign. Give all documents - they should not need the original documents (because they have some setup with the passport office). And pay them their "form submission fee" - which is passport fee + agent fee = around 2K. You can bargain. There are also agencies who specialize in making of passport and pan-card.

Step 2 : Followup with the "agent" to get the receipt of submission of application for passport. The actual process of creation of passport starts only after the application is submitted. If your agent has good connections and has greased the palms nicely with the money you have given, then you would get the receipt very fast.

Step 3 : Once the application receipt is in your hand - have another list of documents ready and wait -
=> ID proof
=> Residence proof - which shows residence at the location for more than a year.
=> Age proof
=> Residence proof of past addresses - at least two location where you have stayed earlier.

Step 4 : In 7-15 days time you would get an official from Intelligence department who would come to your house for verification. He would ask for all sorts of documents and keep you running around the house. The point he basically wants to make is that unless you grease his palms, he wont sign and forward the documents further. If you can show him all the documents he asks for, you will have an edge over him and may be able to bargain with him for the bribe money. Ofcourse he would start the bargain at 1K, but if your negotiation skills are good, you can bring him down to 500. Another point he will make is the police department (to whom he will be forwarding your app) can be bargained with - but do not trust him. The less you pay in the process of making him happy - the better.

Step 5 : Again wait for the police official who will come in a week's time. He will carry a file with him with maybe around 100 applications. He will start asking questions about where you have stayed earlier and the time of your stay. If you happen to carry residence proof of past addresses - you can have an edge over him. Else you have to just play along. If he threatens you that your past locations cannot be verified, dont worry - he is just trying to make you nervous - so he could extract more money in the bribe. Ask him gently about "how much would be needed to get the verification done ?" and he might ask for 1000 - again. If you try to bargain - he would say that he could make your application go around police stations for six months and your case will be lost. Dont worry - just bargain gently. If you tell him that the previous intelligence guy asked for the same amount - he would say that the guy had only a single sign to do - and he is supposed to get 3-4 signatures to do. Just play along and if possible, bring him down to 500. Pay him and wait.

Step 6 : Keep on checking the status of your passport online at http://passport.gov.in/. You will get a notification that your passport is on way. Keep a tab on the local post office and your snail-mail box.

Step 7 : A guy from the post may come to deliver the passport - within 15-20 days time. He would ask for "chai-pani". Dont offer him tea. Simply hand him 20-50 rs and get your passport.


The point to note here is that at every stage a hand has to be greased. Even if the details given by you are wrong, you would still get your passport if the hands are greased properly. Only the amount of grease will vary. With the 6th pay commission in force now - you might have hoped that the officials would be less greedy. But it has only lead to increase in the greed of the government officials and now they charge more for than before.

Monday, January 11, 2010

Forking Vs. Threading

What is Fork/Forking?

Fork is nothing but a new process that looks exactly like the old or the parent process but still it is a different process with different process ID and having it’s own memory. Parent process creates a separate address space for child. Both parent and child process possess the same code segment, but execute independently from each other.

The simplest example of forking is when you run a command on shell in unix/linux. Each time a user issues a command, the shell forks a child process and the task is done.

When a fork system call is issued, a copy of all the pages corresponding to the parent process is created, loaded into a separate memory location by the OS for the child process, but in certain cases, this is not needed. Like in ‘exec’ system calls, there is not need to copy the parent process pages, as execv replaces the address space of the parent process itself.

Few things to note about forking are:

  • The child process will be having it’s own unique process ID.

  • The child process shall have it’s own copy of parent’s file descriptor.

  • File locks set by parent process shall not be inherited by child process.

  • Any semaphores that are open in the parent process shall also be open in the child process.

  • Child process shall have it’s own copy of message queue descriptors of the parents.

  • Child will have it’s own address space and memory.



Fork is universally accepted than thread because of the following reasons:

  • Development is much easier on fork based implementations.

  • Fork based code a more maintainable.

  • Forking is much safer and more secure because each forked process runs in its own virtual address space. If one process crashes or has a buffer overrun, it does not affect any other process at all.

  • Threads code is much harder to debug than fork.

  • Fork are more portable than threads.

  • Forking is faster than threading on single cpu as there are no locking over-heads or context switching.


Some of the applications in which forking is used are: telnetd(freebsd), vsftpd, proftpd, Apache13, Apache2, thttpd, PostgreSQL.

Pitfalls in Fork:

  • In fork, every new process should have it’s own memory/address space, hence a longer startup and stopping time.

  • If you fork, you have two independent processes which need to talk to each other in some way. This inter-process communication is really costly.

  • When the parent exits before the forked child, you will get a ghost process. That is all much easier with a thread. You can end, suspend and resume threads from the parent easily. And if your parent exits suddenly the thread will be ended automatically.

  • In-sufficient storage space could lead the fork system to fail.



What are Threads/Threading?

Threads are Light Weight Processes (LWPs). Traditionally, a thread is just a CPU (and some other minimal state) state with the process containing the remains (data, stack, I/O, signals). Threads require less overhead than “forking” or spawning a new process because the system does not initialize a new system virtual memory space and environment for the process. While most effective on a multiprocessor system where the process flow can be scheduled to run on another processor thus gaining speed through parallel or distributed processing, gains are also found on uniprocessor systems which exploit latency in I/O and other system functions which may halt process execution.

Threads in the same process share:
== Process instructions
== Most data
== open files (descriptors)
== signals and signal handlers
== current working directory
== User and group id

Each thread has a unique:
== Thread ID
== set of registers, stack pointer
== stack for local variables, return addresses
== signal mask
== priority
== Return value: errno

Few things to note about threading are:

  • Thread are most effective on multi-processor or multi-core systems.

  • For thread – only one process/thread table and one scheduler is needed.

  • All threads within a process share the same address space.

  • A thread does not maintain a list of created threads, nor does it know the thread that created it.

  • Threads reduce overhead by sharing fundamental parts.

  • Threads are more effective in memory management because they uses the same memory block of the parent instead of creating new.



Pitfalls in threads:

  • Race conditions: The big loss with threads is that there is no natural protection from having multiple threads working on the same data at the same time without knowing that others are messing with it. This is called race condition. While the code may appear on the screen in the order you wish the code to execute, threads are scheduled by the operating system and are executed at random. It cannot be assumed that threads are executed in the order they are created. They may also execute at different speeds. When threads are executing (racing to complete) they may give unexpected results (race condition). Mutexes and joins must be utilized to achieve a predictable execution order and outcome.

  • Thread safe code: The threaded routines must call functions which are “thread safe”. This means that there are no static or global variables which other threads may clobber or read assuming single threaded operation. If static or global variables are used then mutexes must be applied or the functions must be re-written to avoid the use of these variables. In C, local variables are dynamically allocated on the stack. Therefore, any function that does not use static data or other shared resources is thread-safe. Thread-unsafe functions may be used by only one thread at a time in a program and the uniqueness of the thread must be ensured. Many non-reentrant functions return a pointer to static data. This can be avoided by returning dynamically allocated data or using caller-provided storage. An example of a non-thread safe function is strtok which is also not re-entrant. The “thread safe” version is the re-entrant version strtok_r.


Advantages in threads:

  • Threads share the same memory space hence sharing data between them is really faster means inter-process communication (IPC) is real fast.

  • If properly designed and implemented threads give you more speed because there aint any process level context switching in a multi threaded application.

  • .Threads are really fast to start and terminate


Some of the applications in which threading is used are: MySQL, Firebird, Apache2, MySQL 323

FAQ’s:

1. Which should i use in my application ?

Ans: That depends on a lot of factors. Forking is more heavy-weight than threading, and have a higher startup and shutdown cost. Interprocess communication (IPC) is also harder and slower than interthread communication. Actually threads really win the race when it comes to inter communication. Conversely, whereas if a thread crashes, it takes down all of the other threads in the process, and if a thread has a buffer overrun, it opens up a security hole in all of the threads.

which would share the same address space with the parent process and they only needed a reduced context switch, which would make the context switch more efficient.

2. Which one is better, threading or forking ?

Ans: That is something which totally depends on what you are looking for. Still to answer, In a contemporary Linux (2.6.x) there is not much difference in performance between a context switch of a process/forking compared to a thread (only the MMU stuff is additional for the thread). There is the issue with the shared address space, which means that a faulty pointer in a thread can corrupt memory of the parent process or another thread within the same address space.

3. What kinds of things should be threaded or multitasked?

Ans: If you are a programmer and would like to take advantage of multithreading, the natural question is what parts of the program should/ should not be threaded. Here are a few rules of thumb (if you say “yes” to these, have fun!):

  • Are there groups of lengthy operations that don’t necessarily depend on other processing (like painting a window, printing a document, responding to a mouse-click, calculating a spreadsheet column, signal handling, etc.)?

  • Will there be few locks on data (the amount of shared data is identifiable and “small”)?

  • Are you prepared to worry about locking (mutually excluding data regions from other threads), deadlocks (a condition where two COEs have locked data that other is trying to get) and race conditions (a nasty, intractable problem where data is not locked properly and gets corrupted through threaded reads & writes)?

  • Could the task be broken into various “responsibilities”? E.g. Could one thread handle the signals, another handle GUI stuff, etc.?


Conclusions:

1. Whether you have to use threading or forking, totally depends on the requirement of your application.
2. Threads more powerful than events, but power is not something which is always needed.
3. Threads are much harder to program than forking, so only for experts.
4. Use threads mostly for performance-critical applications.

source : http://www.geekride.com/index.php/2010/01/fork-forking-vs-thread-threading-linux-kernel/