进程

在理解线程之前,首先需要了解UNIX/Linux进程。 进程是由操作系统创建的,需要相当数量的“开销”。 进程包含有关程序资源和程序执行状态的信息,包括:它是一个在随机访问内存(RAM)中,正在执行的程序,它是资源分配的最小单位。

  • 1)进程ID,进程组ID,用户ID和组ID
  • 2)环境
  • 3)工作目录
  • 4)程序说明
  • 5)寄存器
  • 6)栈
  • 7)堆
  • 8)文件描述符
  • 9)信号动作
  • 10)共享库
  • 11)进程间通信工具(例如消息队列,管道,信号量或共享内存)

线程

它是程序执行的最小单位,又称为轻量级的进程,操作系统独立调度和分派到CPU的基本单位,它是进程中的一个实体,一个进程中可以包含多个线程。这些线程共享同一个进程中的资源,我们之前以进程为单位的编程模式,也叫单线程的编程模式

  • 存在于进程中并使用进程资源
  • 只要其父进程存在并且操作系统支持它,便拥有自己的独立控制流
  • 仅复制需要独立计划的必要资源
  • 可以与相对地"平等"运行的其他线程共享进程资源
  • 如果父进程死亡-所有线程就不复存在
  • 是“轻量级的”,因为大多数开销已经通过创建其进程来完成。

并发:在同一个核心的CPU中,同一个时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。

并行:是指在同一个时刻,有多条指令在多个处理器上同时执行。

同步:彼此有依赖关系的调用不应“同时发生”,而同步就是阻止同时发生的事情,同步机制通常是一个线程拥有可以访问系统资源的锁,意味着某个线程在某一时刻执行时占用着CPU资源和进程级别的共享对象会被"锁定",其他线程会被抑制执行而无法获取CPU资源和进程级别共享对象访问的控制权,只有等到拥有该锁的线程的锁释放后,其他线程有机会"争夺"获得该锁才能获得CPU资源和进程的共享对象访问的控制权。

异步:和同步的概念是相对的,任何两个彼此独立的操作是异步的,它表明事件是独立发生的。

题外话

还记得我经常说CPython更新到3.9版本为止,实质上仍然是一个单线程的语言,它压根就不存在线程并发,任何说CPython是一个线程并发的话语都是自欺欺人的。就因为全局解释器锁(GIL),因为CPython的内存垃圾回收机制中,所有PyObject对象内部都有一个引用计数器,在不存在GIL的多线程运行情况下,运行中的相关PyObject对象的引用计数器的值存在被某一个或多个线程篡改,从而导致内存回收机制无法正常执行的风险,因此CPython只能通过GIL来束缚某个时刻多个独立线程运行的情况出现。次要原因要追溯CPython内存垃圾回收的单一化实现,而从目前CPython的源代码看来,除了将基础的内核代码推倒重来并加入更多的内存垃圾回收的算法现实,不然未来不太可能移除GIL。因此为了摆脱GIL,后来陆续出现了PyPy、Cython、Jython、Number和IronPython这些不同的实现。

创建一个线程

首先每个线程,操作系统都会给每个线程分配一个线程ID,在Linux下,进程ID是一个pid_t类型的整数,线程ID是一个标识符类型pthread_t的整数

像pthread_self()和getpid()这些函数在安装Linux/Unix系统后原生内置的函数,通常叫系统调用(Syscall),就是系统原生提供给C/C++程序员使用的系统函数接口,这些系统函数通常可以通过man命令能够查到它的使用方法,例如可以在/usr/include目录下查看对应的系统函数的头文件

vim /usr/include/bits/pthreadtypes.h

我们知道,线程ID其实就是一个long int的无符号整数

我们也可以通过man getpid和man pthread_self分别查看一下,在使用它们之前需要导入那些依赖的头文件,如果你不熟悉的系统函数,你应该经常通过man指令来查看对应的描述文档。

编程示例

我们在没有提及多线程编程模式的时,那些编写的示例代码都是单线程的程序,也就是一个进程中只有一个线程。我们下面的例子是要获取当前运行进程的ID和线程ID,该示例就是一个单线程的程序。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>int main(void){pid_t pid=getpid();pthread_t tid=pthread_self();printf("当前线程ID:%lx,进程ID:%un",tid,pid);return 0;
}

在编译多线程的程序时,记得链接pthread库,即

gcc app.c -o app -pthread

输出

当前线程ID:7fedbcb524c0,进程ID:30167

小结:

