首页 > 系统相关 >进程和线程

进程和线程

时间:2024-04-27 21:25:35浏览次数:25  
标签:task CLONE 线程 切换 进程 页表

线程和进程

linux中,进程和线程都用task_struct结构体表示,只是进程和线程的区别在于task_struct中的mm和files等资源是否共享。

记录层面
task_struct中有两个字段记录的是编号

  • pid_t pid; /* process id */ task编号,唯一标识一个task
  • pid_t tgid; /* thread group id */ 线程组编号,同一进程中的线程tgid相同

系统调用层面
getpid返回的是task的tgid,gettid返回的是task的pid(和posix的thread id不同)

用户层面
ps显示的PID是实际的tgpid,ps -aL显示的LWP是实际的pid,top -H显示的PID是实际的pid

创建上
进程使用fork函数(使用系统调用fork),线程使用pthread_create函数(使用系统调用clone),二者内部实现都是调用do_fork函数,只是传入的参数不同。
创建进程的flag是SIGCHLD,创建线程的flag包括CLONE_VM,CLONE_FS,CLONE_FILES,CLONE_SIGNAL,CLONE_THREAD,CLONE_SYSVSEM,CLONE_SETTLS,CLONE_PARENT_SETTID和CLONE_CHILD_CLEARTID。

CLONE_VM:和父进程共享内存地址空间,因此共用父进程的mm_struct结构
CLONE_FS:和父进程共享文件系统信息,因此共用父进程的fs_struct结构
CLONE_FILES:和父进程共享文件描述符,因此共用父进程的files_struct结构

而区分进程还是线程的关键在于是否拥有独立的内存空间等资源,因此常说进程是资源分配的基本单位,线程是CPU调度的基本单位。

资源占有

进程占有的资源

  • 内存地址空间
  • 全局变量,静态变量等
  • 打开文件描述符
  • 子进程
  • 信号量
  • 信号处理函数

线程私有

  • 线程ID
  • 寄存器
  • 程序计数器

为什么进程切换比线程切换效率低

CPU上下文:CPU寄存器和程序计数器
进程上下文:寄存器,内存地址空间(堆栈,全局变量,静态变量),内核栈等
进程切换时需要保存和恢复更多的上下文,甚至涉及到内存换入换出,
而同一进程的线程切换只需要保存和恢复线程私有数据,比如寄存器和栈。

之前不太认可页表切换开销大、进程上下文切换开销大的说法,而是认为主要原因是进程切换时涉及到页表的切换,切换之后TLB就失效了,地址转换需要重新查找页表,而线程切换不需要切换页表。
当时想的是进程只有创建时申请内存,切换时不涉及内存分配变动,且页表也在内存中,页表切换只简单涉及页表寄存器的更改。但实际上进程切换可能伴随着页调度,内存不够时进程内存数据要换出,需要的内容换入,所以这么说也可以。

附录

排查线程CPU占用过高的问题

# 查看进程,获取进程ID
top

# 查看进程的线程,获取线程ID
top -H -p <PID>
# 或者
ps -T -p <PID>

# 查看线程的栈信息
pstack <PID>

参考

标签:task,CLONE,线程,切换,进程,页表
From: https://www.cnblogs.com/wangerblog/p/18162550

相关文章

  • Java 多线程初步总结
    Java多线程程序,进程,线程的基本概念:程序:是为了完成特定的任务,使用某种语言编写的一组指令的集合,是一段静态的代码,静态对象,如Excel,World等。进程:是程序的一次执行多次,或者是正在运行的一个程序,是一个动态的过程,有自身的产生,存在和消亡的过程,即存在生命周期。线程:进程可以进一步......
  • openharmony 多线程的方式有哪些?两个worker线程数据如何通讯、内存如何共享、与Java多
    OpenHarmony操作系统支持多种多线程并发处理策略,以提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰。以下是OpenHarmony中的多线程方式,以及Worker线程间的数据通讯和内存共享方法,还有它们与Java多线程的区别:OpenHarmony多线程方式Worker线程:OpenHarmony中的Worker是......
  • 进程和任务
    进程和任务目录进程和任务一、程序和进程的关系1、程序2、进程2.1进程具有的特征2.2线程和进程的关系2.2.1线程:程序执行的最小单位2.2.2进程:资源分配的最小单位2.2.3查看单线程还是多线程2.3进程使用内存的问题2.3.1解决方法2.4进程状态2.4.1过滤僵尸进程2.5进程分类二......
  • gdb 根据c语言二进制文件进程号查看内部多线程任务
    C语言二进制文件a编译时添加了-g(gdb调试),但是gdba这种方式有时不容易复现一些场景。这时可以先正常启动a,然后根据a的进程号启动gdb调试。#1.找到程序进程号psaux|grepa#2.使用GDB附加到该进程sudogdb-p[PID]#3.使用infothreads命令来列出......
  • 多进程编程:原理、技术与应用
    title:多进程编程:原理、技术与应用date:2024/4/2612:14:47updated:2024/4/2612:14:47categories:后端开发tags:多进程并发编程网络服务分布式系统任务处理进程池线程对比第一章:进程与线程进程与线程的概念及区别:进程:进程是操作系统中的一个程序执行......
  • 进程线程基础知识
    进程线程基础知识pcb包含的具体信息进程描述信息(进程标识符,用户标识符)进程管理状态(进程当前的状态,进程的优先级)资源分配清单cpu信息pcb通过链表的方式来进行组织,把具有相同状态的进程链在一起组成队列。进程的上下文切换一个进程切换到另一个进程运行,称为进程的上下文切......
  • Java面试题:SimpleDateFormat是线程安全的吗?使用时应该注意什么?
    在日常开发中,我们经常会用到时间,我们有很多办法在Java代码中获取时间。但是不同的方法获取到的时间的格式都不尽相同,这时候就需要一种格式化工具,把时间显示成我们需要的格式。最常用的方法就是使用SimpleDateFormat类。这是一个看上去功能比较简单的类,但是,一旦使用不当也有可能导......
  • python多线程
    多线程的原理是在同一进程内创建多个线程来执行不同的任务,这些线程共享同一进程的资源,包括内存空间、文件句柄等。每个线程拥有独立的执行路径,可以并行执行任务,从而提高程序的效率。在代码中,通过调用threading.Thread类创建了多个线程对象。每个线程对象都有一个target参数......
  • dotnet 简单方法在一个进程内同时跑起 WPF 和 ASP.NET Core 框架
    从设计架构上,无论是WPF还是ASP.NETCore框架,都是在dotnet运行时上层的应用,两个框架处于平级的结构。理论上讲,两个平级的框架只要不存在特殊的情况,都是能够相容存在的。本文将和大家介绍一个非常简单的方法,在一个进程内同时跑起WPF和ASP.NETCore框架在一个进程内同时跑......
  • docker.from_env() 获取docker守护进程时出现 TypeError: load_config() got an unexp
    某天使用python重启docker容器时,出现了一个令人费解的BUG,我的代码为1defrestart_docker(container_name):2#连接到docker守护进程3client=docker.from_env()4try:5#获取容器对象6container=client.containers.get(containe......