【前情提要】:
1.在Linux下,没有线程这个概念,而在Windows系统下有线程。
2.Linux下,用进程来模拟线程(这种模拟出来的线程叫做轻量级进程,简称LWP)。
3.在Linux中(在CPU角度看)线程被称作轻量级进程,由于Linux下没有真正的线程,只有所谓的用户级线程,线程在进程内分布的地址空间内彼此独立地运行。
4.线程并没有独立的虚拟地址空间,只是在进程虚拟地址空间中拥有相对独立的一块空间。
5.多个线程各自有一个栈,共有一个堆。

一、 LWP

LWP被称作轻量级进程,在计算机操作系统中,轻量级进程(LWP)是一种实现多任务的方法。与普通进程相比,LWP与其他进程共享所有(或大部分)它的逻辑地址空间和系统资源;与 线程 相比,LWP有它自己的进程标识符,优先级,状态,以及栈和局部存储区,并和其他进程有着父子关系;这是和类Unix操作系统的系统调用vfork()生成的进程一样的。另外,线程既可由应用程序管理,又可由内核管理,而LWP只能由内核管理并像普通进程一样被调度。Linux内核是支持LWP的典型例子。
  在大多数系统中,LWP与普通进程的区别也在于它只有一个最小的执行上下文和调度程序所需的统计信息,而这也是它之所以被称为轻量级的原因。一般来说,一个进程代表程序的一个实例,而LWP代表程序的执行线程。

二、进程

2.1 进程定义

基本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体

我们通常通过PCB来描述进程 ,PCB(process control block),在Linux操作系统下的PCB是: task_struck.task_struck通常来描述进程,是内核里面的一种数据结构,通常被装在在内存里。
task_struct 中常包含这些信息:

标示符: 描述本进程的唯一标识符,用来区别其他进程。
状态 :任务状态,退出代码,退出信号等。
优先级 :相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文数据:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等

2.2 创建进程

参考我的博客
进程的一生

2.3 终止进程

参考我的博客
进程的一生

三、线程

3.1创建线程

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)
(void*), void *arg);
参数
thread:返回线程ID
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:是个函数地址,线程启动后要执行的函数
arg:传给线程启动函数的参数
返回值:成功返回0;失败返回错误码

基本概念:

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进 程内部的控制序列” 一切进程至少都有一个执行线程
线程在进程内部运行,本质是在进程地址空间内运行 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化
透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

虽然线程共享进程内大部分资源,但是线程也有自己的数据:

线程ID
一组寄存器

errno
信号屏蔽字
调度优先级

3.2 终止线程

如果需要只终止某个线程而不终止整个进程,可以有三种方法:

  1. 从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit。
  2. 线程可以调用pthread_ exit终止自己。
  3. 一个线程可以调用pthread_ cancel终止同一进程中的另一个线程

不要用exit直接退出,用exit退出你会发现什么都不会出现,因为系统这时候会将这个线程当作一个进程来对待。
pthread_exit函数:

void pthread_exit(void *value_ptr);

pthread_cancel函数:

int pthread_cancel(pthread_t thread);

3.3 线程的优点

创建一个新线程的代价要比创建一个新进程小得多 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多 线程占用的资源要比进程少很多
能充分利用多处理器的可并行数量 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作

3.4 线程的缺点

健壮性降低
、、编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了 不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
缺乏访问控制
、、进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
编程难度提高
、、编写与调试一个多线程程序比单线程程序困难得多

【LWP,进程,线程】Linux相关推荐

  1. linux 下的进程创建线程,Linux线程 之 线程 线程组 进程 轻量级进程(LWP)

    线程是有栈的,我们知道,普通的一个进程,它的栈空间是8M,我们可以通过ulmit -a查看: stack size (kbytes, -s) 8192 线程也不例外,线程也是需要栈空间的这句话是废话, ...

  2. Linux查看进程线程个数

    1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...

  3. 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)

    文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...

  4. php linux fork进程 多个进程/线程共享一个 socket连接 出现多个进程响应串联

    简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复现示例代码: testFork.php <?php requi ...

  5. 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )

    文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...

  6. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下文并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一 ...

  7. 32位linux进程线程在内存中的样子

    1.线程诞生史 1.1 线程诞生的原因 早期是没有线程概念的,只有进程的概念,操作系统以进程为调度单位.--可以这么来理解:早期进程相当于现在的单线程的进程(只有一个线程的进程,创建进程时,里面有一个 ...

  8. Linux的进程/线程/协程系列4:进程知识深入总结:上篇

    Linux的进程/线程/协程系列4:进程/线程相关知识总结 前言 本篇摘要: 1. 进程基础知识 1.1 串行/并行与并发 1.2 临界资源与共享资源 1.3 同步/异步与互斥 1.4 进程控制原语 ...

  9. linux的进程/线程/协程系列5:协程的发展复兴与实现现状

    协程的发展复兴与实现现状 前言 本篇摘要: 1. 协同制的发展史 1.1 协同工作制的提出 1.2 自顶向下,无需协同 1.3 协同式思想的应用 2. 协程的复兴 2.1 高并发带来的问题 2.2 制 ...

  10. linux的进程/线程/协程系列3:查看linux内核源码——vim+ctags/find+grep

    linux的进程/线程/协程系列3:查看linux内核源码--vim+ctags/find+grep 前言 摘要: 1. 下载linux内核源码 2. 打标签方法:vim+ctags 2.1 安装vi ...

最新文章

  1. 浅析堡垒机概念及工作原理(转)
  2. C#关于事件的几个好例子
  3. linux 压缩为多个文件,在Linux中,如何将输入流压缩为多个输出文件?
  4. TaskBar Hider – 用快捷键手动隐藏任务栏[Windows]
  5. (22)Verilog HDL结构:function语句
  6. 使用Jquery+CSS如何创建流动导航菜单-Fluid Navigation
  7. 基于Java开发的学校信息管理系统的设计与实现(含论文及毕业设计源码、数据库文件)
  8. mp4视频文件截图--h264解码成yuv再转存为bmp图片
  9. 新旧《西游记》人物造型大PK (转)
  10. linux存放系统文件的目录是,linux系统文件目录列表简介
  11. 纳尼?Collections对时间戳排序出错了??
  12. 把你的阿里巴巴图标库转成你自己的@ant-design/icons
  13. Codeforces Beta Round #14 (Div. 2) E. Camels
  14. web前端开发规范项目流程总结
  15. C++实现简单电话通讯录
  16. about GLOBAL TEMPORARY TABLES
  17. 百度地图的驾车路线规划
  18. GIS在石油行业中的应用
  19. layui报错Uncaught TypeError: tree is not a function
  20. iOS开发中常用到的第三方库

热门文章

  1. python 日历热力图_pyecharts日历热力图
  2. linux双击打开二进制文件,linux下打开二进制文件
  3. 用一年的数据预测下一年数据_一年的招聘数据中的经验教训
  4. 商业智能BI的价值,可视化报表等于商业智能BI吗?
  5. Wargames学习笔记--Natas
  6. mysql 改成 localhos_MySQL添加用户、删除用户与授权
  7. 《TCP/IP网络编程》第20章
  8. 计算机器怎么验证,谷歌验证器【设置步骤】
  9. 服务器开机必须要按f1才能进系统,每次开机都要按F1才能进入系统的解决方法...
  10. 百度实时主动推送url