滴滴出行
1、智力题
2、进程与线程的关系及区别
1)定义
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
2)关系
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
3)区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
① 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
②线程的划分尺度小于进程,使得多线程程序的并发性高。
③另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
④ 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
⑤ 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
4)优缺点
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
参考文献:进程与线程的关系及区别
3、JSON数据格式
JSON的语法可以表示以下三种类型的值。
1)简单值:使用与javascript相同的语法,可以在JSON中表示字符串、数值、布尔值和null。但JSON不支持JavaScript中的特殊值undefined。
例1:用JSON表示数值5
5
例2:用JSON表示字符串
"Hello world!"
注意:JSON的字符串必须使用双引号(单引号会导致语法错误)
2)对象:对象作为一种复杂数据类型,表示的是一组无序的键值对,每个键值对中的只可以是简单值,也可以是复杂数据类型的值。
例1:属性值是简单值
{
"name":"Nicholas",
"age":29
}
例2:属性值是简单值和复杂数据类型值
{
"name":"Nicholas",
"age":29,
"school":{
"name":"Merrimack College",
"location":"North Andover, MA"
}
}
注意:对象的属性必须加双引号。
3)数组:数组也是一种复杂数据类型,表示一组有序的值的列表,可以通过数值索引来访问其中的值,数组的之也可以是任意类型--简单值、对象或数组。
注意:JSON不支持变量、函数或对象实例,它就是一种表示结构化数据的格式,很多编程语言都有针对JSON的解析器和序列器。
例:
[
{
"title":"Professional JavaScript",
"authors":[
"Nicholas C.Zakas"
],
“edition”:3,
"year":2011
},
{
"title":"Professional JavaScript",
"authors":[
"Nicholas C.Zakas"
],
“edition”:2,
"year":2009
}
]
参考文献:
JavaScript高级程序设计
4、onchange事件
在用户改变输入域的内容时触发。
5、HTTP长连接、短连接。
1)HTTP短连接:在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
2)HTTP长连接
HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据
HTTP首部的Connection: Keep-alive是HTTP1.0浏览器和服务器的实验性扩展,当前的HTTP1.1 RFC2616文档没有对它做说明,因为它所需要的功能已经默认开启,无须带着它,但是实践中可以发现,浏览器的报文请求都会带上它。如果HTTP1.1版本的HTTP请求报文不希望使用长连接,则要在HTTP请求报文首部加上Connection: close。
在实际使用中,HTTP头部有了Keep-Alive这个值并不代表一定会使用长连接,客户端和服务器端都可以无视这个值,也就是不按标准来,譬如我自己写的HTTP客户端多线程去下载文件,就可以不遵循这个标准,并发的或者连续的多次GET请求,都分开在多个TCP通道中,每一条TCP通道,只有一次GET,GET完之后,立即有TCP关闭的四次握手,这样写代码更简单,这时候虽然HTTP头有Connection: Keep-alive,但不能说是长连接。正常情况下客户端浏览器、web服务端都有实现这个标准,因为它们的文件又小又多,保持长连接减少重新开TCP连接的开销很有价值。
6、TCP套接字和UDP套接字可以共用相同端口号
参考文献:
TCP套接字和UDP套接字可以共用相同端口号
7、哈夫曼编码
一般地,设要编码的字符集为{d1,d2,…dn},各个字符在电文中出现的次数或频率集合为{w1,w2,…,wn},以d1,d2,…dn作为叶子结点,以w1,w2,…,wn作为相应叶子结点的权值来构造一棵赫夫曼树。规定赫夫曼树的左分支代表0,右分支代表1,则从根结点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符的编码,这就是赫夫曼编码。
参考文献:《大话数据结构》