如果遇到喜欢问操作系统的面试官就自求多福吧,只能说 深不可测 本文只是粗略包含了一些基础知识点
各种知识多而且容易遗忘,还不容易复习。最好的方法当然是自己给自己提问,不断补缺查漏,缺什么补什么。本文将各类知识归类,并将全文知识点浓缩在自问自查中,并且都写好目录,自问自查时可以随时跳转过去,方便大家系统的学习复习知识。 水平有限,有错误敬请指正
传送门(含目录) 数据库:https://blog.csdn.net/qq_45021207/article/details/113427419 计网分层:https://blog.csdn.net/qq_45021207/article/details/112387871 计网应用层:https://blog.csdn.net/qq_45021207/article/details/112723944 计网传输层:https://blog.csdn.net/qq_45021207/article/details/113184737 计网网络层&数据链路层 :https://blog.csdn.net/qq_45021207/article/details/113248814 操作系统 : https://blog.csdn.net/qq_45021207/article/details/113747408 java开篇: https://blog.csdn.net/qq_45021207/article/details/113770277
本质上:进程是资源分配的基本单位,线程是任务调度的基本单位。
内存分配上:进程拥有独立的内存单元,而多个线程共享进程的内存(线程也有子集独立的栈空间,如程序计数器)。
开销:创建和撤销进程时系统需要为它分配和收集资源,所以远远比线程大,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
通信:进程间以IPC(Inter-Process Communication,进程间通信)(管道,信号量,共享内存,消息队列,套接字等)方式通信 ;同一个进程下,线程间可以共享全局变量、静态变量等数据进行通信,做到同步和互斥,以保证数据的一致性。
健壮性:每个进程之间的资源是独立的,当一个进程崩溃时,不会影响其他进程;同一进程的线程共享此线程的资源,当一个线程发生崩溃时,此进程也会发生崩溃,稳定性差,容易出现共享与资源竞争产生的各种问题,如死锁等
线程的实现可以分为两类: 用户级线程:不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,在语言层面利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/内核态切换,速度快,操作系统内核不知道多线程的存在,因此一个线 程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位,所以每个线程执行的时间相对减少 内核线线程:又称为内核支持的线程或轻量级进程,所以需要切换到内核态。
协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。
进程切换与线程切换的最主要区别:进程切换涉及到虚拟地址空间的切换而线程切换则不会。因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用TLB(Translation Lookaside Buffer)来缓存页地址,用来加速页表查找。当进程切换后页表也要进行切换,页表切换后TLB就失效了,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。
http://www.msdn.hk/jshtml/jswz/751.html 线程切换需要换切换必要的CPU寄存器
寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。
先来先服务:first-come first-serverd(FCFS) 按照请求的顺序进行调度,适合于长作业,因为短作业等的时间太长了。