进程是获取资源的最小单位,例如组成我们进程的函数栈和堆内存,注意在主流系统中每个进程中有它对应的函数栈和堆内存,而且这些堆和栈对用于它们的进程来说是私有的,其他进程无法访问。

线程是进程中的一个或多个实例,而线程的职责是消耗进程获得的系统资源(CPU中的寄存器,计算单元和控制单元,以及随机访问内存),在一个进程中,只有一个线程的程序,该线程也叫主线程,主线程可以创建其他子线程

linux编程基础_第1篇 Linux系统编程 -多线程基础相关推荐

  1. hive编程指南_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  2. linux 字符串截取_第13篇:Linux防火墙的日志基本审计

    整个Linux日志管理,大体上就分为三个管理区块:日志的采集以及分析.轮转 rsyslog是一个系统的守护进程,绝大部分和操作系统有关的日志,例如系统安全.认证,计划任务等等都由该进程完成. 还有一些 ...

  3. linux设置基础软件仓库时,安装centos系统时设置基础软件仓库出错

    安装centos系统时设置基础软件仓库出错,公钥,命令,视频教程,器上,提示 安装centos系统时设置基础软件仓库出错 易采站长站,站长之家为您整理了安装centos系统时设置基础软件仓库出错的相关 ...

  4. 工业机器人编程与操作-搬运机器人码垛系统编程与仿真

    目录 一.设计背景 二.课程设计任务要求 三.设备导入并布局 四.传送带的smart组件 五.传送带整体思路 六.夹爪的smart组件6.1 LineSensor被测是否有任何对象与两点之间 七.夹爪 ...

  5. hive编程指南电子版_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  6. spark-sql建表语句限制_第三篇|Spark SQL编程指南

    在<第二篇|Spark Core编程指南>一文中,对Spark的核心模块进行了讲解.本文将讨论Spark的另外一个重要模块--Spark SQL,Spark SQL是在Shark的基础之上 ...

  7. 编程实现将rdd转换为dataframe:源文件内容如下(_第四篇|Spark Streaming编程指南(1)

    Spark Streaming是构建在Spark Core基础之上的流处理框架,是Spark非常重要的组成部分.Spark Streaming于2013年2月在Spark0.7.0版本中引入,发展至今 ...

  8. 小红帽linux操作教程_【免费】Linux从入门到精通教程!

    Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的操作系统.伴随着互联网的发展,Linux得到了来 ...

  9. linux 内存管理_真香!Linux 原来是这么管理内存的

    这是 Linux 系列第三篇文章,前两篇文章如下 程序员cxuan:初识 Linux 系统,就这一篇了!​zhuanlan.zhihu.com 程序员cxuan:Linux 进程必知必会​zhuanl ...

最新文章

  1. Linux修改UTF8字符编码
  2. 从 wiscKey 看 LSMtree 的不足
  3. Source Insight经典教程
  4. jvm(11)-晚期(运行期)优化
  5. Err:ClassNotFoundException: org.apache.tomcat.util.log.SystemLogHandler
  6. 如何安装中文manpage
  7. UVA10018 Reverse and Add【回文数+水题】
  8. __proto__和prototype 小记
  9. JAVA实用教程(第六版)——期末复习1
  10. 使用Windows自带的录音机进行wav转mp3的操作
  11. 解决虹软人脸识别打开摄像头黑屏的BUG
  12. 屏幕录像大师2016【破解版】
  13. 51单片机——串口通信
  14. net share列出了Windows的默认共享(包括C盘)
  15. el-upload 仅上传一张图片
  16. Linux系统网络环境配置(初学者必看)!!
  17. (数据库系统)(十二)故障恢复
  18. Linux最著名的文本编辑器,最优秀的5个Linux文本编辑器
  19. 一文读懂C#中的抽象类、抽象方法、virtual虚函数、override重写函数及父类子类构造函数和析构函数的执行顺序
  20. 中国省份及其地级市整理JSON版(2015-08-23)

热门文章

  1. Laya 位图字体制作(失败...)
  2. 03-Tomcat服务器
  3. bzoj3450 Easy(概率期望dp)
  4. 【引用】Linux常用的日志文件解说及常用系统命令
  5. 如何理解IIS 7的两种应用程序池的管道模式(Managed Pipeline Mode)
  6. 用XMLHTTP获取动态页生成的HTML内容
  7. 42.存储器管理应具有的功能?
  8. 没有人会尊重弱者,把弱者当成朋友!人们永远追随强者,永远和强者结盟!
  9. MinGW-W64安装及其使用
  10. 担心被机器人抢饭碗?亚马逊教 10 万员工这样保住工作