1、进程的概念

进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

2、轻量级进程

轻量级进程由clone()系统调用创建,参数是CLONE_VM,即与父进程是共享进程地址空间和系统资源。轻量级进程有自己独立的用户空间栈和内核空间栈,并且可以被linux操作系统像普通进程一样被调度。

3、线程的概念

linux系统中用户线程就是轻量级进程,因为用户线程就是由轻量级进程实现的。

4、进程的内存分布

可执行程序文件必须被加载到内存中才能真正跑起来,程序被加载到内存中如上图所示,标注出来的地址是虚拟地址,也就是用户空间为低位的3G,内核空间为高位的1G。

.text区域:存放的是程序的代码段,该区域只读

.data区域:存放的是已经初始化的静态或全局变量

.bss区域:存放的是未初始化的静态或全局变量

heap区域:程序中的堆,程序中动态申请的内存就是在这个区域,会向上增长

map区域:加载的动态库等会映射到这个区域,那么这个区域会不会被heap或者stack覆盖呢,有可能,但是系统会做好处理的。

stack区域:程序中的栈,程序执行过程中的函数调用相关的信息或者局部变量会放在这个区域,会向下增长。

heap和stack都加了随机偏移,这样做的目的是为了安全吧,增加被攻击的难度。

5、线程的内存分布

根据上面的了解我们知道线程(轻量级进程)有自己独立的用户空间栈和内核空间栈,所以在内存分布多了独立的栈,.text,.data,.bss和heap是共享的,包括打开的文件描述符等。用户的空间栈大小默认是 8M,内核空间栈大小是 8k。

6、内核栈

linux-4.10/arch/arm/include/asm/thread_info.h

/*

46 * low level task data that entry.S needs immediate access to.

47 * __switch_to() assumes cpu_context follows immediately after cpu_domain.

48 */

49 struct thread_info {

50 unsigned longflags;/* low level flags */

51 intpreempt_count;/* 0 => preemptable, <0 => bug */

52 mm_segment_taddr_limit;/* address limit */

53 struct task_struct*task;/* main task structure */

54 __u32cpu;/* cpu */

55 __u32cpu_domain;/* cpu domain */

56 struct cpu_context_savecpu_context;/* cpu context */

57 __u32syscall;/* syscall number */

58 __u8used_cp[16];/* thread used copro */

59 unsigned longtp_value[2];/* TLS registers */

60 #ifdef CONFIG_CRUNCH

61 struct crunch_statecrunchstate;

62 #endif

63 union fp_statefpstate __attribute__((aligned(8)));

64 union vfp_statevfpstate;

65 #ifdef CONFIG_ARM_THUMBEE

66 unsigned longthumbee_state;/* ThumbEE Handler Base register */

67 #endif

68 };

linux-4.10/include/linux/sched.h

struct task_struct {

1512 #ifdef CONFIG_THREAD_INFO_IN_TASK

1513 /*

1514 * For reasons of header soup (see current_thread_info()), this

1515 * must be the first element of task_struct.

1516 */

1517 struct thread_info thread_info;

1518 #endif

1519 volatile long state;/* -1 unrunnable, 0 runnable, >0 stopped */

1520 void *stack;

1521 atomic_t usage;

1522 unsigned int flags;/* per process flags, defined below */

1523 unsigned int ptrace;

1524

1525 #ifdef CONFIG_SMP

1526 struct llist_node wake_entry;

1527 int on_cpu;

1528 #ifdef CONFIG_THREAD_INFO_IN_TASK

1529 unsigned int cpu;/* current CPU */

1530 #endif

1531 unsigned int wakee_flips;

1532 unsigned long wakee_flip_decay_ts;

1533 struct task_struct *last_wakee;

...

2009 };

task_sturce 就是进程(轻量级进程)对应的数据结构,linux kernel就是通过它来调度对应的进程。创建内核栈的时候会把thread_info 结构体放在栈底,使用栈的时候是从栈顶开始,往下增长。thread_info中的task指向对应的task_struct结构体,而task_stuct结构体中的stack是指向栈底的指针。

