当前位置: 首页 > news >正文

重庆网站设计排名企业策划 企业网站建设 品牌设计

重庆网站设计排名,企业策划 企业网站建设 品牌设计,外网访问群晖wordpress,关键词工具软件哈喽#xff0c;我是吴同学#xff0c;继续记录我的学习心得。一、关于写文章许多知识#xff0c;书上或者网络上都有#xff0c;就算这两个地方都没有#xff0c;代码里也会有答案。但有时恰恰是 资料太多#xff0c;反而让人难以检索出有用的信息。面对同样的资料… 哈喽我是吴同学继续记录我的学习心得。一、关于写文章许多知识书上或者网络上都有就算这两个地方都没有代码里也会有答案。但有时恰恰是 资料太多反而让人难以检索出有用的信息。面对同样的资料每个人的理解能力思维方式学习能力学习时间是不同所以学习的效果也是不一样的。有人愿意将自己认真思考的结果分享出来是非常值得鼓励的。即便你是学霸找到优秀的人和他们的文章会大大节省自己在陌生领域的学习时间。每个人的思维方式和写作能力是有高低之分的同样的内容不同的描述读者会有不同的收获。我希望写一些有价值的文章通过公开写作来不断地提高自己学习能力并且寻找出更好的学习方法。学得越多记忆的难度越大。不及时输出的话内化效果极差学习价值会不断地进行贬值。写文章首先是给自己看其次才是给别人看不要害怕写错写错了要虚心接受批评。二、Linux 内核如何描述一个进程目的初步了解进程描述符 task_struct。目录Linux 的进程Linux 的进程描述符task_struct内核如何找到 task_structtask_struct 的分配和初始化实验打印 task_struct / thread_info / kernel mode stack环境Linux-4.14 ARMv71. Linux 的进程进程的术语是 process是 Linux 最基础的抽象另一个基础抽象是文件。最简单的理解进程就是执行中 (executing, 不等于running) 的程序。更准确一点的理解进程包括执行中的程序以及相关的资源 (包括cpu状态、打开的文件、挂起的信号、tty、内存地址空间等)。一种简洁的说法进程 n*执行流 资源n1。Linux 进程的特点通过系统调用 fork() 创建进程fork() 会复制现有进程来创建一个全新的进程。内核里并不严格区分进程和线程。从内核的角度看调度单位是线程 (即执行流)。可以把线程看做是进程里的一条执行流1个进程里可以有1个或者多个线程。内核里常把进程称为 task 或者 thread这样描述更准确因为许多进程就只有1条执行流。内核通过轻量级进程 (lightweight process) 来支持多线程。1个轻量级进程就对应1个线程轻量级进程之间可以共享打开的文件、地址空间等资源。2. Linux 的进程描述符2.1 task_struct内核里通过 task_struct 结构体来描述一个进程称为进程描述符 (process descriptor)它保存着支撑一个进程正常运行的所有信息。每一个进程即便是轻量级进程(即线程)都有1个 task_struct。sched.h (include\linux)struct task_struct {struct thread_info thread_info;volatile long state;void *stack;[...]struct mm_struct *mm;[...]pid_t pid;[...]struct task_struct *parent;[...]char comm[TASK_COMM_LEN];[...]struct files_struct *files;[...]struct signal_struct *signal; } 这是一个庞大的结构体不仅有许多进程相关的基础字段还有许多指向其他数据结构的指针。它包含的字段能完整地描述一个正在执行的程序包括 cpu 状态、打开的文件、地址空间、挂起的信号、进程状态等。点击查看大图作为初学者先简单地了解部分字段就好struct thread_info thread_info: 进程底层信息平台相关下面会详细描述。long state: 进程当前的状态下面是几个比较重要的进程状态以及它们之间的转换流程。点击查看大图void *stack: 指向进程内核栈下面会解释。struct mm_struct *mm: 与进程地址空间相关的信息都保存在一个叫内存描述符 (memory descriptor) 的结构体 (mm_struct) 中。点击查看大图pid_t pid: 进程标识符本质就是一个数字是用户空间引用进程的唯一标识。struct task_struct *parent: 父进程的 task_struct。char comm[TASK_COMM_LEN]: 进程的名称。struct files_struct *files: 打开的文件表。struct signal_struct *signal: 信号处理相关。其他字段等到有需要的时候再回过头来学习。2.2 当发生系统调用或者进程切换时内核如何找到 task_struct ?对于 ARM 架构答案是通过内核栈 (kernel mode stack)。为什么要有内核栈因为内核是可重入的在内核中会有多条与不同进程相关联的执行路径。因此不同的进程处于内核态时都需要有自己私有的进程内核栈 (process kernel stack)。当进程从用户态切换到内核态时所使用的栈会从用户栈切换到内核栈。至于是如何切换的关键词是系统调用这不是本文关注的重点先放一边学习内核要懂得恰当的时候忽略细节。当发生进程切换时也会切换到目标进程的内核栈。同上关键词是硬件上下文切换 (hardware context switch)忽略具体实现。无论何时只要进程处于内核态就会有内核栈可以使用否则系统就离崩溃不远了。ARM 架构的内核栈和 task_struct 的关系如下点击查看大图内核栈的长度是 THREAD_SIZE对于 ARM 架构一般是 2 个页框的大小即 8KB。内核将一个较小的数据结构 thread_info 放在内核栈的底部它负责将内核栈和 task_struct 串联起来。thread_info 是平台相关的在 ARM 架构中的定义如下// thread_info.h (arch\arm\include\asm)struct thread_info {unsigned long flags;  /* low level flags */int preempt_count; /* 0  preemptable, 0  bug */mm_segment_t addr_limit; /* address limit */struct task_struct *task;  /* main task structure */[...]struct cpu_context_save cpu_context; /* cpu context */[...] }; thread_info 保存了一个进程能被调度执行的最底层信息(low level task data)例如struct cpu_context_save cpu_context 会在进程切换时用来保存/恢复寄存器上下文。内核通过内核栈的栈指针可以快速地拿到 thread_info// thread_info.h (include\linux)static inline struct thread_info *current_thread_info(void) {// current_stack_pointer 是当前进程内核栈的栈指针return (struct thread_info *)(current_stack_pointer  ~(THREAD_SIZE - 1)); } 然后通过 thread_info 找到 task_struct:// current.h (include\asm-generic)#define current (current_thread_info()-task) 内核里通过 current 宏可以获得当前进程的 task_struct。2.3 task_struct 的分配和初始化当上层应用使用 fork() 创建进程时内核会新建一个 task_struct。进程的创建是个复杂的工作可以延伸出无数的细节。这里我们只是简单地了解一下 task_struct 的分配和部分初始化的流程。fork() 在内核里的核心流程点击查看大图dup_task_struct() 做了什么点击查看大图至于设置内核栈里做了什么涉及到了进程的创建与切换不在本文的关注范围内以后再研究了。3. 实验打印 task_struct / thread_info / kernel mode stack实验目的梳理 task_struct / thread_info / kernel mode stack 的关系。实验代码#include linux/init.h #include linux/module.h #include linux/sched.hstatic void print_task_info(struct task_struct *task) {printk(KERN_NOTICE %10s %5d task_struct (%p) / stack(%p~%p) / thread_info-task (%p),task-comm, task-pid,task,task-stack,((unsigned long *)task-stack)  THREAD_SIZE,task_thread_info(task)-task); }static int __init task_init(void) {struct task_struct *task  current;printk(KERN_INFO task module init\n);print_task_info(task);do {task  task-parent;print_task_info(task);} while (task-pid ! 0);return 0; } module_init(task_init);static void __exit task_exit(void) {printk(KERN_INFO task module exit\n ); } module_exit(task_exit); 运行效果task module initinsmod  3123 task_struct (edb42580) / stack(ed46c000~ed474000) / thread_info-task (edb42580)bash  2393 task_struct (eda13e80) / stack(c9dda000~c9de2000) / thread_info-task (eda13e80)sshd  2255 task_struct (ee5c9f40) / stack(c9d2e000~c9d36000) / thread_info-task (ee5c9f40)sshd   543 task_struct (ef15f080) / stack(ee554000~ee55c000) / thread_info-task (ef15f080)systemd     1 task_struct (ef058000) / stack(ef04c000~ef054000) / thread_info-task (ef058000) 在程序里我们通过 task_struct 找到 stack然后通过 stack 找到 thread_info最后又通过 thread_info-task 找到 task_struct。4. 相关参考Linux 内核设计与实现 / 第 3.1 章节深入理解 Linux 内核 / 3Linux 内核深度解析 / 2.5.1深入Linux 内核架构 / 2.3推荐阅读    专辑|Linux文章汇总    专辑|程序人生    专辑|C语言嵌入式Linux微信扫描二维码关注我的公众号
http://www.sadfv.cn/news/54600/

