进程和线程的基本概念:
进程是对运行时程序的封装,是系统资源调度和分配的基本单位,实现了操作系统的并发。
为了进一步的提高操作系统的并发性,引入了线程。
线程是进程的子任务,是CPU调度和分配的基本单位,用于保证程序的实时性,实现进程内部的并发。
线程是操作系统可识别的最小执行和调度单位。
每个线程占用一个虚拟处理器,有独自的寄存器组,指令计数器和处理器状态。
每个线程完成不同的任务,但共享同一地址空间、打开的文件队列、其他内核资源。
进程和线程的区别:
1.线程是进程划分出的更小运行单位,一个进程在执行过程中可以产生很多个线程,一个线程只能属于一个进程,线程依赖于进程存在。
2.进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。
资源分配给进程, 同一进程的所有线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。
但每个线程拥有自己的栈段(又称运行时段,用来存放所有局部变量和临时变量)。
3.进程是资源调度和分配的最下单位,线程是CPU调度和分配的最小单位。
4.线程执行开销小,但不利于资源的管理和保护,进程相反。
5.同一多个线程具有相同的地址空间,因此他们的同步和通信实现较容易。线程之间可以直接读写进程数据段(如全局变量)来进行通信,但需要同步和互斥手段的辅助,以保持数据的一致性。
6.进程编程调试简单可靠性高,但创建摧毁开销大,线程相反。
7.进程之间不会相互影响,但一个线程挂掉会导致整个进程挂掉。
进程的几种状态:
1.创建态:进程正在被创建,尚未就绪。
2.就绪态:进程处于准备运行状态,已经获得了除处理器之外的所有资源,当获得处理器资源时(处理器分配的时间片)即可运行。
3.运行态:进程正在处理器上运行(单核CPU同时只能有进程处理运行态。
4.阻塞态:进程正在等待某一时间而暂停运行,例如等待资源可用,或等待IO操作完成。此时就算处理器空闲也不能运行。
5.结束态:进程正在从系统中消失,既可能是正常结束,也可能是因为其他原因中断运行。
进程间的通信方式:
1.普通管道/匿名管道:
半双工。
由于没有名字,只能用于具有亲缘关系的进程之间的通信(父子或兄弟)。
2.命名管道:
严格遵循先进先出FIFO。
以磁盘文件的方式存在,可以实现本机任意两个进程通信。
3.信号:
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
4.消息队列:
消息队列是消息的链表,具有特定格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都遵守FIFO原则。
匿名管道只存在于内存中的文件,命名管道存在于实际的磁盘介质或文件系统,而消息队列存放在内核中,只有在内核重启(即OS重启)或显示地删除一个消息队列时,该消息队列才会被真正删除。
消息队列可以实现消息的随机查询,消息不一定要按照FIFO的顺序读取,也可以按消息类型读取,比FIFO更有优势。
消息队列克服了信号承载信息少,管道只能承载无格式字节流以及缓冲区大小的限制。
5.信号量:
信号量式一个计数器,用于多线程对于共享数据的访问,信号量通常用于解决进程同步相关问题并避免竞争。
6.共享内存:
使多个进程可以访问同一块内存空间,不同进程可以及时看到进程对共享数据的更新。
这种方式需要依赖某种同步操作(如互斥锁和信号量)。
这是最有用的进程间的通信方式。
7.套接字:
套接字主要用户客户端和服务器之间通过网络进行通信。
套接字式支持TCP/IP的网络通信的基本操作单元,可以看作是不同主机之间的进程进行双向通信的端点,简单的说就是通信的双方的一种约定,用套接字的相关函数来完成通信过程。
线程间的通信(同步)方式:
线程间通信主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
1.互斥量:
采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
2.信号量:
信号量允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
3.信号(事件):
通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
进程调度算法:
1.先来先服务调度算法:
从就绪队列中选出最先进入队列的。
2.短作业优先调度算法:
从就绪队列中选出估计允许时间最短的。
3.时间片轮转调度算法:
为每个进程分配时间片。
4.多级反馈队列调度算法
5.优先级调度算法:
为每个进程分配优先级,先执行高优先级进程。
相同优先级的进程以先来先服务执行。
优先级可以根据内存要求、时间要求,或其他资源要求来确定。