线程与进程在内核中的实现
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
线程与进程在内核中的实现相关推荐
- linux下查看mysql线程_linux-如何查看线程在哪个CPU内核中运行?
linux-如何查看线程在哪个CPU内核中运行? 在Linux中,假设线程的pid是[pid],则从目录/ proc / [pid]中我们可以获得许多有用的信息. 例如,这些proc文件/ proc ...
- linux 驱动线程与进程,Linux内核学习之二-进程与线程
一.操作系统的功能 根据维基百科的解释,一个操作系统大概包括以下几个功能: 进程管理(Processing management) 安全机制(Security) 内存管理(Memory managem ...
- 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )
文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...
- 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )
文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...
- 守护进程(内核线程和普通进程)
ps命令看到的内核线程(thread)属于守护进程(daemon)<注1>, 在操作系统中占据相当大的比例,当Linux操作系统启动以后,尤其是Xwindow也启动以后,你可以用" ...
- linux中线程和进程的区别深度剖析底层实现
文章目录 前言 Linux中进程和线程的共性 Linux中进程的创建 Linux中线程的实现 总结 前言 在没有仔细了解过Linux的进程和线程实现机制之前,看过很多关于进程和线程的博客,从这些博客中 ...
- 操作系统原理:进程与线程、进程生命周期、线程的类型
一.进程定义 进程可以看成程序的执行过程,可以展示在当前时刻的执行状态.它是程序在一个数据集合上的一次动态执行的过程.这个数据集合通常包含存放可执行代码的代码段,存放初始化全局变量和初始化静态局部变量 ...
- acl在内核里的位置_Linux 进程在内核眼中是什么样子的?
本篇算是进程管理的的揭幕篇,简单介绍一个进程在内核眼里的来龙去脉,为接下来的进程创建,进程调度,进程管理等篇章做好学习准备. 从程序到进程再到内核 啥是程序,啥是进程,一张图可以给我们解释: 程序转换 ...
- linux内核中等待队列
根据内核3.1.6版本源码.书籍和网上资料,对几个函数进行分析 介绍这几个函数,不得不先介绍等待队列wait_queue_head_t 等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程 ...
- 驱动开发笔记1—内核中的事件、进程、线程、自旋锁
内核模式下的等待 KeWaitForSingleObject() 和 KeWaitForMultipleObjects() NTSTATUS KeWaitForSingleObject(IN PVOI ...
最新文章
- [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
- C#字符格式化占位符
- springboot 项目部署为war项目
- listview的item中嵌套多个EditText时的问题
- 梦幻星空PSD分层海报素材,通过临摹打开思路。
- Spring MVC 4.x 知识点
- android su程序分析
- 网站打开速度慢的解决方法
- 使用python将ppt文件批量转为pptx、批量提取ppt中的文字保存
- python/appium实现华为应用商城app界面上下滑动打开关闭通知栏等功能
- python国际象棋ai程序_用 Python 编写一个国际象棋 AI 程序
- ArduiNo(WeMos D1)基础(一)
- Android 百分比布局、权重、隐藏TitleBar、引入自定义控件
- 【效率特工队】Excel转手机通讯录格式,如何将一个Excel批量拆分生成多个vcf,怎么快速的加微信好友,优化一下方法效率可能更高,解决微信通讯录手机联系人好友不显示的问题
- Sweet Dreams优美的英文手写字体
- Linux 驱动开发 六十四:《pwm-backlight.txt》翻译
- 【Win10】开机启动输入密码——免回车
- 机械硬盘速度测试软件用哪个,硬盘测评,脱颖而出的果然是它!
- linux面试常问问题
- IPGUARD客户端与应用程序冲突
热门文章
- 【LeetCode】【数组】题号:*119,杨辉三角2
- 《机器学习Python实践》第7章——数据可视化
- [编程题] 被3整除
- day2--numpy
- 【读书】如何阅读一本书
- 并发编程之美(1)并发编程基础
- 回顾 | Apache Flink 1.13 新版本 x 互娱实践分享 Meetup · 北京站精彩回顾 (附 PPT 下载)...
- 寒冬之下,被cai的那些人到底去哪了?
- 为什么每天工作那么努力,却无法突破职场瓶颈?
- java常量表达式区别_java编译器对string常量表达式的处理和优化