精华内容
下载资源
问答
  • 前些时日,出于某种需要,需要同时启动多Tomcat服务器,在网上查了半天,才找到解决的办法,拿出来分享一下,嘿嘿。 我所用Tomcat服务器都为zip版,非安装版。以两为例: 安装第二Tomcat完成后,到安装...
     
    
    前些时日,出于某种需要,需要同时启动多个Tomcat服务器,在网上查了半天,才找到解决的办法,拿出来分享一下,嘿嘿。

    我所用Tomcat服务器都为zip版,非安装版。以两个为例:
    安装第二个Tomcat完成后,到安装目录下的conf子目录中打开server.xml文件,查找以下三处:

      (1) 修改http访问端口(默认为8080端口)
             
    <Connector   className="org.apache.coyote.tomcat4.CoyoteConnector"   port="8080"   
                                   minProcessors
    ="5"   maxProcessors="75"
       
                                    enableLookups
    ="true"   redirectPort="8443"
       
                                    acceptCount
    ="100"   debug="0"   connectionTimeout="20000"
       
                                    useURIValidationHack
    ="false"   disableUploadTimeout="true"   />
     

    (大概在86行左右)将8080修改为第一个tomcat不在使用的端口号。此处所设的端口号即是以后访问web时所用的端口号。  

      (2) 修改Shutdown端口(默认为8005端口)
       
    <Server port="8005" shutdown="SHUTDOWN" debug="0">

        (大概在13行左右)将8005修改为没有在使用的端口号,例如8095   

      (3) 修改JVM启动端口(默认为8009端口)
             
       < Connector    className ="org.apache.coyote.tomcat4.CoyoteConnector"    
                                    port
     ="8009"    minProcessors ="5"    maxProcessors="75" 
       
                                    enableLookups
     ="true"    redirectPort ="8443" 
       
                                    acceptCount
     ="10"    debug ="0"    connectionTimeout="20000" 
      
                                    useURIValidationHack
     ="false" 
       
                                   protocolHandlerClassName
     ="org.apache.jk.server.JkCoyoteHandler" />

      (大概在107行左右)将8009修改为没有在使用的端口号,例如8099   
       
    这样就没问题了。
    展开全文
  • 游戏服务器应该为每用户开辟一个进程。因为同一进程间的线程会相互影响, 一线程死掉会影响其他线程,从而导致进程崩溃。因此为了保证不同用户之 间不会相互影响,应该为每用户开辟一个进程 ...

    参考回答:

    游戏服务器应该为每个用户开辟一个进程。因为同一进程间的线程会相互影响,
    一个线程死掉会影响其他线程,从而导致进程崩溃。因此为了保证不同用户之
    间不会相互影响,应该为每个用户开辟一个进程
    
    展开全文
  • 如果实现一客户端与服务器的交互比较容易(直接用TCP的编程流程就可以实现,只是这样写出的程序只能是一客户端交互释放连接后其他客户端才可以与服务器交互 ),但是要实现多客户端同时与同一服务器的交互就相对...

            如果实现一客户端与服务器的交互比较容易(直接用TCP的编程流程就可以实现,只是这样写出的程序只能是一个客户端交互释放连接后其他客户端才可以与服务器交互 ),但是要实现多个客户端同时与同一服务器的交互就相对复杂一点。

    我们先给出服务器处理同一客户端的多次访问的伪代码:

                               

    要实现多个客户端同时与同一服务器的交互,就要求服务器与客户端的交互要并发处理。我们就想到用多进程,或者多线程来实现。以下我们分别用多进程和多线程来实现多个客户端同时与同一服务器的交互。


    多进程:启动多个进程,每个进程执行和一个客户端的交互。

      1. 父进程完成与客户端的连接工作,随后创建子进程,子进程与客户端具体交互。

      2.父进程需不需要把文件描述符传递给子进程?(不需要,因为在fork之前打开的文件描述符,子进程会继承父进程打开的文件描述符。)

      3.父进程需不需要关闭文件描述符?(需要,父进程关闭文件描述符并没有断开连接,只是将PCB中的struct file中的引用计数-1,等子进程也关闭文件描述符时才真正断开连接。而只有子进程关闭文件描述符父进程不关闭文件描述符,系统就会一直为其维护这一文件描述符,会造成资源的浪费。)

      4.防止僵尸进程,需要修改信号的响应方式。

    具体代码如下:

    服务器端:

    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    #include<string.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<arpa/inet.h>
    #include<netinet/in.h>
    #include<pthread.h>
    #include<signal.h>
    
    void communication(int a)
    {
    	while(1)//一个客户端与服务器多次交互
    	{
    	    char buff[128]={0};
    	    int n=recv(a,buff,127,0);
    	    if(n<=0)
    	    {
    		    close(a);//关闭子进程的文件描述符
    		    printf("One client over\n");
    		    break;
    	     }
    	    printf("%d:%s\n",a,buff);
    	    send(a,"OK",2,0);
    	}
    }
    
    void fun(int sig)
    {
        wait(NULL);
    }
    int main()
    {
    	signal(SIGCHLD,fun);//防止僵尸进程
    	int sockfd=socket(PF_INET,SOCK_STREAM,0);
    	assert(-1!=sockfd);
    
    	struct sockaddr_in ser,cli;
    	ser.sin_family=AF_INET;
    	ser.sin_port=htons(6000);
    	ser.sin_addr.s_addr=inet_addr("127.0.0.1");
    	int res=bind(sockfd,(struct sockaddr*)&ser,sizeof(ser));
    	assert(-1!=res);
    
    	listen(sockfd,5);
    
    	while(1)//保证服务器可以与多个客户端交互
    	{
    		int len=sizeof(cli);
    		int n=accept(sockfd,(struct sockaddr*)&cli,&len);
    		if(n<0)
    		{
    			printf("link error\n");
    			continue;
    		}
    
    	    pid_t m=fork();
    		assert(m!=-1);
    		if(m==0)
    		{
    			communication(n);//与客户端交互
    			exit(0);//结束子进程,避免子进程再次进入while循环
    		}
    		else
    		{
    			close(n);//关闭父进程的文件描述符
    		}
    	}
        close(sockfd);
    }
    

    客户端:

    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    #include<string.h>
    #include<sys/socket.h>
    #include<sys/types.h>
    #include<arpa/inet.h>
    #include<netinet/in.h>
    
    int main()
    {
    	int sockfd = socket(PF_INET,SOCK_STREAM,0);
    	assert(-1!=sockfd);
    
    	struct sockaddr_in ser,cli;
    	memset(&ser,0,sizeof(ser));
    	ser.sin_family=AF_INET;
    	ser.sin_port=htons(6000);
    	ser.sin_addr.s_addr=inet_addr("127.0.0.1");
    	int res=connect(sockfd,(struct sockaddr*)&ser,sizeof(ser));
    	assert(res!=-1);
    
    	while(1)
    	{
    		printf("Please input:");
    		fflush(stdout);
    		char buff[128]={0};
    		fgets(buff,127,stdin);
    		buff[strlen(buff)-1]=0;
    
    		if(strncmp(buff,"end",3)==0)
    		{
    		    break;
    		}
    		send(sockfd,buff,strlen(buff),0);
    
    		memset(buff,0,sizeof(buff));
    		recv(sockfd,buff,127,0);
    		printf("%s\n",buff);
    	}
    	close(sockfd);
    }
    

    运行结果如下:

    客户端1:

    客户端2:

    服务器端:

    我们可以看到两个客户端的文件描述符是一样的,所以能通过文件描述符来判断是否是同一个客户端连接,需要用netstat -natp来查看客户端的ip和端口(地址对)来确定客户端。


    多线程:启动多个线程,每个线程执行和一个客户端的交互。

     1. 主线程完成与客户端的连接工作,函数线程与客户端具体交互。

     2.函数线程怎么拿到主线程的文件描述符?(创建线程时,以值传递的形式传递给函数线程,即pthread_create的参数)

     3.主线程需不需要关闭文件描述符?(文件描述符是PCB中struct file*数组的下标,同进程的多个线程共享PCB,故主线程不需要关闭文件描述符。只要有一个线程关闭文件描述符,就直接关闭了与客户端的通讯)

    代码实现如下:

    服务器端:

    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    #include<string.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<arpa/inet.h>
    #include<netinet/in.h>
    #include<pthread.h>
    
    void* communication(void* arg);
    
    int main()
    {
    	int sockfd=socket(PF_INET,SOCK_STREAM,0);
    	assert(-1!=sockfd);
    
    	struct sockaddr_in ser,cli;
    	ser.sin_family=AF_INET;
    	ser.sin_port=htons(6000);
    	ser.sin_addr.s_addr=inet_addr("127.0.0.1");
    	int res=bind(sockfd,(struct sockaddr*)&ser,sizeof(ser));
    	assert(-1!=res);
    
    	listen(sockfd,5);
    
    	while(1)//保证服务器可以连接多个客户端
    	{
    		int len=sizeof(cli);
    		int c=accept(sockfd,(struct sockaddr*)&cli,&len);
            if(c<0)
            {
                printf("link error\n");
                continue;
            }
    
    		pthread_t id;
    		int n=pthread_create(&id,NULL,communication,(void*)c);//创建线程,将文件描述符强转为void*,此处只能是值传递,地址传递的话,可能函数线程还没拿到该地址的值,就被主线程更改
    		assert(n==0);
    	}
        close(sockfd);
    }
    
    void* communication(void* arg)//函数线程完成与客户端的交互
    {
    	while(1)//实现与一个客户端的多次交互
    	{
    	    char buff[128]={0};
    	    int c=(int)arg;//将文件描述符转回int型
    	    int n=recv(c,buff,127,0);
    	    if(n<=0)
    	    {
    			close(c);
    			printf("%d client over\n",c);
    			break;
    	    }
    	    printf("%d:%s\n",c,buff);
    
    		send(c,"OK",2,0);
    	}
    }

    客户端yu多进程的客户端相同。

    运行结果如下:

    客户端1:

    客户端2:

    服务器端:

    多线程的一个缺点:一个进程PCB中struct file*数组的大小的确定的,所以能连接的客户端的个数比较有限。


    多进程与多线程的选择??

    多进程和多线程各有利弊,我们需要根据具体业务需求来选择使用哪一种。

    我们从以下五个方面对多进程和多线程进行比较:

    1. 编程角度:多线程代码实现简单,控制也简单一些。
    2. 占据资源:多进程比多线程占据的资源多。
    3. 切换速度:进程CPU调度时比较慢,故多进程比多线程慢。
    4. 资源共享:线程间比进程间共享资源多。
    5. 安全性:进程比线程安全,因为线程共享的资源多,而进程之间是相互独立的。
    6. 能够创建的个数:linux中进程中能够创建的线程数量相比于系统能够创建的进程数量少得多。
    展开全文
  • Oracle服务器进程

    千次阅读 2018-04-13 19:00:13
    Oracle实例主要有3类进程:A 服务器进程 server process根据客户的请求来完成工作。专用/共享服务器,就是服务器进程B 后台进程 background process随数据库而启动,完成各种维护任务,如将块写至磁盘、维护在线重做...

    Oracle中的各个进程要完成某个特定的任务或一组任务,每个进程都会分配内部内存(PGA内存)来完成它的任务。

    Oracle实例主要有3类进程:

    A 服务器进程 server process
    根据客户的请求来完成工作。专用/共享服务器,就是服务器进程

    B 后台进程 background process
    随数据库而启动,完成各种维护任务,如将块写至磁盘、维护在线重做日志、清理异常中止的进程等。

    C 从属进程 slave process

    类似于后台进程,不过它们要代表后台进程或服务器进程完成一些额外的工作。


    A服务器进程

    代表客户会话完成工作的进程。应用向数据库发送的SQL语句最后就要由这些进程接收并执行。

    dedicated server连接
    会在服务器上得到针对这个连接的一个专用进程。数据库连接与服务器上的一个进程之间存在一对一的映射。

    shared server
    多个会话可以共享一个服务器进程池,其中的进程由Oracle实例生成和管理。

    你所连接的是一个数据库调度器(dispatcher),而不是特意为连接创建的一个专用服务器进程。


    专用or共享 服务器进程的任务是一样的:要处理你提交的所有SQL。当你向数据库提交一个SELECT * FROM EMP查询时,会有一个Oracle专用/共享服务器进程解析这个查询并把它放在共享池中(或者最好能发现这个查询已经在共享池中)。这个进程要提出查询计划,如果必要,还要执行这个查询计划可能在缓冲区缓存中找到必要的数据,或者将数据从磁盘读入缓冲区缓存中。这些服务器进程是干重活的进程。在很多情况下,你都会发现这些进程占用的系统CPU时间最多,因为正是这些进程来执行排序、汇总、联结等等工作,几乎所有工作都是这些进程做的。

    ------------------------------------------------------------------------专用服务器

    客户应用中链接着Oracle库,这些库提供了与数据库通信所需的API。这些API知道如何向数据库提交查询,并处理返回的游标。它们知道如何把你的请求打包为网络调用,专用服务器则知道如何将这些网络调用解开。这部分软件称为Oracle Net,这是一个网络软件/协议,Oracle利用这个软件来支持客户/服务器处理(即使在一个n层体系结构中也会“潜伏”着客户/服务器程序)。不过,即使从技术上讲没有涉及Oracle Net,Oracle也采用了同样的体系结构。也就是说,即使客户和服务器在同一台机器上,也会采用这种两进程(也称为两任务)体系结构。这个体系结构有两个好处:
    1.远程执行(remote execution):客户应用可能在另一台机器上执行(而不是数据库所在的机器)
    2.地址空间隔离(address space isolation):服务器进程可以读写SGA。如果客户进程和服务器进程物理地链接在一起,客户进程中一个错误的指针就能轻松地破坏SGA中的数据结构。

    可以在同一台机器上运行客户和服务器,就能很清楚地看出这种父/子进程的创建

    scott@ORCL>select a.spid dedicated_server,
      2  b.process clientpid
      3  from v$process a, v$session b
      4  where a.addr = b.paddr
      5  and b.sid = (select sid from v$mystat where rownum=1)
      6  /
    
    DEDICATED_SERVER         CLIENTPID
    ------------------------ ------------------------
    5748                     1408:3388
    

    查询与专用服务器相关联的进程ID(PID),从V$PROCESS得到的SPID是执行该查询时所用进程的操作系统PID



    shared server

    共享服务器连接强制要求必须使用Oracle Net,即使客户和服务器都在同一台机器上也不例外。如果不使用Oracle TNS监听器,就无法使用共享服务器。客户应用会连接到Oracle TNS监听器,并重定向或转交给一个调度器。调度器充当客户应用和共享服务器进程之间的“导管”。


    在此可以看到,客户应用(其中链接了Oracle库)会与一个调度器进程物理连接。调度器只负责从客户应用接收入站请求,并把它们放入SGA中的一个请求队列第一个可用的共享服务器进程从队列中选择请求,并附加相关会话的UGA共享服务器处理这个请求,把得到的输出放在响应队列中调度器一直监视着响应队列来得到结果,并把结果传回给客户应用。就客户而言,它分不清到底是通过专用 or 共享 服务器连接进行连接,看上去二者都一样,只是在数据库级二者的区别才会明显。


    连接与会话

    在一条连接上可以建立0个、一个或多个会话各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。一个会话中的提交不会影响该连接上的任何其他会话。实际上,一条连接上的各个会话可以使用不同的用户身份

    在Oracle中,连接只是客户进程和数据库实例之间的一条特殊线路,最常见的就是网络连接。这条连接可能连接到一个专用服务器进程,也可能连接到调度器。如前所述,连接上可以有0个或多个会话,这说明可以有连接而无相应的会话。另外,一个会话可以有连接也可以没有连接。使用高级Oracle Net特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话上执行某个操作时,它会重新建立物理连接。

    connection

    客户进程Oracle实例一条物理路径(例如,客户与实例之间的一个网络连接)
    连接可以在网络上建立,或者通过IPC机制建立。通常会在客户进程与一个专用服务器或一个调度器之间建立连接。


    session

    会话是实例中存在的一个逻辑实体。这就是你的会话状态(session state),

    也就是表示特定会话的一组内存中的数据结构。客户进程要在服务器中的会话上执行SQL、提交事务和运行存储过程。多个独立的会话可以与一个连接相关联,这些会话甚至可以独立于连接存在。


    这里使用了AUTOTRACE命令,并发现有两个会话。我们在一条连接上使用一个进程创建了两个会话。以下是其中的第一个会话:

    scott@ORCL>select username, sid, serial#, server, paddr, status
      2  from v$session
      3  where username = USER
      4  /
    
    USERNAME                              SID    SERIAL# SERVER    PADDR                STATUS
    ------------------------------ ---------- ---------- --------- ----------------    --------
    SCOTT                                  67        434 DEDICATED 000007FF634DF010    ACTIVE
    这说明现在有一个会话:这是一个与单一专用服务器连接的会话。以上PADDR列是这个专用服务器进程的地址


    下面,只需打开AUTOTRACE来查看SQL*Plus中所执行语句的统计结果:

    scott@ORCL>set autotrace on statistics
    scott@ORCL>select username, sid, serial#, server, paddr, status
      2  from v$session
      3  where username = USER
      4  /
    
    USERNAME                              SID    SERIAL# SERVER    PADDR                STATUS
    ------------------------------ ---------- ---------- --------- ----------------    --------
    SCOTT                                  63        535 DEDICATED 000007FF634DF010    INACTIVE
    SCOTT                                  67        434 DEDICATED 000007FF634DF010    ACTIVE
    
    
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              0  consistent gets
              0  physical reads
              0  redo size
            992  bytes sent via SQL*Net to client
            519  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              2  rows processed
    

    这样一来,我们就有了两个会话,但是这两个会话都使用同一个专用服务器进程,从它们都有同样的PADDR值就能看出这一点。从操作系统也可以得到确认,因为没有创建新的进程,这两个会话只使用了一个进程(一条连接)。需要注意,其中一个会话(原来的会话)是ACTIVE(活动的),它正在运行查询来显示这个信息。那个INACTIVE(不活动的)会话是 AUTOTRACE 会话,它的任务是“监视”我们的实际会话,并报告它做了什么。

    在SQL*Plus 中启用AUTOTRACE时,如果执行DML操作(INSERT、UPDATE、DELETE、SELECT和MERGE),SQL*Plus会完成以下动作:
    (1) 如果还不存在辅助会话,它会使用当前连接创建一个新会话。
    (2) 要求这个新会话查询V$SESSTAT视图来记住实际会话(即运行DML的会话)的初始统计值。
    (3) 在原会话中运行DML操作。

    (4) DML语句执行结束后,SQL*Plus会请求另外那个会话(即“监视”会话)再次查询V$SESSTAT,并生成前面所示的报告,显示出原会话(执行DML的会话)的统计结果之差。

    如果关闭AUTOTRACE,SQL*Plus会终止这个额外的会话,在V$SESSION中将无法看到这个会话。

    SQL*Plus之所以会另外创建一个会话来执行监视,原因:如果使用同一个会话来监视内存使用,那执行监视本身也要使用内存,就会对统计结果造成影响(导致对统计结果的修改)。


    到目前为止,我们已经看到一条连接可以有一个或两个会话。现在,我们想使用SQL*Plus来查看一条没有任何会话的连接。在上例所用的同一个SQL*Plus窗口中,只需键入DISCONNECT

    scott@ORCL>disconnect
    从 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options 断
    开
    从技术上讲,这个命令应该叫DESTROY_ALL_SESSIONS更合适,而不是DISCONNECT,因为我们并没有真正物理地断开连接。
    在SQL*Plus中要真正地断开连接,应该执行“exit”命令,必须退出才能完全撤销连接。


    我们已经关闭了所有会话。如果使用另一个用户账户system打开另一个会话,并查询。可以看到,之前账户scott下没有会话,但是仍有一个进程,相应地有一条物理连接(使用前面的ADDR值):

    system@ORCL>select * from v$session where username = 'scott@ORCL';
    未选定行
    
    system@ORCL>select username, program
      2  from v$process
      3  where addr = hextoraw('000007FF634DF010');
    
    USERNAME        PROGRAM
    --------------- ----------------------------------------------------------------
    SYSTEM          ORACLE.EXE (SHAD)
    

    所以,这就有了一条没有相关会话的“连接”。可以使用SQL*Plus的CONNECT命令(这个命令的名字也起得不恰当),在这个现有的进程中创建一个新会话(CONNECT命令叫CREATE_SESSION更合适):

    scott@ORCL>conn scott/123456
    已连接。
    scott@ORCL>select username, sid, serial#, server, paddr, status
      2  from v$session
      3  where username = USER
      4  /
    
    USERNAME                              SID    SERIAL# SERVER    PADDR               STATUS
    ------------------------------ ---------- ---------- --------- ----------------    -------
    SCOTT                                  67        470 DEDICATED 000007FF634DF010    ACTIVE

    可以注意到,PADDR还是一样的,所以我们还是在使用同一条物理连接,但是(可能)有一个不同的SID,也许还会分配同样的SID,这取决于在我们注销时是否有别人登录,以及我们原来的SID是否可用。


    到此为止,这些测试都是用一条专用服务器连接执行的,所以PADDR正是专用服务器进程的进程地址。

    ------------------------------------------------------------------------共享服务器

    共享服务器模式设置 详见 https://blog.csdn.net/A0001AA/article/details/79915439

    下面使用共享服务器登录,并在这个会话中查询:

    sys@ORCL>select username, sid, serial#, server, paddr, status from v$session where username = USER ;
    
    USERNAME                    SID    SERIAL# SERVER    PADDR            STATUS
    -------------------- ---------- ---------- --------- ---------------- --------
    SYS                           9         87 SHARED    000007FF634DDFA0 ACTIVE
    一条连接(从客户到数据库实例的一条物理路径)上可以建立0个、1个或多个会话。我们看到了这样一个用例,其中使用了SQL*Plus的AUTOTRACE工具。还有许多其他的工具也利用了这一点。例如,Oracle Forms就使用一条连接上的多个会话来实现其调度功能。Oracle 的n层代理认证特性可用于提供从浏览器到数据库的端到端用户鉴别,这个特性也大量使用了有多个会话的单连接概念,但是每个会话中可能会使用一个不同的用户账户。随着时间的推移,会话可能会使用多个进程,特别是在共享服务器环境中这种情况更常见。另外,如果使用Oracle Net的连接池,会话可能根本不与任何进程关联;连接空闲一段时间后,客户会将其删除,然后再根据检测活动(是否需要连接)透明地重建连接。


    连接和会话之间有一种多对多的关系。不过,最常见的是专用服务器与单一会话之间的一对一关系.

    ------------------------------------------------------------------------------专用 or 共享服务器

    1. 什么时候使用专用服务器
    客户连接与服务器进程之间存在一种一对一的映射。对于目前所有基于SQL的应用来说,这是应用连接Oracle数据库的最常用的方法。设置专用服务器最简单,而且采用这种方法建立连接也最容易,基本上不需要什么配置。
    因为存在一对一的映射,所以不必担心长时间运行的事务会阻塞其他事务。其他事务只通过其自己的专用进程来处理。因此,在非OLTP环境中,也就是可能有长时间运行事务的情况下,应该只考虑使用这种模式。专用服务器是Oracle的推荐配置,它能很好地扩缩。只要服务器有足够的硬件(CPU和RAM)来应对系统所需的专用服务器进程个数,专用服务器甚至可以用于数千条并发连接。

    某些操作必须在专用服务器模式下执行,如数据库启动和关闭,所以每个数据库中可能同时有专用服务器和共享服务器,也可能只设置一个专用服务器。


    2. 什么时候使用共享服务器

    多个客户对应一个共享服务器。使用共享资源时,不要太长时间独占这个资源要确保事务的持续时间尽量短事务可以频繁地执行,但必须在短时间内执行完(这正是OLTP系统的特点)。如果事务持续时间很长,看上去整个系统都会慢下来,因为共享资源被少数进程独占着。使用共享服务器时,可能还会人工死锁(artificial deadlock)。


    你有5个共享服务器,并建立了100个用户会话。现在,一个时间点上最多可以有5个用户会话是活动的。假设其中一个用户会话更新了某一行,但没有提交。正当这个用户呆坐在那里对是否修改还有些迟疑时,可能又有另外5个用户会话力图锁住这一行。当然,这5个会话会被阻塞,只能耐心地等待这一行可用。现在,原来的用户会话(它持有这一行的锁)试图提交事务,相应地释放行上的锁。这个用户会话发现所有共享服务器都已经被那5个 等待的会话所垄断。这就出现了一个人工死锁的情况:锁的持有者永远也拿不到共享服务器来完成提交,除非某个等待的会话放弃其共享服务器但是,除非等待的 会话所等待的是一个有超时时间的锁,否则它们绝对不会放弃其共享服务器(除非让管理员通过一个专用服务器“杀死”(撤销)等待的会话来摆脱这种 困境)。

    共享服务器只适用于OLTP系统,这种系统 事务短而且频繁。在一个OLTP系统中,事务以毫秒为单位执行,任何事务的执行都会在1秒以内的片刻时间内完成。共享服务器对数据仓库很不适用,因为在数据仓库中,可能会执行耗时1分钟、2分钟、5分钟甚至更长时间的查询。如果你的系统中90%都是OLTP,只有10%“不那么OLTP”,那么可以在同一个实例上适当地混合使用专用服务器和共享服务器。采用这种方式,可以大大减少机器上针对OLTP用户的服务器进程个数,并使得“不那么OLTP”的用户不会独占共享服务器。另外,DBA可以使用内置的资源管理器(Resource Manager)进一步控制资源利用率。

    当然,使用共享服务器还有一个很重要的原因,许多高级连接特性都要求使用共享服务器。如果你想使用Oracle Net连接池 或 数据库之间使用数据库链接集合(database link concentration),必须对这些连接使用共享服务器。

    共享服务器的潜在好处

    1.减少操作系统进程/线程数

    2.刻意地限制并发度

    3.减少系统所需的内存

    展开全文
  • 同类基础博客: ...占用资源大,但是一个进程挂了不会影响另一。这与多线程刚好相反,多线程服务器不稳定。分析: 父进程循环accept,当父进程接收到链接请求之后,立即fork出一新的子进程去处理通信
  • 进程服务器

    千次阅读 2018-05-29 15:17:11
    然而在实际应用中,不可能让一个服务器长时间地为一客户服务,而需要其具有同时处理 多客户请求的能力,这种同时可以处理多客户请求的服务器称为并发服务器,其效率很 高却实现复杂。在实际应用中,并发服务....
  • 服务器进程运行查看方式

    千次阅读 2019-06-20 21:48:35
    Linux服务器进程查看命令详解 - 云+社区 - 腾讯云 原文地址 https://cloud.tencent.com/developer/article/1071977 原文复制如下: Linux 服务器正常启动后,提供服务时会调用程序,占用进程。这时候我们如何查看...
  • 在上一篇文章中,最后遗留了一僵尸进程的问题。一旦客户端关闭连接,服务器进程就会退出,然而父进程仍然存在,就产生了“白发人送黑发人”的场景。如果父进程没有主动回收(wait)子进程,或者没有忽略 SIGCHLD...
  • 然而在实际应用中,不可能让一个服务器长时间地为一客户服务,而需要其具有同时处理 多客户请求的能力,这种同时可以处理多客户请求的服务器称为并发服务器,其效率很 高却实现复杂。在实际应用中,并发服
  • 进程并发服务器

    千次阅读 2017-03-23 16:40:56
    我们来考虑有多客户同时连接一个服务器的情况。在前面的TCP套接字编程的例子中,我们已经看到,服务器程序在接受来自客户端的一新连接时,会创建出一新的套接字(已连接套接字),而原先的监听套接字则继续...
  • 服务器java进程查看

    千次阅读 2018-07-04 10:38:45
    1.首先根据你访问端口号找到程序的PId...查看进程信息:jstack 23033 |grep -A 10 0x5a24这里5a24为23076的16进制;具体转换方法可以使用程序员计算器或者浏览器开发者模式(F12即可)的console;执行完成后java线程栈...
  • 1.进程A在n端口上监听,即调用listen(listenfd,backlog);...多服务进程同时阻塞在accept等待监听套接字已建立连接的信息,那么当内核在该监听套接字上建立一连接,那么将同时唤起这些处于accept阻塞的服务进程
  • 1 打开软件setting -> ...3 重启软件就行了,但是此时打开软件有一些策略,不能直接从项目里.cbp文件,需要先打开软件,在软件里选择要运行的软件,然后再次打开软件,再打开要运行的软件,就实现多进程同时运行了
  • linux服务器查看进程数量

    千次阅读 2020-06-10 10:35:36
    Linux系统的进程是由线程组成的,当然Linux进程下的线程数是不固定的,可以是一个进程,也可以是多个进程。 一、使用命令查看Linux进程的线程数  1、使用top命令,具体用法是 top -H  加上这选项,top的每一...
  • 如何在同一台服务器起多pm2进程

    千次阅读 2015-12-13 00:00:21
    但是为了节省成本,一般公司可能也就一台服务器,这种情况,如果还是按照之前的模式,会出现同时起多pm2进程后,多node进程冲突,导致服务不可用。 怎么办? 其实官网已经有说明: Multiple PM2 on the same ...
  • Oracle 用户进程和服务器进程

    千次阅读 2012-12-18 14:48:41
    主要介绍一下用户进程、服务器进程 及PGA    1.用户进程(或称客户进程) 是指用户到Oracle数据库服务器的链接,用户进程处理用户输入并通过Oracle程序接口与Oracle服务器进程通信。用户进程还负责显示用户请求的...
  • Linux网络编程——tcp并发服务器(多进程

    万次阅读 多人点赞 2015-06-15 15:02:24
    好的服务器,一般都是并发服务器(同一时刻可以响应多客户端的请求)。并发服务器设计技术一般有:多进程服务器、多线程服务器、I/O复用服务器等。 二、多进程并发服务器 在 Linux 环境下多进程的...
  • 看了传智播客讲的linux视频,把“多进程进行socket编程”好好理解了一下,整理出来的。 用TCP协议编写了一简单的服务器、客户端,其中服务器一直在监听本机8000号端口。如果收到客户端的链接,就在服务器端把...
  • 并发服务器--多进程实现

    千次阅读 2018-03-01 21:58:17
    通过简单的socket可以实现一对一的c/s通信,当多客户端同时进行服务器访问,那么服务器只能按序的一一进行处理,除了第一客户端,其余客户端都会陷入等待。并且这样的程序只能实现半双工通信(数据能双向传输,...
  • linux shell获取部署服务器进程 及 kill该进程的方法 有时候我们需要在shell脚本中kill某个部署服务器的进程,那么可以使用以下命令实现。 下面以kill weblogic 进程为例,以下为shell脚本内容: ...
  • python多进程网络服务器

    千次阅读 2012-04-15 13:10:42
    最近看Nginx有些收获,于是想用python语言来实现一简易的网络服务器模型:一进程和3个子进程,主进程只负责创建侦听的socket,并创建子进程然后等待子进程退出,而真正的工作全部交给子进程来做,包括接收新的...
  • Error: Error: %(process_num) must be present within ...背景:一台消费者服务器,同一消费者脚本,希望开启多个进程,(多消费者,消费) 需要增加两参数: process_name=%(program_name)s_%(pr...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 966,924
精华内容 386,769
关键字:

服务器同时500个进程