进程和线程笔记

一、区别

进程

进程是一个在内存中运行的应用程序,每个进程都有自己独立的一块内存空间,存储该进程所需要的相关资源,进程是资源(CPU、内存等)分配的基本单元。

一个进程至少有一个线程,且可以有多个线程。

线程

线程是进程中的一个任务单位,负责该进程中某部分任务的执行任务,是CPU调度、内存分配的最小单位,是程序执行的最小单元,也被称为轻量级进程。

每个线程都与该进程下的其他所有线程共享同一块内存空间及资源,即线程之间共享数据。

总结:

线程具有许多传统进程所具有的特征,故又称为轻型进程。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间,程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行。
 

二、优缺点

1、一个进程崩溃不影响其他进程,而一个线程崩溃很可能影响到它本身所处的整个进程使整个进程崩溃。
2、创建多进程的系统花销大于创建多线程。
3、多进程通讯因为需要跨越进程边界,不适合大量数据的传送,适合小数据或者密集数据的传送。多线程无需跨越进程边界,适合各线程间大量数据的传送。并且多线程可以共享同一进程里的共享内存和变量。
 

三、如何选择进程和线程

1)当创建和销毁较频繁时选用线程,因为创建进程花销大。

2)当需要大量数据传送时选用线程,因为多线程切换速度快,不需要跨越进程边界。

3)注重安全稳定选进程;注重快速频繁选线程。

四、通讯方法

1、进程间通信

1)管道

管道 是利用文件系统的操作接口,在操作系统内部实现的一种,用于进程间通信的方式。

特点:利用了文件接口(open、read、write、close、……)、其内容存储在内核空间(内核内存),因此,管道的操作简单,并且效率要高于 文件(不需要访问硬件)

为什么称为管道呢??

是由于 管道内部自带内核空间,用于存储进程间通信的数据,并且该空间遵循“队列”的思维,先进先出,后进后出,从一段写入数据,而从另一端读取数据(水管一样),管道的数据根水流一样,读走了就没得了(不能用lseek)

Linux中的管道分为两种: 有名管道(FIFO) 和 无名管道(Pipe)

无论是哪种管道,其内容都是存储在内核中,两者唯一的区别在于:

 1)无名管道

无名管道的无名 指该管道在文件系统中不存在 文件名(没有i-node节点),因此无名管道只能用于亲缘进程之间。

亲缘进程: 在进程中通过fork出来的新进程与原进程为 父子关系

 2)有名管道

有名管道的有名 指该管道在文件系统中存在一个 文件名(有i-node节点),因此 有名管道可以用于任意进程间通信。

==有名管道和无名管道只是指其在文件系统中是否存在,但管道的内容 只会在 内核中==

2)信号

信号signal在实现的时候其实就是一个 整数。

每个进程都可以接收 signal,而且的维护是在内核中实现(由内核维护信号),因此,信号在不同进程之间也属于 共享资源,可以用于实现 不同进程间的 进程间通信。

3)消息队列

对于系统中每个消息队列,内核都会维护一个定义在 <sys/msg.h>头文件中的 消息结构体,消息队列的实现实质,就是在内核中由内核维护着的一个带头结点的链表。

消息队列是随内核持续,任何进程发送到消息队列的消息,即便进程已经消亡,只要内核存在,则消息会一直在内核中,直到被 其它用户进程接收。

发送消息时,必须指定消息的type类型,因为可能会有多个进程利用同一个消息队列进行通信,接收方可以根据消息的type来区分自己要接收的消息,接收方在接收时,只会接收自己想要的类型的消息。

4)共享内存

共享内存的实质是在内核空间中开辟了一块 任意进程都能访问(共享)的 内存存储空间,由于两个进程映射了同一个共享内存,由映射原理(操作映射内存,就等同于操作了被映射的对象,反正依然可知,两个进程相当于有了重叠的 内存地址。

5)信号量

信号量 semaphore 是一种用于提供在不同进程间 或 同一进程的不同线程间的一种 同步手段的原语。信号量机制其实是程序设计者之间的一种 “君子之约”: 在访问带互斥属性的共享资源前,必须先访问信号量,得到信号量才能访问共享资源。

信号量本身也是一个共享资源(因为其要能被多个进程访问)。

2.线程间通信

1)信号量

2)互斥锁

互斥锁是POSIX提供的,一种用于线程间的互斥手段。使用方法与信号量类似。

信号量和互斥锁的区别

1、信号量用于不同进程间(也可用于线程间)通信,存在内核中;

      互斥锁用于同一进程的不同线程,存在于进程的共享内存中。

2、 互斥锁用于线程的互斥,信号量用于线程的同步。  这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。  

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。  

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源  

3、 互斥量值只能为0/1,信号量值可以为非负整数。  

也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。  

4、互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十九-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值