2019独角兽企业重金招聘Python工程师标准>>>

内核代码为2.6.35.13。

1      概述

进程与其对应的线程之间使用相同的内存空间、文件描述符和一些其他的东西。

2      分析

在内核中,线程与进程都是用结构体task_struct来表示的,在内核调度上并没有什么区别。

2.1         相同点

我们已经在上文中指出主线程与线程之间使用相同的内存空间、文件描述符和一些其他的东西。

#include <stdio.h>

#include <pthread.h>

void *thread1(void *data)

{

while (1){

printf("thread 1\n");

sleep(1);

}

pthread_exit(0);

return;

}

void *thread2(void *data)

{

while (1){

printf("thread 2\n");

sleep(2);

}

pthread_exit(0);

return;

}

int main()

{

pthread_t th1;

pthread_t th2;

if (pthread_create(&th1, NULL,thread1, NULL)){

return 1;

}

if (pthread_create(&th2, NULL,thread2, NULL)){

return 1;

}

pthread_join(th1, NULL);

pthread_join(th2, NULL);

return 0;

}

为了验证这些观点,我以上面的用户态代码示例来说明(代码不一定规范,仅为说明问题)。如上代码,在主线程成创建了两个线程thread1和thread2,然后就等待这两个线程执行完成,但这两个线程都一直在死循环中,也就说,整个都不为结束,除非我手动杀掉这个进程。

在内核中编写(test)模块来查看这三个(主)线程之间的关系,代码如下:

#include <linux/init.h>

#include <linux/module.h>

#include <linux/sched.h>

#include <asm/string.h>

static void print_task(struct task_struct *p)

{

printk(KERN_ALERT "pid: %d,tgid: %d, mm = %p, files = %p\n",

p->pid, p->tgid, p->mm, p->files);

return;

}

static int hello_init(void)

{

struct task_struct *g =NULL;

struct task_struct *t =NULL;

printk(KERN_ALERT "\ntestmodule init\n");

do_each_thread(g, t){

if (!strcmp(g->comm,"a.out")) {

print_task(t);

}

}while_each_thread(g,t);

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT "test moduleexit\n");

}

MODULE_LICENSE("DualBSD/GPL");

module_init(hello_init);

module_exit(hello_exit);

如上代码,轮训当前所有的线程,找到名称为“a.out”的线程(即以上用户态代码生成的线程)。打印对应线程的pid、tgid、mm和files。其中,pid表示线程的一个标识;tgid即threadgroup id,表示该线程组的id,其实也就是主线程的id;mm表示该task使用的内存空间;file表示该task所有打开的文件描述符。运行结果如下:

从上述结果中可以看出,主线程和两个辅线程都拥有各自的pid,但其tgid都等于主线程的pid,而且他们的mm和files也指向同样的一块内存,也就是说:主线程和辅线程之间的确共享着内存空间和文件描述符信息。

在内核中,调度主线程和辅线程是没有区别的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/styshoo/blog/546656

线程与进程在内核中的实现相关推荐

  1. linux下查看mysql线程_linux-如何查看线程在哪个CPU内核中运行?

    linux-如何查看线程在哪个CPU内核中运行? 在Linux中,假设线程的pid是[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息. 例如,这些proc文件/ proc ...

  2. linux 驱动线程与进程,Linux内核学习之二-进程与线程

    一.操作系统的功能 根据维基百科的解释,一个操作系统大概包括以下几个功能: 进程管理(Processing management) 安全机制(Security) 内存管理(Memory managem ...

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

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

  4. 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

    文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...

  5. 守护进程(内核线程和普通进程)

    ps命令看到的内核线程(thread)属于守护进程(daemon)<注1>, 在操作系统中占据相当大的比例,当Linux操作系统启动以后,尤其是Xwindow也启动以后,你可以用" ...

  6. linux中线程和进程的区别深度剖析底层实现

    文章目录 前言 Linux中进程和线程的共性 Linux中进程的创建 Linux中线程的实现 总结 前言 在没有仔细了解过Linux的进程和线程实现机制之前,看过很多关于进程和线程的博客,从这些博客中 ...

  7. 操作系统原理:进程与线程、进程生命周期、线程的类型

    一.进程定义 进程可以看成程序的执行过程,可以展示在当前时刻的执行状态.它是程序在一个数据集合上的一次动态执行的过程.这个数据集合通常包含存放可执行代码的代码段,存放初始化全局变量和初始化静态局部变量 ...

  8. acl在内核里的位置_Linux 进程在内核眼中是什么样子的?

    本篇算是进程管理的的揭幕篇,简单介绍一个进程在内核眼里的来龙去脉,为接下来的进程创建,进程调度,进程管理等篇章做好学习准备. 从程序到进程再到内核 啥是程序,啥是进程,一张图可以给我们解释: 程序转换 ...

  9. linux内核中等待队列

    根据内核3.1.6版本源码.书籍和网上资料,对几个函数进行分析 介绍这几个函数,不得不先介绍等待队列wait_queue_head_t 等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程 ...

  10. 驱动开发笔记1—内核中的事件、进程、线程、自旋锁

    内核模式下的等待 KeWaitForSingleObject() 和 KeWaitForMultipleObjects() NTSTATUS KeWaitForSingleObject(IN PVOI ...

最新文章

  1. [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
  2. C#字符格式化占位符
  3. springboot 项目部署为war项目
  4. listview的item中嵌套多个EditText时的问题
  5. 梦幻星空PSD分层海报素材,通过临摹打开思路。
  6. Spring MVC 4.x 知识点
  7. android su程序分析
  8. 网站打开速度慢的解决方法
  9. 使用python将ppt文件批量转为pptx、批量提取ppt中的文字保存
  10. python/appium实现华为应用商城app界面上下滑动打开关闭通知栏等功能
  11. python国际象棋ai程序_用 Python 编写一个国际象棋 AI 程序
  12. ArduiNo(WeMos D1)基础(一)
  13. Android 百分比布局、权重、隐藏TitleBar、引入自定义控件
  14. 【效率特工队】Excel转手机通讯录格式,如何将一个Excel批量拆分生成多个vcf,怎么快速的加微信好友,优化一下方法效率可能更高,解决微信通讯录手机联系人好友不显示的问题
  15. Sweet Dreams优美的英文手写字体
  16. Linux 驱动开发 六十四:《pwm-backlight.txt》翻译
  17. 【Win10】开机启动输入密码——免回车
  18. 机械硬盘速度测试软件用哪个,硬盘测评,脱颖而出的果然是它!
  19. linux面试常问问题
  20. IPGUARD客户端与应用程序冲突

热门文章

  1. 【LeetCode】【数组】题号:*119,杨辉三角2
  2. 《机器学习Python实践》第7章——数据可视化
  3. [编程题] 被3整除
  4. day2--numpy
  5. 【读书】如何阅读一本书
  6. 并发编程之美(1)并发编程基础
  7. 回顾 | Apache Flink 1.13 新版本 x 互娱实践分享 Meetup · 北京站精彩回顾 (附 PPT 下载)...
  8. 寒冬之下,被cai的那些人到底去哪了?
  9. 为什么每天工作那么努力,却无法突破职场瓶颈?
  10. java常量表达式区别_java编译器对string常量表达式的处理和优化