操做系统与服务器

瀑布模型

瀑布模型核心思想是按工序将问题化简,将功能的实现与设计分开,便于分工协做,即采用结构化的分析与设计方法将逻辑实现与物理实现分开。将软件生命周期划分为可行性分析、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,而且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。html

对于常常变化的项目而言,瀑布模型毫无价值nginx

简述模型优缺点,简述其余模型如何弥补瀑布模型的不足

优势:阶段划分清晰,各阶段人员的职责明确,便于先后活动的衔接,有利于活动的重用和管理程序员

缺点:缺少灵活性,没法解决需求常常变化的问题算法

用其余弥补不足:shell

原型化模型:用于解决需求不明确的状况数据库

螺旋模型:强调风险分析,特别适合庞大而复杂的、高风险的系统缓存

 

进程和线程

1.对进程和线程的描述,一下()是正确的安全

  A 父进程的全部线程共享相同的地址空间,父进程的全部子进程共享相同的地址空间服务器

  B 改变进程里面主线程的状态会影响其余线程的行为,改变父进程的状态不会影响其余子进程网络

  C 多线程会引发死锁,而多进程则不会

  D 以上都不对

D   进程拥有独立的地址空间,A错;多进程中父进程与子进程互不会影响,B错;多线程和多进程都会引发死锁,通常提及死锁指的都是进程间的死锁,C错。

 

 什么是进程(Process)和线程(Thread)

进程(Process)是应用程序的一次运行活动。从操做系统核心角度来讲,进程是操做系统分配和调度系统内存资源、cpu时间片等资源的基本单位,为正在运行的应用程序提供

运行环境。

线程(Thread)是程序内部有并发性的顺序代码流。是cpu调度资源的最小单元。

单位大小

进程是操做系统分配和调度系统内存资源、cpu时间片 等资源的基本单位;一个进程至少包括一个线程。进程是操做系统资源管理的实体。
线程是cpu调度资源的最小单元。线程是进程的实体。


系统资源分配上

每一个进程都有本身的内存地址空间。
线程没有本身独立的内存资源,它只有本身的执行堆栈和局部变量。可是在同属一个进程的多个线程中他们能够共享进程的内存

 

执行过程当中

执行过程当中,进程有内存单元的初始入口点,在存活阶段里拥有独立的地址空间。
进程是应用程序的一次运行活动,独立地执行;因此某一个进程崩溃之后,在保护模式下不会影响其余的进程,健壮性好。

每一个已建立的进程均可以建立进程,建立进程的进程称为父进程,被建立的新进程为子进程,这样便造成一个进程树。

父进程与子进程可并行执行;父进程等 待子进程终止执行。父进程终止后,全部的子进程也都必需要终止。

而线程不能独立地执行,它必须依附在一个运行中的应用程序上。
可是,同一个进程中的多个线程能够并发地执行,并发性高,系统在数据交换上花费的资源少,运行效率高。

每一个进程里都会有一个主线程,由它建立其余线程。

父进程为何要建立子进程 

在程序设计时,某一个具体的功能模块能够经过函数或是线程等不一样的形式来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,并且在执行时,大多只对与其相关的一些数据进行处理。若是算法存在某种错误,将有可能破坏与其同处一个地址空间的其余一些重要内容,这将形成比较严重的后果。为保护地址空间中的内容能够考虑将那些须要对地址空间中的数据进行访问的操做部分放到另一个进程的地址空间中运行,而且只容许其访问原进程地址空间中的相关数据。

 

共同点
Process和Thread都有生命周期:
create 建立,ready就绪,running运行,waitSleepJoin阻塞,suspend挂起,stoped死亡

 

 

请阐述进程与线程的区别

解答:

  • ①从概念上:
    • 进程:一个程序对一个数据集的动态执行过程,是分配资源的基本单位。
    • 线程:一个进程内的基本调度单位。线程的划分尺度小于进程,一个进程包含一个或者更多的线程。
  • ②从执行过程当中来看:
    • 进程:拥有独立的内存单元,而多个线程共享内存,从而提升了应用程序的运行效率。
    • 线程:每个独立的线程,都有一个程序运行的入口、顺序执行序列、和程序的出口。可是线程不可以独立的执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  • ③从逻辑角度来看(重要区别):
    • 多线程的意义在于一个应用程序中,有多个执行部分能够同时执行。可是,操做系统并无将多个线程看作多个独立的应用,来实现进程的调度和管理及资源分配。

 

