进程和线程的区别
- 一个进程可以包含多个线程。
- 不同进程间数据很难共享,同一进程下不同线程间数据可以共享。
- 进程要比线程消耗更多的计算机资源
- 进程间不会相互影响,一个线程挂掉可能导致整个进程挂掉。
- 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
进程之间通信的方式
- 管道:单项的
- 消息队列:
- 共享内存:两个进程将各自将一部分独立的虚拟内存映射到相同的物理内存中,问题: 多进程竞争内存的问题
- 信号量: 用来实现进程之间的互斥与同步
- Socket:不同主机上进程之间的通信
线程间通信的方式
- 共享内存: 线程之间通过读-写内存中的公共状态来隐式通信。
volatile共享变量
-
消息传递: 线程之间没有公共的状态,线程之间必须通过明确的发送信息来显示的进行通信。
wait/notify,notifyAll等待通知方式 join
-
管道流
线程同步的方式有哪些?
- 互斥量:只有拥有互斥对象的线程才有访问公共资源的权限。
- 信号量: 它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
- 事件: 通过通知操作的方式来保持多线程同步。
什么是缓冲区溢出?有什么危害?其原因是什么?
缓冲区溢出: 指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
危害:(1)程序崩溃,导致拒绝额外服务。(2)跳转并执行一段恶意代码。
造成缓冲区溢出的主要原因:程序没有仔细检查用户输入。
什么是死锁?死锁产生的条件?
**什么是死锁:**A进程在持有x资源的同时请求y资源,B进程在持有y资源的同时请求x资源,就会产生死锁。通俗的讲就是两个或者多个进程无限期的阻塞、相互等待的一种状态。
死锁产生的四个条件
- 互斥条件:一个资源一次只能被一个进程使用
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获取的资源保持不放
- 不剥夺条件: 进程获得的资源,在未完全使用完之前,不能强行剥夺
- 循环等待条件: 若干进程之间形成一种头尾相接的环形等待资源关系
用户态和内核态
**内核态:**从本质上看也是一种软件资源,用于控制计算机的硬件资源,并为上层应用提供服务。
**用户态:**用户态就是上层应用的活动空间,应用程序的执行必须依靠于内核提供的资源,包括CPU,存储器,I/O资源
为什么需要用户态和内核态:由于需要限制不同应用程序的访问能力,防止应用程序获取别的应用程序的内存数据或者获取外围设备的数据,CPU划分出用户态和内核态
用户态和内核态的切换
系统调用
- 执行文件操作, 网络数据发送等的操作, 必须通过send, write等的系统调用来实现。
- 从硬盘读取数据, 从键盘获取输入等。
异常
**中断 **