进程和线程的区别?
根本:进程是操作系统资源分配的基本单位,线程是任务调度和执行的基本单位。
开销方面:每个进程都有独立的代码和数据空间(程序的上下文),线程共享代码和数据空间,但每个线程都有自己独立运行的栈,寄存器包括程序计数器。线程共享资源比如堆,全局变量,静态变量等。所以进程切换开销较大,线程切换开销较小。
包含关系:一个进程包含多个线程。
进程的实现只能由操作系统内核来实现,而不存在用户态实现。线程的管理者可以是用户也可以是操作系统本身,所以线程的实现分为内核态实现和用户态实现(协程)。协程是比线程的量级更小,1个线程包含多个协程。
用户态:上次应用程序的活动空间,需要依赖内核态提供的硬件资源。(权限级别低,只能访问部分内存资源)
内核态:控制计算机的硬件资源,比如cpu资源,内存资源和io资源,为应用程序的运行提供环境。(权限较高,可以访问计算机的全部资源)
用户态通过系统调用访问内核态。
用户态进入内核态:1.系统调用2.异常3.外设中断。
并行和并发的区别?
并行是指某个时刻,多个程序同时运行。(比如多个cpu同时执行多个线程)
并发则是指某个时间段,多个程序同时运行。(一个cpu通过时间片轮转调度执行多个线程)
进程间通信的方式?
- 管道
- 命名管道
- 消息队列
- 信号量
- 共享内存
- 套接字
线程的通信方式:
- wait和notify
- volatile共享内存
- Countdownlatch 并发工具
- CyclicBarrier 并发工具
分段和分页?
分段:分段机制就是把虚拟地址空间中的虚拟内存组织成一些长度可变的称为段的内存块单元。
分页机制在分段机制之后进行的,它将每个段划分成4k大小的页面。
虚拟内存,虚拟内存怎么管理和物理地址的映射?
计算机的三级存储架构
Cpu的cache(高速缓存) <----- 主存(内存条) <-------磁盘
虚拟内存将主存看成一个磁盘的高速缓存,主存中只保存活动区域,并根据需要在磁盘和主存之间传递数据。
Linux系统中,进程的4GB内存空间被划分成为两个部分------用户空间和内核空间,大小分别为0~3G,3~4G。用户进程通常情况下,只能访问用户空间的虚拟地址,不能访问到内核空间。
虚拟内存的虚拟地址到物理地址的映射:
- 利用分段机制将虚拟地址映射成线性地址。
- 利用分页机制将线程地址映射成物理地址。
页面管理的页面置换算法?
- 最佳置换算法
- 先进先出页面置换算法
- 最近最久未使用算法。
进程的调度算法?
- 先来先服务。
- 短进程优先。
- 优先权调度算法。
- 高响应比优先算法。(等待的时间+需要执行的时间) / 需要执行的时间
- 时间片轮转算法。
内核态和用户态,内核态可以访问哪些资源?
用户态:上层应用程序的活动空间,应用程序的执行必须依托内核提供的资源
内核态:控制计算机的硬件资源,并提供上层应用程序运行的环境。
内核态可以访问cpu资源,存储资源和i/o资源。
什么是死锁:
两个或者两个以上的进程各自拥有部分资源,并且相互请求对方的资源时,会产生死锁。比如你给我offer我就给你解释什么是死锁,而你要求我给你解释完什么是死锁后才给我offer。
死锁产生的原因:
- 竞争资源
- 进程推进顺序不当。
死锁的四个必要条件:
1.互斥条件
系统的资源只能由一个进程持有,其他进程进入阻塞等待状态。
2.不可剥夺条件
系统的资源未使用完毕前,不可以被其他进程剥夺。
3.请求与保持条件
进程拥有部分资源,并请求新的资源时,新的资源被其他进程占有,那么该进程不会释放持有的资源,而进入阻塞等待状态。
4.循环等待条件
多个进程循环等待。
死锁的预防和避免:
死锁的预防:
- 破坏互斥条件
- 破坏不可剥夺条件
- 破坏请求与等待条件
- 破坏循环等待条件
死锁的避免:
使用银行家算法来找到一个安全序列(安全序列即,按照该序列进行推进不会发生死锁)。进程首次申请系统资源时,会先测试该进程所需的最大资源量,如果当前系统资源能够满足其最大资源,那么就给该进程分配其所申请的系统资源,否则推迟分配。
死锁的检测和解除:
死锁的检测:
第一步:根据进程列表和锁列表生成wait for graph,它是一个有向图。
第二步:判断该有向图中是否有环,如果有环则说明死锁。
死锁的解除:
- 资源剥夺
- 撤销进程
- 进程回退