进程通讯方式有哪些?

进程间通信的方式: 管道通信,消息队列,信号量,共享内存,信号,套接字

解答:主要有如下6种:

  • 一、管道:管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另外一个进程的标准输入链接在一块儿。写进程在管道的尾端写入数据,读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。一样地,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据以前,写进程将一直阻塞。
    • 无名管道:管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系(一般是指父子进程关系)的进程间使用。
    • 命名管道:命名管道也是半双工的通讯方式,在文件系统中做为一个特殊的设备文件而存在,可是它容许无亲缘关系进程间的通讯。当共享管道的进程执行完全部的I/O操做之后,命名管道将继续保存在文件系统中以便之后使用。
  • 二、信号量:信号量是一个计数器,能够用来控制多个进程对共享资源的访问。它常做为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。所以,主要做为进程间以及同一进程内不一样线程之间的同步手段。
  • 三、消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 四、信号:信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生。
  • 五、共享内存:共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的IPC方式,它是针对其它进程间通讯方式运行效率低而专门设计的。它每每与其它通讯机制(如信号量)配合使用,来实现进程间的同步和通讯。
  • 六、套接字:套接字也是一种进程间通讯机制,与其它通讯机制不一样的是,它可用于不一样机器间的进程通讯。

几种方式的比较:

  • 管道:速度慢,容量有限
  • 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
  • 信号量:不能传递复杂消息,只能用来同步
  • 共享内存区:可以很容易控制容量,速度快,但要保持同步,好比一个进程在写的时候,另外一个进程要注意读写的问题,至关于线程中的线程安全,固然,共享内存区一样能够用做线程间通信,不过没这个必要,线程间原本就已经共享了一块内存的。

 

同步的方式有哪些?

线程同步指多个线程同时访问某资源时,采用一系列的机制以保证同时最多只能一个线程访问该资源。线程同步是多线程中必须考虑和解决的问题,由于极可能发生多个线程同时访问(主要是写操做)同一资源,若是不进行线程同步,极可能会引发数据混乱,形成线程死锁等问题;

线程同步的方式:临界区,互斥对象机制,信号量对象,事件信号

  • 临界区:经过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问
  • 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,由于互斥对象只有一个,因此能够保证公共资源不会同时被多个线程访问
  • 信号量:它容许多个线程同一时刻访问同一资源,可是须要限制同一时刻访问此资源的最大线程数目。信号量对象对线程的同步方式与前面几种方法不一样,信号容许多个线程同时使用共享资源,这与操做系统中PV操做类似。
  • 事件(信号):经过通知操做的方式来保持多线程的同步,还能够方便的实现多线程的优先级比较的操做

总结比较: 

  • 互斥量与临界区的做用很是类似,但互斥量是能够命名的,也就是说它能够跨越进程使用。因此建立互斥量须要的资源更多,因此若是只为了在进程内部是用的话使用临界区会带来速度上的优点并可以减小资源占用量。由于互斥量是跨进程的互斥量一旦被建立,就能够经过名字打开它。
  • 互斥量(Mutex),信号灯(Semaphore),事件(Event)均可以被跨越进程使用来进行同步数据操做,而其余的对象与数据同步操做无关,但对于进程和线程来说,若是进程和线程在运行状态则为无信号状态,在退出后为有信号状态。因此可使用WaitForSingleObject来等待进程和线程退出。
  • 经过互斥量能够指定资源被独占的方式使用,但若是有下面一种状况经过互斥量就没法处理,好比如今一位用户购买了一份三个并发访问许可的数据库系统,能够根据用户购买的访问许可数量来决定有多少个线程/进程能同时进行数据库操做,这时候若是利用互斥量就没有办法完成这个要求,信号灯对象能够说是一种资源计数器

 

说出你所知道的保持进程同步的方法?

  进程间同步的主要方法有原子操做、信号量机制、自旋锁、管程、会合、分布式系统等。

 

线程安全

若是你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。若是每次运行结果和单线程运行的结果是同样的,并且其余的变量的值也和预期的是同样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来讲是原子操做或者多个线程之间的切换不会致使该接口的执行结果存在二义性,也就是说咱们不用考虑同步的问题。

 

什么是死锁?其条件是什么?怎样避免死锁?

