什么是进程
进程:一个具有独立功能的程序在一个数据集合上的一次动态执行过程
进程的组成
- 程序的代码
- 程序处理的数据
- 程序计数器的值,指示下一条将运行的指令
- 一组通用的寄存器的当前值,堆,栈
- 一组系统资源(如打开的文件/网络资源/磁盘IO资源)
总之,进程包含了正在运行的一个程序的所有状态信息
进程与程序的联系
- 程序是产生线程的基础
- 程序每次运行构成不同的进程
- 进程是程序功能的体现
- 通过多次执行,一个程序可以对于多个进程,一个进程可以包括多个程序(调度程序)
进程和程序的区别
- 进程是动态的,程序是静态的;程序是有序代码的集合;进程是程序的执行,进程还有核心态/用户态
- 进程是暂时的,程序是永久的;进程是一个程序运行的状态过程;程序可以长久保持
- 进程和程序组成不同;进程包括了程序、数据、和进程控制块(即进程状态信息)
进程和线程对比
- 进程是对运行时程序的封装,是系统调度资源的分配的基本单位
- 线程是进程的子任务,cpu调度和分配的基本单位,实现进程内的并发
- 一个进程可以包含多个线程,线程依赖进程存在,并共享进程内存
什么是线程安全
如何保证线程安全
- 互斥量(锁),通过互斥机制防止多个线程同时访问公共资源
- 信号量(Semphare),控制同一时刻多个线程访问同一个资源的线程数
- 事件(信号):通过通知的方式保持多个线程同步
进程间通信方式
- 管道/匿名管道/有名管道(pipe)
- 信号(Singal):比如用户使用ctrl+c产生SIGINT程序停止信号
- 消息队列(Message)
- 共享内存
- 信号量
- 套接字(socket):最常用的方式,web应用都是这种方式
死锁发生的四个必要条件:
(1) 互斥条件(选项D):一个资源每次只能被一个进程使用。
(2) 请求与保持条件(选项C):一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件(选项B):进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件(选项A):若干进程之间形成一种头尾相接的循环等待资源关系。
只要发生死锁,上述四个条件一定满足,只要有一个条件不满足,就不会发生死锁
因此,要避免死锁,只要破坏上述四个条件之一,主要有以下方法:
静态分配资源:破坏条件(2)和(4)
按序分配资源:破坏条件(4)
剥夺是分配:破坏条件(3)
而互斥地使用资源是多进程能正确工作的前提,是必须保证满足的,不能破坏,否则就会出现问题如读写不一致