进程和线程


点击查看参考资料


1 进程

进程是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发。

至少有5种基本状态

  • 初始状态
  • 等待状态
  • 就绪状态
  • 执行状态
  • 终止状态

2 线程

线程是进程的子任务,是cpu调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发。

  • 线程是操作系统可识别的最小执行和调度单位。
  • 每个线程都独自占用一个虚拟处理器:独自的寄存器组、指令计数器和处理器状态。
  • 线程可与同属一个进程的其他线程共享进程所拥有的全部资源。

3 进程和线程的联系

线程是进程的一部分。一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

4 进程和线程的区别

  • 进程是资源分配的单元,线程是任务执行单元
  • 进程是运行中的程序,线程是进程的内部的一个执行序列
  • 多个线程共享进程的资源
  • 进程间切换代价大,线程间切换代价小
  • 进程拥有资源多,线程拥有资源少
  1. 根本区别:
    • 进程是操作系统资源分配的基本单位
    • 而线程是任务调度和执行的基本单位。
  2. 开销方面:
    • 每个进程都有独立的代码和数据空间,程序之间的切换会有较大的开销。
    • 线程可以看作是轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销较小。
  3. 所处环境:
    • 在操作系统中,能同时运行多个进程
    • 而在同一进程中有多个线程同时执行
  4. 内存分配方面:
    • 系统在运行的时候会为每个进程分配不同的内存空间
    • 除了CPU外,系统不会为线程分配内存空间,线程所使用的资源来自其所属进程的资源,线程组之间只能共享资源。
  5. 包含关系
    • 线程是进程的一部分,可被称为“轻量级进程”
    • 没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的

5 进程间通信方式

不同的进程间有着不同的虚拟地址空间,所以进程间的通信不能简单地直接共享内存。

常用的进程方式有:

  1. 管道

    • 无名管道:一种半双工的通信方式,只能在具有亲缘关系的进程间使用(父子进程)
    • 有名管道:一种半双工的通信方式,它允许无亲缘关系进程间的通信
  2. 信号量(Semaphore):一个计数器,可以用来控制多个线程对共享资源的访问。用于实现进程间的互斥和同步。

  3. 消息队列(Message Queue):是消息的链表,存放在内核中。一个消息队列并由一个标识符标识。

  4. 共享内存(Shared Memory):多个进程的地址空间都映射到同一块物理内存,这样多个进程都能看到这块物理内存,实现进程间通信。而且不需要数据的拷贝,所以速度最快。

  5. 套接字(Socket):可用于不同计算机间的进程通信

    例子:使用了【共享内存+信号量+消息队列】的组合来实现服务器进程与客户进程间的通信。

    1. 共享内存用来传递数据;
    2. 信号量用来同步;
    3. 消息队列用来 在客户端修改了共享内存后 通知服务器读取。

1、单工通信是指消息只能单方向传输的工作方式。

在单工通信中,通信的信道是单向的,发送端与接收端也是固定的,即发送端只能发送信息,不能接收信息;接收端只能接收信息,不能发送信息。基于这种情况,数据信号从一端传送到另外一端,信号流是单方向的。

2、半双工通信可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。

在这种工作方式下,发送端可以转变为接收端;相应地,接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种切换方向的单工通信。

3、全双工通信是指在通信的任意时刻,线路上存在A到B和B到A的双向信号传输。 全双工通信允许数据同时在两个方向上传输,又称为双向同时通信,即通信的双方可以同时发送和接收数据。

在全双工方式下,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送。这种方式要求通讯双方均有发送器和接收器,同时,需要2根数据线传送数据信号。

6 线程间的通信方式

线程是共享进程的内存空间,所以考虑好互斥和同步即可.常用的措施有:

  • 锁机制:
    • 互斥锁(互斥):在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量。对互斥量进行枷锁以后,其他视图再次对互斥量加锁的线程都会被阻塞直到当前线程释放该互斥锁。
    • 条件锁,即“条件变量”(同步):一个线程完成了某一个动作就通过条件变量发送信号告诉别的线程,别的线程再进行某些动作。(条件变量必须和互斥锁配合使用)
    • 自旋锁:在获取锁之前一直处于忙等的阻塞状态。
      • 互斥锁是sleep-waiting的锁,如果线程2想去获取互斥锁,但线程1正在使用。那么线程2处于阻塞状态,被放到等待队列中去了。但是运行线程2的处理器不会因为线程阻塞而空闲着,它会去处理其他事务。
      • 但是自旋锁是sleep-waiting的锁,运行线程2的处理器会一直不断地循环检查锁是否可用,直到获取到这个自旋锁为止。
    • 读写锁:有三种状态
      • 读模式加锁状态:所有试图以读模式对资源进行加锁的线程都可以得到访问权,但是任何以写模式对资源进行加锁的线程都会阻塞,直到所有的线程释放它们的读锁为止。
      • 写模式下加锁状态:在这个锁被解锁之前,所有视图对这个锁加锁的线程都会被阻塞。
      • 不加锁状态
  • 信号量机制(同步):一个非负的整数计数器,用来实现对公共资源的控制。
  • 屏障:协调多个线程并行工作的同步机制。屏障允许每个线程等待,直到所有的合作线程都达到某一点,然后从该点继续执行。

互斥和同步的区别

  • 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排他性。但是访问是无序的。
  • 同步:在互斥的基础上,通过其他机制实现对资源的有序访问。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值