首先回答死锁的定义,所谓死锁就是一个进程集合中的多个进程由于竞争资源,而形成的互相等待现象。

死锁的缘由:系统资源不足;多个进程的推动顺序不合理

死锁的必要条件:

  • 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
  • 请求与保持条件(Hold and wait):已经获得资源的进程能够再次申请新的资源。
  • 非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
  • 循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每一个进程都在等待相邻进程正占用的资源。

处理死锁的策略:

  • 鸵鸟策略。忽略该问题。例如鸵鸟算法,该算法能够应用在极少发生死锁的状况下。传说中,鸵鸟看到危险就把头深埋地下,这是显然是一种很消极的策略。
  • 检测与恢复策略。检测死锁而且恢复。
  • 避免策略。仔细地对资源进行动态分配,以免死锁。
  • 预防策略。经过破坏死锁的必要条件,来防止死锁的产生。

 

解除死锁,银行家算法:http://blog.csdn.net/abigale1011/article/details/6450845/

 

银行家算法

银行家算法( banker's algorithm )由 Dijkstra(1065)提出。他将死锁的问题演示为一个银行家贷款的模型。
一个银行家向一群客户发放信用卡,每一个客户有不一样的信用额度。每一个客户能够提出信用额度内的任意额度的请求,直到额度用完后再一次性还款。银行家承诺每一个客户最终都能得到本身须要的额度。
所谓“最终”,是说银行家能够先挂起某个额度请求较大的客户的请求,优先知足小额度的请求,等小额度的请求还款后,再处理挂起的请求。这样,资金可以永远流通。

银行家算法其核心是:保证本身的限额至少不小于一个客户的限额。
咱们能够用填表法来快速解决银行家算法。

创建一个二维表格:每列数据表示每次交易各个参与者的限额。这个表格第一列数据是银行家是客户的交易限额,每发生一次交易,增长一列,同时将银行家和发生交易的客户的限额减少。直到银行家的限额小于某个客户的限额时,交易不能继续进行。不然便发生死锁。

例题:
一、操做系统分配资源时的一个重要考虑是避免死锁的发生.若系统中有同类资源 16 个,由四个进程 P一、P二、P3 和 P4 共享该资源。已知 P一、P二、P三、P4 所需的资源总数分别为 八、五、九、6。各进程请求资源的次序以下表,若系统采用银行家算法为它们分配资源,那么_(1)__依次申请分配会使系统进入不安全状态。 
进程申请资源的状况

序号 进程 申请量 
1 P1 6 
2 P2 4 
3 P3 5 
4 P4 1 
5 P1 1 
6 P2 1 
A.三、4 B.三、5 C.四、5 D.五、6

答案是c
咱们初始化一个二维表格


到完成第三个请求到达的时候,资源只有一个了。此时只能知足p2的请求。因此,第四个和第五个请求会被系统挂起。第六个请求p2到达后会被处理。等p2事务结束释放资源后,系统会再处理挂起的请求,这样就不会发生死锁。一旦在第三步后将剩下的惟一的一个资源分配给其它的进程,(如请求4或请求5),则请求4和5可能会因须要不止一个资源而继续等待,则发生了死锁。(经过表格能够看出,依次申请到C组时,银行家的剩余额度已经不能知足全部的客户的需求了)

 

描述实时系统的基本特性

  在特定时间内完成特定的任务,实时性与可靠性。

  所谓“实时操做系统”,其实是指操做系统工做时,其各类资源能够根据须要随时进行动态分配。因为各类资源能够进行动态分配,所以,其处理事务的能力较强、速度较快。

 

中断和轮询的特色

  对I/O设备的程序轮询的方式,是早期的计算机系统对I/O设备的一种管理方式。它定时对各类设备轮流询问一遍有无处理要求。轮流询问以后,有要求的,则加以处理。在处理I/O设备的要求以后,处理机返回继续工做。尽管轮询须要时间,但轮询要比I/O设备的速度要快得多,因此通常不会发生不能及时处理的问题。固然,再快的处理机,能处理的输入输出设备的数量也是有必定限度的。并且,程序轮询毕竟占据了CPU至关一部分处理时间,所以,程序轮询是一种效率较低的方式,在现代计算机系统中已不多应用。

  中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。

  轮询——效率低,等待时间很长,CPU利用率不高。

  中断——容易遗漏一些问题,CPU利用率高。

 

什么是临界区?如何解决冲突?

  每一个进程中访问临界资源的那段程序称为临界区,每次只准许一个进程进入临界区,进入后不容许其余进程进入。

  (1)若是有若干进程要求进入空闲的临界区,一次仅容许一个进程进入;

  (2)任什么时候候,处于临界区内的进程不可多于一个。如已有进程进入本身的临界区,则其它全部试图进入临界区的进程必须等待;

  (3)进入临界区的进程要在有限时间内退出,以便其它进程能及时进入本身的临界区;

  (4)若是进程不能进入本身的临界区,则应让出CPU,避免进程出现“忙等”现象。

 

你知道操做系统的内容分为几块吗?什么叫作虚拟内存?他和主存的关系如何?内存管理属于操做系统的内容吗?

  操做系统的主要组成部分:进程和线程的管理,存储管理,设备管理,文件管理。虚拟内存是一些系统页文件,存放在磁盘上,每一个系统页文件大小为4K,物理内存也被分页,每一个页大小也为4K,这样虚拟页文件和物理内存页就能够对应,实际上虚拟内存就是用于物理内存的临时存放的磁盘空间。页文件就是内存页,物理内存中每页叫物理页,磁盘上的页文件叫虚拟页,物理页+虚拟页就是系统全部使用的页文件的总和。

 

说说分段和分页

  页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提升内存的利用率;或者说,分页仅仅是因为系统管理的须要,而不是用户的须要。

  段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的知足用户的须要。

  页的大小固定且由系统肯定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,于是一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,一般由编辑程序在对源程序进行编辑时,根据信息的性质来划分。

  分页的做业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,便可表示一地址。分段的做业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。

 

Linux中经常使用到的命令

  显示文件目录命令ls        如ls

  改变当前目录命令cd        如cd /home

  创建子目录mkdir           如mkdir xiong

  删除子目录命令rmdir       如rmdir /mnt/cdrom

  删除文件命令rm            如rm /ucdos.bat

  文件复制命令cp            如cp /ucdos /fox

  获取帮助信息命令man      如man ls

  显示文件的内容less        如less mwm.lx

  重定向与管道type          如type readme>>direct,将文件readme的内容追加到文direct中

 

Linux文件属性有哪些?(共十位)

  -rw-r--r--那个是权限符号,总共是- --- --- ---这几个位。

  第一个短横处是文件类型识别符:-表示普通文件;c表示字符设备(character);b表示块设备(block);d表示目录(directory);l表示连接文件(link);后面第一个三个连续的短横是用户权限位(User),第二个三个连续短横是组权限位(Group),第三个三个连续短横是其余权限位(Other)。每一个权限位有三个权限,r(读权限),w(写权限),x(执行权限)。若是每一个权限位都有权限存在,那么满权限的状况就是:-rwxrwxrwx;权限为空的状况就是- --- --- ---。

  权限的设定能够用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:

  一个文件aaa具备彻底空的权限- --- --- ---。

  chmod u+rw aaa(给用户权限位设置读写权限,其权限表示为:- rw- --- ---)

  chmod g+r aaa(给组设置权限为可读,其权限表示为:- --- r-- ---)

  chmod ugo+rw aaa(给用户,组,其它用户或组设置权限为读写,权限表示为:- rw- rw- rw-)

  若是aaa具备满权限- rwx rwx rwx。

  chmod u-x aaa(去掉用户可执行权限,权限表示为:- rw- rwx rwx)

  若是要给aaa赋予制定权限- rwx r-x r-x,命令为:

  chmod u=rwx,go=rx aaa

 

makefile文件的做用是什么?

  一个工程中的源文件不可胜数,其按类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定哪些文件须要先编译,哪些文件须要后编译,哪些文件须要从新编译,甚至于进行更复杂的功能操做。由于makefile就像一个Shell脚本同样,其中也能够执行操做系统的命令。makefile带来的好处就是——“自动化编译”。一旦写好,只须要一个make命令,整个工程彻底自动编译,极大地提升了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具。通常来讲,大多数的IDE都有这个命令,好比:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

 

什么是缓冲区溢出?有什么危害?其缘由是什么?

  缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区自己的容量,溢出的数据覆盖在合法数据上。

  危害:在当前网络与分布式系统安全中,被普遍利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,由于入侵者能够利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃致使拒绝服务,另一种就是跳转而且执行一段恶意代码,好比获得shell,而后随心所欲。经过往程序的缓冲区写超出其长度的内容,形成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。

  形成缓冲区溢出的主缘由是程序中没有仔细检查用户输入的参数

 

操做系统进程调度算法

http://blog.csdn.net/luyafei_89430/article/details/12971171

1、先来先服务和短做业(进程)优先调度算法
1.先来先服务调度算法
2.短做业(进程)优先调度算法


2、高优先权优先调度算法
1.优先权调度算法,包括非抢占式优先权算法、抢占式优先权调度算法(强调系统的实时性,实时比较优先级)
2.高响应比优先调度算法,优先权=(等待时间+要求服务时间)/要求服务时间
(1) 若是做业的等待时间相同,则要求服务的时间愈短,其优先权愈高,于是该算法有利于短做业。
(2) 当要求服务的时间相同时,做业的优先权决定于其等待时间,等待时间愈长,其优先权愈高,于是它实现的是先来先服务。
(3) 对于长做业,做业的优先级能够随等待时间的增长而提升,当其等待时间足够长时,其优先级即可升到很高,从而也可得到处理机。简言之,该算法既照顾了短做业,又考虑了做业到达的前后次序,不会使长做业长期得不到服务。所以,该算法实现了一种较好的折衷。固然,在利用该算法时,每要进行调度以前,都须先作响应比的计算,这会增长系统开销。


3、基于时间片的轮转调度算法
1.时间片轮转法
2.多级反馈队列调度算法,
多级反馈队列调度算法则没必要事先知道各类进程所需的执行时间,并且还能够知足各类类型进程的须要,于是它是目前被公认的一种较好的进程调度算法。
(1) 应设置多个就绪队列,并为各个队列赋予不一样的优先级。第一个队列的优先级最高,第二个队列次之,其他各队列的优先权逐个下降。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每一个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍。
(2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,即可准备撤离系统;若是它在一个时间片结束时还没有完成,调度程序便将该进程转入第二队列的末尾,再一样地按FCFS原则等待调度执行;若是它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长做业(进程)从第一队列依次降到第n队列后,在第n 队列便采起按时间片轮转的方式运行。
(3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。若是处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。

 

服务器线程优化问题?

线程是轻量级的,它本身不拥有系统资源,可是咱们知道线程执行时候是能够操做硬盘的文件,也能够操做内存的数据,那么这些被线程操做的资源从哪里来的呢?

答案:线程用的进程的资源

 

线程的特色:

  • 特色一:线程是进程的一个实体,也就是说线程的母体是进程,这是线程的范畴问题。
  • 特色二:线程是轻量级的,它本身不拥有系统资源,可是咱们知道线程执行时候是能够操做硬盘的文件,也能够操做内存的数据,那么这些被线程操做的资源从哪里来的呢?上面的解释里回答了这个问题,那就是线程能够共享进程的资源,换句话说线程操做的资源是进程的资源。
  • 特色三:线程本身也有寄存器和堆栈,这些东西自己也是能够存储数据的,数据也是要占用系统的部分资源,那么这个解释也就说明,线程自己也是能够占必定系统资源了,只不过这个资源比较少而已,因此这个解释就补充了特色二的场景:线程操做的资源除了它所在进程的资源外还有它自身能控制的资源,这一点比较重要,我会在后面讲线程安全问题里提到线程自有资源的使用问题的。

 

线程的运做流程: 线程建立 线程执行 线程销毁

 

咱们就会发现线程的建立过程和线程的销毁过程实际上是和处理请求的逻辑无关,可是一个线程又必须经历这三个阶段,所以线程建立的时间和线程销毁的时间也会被统计到请求处理时间里,那么咱们就会想有没有办法能够消除线程建立和销毁所花的时间对请求处理的影响呢?目标就是减小线程建立和销毁的时间

 

咱们但愿请求处理流程只是做用在线程执行这块,那么在实际的生产实践里咱们又是如何来解决这个问题了?解决方案就是使用线程池技术,线程池技术就是基于线程建立和销毁操做影响性能的角度来设计的,不过线程池技术并不是简单的事先建立好一批线程,而后统一销毁一批线程那么简单.  

 举例分析JDK的线程池

JDK的线程池对线程池的大小设定了两个参数,一个是核心线程个数,一个是最大线程个数

  1. 1.    系统启动时,核心线程就会被建立
  2. 2.    当用户请求没有超过核心线程的处理能力时,新的线程再也不建立
  3. 3.    当用户请求超过核心线程的处理能力时,新的线程建立,使用完毕后不是当即被销毁,也会被收到线程池里面,当线程池里的总数超过最大线程个数时,线程再也不被建立

(线程数量根据实际请求状况,这样充分利用了计算机资源, 又避免了资源浪费)

  1. 4.    超时机制。当超出核心线程的线程在必定时间内未被使用,那么这些线程将会被销毁,资源会被释放。

(使得线程池里线程的数量在一个合理的范围内)

5    队列机制。对处理不过来的请求排队等待,当某个线程处理完毕时,该线程会从这个队列里面取出一个请求进行处理

      (避免请求的丢失)

6    拒绝策略。若是队列容量超出了计算机的处理能力,队列会抛弃没法处理的请求。

7….JDK还有不少队列策略

 

由上面对JDK自带线程池的介绍,咱们发现使用线程池咱们要考虑以下的问题,具体以下:

  • 问题一:线程池初始化的时候咱们到底要事先建立多少个线程放在池子里比较合适。
  • 问题二:线程池初始化时候若是建立的线程过多会有什么问题。
  • 问题三:一台服务器因为受限于自身能力的限制例如CPU的能力,内存的能力等等,那么一台服务器能够建立多少个有效线程的数量实际上是有个临界值的,那么当业务方要求建立超出临界值的线程时候咱们的处理策略是怎样的呢。

问题三的我在介绍JDK里线程池的设计方案时候已经提到了,解决方法就是当业务方要求超出临界值时候,具体就是超出线程池最大线程数的时候,咱们用一个队列先缓存这些请求,等线程池里的线程空闲出来后,再去从队列里取出业务请求交付给线程进行处理。

至于问题一和问题二,这个就和多线程的技术相关了,为了更好的解答它,我这里先来介绍下多线程技术。

计算机多线程的时间片问题:

有一个线程被分配到的时间片长度是10毫秒,若是这个线程没有其余干扰,它执行完毕须要花费50毫秒,那就等于要执行5次时间片,假如咱们再新增了一个线程,该线程时间片也是10毫秒,也要执行50毫秒才能执行完毕,那么其中一个线程执行完一次时间片,按照轮询机制另一个线程也要被执行,最后咱们就会发现第一个线程执行时间就变成了100毫秒,若是咱们再加上CPU的调度所花的时间,该线程的执行时间就会远远大于100毫秒,虽然100多毫秒人的感官是很难觉察到,可是这个作法毕竟让单个线程的执行效率大幅度下降了,若是咱们线程开启的更多,那么单个线程执行效率也就会变得更低。

有了这个结论咱们再去看看线程池问题一和问题二,若是咱们一开始建立了太多线程,并且这些线程大部分都会被闲置,那么这些闲置的线程就会让有效线程的执行效率大大下降,同时闲置的线程还会消耗系统资源,而这些被消耗的系统资源都没有用到业务处理上,因此成熟的线程池方案就会设计核心线程和最大线程的概念,它们可让线程池根据实际业务需求和系统负载能力作到动态调节,这样就能够减小开启更多线程影响线程执行效率的问题,也可让计算机的系统资源获得更加有效的利用。

C10K的目标

业界有一个C10K的目标,所谓c10k问题,指的是服务器同时支持成千上万个客户端的问题,也就是concurrent 10 000 connection(这也是c10k这个名字的由来)。

通常Apache最多支持5000个客户端的并发请求,并且不会随着服务器硬件配置的提高有质的改变,并且单个请求的处理能力会降低

而ngnix能够作到3万个并发,并且能够随服务器配置提高而提高

ngnix的设计

Nginx开发从入门到精通http://tengine.taobao.org/book/#nginx

nginx源码分析--master和worker进程模型

http://blog.csdn.net/yusiguyuan/article/details/40924415?utm_source=tuicool

《深刻理解Nginx》-陶辉

阿里集团数据平台博客

阿里集团数据平台博客2

http://blog.csdn.net/lengzijian/article/details/7349673

 

nginx模块的开发门槛还挺高,须要开发者对于服务器的非阻塞调用、事件模型有较深的理解,而若是请求处理时须要有全局化视角时,麻烦的多进程通讯又来了,开发者不能使用简单的堆分配对象,而要使用nginx_slab管理内存。

相关文章
相关标签/搜索