linux线程和进程详解,linux 进程和线程简介相关推荐

  1. linux环境下ps命令行,Linux下ps命令详解 Linux下ps命令的详细使用方法

    Linux下ps命令详解 Linux上进程有5种状态:1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运 ...

  2. linux中jstack命令详解,Linux jstack命令详解

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息. 如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack ...

  3. linux中create命令详解,linux中 pmap 命令详解

    通过查看帮助,返回了如下信息: Usage: pmap [options] pid [pid ...] Options: -x, --extended show details -X show eve ...

  4. linux中which命令详解,Linux下which命令使用详解(转)

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置. f ...

  5. linux中的ps fx命令,Linux下ps命令详解 Linux下ps命令的详细使用方法

    Linux下ps命令详解 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断 ...

  6. linux 命令行 time,详解Linux time 命令的使用

    1.命令简介 time 用于统计命令执行所消耗的时间及相关系统资源等信息.time 可以显示的资源有四大项,分别是: Time resources Memory resources IO resour ...

  7. linux的vi命令详解,Linux上Vi命令详解

    Linux下Vi命令详解 补充一点:在vi中使用命令的方法是:冒号+命令+回车,如:q 回车代表退出.================================================= ...

  8. linux怎么授权目录,详解Linux如何将一个文件夹的所有内容授权给某一个用户?...

    详解Linux如何将一个文件夹的所有内容授权给某一个用户? 发布时间:2020-09-14 15:23:51 来源:脚本之家 阅读:138 作者:冰阔落 栏目:服务器 [问题分析] 我们可以使用cho ...

  9. linux下awk命令详解,Linux文件处理awk命令-linux awk命令详解-嗨客网

    Linux文件处理awk命令详解教程 Linux awk命令说明 awk 是一个强大的文本分析工具,相对于 awk 有 3 个不同版本: awk.nawk 和 gawk,未作特别说明,一般指 gawk ...

  10. linux中dd命令详解,Linux中DD命令详解

    Linux中DD命令详解 1.dd命令简介 功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换.可以用该命令实现DOS下的diskcopy命令的作用.先用dd命令把软盘上的 ...

最新文章

  1. 电子工程师必须知道的10个网站 !!!
  2. win10不能预览图片
  3. 表格合并行_Word制作验收单表格,很简单,快来学习吧
  4. 《一》php多进程编程:第一次fork
  5. frameset和frame
  6. SMTP连接器的使用
  7. 计算机硬件检测维修资料,计算机硬件检测维修实训台 Computer hardware detection and maintenance training bench...
  8. MySQL CAST与CONVERT 函数的用法
  9. 有趣的算法:1元=1分
  10. 【Python实例第25讲】稳健的 vs 经验的协方差估计
  11. 操作系统课程设计(页面置换算法 C语言)
  12. 安装Navision Server5.0 注意事项
  13. Part2 Movielens介绍
  14. GIS当中矢量数据、影像数据、地形数据等常见数据格式的介绍
  15. 【25.00%】【vijos P1907】飞扬的小鸟
  16. js获取网页元素文本
  17. 食堂报餐点餐公司订餐微信小程序源码开发使用
  18. 右键 git找不到应用程序
  19. 微信小程序---快速上手云开发
  20. 学生教育邮箱申请免费JetBrains套装正版授权

热门文章

  1. 2021-05-19 Schur补引理及证明
  2. yii2 basic版 MVC 部分
  3. 43、Java动态代理一——动态类Proxy的使用
  4. centos7 php7 httpd
  5. 判断101-200之间有多少个素数,并输出所有素数(C)
  6. Oracle 数据恢复指导具体解释
  7. asp.net机器人注册原理
  8. 会员教程翻译:性能和时间
  9. TreeView Checkbox选中
  10. A Network in a Laptop: Rapid Prototyping for Software-Defined Networks