瀑布模型核心思想是按工序将问题化简,将功能的实现与设计分开,便于分工协做,即采用结构化的分析与设计方法将逻辑实现与物理实现分开。将软件生命周期划分为可行性分析、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,而且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。html
对于常常变化的项目而言,瀑布模型毫无价值nginx
优势:阶段划分清晰,各阶段人员的职责明确,便于先后活动的衔接,有利于活动的重用和管理程序员
缺点:缺少灵活性,没法解决需求常常变化的问题算法
用其余弥补不足:shell
原型化模型:用于解决需求不明确的状况数据库
螺旋模型:强调风险分析,特别适合庞大而复杂的、高风险的系统缓存
1.对进程和线程的描述,一下()是正确的安全
A 父进程的全部线程共享相同的地址空间,父进程的全部子进程共享相同的地址空间服务器
B 改变进程里面主线程的状态会影响其余线程的行为,改变父进程的状态不会影响其余子进程网络
C 多线程会引发死锁,而多进程则不会
D 以上都不对
D 进程拥有独立的地址空间,A错;多进程中父进程与子进程互不会影响,B错;多线程和多进程都会引发死锁,通常提及死锁指的都是进程间的死锁,C错。
进程(Process)是应用程序的一次运行活动。从操做系统核心角度来讲,进程是操做系统分配和调度系统内存资源、cpu时间片等资源的基本单位,为正在运行的应用程序提供
运行环境。
线程(Thread)是程序内部有并发性的顺序代码流。是cpu调度资源的最小单元。
单位大小
进程是操做系统分配和调度系统内存资源、cpu时间片 等资源的基本单位;一个进程至少包括一个线程。进程是操做系统资源管理的实体。
线程是cpu调度资源的最小单元。线程是进程的实体。
系统资源分配上
每一个进程都有本身的内存地址空间。
线程没有本身独立的内存资源,它只有本身的执行堆栈和局部变量。可是在同属一个进程的多个线程中他们能够共享进程的内存
执行过程当中
执行过程当中,进程有内存单元的初始入口点,在存活阶段里拥有独立的地址空间。
进程是应用程序的一次运行活动,独立地执行;因此某一个进程崩溃之后,在保护模式下不会影响其余的进程,健壮性好。
每一个已建立的进程均可以建立进程,建立进程的进程称为父进程,被建立的新进程为子进程,这样便造成一个进程树。
父进程与子进程可并行执行;父进程等 待子进程终止执行。父进程终止后,全部的子进程也都必需要终止。
而线程不能独立地执行,它必须依附在一个运行中的应用程序上。
可是,同一个进程中的多个线程能够并发地执行,并发性高,系统在数据交换上花费的资源少,运行效率高。
每一个进程里都会有一个主线程,由它建立其余线程。
(
在程序设计时,某一个具体的功能模块能够经过函数或是线程等不一样的形式来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,并且在执行时,大多只对与其相关的一些数据进行处理。若是算法存在某种错误,将有可能破坏与其同处一个地址空间的其余一些重要内容,这将形成比较严重的后果。为保护地址空间中的内容能够考虑将那些须要对地址空间中的数据进行访问的操做部分放到另一个进程的地址空间中运行,而且只容许其访问原进程地址空间中的相关数据。
)
共同点
Process和Thread都有生命周期:
create 建立,ready就绪,running运行,waitSleepJoin阻塞,suspend挂起,stoped死亡
解答:
进程间通信的方式: 管道通信,消息队列,信号量,共享内存,信号,套接字
解答:主要有如下6种:
几种方式的比较:
线程同步指多个线程同时访问某资源时,采用一系列的机制以保证同时最多只能一个线程访问该资源。线程同步是多线程中必须考虑和解决的问题,由于极可能发生多个线程同时访问(主要是写操做)同一资源,若是不进行线程同步,极可能会引发数据混乱,形成线程死锁等问题;
线程同步的方式:临界区,互斥对象机制,信号量对象,事件信号
总结比较:
进程间同步的主要方法有原子操做、信号量机制、自旋锁、管程、会合、分布式系统等。
若是你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。若是每次运行结果和单线程运行的结果是同样的,并且其余的变量的值也和预期的是同样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来讲是原子操做或者多个线程之间的切换不会致使该接口的执行结果存在二义性,也就是说咱们不用考虑同步的问题。
首先回答死锁的定义,所谓死锁就是一个进程集合中的多个进程由于竞争资源,而形成的互相等待现象。
死锁的缘由:系统资源不足;多个进程的推动顺序不合理
死锁的必要条件:
处理死锁的策略:
解除死锁,银行家算法: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,这样虚拟页文件和物理内存页就能够对应,实际上虚拟内存就是用于物理内存的临时存放的磁盘空间。页文件就是内存页,物理内存中每页叫物理页,磁盘上的页文件叫虚拟页,物理页+虚拟页就是系统全部使用的页文件的总和。
页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提升内存的利用率;或者说,分页仅仅是因为系统管理的须要,而不是用户的须要。
段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的知足用户的须要。
页的大小固定且由系统肯定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,于是一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,一般由编辑程序在对源程序进行编辑时,根据信息的性质来划分。
分页的做业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,便可表示一地址。分段的做业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
显示文件目录命令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中
-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就像一个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的线程池对线程池的大小设定了两个参数,一个是核心线程个数,一个是最大线程个数
(线程数量根据实际请求状况,这样充分利用了计算机资源, 又避免了资源浪费)
(使得线程池里线程的数量在一个合理的范围内)
5 队列机制。对处理不过来的请求排队等待,当某个线程处理完毕时,该线程会从这个队列里面取出一个请求进行处理
(避免请求的丢失)
6 拒绝策略。若是队列容量超出了计算机的处理能力,队列会抛弃没法处理的请求。
7….JDK还有不少队列策略
由上面对JDK自带线程池的介绍,咱们发现使用线程池咱们要考虑以下的问题,具体以下:
问题三的我在介绍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》-陶辉
http://blog.csdn.net/lengzijian/article/details/7349673
nginx模块的开发门槛还挺高,须要开发者对于服务器的非阻塞调用、事件模型有较深的理解,而若是请求处理时须要有全局化视角时,麻烦的多进程通讯又来了,开发者不能使用简单的堆分配对象,而要使用nginx_slab管理内存。