概述
进程是系统对应用程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发。
线程是进程的子任务,是cpu进行调度和分配的进本单位,实现进程内部的并发,线程是操作系统可识别的最小执行和调度单位,每个线程都独自占用一个虚拟处理器:独立的寄存器组,指令计数器和处理器状态。每个线程完成独立的任务,但是共享同一片内存空间,打开的文件队列和其他内核资源。
区别:
1.一个线程只能属于一个进程,但一个进程可以拥有多个线程,至少有一个线程,线程依赖于进程存在。
2.进程在运行过程中拥有独立的内存单元,而多个线程共享进程的内存。同一进程中的多个线程共享代码段,数据段,堆区,但是每个线程拥有自己的栈,用来存放临时变量。
3.进程是操作系统的最小分配单位,线程是最小调度单位。
4.系统开销:在操作系统进行创建和撤销进程时,需要分配或者回收内存资源,显著的大于线程;在进行进程切换的时候,需要保存当前整个cpu运行环境和创建新的cpu设置,而线程只需要保存少量寄存器内容。
5.通信:同一进程中的多个线程具有相同的地址空间,因此通信比较容易,比如通过直接读取数据段来进行通信,不过需要进程同步和互斥来保证数据的一致性。
6.进程不会相互影响,一个线程崩掉,整个进程都会崩。
7.进程用于多内核,多机分布;线程用于多内核。
8.进程调试简单方便,但创建撤销开销大;线程调试复杂但开销小,切换速度快。
进程间通信方式:管道,系统进程通信和套接字
1.管道可以用于具有亲缘关系的父子进程通信,命名管道还可以用于无亲缘关系的进程间通信。
普通管道:半双工,具有固定的读端和写端;具有亲缘关系的进程通信;可以被看做是文件,可以使用read和write来读写,但不属于任何文件系统,只是在内核中开辟的一处空间。命名管道有路径名与之关联,属于文件系统;可以用于无亲缘关系的进程通信,它不需要序列化和反序列化,效率比tcp要高,但是比共享内存低。
2.系统进程通信
2.1消息队列
消息队列是消息的链接表,存放于内核中,一个消息队列由消息标识符来标记。具有读权限的进程可以按照一定规则向队列里写信息,具有读权限的进程可以从消息队列读取信息。消息队列克服了信息传输量少,管道只能承载无格式字节流和缓冲区大小受限的缺点。
1.消息队列是面向记录的,其中的消息具有特定的格式和特定的优先级
2.消息队里独立于接收和发送进程,进程终止时,消息队列不会被删除
3.消息队列支持随机读取信息,不需要按先进先出的次序读
2.2信号量
信号量是一个计数器,可以用来控制多个进程对共享资源的访问,信号量用来处理进程间的同步和互斥,而不是用来存储通信数据。
1.信号量用于进程间的同步,如果要存储数据需要结合共享内存。
2.每次对信号量的PV操作不仅加减1,可以是任意正数
2.3信号
用于通知接收进程某个时间已发生
2.4共享内存
多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程对共享内存中数据的更新,这种方式依赖于同步操作,比如互斥棒和信号量。
1.共享内存是速度最快的一种进程通信,因为进程直接对内存访问。
2.多个进程可以同时操作,所以需要同步
3.共享内存通常和信号量同时使用,用来处理同步
3.socket
socket套接字可以用于不同主机之间的进程通信
线程间通信方式:
临界区:通过多线程的串行化来访问公共区域
互斥量:采用互斥对象机制。只有拥有互斥对象的线程才有访问公共资源的权限,只有就可以保证公共资源不会被多个线程同时使用。
信号量:允许多个线程同时去访问同一个资源,一般会有最大线程数;
事件(信号):通过通知的方式来实现多线程同步,还可以方便的实现多线程优先级比较操作。
如果只有进程,可以实现并发、并行操作,但是会出现以下问题:
1.同一时间只能干一件事
2.如果阻塞,整个进程就会被挂起
引入线程,提高了进程的并发性。同时一个进程的不同线程也可以运行在不同的核上,提高了cpu的利用率。一个完整的任务可以拆分为几个独立的子任务,有助于改善程序结构。
并发是指宏观上两个进程在同时运行,但微观上看,是两个进程指令交替运行,每个周期实际上只在运行一条指令,提高了效率
并行是由多核,一个周期确实有多条指令在各自核上运行,互不影响
最后
以上就是尊敬秋天为你收集整理的进程和线程的全部内容,希望文章能够帮你解决进程和线程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复