1,Ascill,unicode,utf-8的区别
答:上世纪60年代,美国制订了一套编码,对英语字符和二进制的关系做了统一规定,称为Ascill码。Ascill码一共制订了128个字符的编码,因此一个字节的八位只用后七位,第一位置零。 Unicode顾名思义独一无二的编码,这是一种所有符号的编码,它解决了一串二进制数字因为不同的编码方式而出现的乱码问题(如:发邮件因编码不同出现的乱码)。(只是只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。因此出现了多种存储方式来表示Unicode,导致Unicode不能普及,直到互联网的出现。) utf-8就是互联网上使用最广的一种Unicode实现方式。utf-8(utf-16,utf-32基本不用)是Unicode的实现之一。 编码规则如下:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,
UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。
剩下的没有提及的二进制位,全部为这个符号的unicode码。
参考于https://blog.csdn.net/liugec/article/details/76400793
2,进程线程的区别
进程是系统中正在运行的程序,每个进程都有自己独立的地址空间,一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要时用进程间通信,比如管道,文件,套接字。
线程进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。线程是进程的一个特定执行路径,当一个线程修改了进程的资源,它的兄弟线程可以立即看到这种变化。
与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈。
区别总结:
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行。
切换关系:线程上下文切换比进程上下文切换快的多。
参考于https://blog.csdn.net/ThinkWon/article/details/102021274
3,为什么线程切换比进程切换开销小(快的多)
进程切换会导致页表、cache、TLB中的内容发生变化,原进程保存的内容无效,新的进程必须重新加载,导致缺页中断增多,cache,TLB也命中率下降。而线程切换会保留页表、cache、TLB中的内容,因为多个线程之间共享进程的这部分资源。
4,进程和线程的选择
1,需要频繁创建销毁的优先使用线程;因为进程的创建销毁代价很大
2,需要大量计算,切换频繁时使用线程,比较耗时的操作时使用线程
3,因为对cpu系统的效率使用上线程更占优势,所以可能发展到多机分布用进程,多核分布用线程
4,并行操作用线程,如c/s架构的服务端并发线程响应用户的请求
5,需要更稳定安全时,适合选择进程:需要速度时,选择线程更好。
个人建议:多看几篇文章,弄清原理,记得更牢。