(1)fork()后创建的子进程是父进程的拷贝,那么pthread_create,创建线程,创建的线程跟原进程有什么关系呢?
fork 会通过拷贝产生新的虚拟地址空间(PCB 会变化),而 pthread_create 后,虚拟地址空间没有变化,原进程退化成线程(主控线程)。 创建的子线程和主控线程共享地址空间,且各自有独立的 PCB(由一个 PCB 变成多个,但相同)。
(2)子线程的 PCB 是从主控线程拷贝来的。
(3)子线程和主控线程共享地址空间,用户区中除了栈区独有,其余都共享。因此可以通过全局变量进行通信,但不可以通过局部变量进行通信。
(4)栈不共享,各线程平分栈空间,而非另外创建栈空间。
注意:
在 Linux 下,对于内核,线程就是进程 。
进程是最小的系统资源分配单位,线程是最小的执行单位。
线程号和线程 ID 的区别:一个线程 ID 可能对应多个进程号,用户看线程 ID,内核看线程号。
查看指定线程的 LWP 号: 首先找到程序的进程 pid (ps aux | grep 关键字);其次 ps -Lf pid。
(5)多进程和多线程的区别
多进程始终共享的资源:代码段.txt,文件描述符,内存映射区。
多线程始终共享的资源:堆、全局比变量。
使用多线程好处:可以更简单的实现通信;而且可以节省资源,更合理的利用 CPU(如果有两个 CPU,对于一个进程,只能占用一个,但创建一个线程,两个线程就都可以跑,在内核看来,占用同样的地址空间,但有 2 个进程在运作)。

Linux学习之系统编程篇:对线程的基本认识相关推荐

  1. Linux学习之系统编程篇:线程同步的引出和思想

    一.线程同步的引出 程序:父子线程交替数数 #include <stdio.h> #include <unistd.h> #include <string.h> # ...

  2. Linux学习之系统编程篇:杀死 / 取消线程

    函数: int pthread_cancel(pthread_t thread);//参数:线程 ID 注意:并不是调用了 pthread_cancel,就一定能杀死进程, 必须死在"取消点 ...

  3. Linux学习之系统编程篇:实现线程分离

    函数: int pthread_detach(pthread_t thread); // 参数:线程 ID 最大特点: (1)子进程会自己回收 PCB,因此调用该函数之后,不需要调用 pthread_ ...

  4. Linux学习之系统编程篇:回收子线程资源

    子线程退出后,主控线程也是需要回收子线程资源的. 函数:pthread_ join 阻塞等待线程退出,获取线程退出状态函数说明: int pthread_join(pthread_t thread, ...

  5. Linux学习之系统编程篇:练习验证线程共享全局变量

    #include <pthread.h> #include <stdio.h> #include <unistd.h> int var = 1001; void * ...

  6. Linux学习之系统编程篇:单个线程的退出函数

    能否用 exit 来退出某个线程,exit 是用来退出进程的,因为父子线程共享同一地址空间,如果在某线程中使用,会使 所有线程全退出,因此需要使用别的函数 :pthread_exit (注意:子线程使 ...

  7. Linux学习之系统编程篇:创建线程函数

    所有线程函数相同点: (1)函数调用成功返回 0,失败返回错误号(但注意:不能用 perror 打印). (2) 头文件:#include <pthread.h> 编译时候需要使用线程库, ...

  8. Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式

    一.ps 和 kill 命令 1.ps 命令 常用方式: ps aux :查看正在运行进程信息(主要查 pid). ps ajx :更加详细(PID. PPID:父进程 id. PGID:进程组 id ...

  9. Linux学习之系统编程篇:使用信号量实现“生产者和消费者模型”

    模型中,最为关键的步骤是,在生产者回调函数中,未生产之前,消费者回调函数是阻塞的,阻塞方式是条件变量. 那么不使用条件变量,如何使用"信号量"实现阻塞呢? 答案是因为调用 sem_ ...

最新文章

  1. 2020 年度最佳的23个机器学习项目!(附源代码)
  2. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(一)
  3. OpenCV形态学变换函数morphologyEx()开运算的使用
  4. CodeForces - 1420D Rescue Nibel!(组合数学+离散化)
  5. .NET Core 2.1 Preview 2发布 - April 10, 2018
  6. java之socket的OOBInline和UrgentData和发送心跳包研究
  7. 启动azkaban报错_解决启动Azkaban报错问题:java.lang.NoSuchMethodError: com.google.comm
  8. c语言高级语言期中测试答案,上海理工大学C语言2011期中试题和答案
  9. mybatis学习(43):一级缓存被刷新情况
  10. python打印表格_python 6.7 编写printTable()函数表格打印(完整代码)
  11. 职业高中计算机专业目标,职业高中计算机专业开设的必要性
  12. springMvc + websocket 实现点对点 聊天通信功能
  13. Qt_解决Qt5.15 + Xcode12iOS端qmake不可用的问题
  14. roboware studio安装
  15. PDF转换工具安装教程
  16. EA enterprise architect 画类图
  17. opcode php 5.4,为PHP5.4开启Zend OPCode缓存
  18. 【ACWing】658. 一元二次方程公式
  19. /dev/sr0 3.7G 3.7G 0 100% /media/CentOS_6.8_Final no space left on device磁盘空间不足处理
  20. 【现代机器人学】学习笔记七:开链动力学(前向动力学Forward dynamics 与逆动力学Inverse dynamics)

热门文章

  1. 关于浏览器跨域请求的相关原理实现--很经典的博客
  2. 全网首个OpenPrompt尝鲜报告:Prompt研究者必备实验利器
  3. 一文详解图对比学习(GNN+CL)的一般流程和最新研究趋势
  4. 上海人工智能实验室牛雅哲:通用决策AI平台的开拓创新之路
  5. CTO案头必备|AI技术产业落地的42章经
  6. 热门的模型跨界,Transformer、GPT做CV任务一文大盘点
  7. ACL 2020 | 用于多领域端到端任务型对话系统的动态融合网络
  8. 一文读懂领域迁移与领域适应的常见方法
  9. Science论文解读:打牌一时爽,一直打牌一直爽
  10. 深度强化学习实战:Tensorflow实现DDPG - PaperWeekly 第48期