Concurrent servers
This presentation is the property of its rightful owner.
Sponsored Links
1 / 24

Concurrent Servers PowerPoint PPT Presentation


  • 79 Views
  • Uploaded on
  • Presentation posted in: General

Concurrent Servers. Idea Behind Concurrent Servers. Server. X. Client 1. Server 1. Idea Behind Concurrent Servers. Server. Client 1. Server 1. Idea Behind Concurrent Servers. Server. Client 1. Server 1. Client 2. Idea Behind Concurrent Servers. Server. Client 1. Server 1.

Download Presentation

Concurrent Servers

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Concurrent servers

Concurrent Servers


Idea behind concurrent servers

Idea Behind Concurrent Servers

Server

X

Client 1

Server 1


Idea behind concurrent servers1

Idea Behind Concurrent Servers

Server

Client 1

Server 1


Idea behind concurrent servers2

Idea Behind Concurrent Servers

Server

Client 1

Server 1

Client 2


Idea behind concurrent servers3

Idea Behind Concurrent Servers

Server

Client 1

Server 1

Server 2

Client 2


Idea behind concurrent servers4

Idea Behind Concurrent Servers

Server

Client 1

Server 1

Server 2

Client 2


Idea behind concurrent servers5

Idea Behind Concurrent Servers

Server

X

Client 1

Server 1

Server 2

Client 2


Idea behind concurrent servers6

Idea Behind Concurrent Servers

Server

Client 1

Server 1

Server 2

Client 2


Creating a new server fork

Creating a New Server - fork()

listenfd = Socket( … )

Initialize server address

Bind( listenfd, … )

for ( ;; ) {

/* wait for client connection */

connfd = Accept(listenfd,…);

if( (pid = Fork() ) = = 0) {

/*I am the child */

Close(listenfd);

service_client(connfd);

Close(connfd);

exit(0);

} else /* I am the parent */

Close(connfd);

}


Points to note

Points to Note

  • fork() is called once …

  • …but it returns twice!!

    • Once in the parent server and

    • Once in the child server

  • How to distinguish parent and child??


Points to note1

Points to Note

  • fork() is called once …

  • …but it returns twice!!

    • Once in the parent server and

    • Once in the child server

  • How to distinguish parent and child??

    • Return value in child = 0

    • Return value in parent = process id of child


Points to note2

Points to Note

  • fork() is called once …

  • …but it returns twice!!

    • Once in the parent server and

    • Once in the child server

  • How to distinguish parent and child??

    • Return value in child = 0

    • Return value in parent = process id of child

  • Child server exits after servicing the client.


Running another program in child exec

Running another program in child – exec()


Running another program in child exec1

Running another program in child – exec()

Inetd daemon

listenfd = Socket(…)

Connfd = Accept(…)


Running another program in child exec2

Running another program in child – exec()

Inetd child

Inetd daemon

Close(listenfd)

listenfd = Socket(…)

Connfd = Accept(…)

Fork(…)


Running another program in child exec3

Running another program in child – exec()

Inetd child

Inetd daemon

Close(listenfd)

listenfd = Socket(…)

Connfd = Accept(…)

Fork(…)

Exec(…)

Service telnet client

Close(connfd)

Telnet server


Different types of exec

Different Types of exec()

  • int execl(char * pathname, char * arg0, … , (char *)0);

  • int execv(char * pathname, char * argv[]);

  • int execle(char * pathname, char * arg0, … , (char *)0, char envp[]);

  • int execve(char * pathname, char * argv[], char envp[]);

  • int execlp(char * filename, char * arg0, … , (char *)0);

  • int execvp(char * filename, char * argv[]);


Properties of exec

Properties of exec()

  • Replaces current process image with new program image.

    • E.g. inetd image replaced by telnet image

  • All descriptors open before exec remain open after exec.


Getting ip address port from socket

Getting IP address/port from socket

  • int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen)

    • Get the local IP/port bound to socket

  • int getpeername(int sockfd, struct sockaddr *remoteaddr, socklen_t *addrlen)

    • Get the IP/port of remote endpoint

  • Why do we need these?


Two other useful functions

Two other useful functions

  • struct hostent *gethostbyaddr (void *addr, size_t len, int type);

    • Converts from IP addr to domain name

  • struct hostent *gethostbyname (char *name);

    • Converts from domain name to IP address

  • struct hostent {

    char *h_name;/* official name of host */

    char **h_aliases; /* alias list */

    int h_addrtype; /* address type */

    int h_length; /* address length*/

    char **h_addr_list; /* address list */

    }


Signals

Signals

  • Signal is a notification to process (from OS or from another process) that an event has occurred.

  • Type of event determined by type of signal

  • Try listing all signal types using

    % kill –l

  • Some interesting signals

    • SIGCHLD, SIGTERM, SIGKILL, SIGSTOP


Handling signals

Handling Signals

  • Signals can be caught – i.e. an actionassociated with them

    • SIGKILL and SIGSTOP cannot be caught.

  • Actions can be customized using

    sigaction(…)

    which associates a signal handler with the signal.

    Details in page 120 of Steven’s book

  • Default action for most signals is to terminate the process

    • SIGCHLD and SIGURG are ignored by default.

  • Unwanted signals can be ignored

    • except SIGKILL or SIGSTOP


Zombie processes

Zombie Processes

  • When a child server dies, a SIGCHLD is sent to the parent server.

  • If parent doesn’t wait()on the child, child becomes a zombie (status “Z” seen with ps).

  • Zombies hang around forever.


How to avoid zombies

How to avoid zombies?

  • Parent should install a signal handler for SIGCHLD

  • Call wait(…)/waitpid(…)inside the signal handler

    void handle_sigchld(int signo) {

    pid_tpid;

    int stat;

    pid = wait(&stat);

    printf(“child %d terminated\n”, pid);

    }


  • Login