Linux中线程与进程对比总结

进程是资源分配的最小单位,线程是CPU调度的最小单位。进程拥有独立的地址空间,线程共享。线程创建和切换开销小,通信方便,但多线程可能导致竞态条件。进程间通信复杂,但更安全。多线程执行效率高,多进程资源消耗大。
摘要由CSDN通过智能技术生成

进程线程的定义

1.进程定义

**进程:**资源分配的最小单位。(内核)

进程(process)是一个可并发执行的程序在某数据集上的一次运行。

程序是进程的一个组成部分,是进程的执行文本,而进程是程序的执行过程。

从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。

(!!!并且进程同样拥有优先级的判断,执行高优先级。)

注意:实现进程互斥与同步的手段有多种,其中,信号量是最早出现的进程同步机制。因其简洁有效,信号量被广泛地用来解决各种互斥与同步问题。P,S原语操作!!!

信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。

用P、V操作实现进程互斥

两步走即可实现进程的互斥:

  • 定义一个互斥信号量,并初始化为 1
  • 把对于临界资源的访问置于 P 操作和 V 操作之间

2. 线程定义:

**线程:**程序执行的最小单位。线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。

线程是参与系统调度的最小单位。它被包含在进程之中,是进程中的实际运行单位。一个线程指的是进程中一个单一顺序的控制流(或者说是执行路线、执行流),一个进程中可以创建多个线程,多个线程实现并发运行,每个线程执行不同的任务

互斥锁,条件变量等

线程则使用互斥锁进行加锁和解锁,pthread_mutex_xxx,相应的和进程在思想上一定的相似之处。类似于阻塞等待终止等

3.区别

进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。

(1)线程共享内存空间;进程的内存是独立的;

(2)同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现(无法直接交流);

(3)创建新进程很简单;创建新进程需要对其父进程进行一个克隆;(fork()一个又何妨)

(4)一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程(不能控制或操作其他进程);

(5)改变主线程(如优先权),可能会影响其他线程;改变父进程,不影响子进程。

(6)调度:线程作为分配和调度的基本单位,进程作为拥有资源的基本单位

(7)并发性:不同进程之间可以并发执行,同一进程内的线程也可以并发执行

(8)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的系统资源

(9)系统开销:在创建和撤销进程的时候,系统都要分配和回收资源,导致系统的明显大于创建和撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式的下不会对其他进程造成影响,而线程只是进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死后就等于整个进程死掉,所以多进程程序要比多线程程序健壮,但是在进程切换的时候消耗的资源较大,效率差。

根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。(就像是不同树枝,每个树枝上的叶子存在于相同的树枝,共享一个树枝。)

总结:多线程执行效率高; 多进程耗资源,安全。

4.同

线程也有就绪、阻塞和运行三种基本状态

都要不免死锁的问题

5.二者的关系

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;

(2)资源分配给进程,同一进程内的所有线程共享该进程的所有资源;

(3)线程在执行过程中需要协作同步。不同进程中的线程之间要利用消息通信的方法实现同步;

(4)处理机分配给线程,即真正在处理机上运行的是线程

(5)线程是进程的一个执行单元,也是进程内的可调用实体

6.进程的优点与缺点

优点:

1)顺序程序的特点:具有封闭性和可再现性;(更加安全可靠)

2)程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提高了系统的效率和系统的资源利用率。

缺点:

1)操作系统调度切换多个线程要比切换调度进程在速度上快的多

2)进程间内存无法共享,通讯也比较麻烦。线程之间由于共享进程内存空间,所以交换数据非常方便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。(给人一种供不应求的感觉,产20个面包,但总是吃25个)

7.线程的优点和缺点

优点:

1)它是一种非常"节俭"的多任务操作方式。(损耗或者需求更少,更利于多进程交互信息时的流畅)

在Linux系统下:

启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码 段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据。

而启动一个线程 所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。当然,在具体的系统上,这个数据可能 会有较大的区别;

2)线程间方便的通信机制,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;

3)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;(对于在cpu上,进程中线程的数目受到控制一方面是对cpu的保障,一方面是最大利用了线程的优势,分配合理)

4)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改

缺点:

1)调度时, 要保存线程状态,频繁调度,需要占用大量的机时;

2)程序设计上容易出错(线程同步问题)。因为有时分复用,要处理同步问题也是一个难点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

芯片烧毁大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值