相关文章:

  • 自己建网站怎么弄用子域名安装wordpress
  • 企业网站制作比较好的全是图片的网站怎么做seo
  • 网站建设的前期开发wordpress的别名获得页面的别名
  • 怎样申请网站呢metro风格网站开发
  • 电子商务网站问题与解决方案wordpress前台打开慢
  • 优秀网站架构如何绑定网站域名解析
  • 企业网站可以备案几个南昌做购物网站的公司
  • 建设网站杭州好123设为主页官网网址大全
  • 网站建设如何控标wordpress怎么找模板
  • 佛山网站推广优化笔记本做网站
  • 网站建设 需求高级前端开发在线培训
  • 做网站怎么租个空间wordpress全部文件
  • 淮阳网站建设做海岛旅游类网站的背景及意义
  • ae做的动效怎么放在网站上哈尔滨信息工程学院
  • 建设银行网站查询重庆市造价工程信息网官网
  • 网站快照历史建湖县住房和城乡建设局网站
  • 网站not foundwordpress默认居中
  • 五金网站方案c 做网站看什么书
  • 网站域名登录不了一个店铺的运营方案
  • 茂名seo站内优化图片制作器手机版
  • 西安网站建设gjwordpress 关闭访问
  • wordpress 仿站 教程网网站设计酷站
  • 软件制作网站网站开发软件有哪些免费
  • 做代练网站能备案网站做两个月百度没有录取
  • 怎样制作个人网站wordpress jekyll
  • 网站高端网站建设东莞有哪些网络有限公司
  • 汕头seo网站管理龙岩做网站龙岩网页设计
  • 购物网站修改注册信息模块的分析php开源网站管理系统
  • 个人建什么样的网站好wordpress猜你喜欢
  • 织梦网站修改教程视频上海十大建筑设计公司