1.定义java
进程:具备必定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.linux
线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),可是它可与同属一个进程的其余的线程共享进程所拥有的所有资源.数据库
2.关系设计模式
一个线程能够建立和撤销另外一个线程;同一个进程中的多个线程之间能够并发执行.数组
相对进程而言,线程是一个更加接近于执行体的概念,它能够与同进程中的其余线程共享数据,但拥有本身的栈空间,拥有独立的执行序列。安全
3.区别网络
进程和线程的主要差异在于它们是不一样的操做系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不一样执行路径。线程有本身的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行而且又要共享某些变量的并发操做,只能用线程,不能用进程。多线程
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.并发
2) 线程的划分尺度小于进程,使得多线程程序的并发性高。机器学习
3) 另外,进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大地提升了程序的运行效率。
4) 线程在执行过程当中与进程仍是有区别的。每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。可是线程不可以独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5) 进程是系统进行资源分配和调度的一个独立单位,线程能够拥有本身的堆栈,但不能拥有系统资源。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分能够同时执行。但操做系统并无将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
4.优缺点
线程执行开销小,但不利于资源的管理和保护;而进程正相反。
线程适合于在SMP机器上运行,而进程则能够跨机器迁移。
5.总结:回答进程和线程的区别这个问题
a.进程有本身的独立地址空间,每启动一个进程,系统就会为它分配地址空间。
b.线程不可以独立执行,必须依存在进程中,使用相同的地址空间。
进程间通讯主要包括管道, 系统IPC(包括消息队列,信号,共享存储), 套接字(SOCKET).
1.管道:
匿名管道( pipe ):匿名管道是一种半双工的通讯方式,一般是在父子进程间使用。
命名管道 (named pipe) :命名管道也是半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。
2.系统IPC:
消息队列( message queue ) :消息队列是内核地址空间中的内部链表,经过linux内核在各个进程之间传递内容。消息顺序地发送到消息队列中,而且以几种不一样的方式从队列中获取,每一个消息队列能够用IPC标识符惟一的进行标识,内核中的消息队列是经过IPC的标识符来区别的,不一样的消息队列之间是相互独立的,每一个消息队列中的消息又构成一个独立的链表。
信号 ( sinal ) :信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生。
共享内存( shared memory ) :共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问。共享内存是最快的 IPC 方式,它是针对其余进程间通讯方式运行效率低而专门设计的。它每每与其余通讯机制,如信号量,配合使用,来实现进程间的同步和通讯。
3.套接字( socket ) :
套接字也是一种进程间通讯机制,与其余通讯机制不一样的是,它可用于不一样进程间的进程通讯。
grep:文本搜索
tail -f filename:监视filename文件的尾部内容(默认10行,至关于增长参数 -n 10),刷新显示在屏幕上。退出,按下CTRL+C。
top:监控Linux的系统情况,好比cpu、内存的使用(实时更新)
lsof:显示系统打开的文件
kill:删除执行中的程序或工做
5、topK问题
已求访问量top100的网址ip为例:
(一)单机内存足够
能够建一个哈希表,key是ip出现的次数,value是ip。
而后依次遍历key,建一个最小堆,依次比较key与最小堆叶子结点的大小,若是key更大,那么用key替换最小堆的根节点,更新最小堆的结构。
(二)单机内存不够
采用MapReduce的思想,将ip散列到1000个小文件中,用hash表分别统计top100。最后进行归并这些小文件,找出总共的top100。
6、数组和散列表的区别
数组和链表都被直接映射到内存。但散列表更复杂,它使用散列函数来肯定元素的存储位置(将输入映射到数字,输入与数字是惟一对应的关系)。
B+树(减小硬盘的I/O次数)
哈希表
当你想快速查找值时,哈希表是很是有用的。
TCP/IP 网络协议共分为四层(TCP/IP 参考模型):应用层、传输层、网络层和数据链路层。其中MAC 协议属于链路层,IP协议属于网络层,TCP 协议属于传输层,HTTP 协议属于应用层。
SYN请求同步,ACK确认同步,FIN结束
结合机器学习中的k近邻方法来作
基本的思路很简单:首先经过二叉树搜索(比较待查询节点和分裂节点的分裂维的值,小于等于就进入左子树分支,等于就进入右子树分支直到叶子结点),顺着“搜索路径”很快能找到最近邻的近似点,也就是与待查询点处于同一个子空间的叶子结点;
而后再回溯搜索路径,并判断搜索路径上的结点的其余子结点空间中是否可能有距离查询点更近的数据点,若是有可能,则须要跳到其余子结点空间中去搜索(将其余子结点加入到搜索路径)。重复这个过程直到搜索路径为空。
核心工厂类再也不负责产品的建立工做,让它成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可使系统在不修改具体工厂角色的状况下引进新的产品,彻底遵照了开闭原则,提升了可扩展性。在这个模式中,工厂类和产品类每每一一对应,即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
优势:
(1)利用工厂的工厂方法类去建立具体的产品对象,隐藏了具体产品对象的建立细节,只须要关心具体产品对应的具体工厂;
(2)遵照开闭原则。加入新的产品类时,只须要同时加入工厂类就能够实现扩展,无需修改原来的代码。
缺点:
随着产品种类的数量的增加,工厂类也会随之增长,将不利于系统的维护,增长系统编译和运行的开销。
适用场景:
(1)对于某个产品,调用者清楚地知道应该使用哪一个具体的工厂来服务,实例化该具体工厂,生产出具体的产品来;
(2)只是须要一种产品,而不想知道也不须要知道工厂是如何生产出来的,自须要知道具体对应的工厂就行。
1.运行速度快慢为:StringBuilder > StringBuffer > String
2.在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
若是一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中不少方法能够带有synchronized关键字,因此能够保证线程是安全的,但StringBuilder的方法则没有该关键字,因此不能保证线程安全,有可能会出现一些错误的操做。因此若是要进行的操做是多线程的,那么就要使用StringBuffer,可是在单线程的状况下,仍是建议使用速度比较快的StringBuilder。