Linux---线程概念

在Linux下 , 操作系统是通过PCB来模拟线程的.

因为CPU是通过操控PCB来操作进程的 , 每一个进程都有一个属于自己的虚拟地址空间, 并且通过页表对应到内存上
如下图中, 一个程序有四个函数 , 此时要创建4个进程分别去执行四个函数的话, 需要创建四个虚拟地址空间 , 通过页表的映射 , 找到四个函数分别内存上的地址,来执行四个函数
在这里插入图片描述

当我们要让进程执行不同的函数时, 因为创建一个进程时, 同时也要创建虚拟地址空间与页表, 这样在程序运行时会对性能造成不小的影响 .
而线程就是在创建出PCB的时候让这些PCB共用同一块虚拟地址空间, 在同一块虚拟地址空间上,PCB分别指向不同的函数去执行. 这样就大大提高了性能
创建的4个PCB共用同一块虚拟地址空间, 并且它们4个共享这块资源 , 这样减少了创建其他虚拟地址空间是的损耗

在这里插入图片描述因此说在Linux下 , 线程是通过PCB模拟实现的 , 它们共用同一块虚拟地址空间 , 共享进程中的大部分资源 , 所以线程是一个轻量级的进程
此时的PCB成了线程 , 而进程成了线程组 , 一个进程中至少包含了一个线程

因为CPU的基本调度单位是线程 , 因此线程是进程内部的一个执行流 -----所以线程是CPU调度的基本单位

**线程共用同一块虚拟地址空间 , 因为进程就是线程组----所以进程是资源分配的基本单位 **

线程共享

  1. 同一地址空间上的 代码段, 数据段.
    一般我们创建线程去执行主线程的函数 , 保存代码和全局变量的代码段与数据段是线程之间共享的.
  2. 共享文件描述符表
    不同的线程通过文件描述符表的共享可以操作同一个文件
  3. 信号处理方式
  4. 当前工作路径
  5. 用户组与用户

线程独有

对比进程创建的 vfork() 函数,vfork() 在创建进程时是复制一个PCB,子进程与父进程共用一块虚拟地址空间, 这样会在程序运行时造成 调用栈混乱 ,因此vfork()函数创建后,必须让父进程阻塞.
而线程也是共享同一块虚拟地址空间的 , 他却不会造成调用栈混乱 , 是因为线程也有自己都有的资源


  1. 同一个进程内的线程在进程的虚拟地址空间上都会开辟出自己独有的一片空间用来保存自己的数据和做自己的栈区
  2. 上下文数据(寄存器)
  3. 信号屏蔽字
  4. errno

多线程和多进程的优缺点分析

多线程的优点

  1. 由于线程共用同一块虚拟地址空间 , 共享数据段和代码段, 因此线程在进行通信的时候相对于进程就简单, 并且进程间的通信全部适用于线程
  2. 由于在创建PCB时少了 , 虚拟地址空间与页表, 多以线程的创建和销毁的成本较低
  3. 现成的调度成本更低

多线程的缺点
4. 线程缺乏访问控制 : 一些系统调用和错误只是针对进程的
例如:exit接口只针对进程退出
5. 健壮性较低 : 线程的某一个错误可能会直接是进程退出
6. 线程安全问题

共同的优点
针对IO,密集型程序与CPU密集型程序两者共同使用,会体高性能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值