LKD3
第三章 进程
1. Unix操作系统的抽象:进程和文件
2. 进程包括两个因素:可运行代码,和资源(打开的文件,挂起的信号,内核内部数据,处理器状态,地址空间)
3. 线程是进程中活动的对象。
4. 线程有独立的程序计数器,进程栈,和一组进程寄存器。
5. 内核调度的对象是线程,传统的Unix系统中,一个进程仅仅包括一个线程。
6. Linux系统中,线程只是是一个特殊的进程。
7. 进程的两种虚拟机制:虚拟处理器和虚拟内存。线程之间,共享虚拟内存,但拥有自己的虚拟处理器。
8. fork()从系统调用返回两次,一次回到父进程,一次回到子进程。
9. 用exec*能够创建新的地址空间,把新的程序加载。
10. 进程退出后是僵死状态,直到wait()和waitpid为止。
--------------------------------------------------------------
1. 任务队列,是task_struct的链表,称为进程描写叙述符,定义于linux/sched.h中
2. sizeof(task_struct)在32bit RISC机器上有1.7KB的大小
3. Linux通过slab分配器分配task_struct的结构。
4. 在2.6曾经的内核中,task_struct放在内核栈的末尾,如今是用在栈的顶端或者底端,创建新的结构thread_info来计算。
struct thread_info{
struct task_struct *task;
struct exec_domain *exec_domain;
unsigned long flags;
unsigned long status;
__u32 cpu;
__s32 preempt_count;
mm_segment_t addr_limit;
struct restart_block restart_block;
unsinged long pervious_esp;
__u8 supervisor_stack[0]
}
5. 内核通过唯一的标志值PID来标志每一个进程。
6. current 宏来查找正在执行的进程的进程描写叙述符的速度尤为重要。不同的体系结构做法不同。
x86:PPC等
7. 五中进程状态
8. set_task_state(task,state)来改变进程的状态,set_current_state(state)
9. 进程上下文:"内核代表进程执行"
10. 进程家族树:init进程和inittab脚本,init_task是静态分配的。
一次訪问子进程
list_for_each(list,¤t->children){
task = list_entry(list,struct task_struct,sibling);
}
找到init 进程
for(task = current;task != &init_task;task = task->parent)
;
下一个进程
list_entry(task->tasks.next,struct task_struct,tasks);<==>next_tasks(task)
前一个进程
list_entry(task->tasks.prev,struct task_struct,tasks);<==>prev_tasks(task)
for_each_task(task){
/*task指向下一个元素*/
}
----------------------------------------------------------------------
1. 其它操作系统的spawn机制。在新的地址空间创建进程,读入运行文件,运行
2. Unix的方法,fork():拷贝当前进程创建一个子进程
exec:读取可运行文件,将其加载地址空间运行
3. 写时拷贝:推迟拷贝的技术。由于这些数据可能根本用不到,比方,fork之后马上调用exec
4. fork->clone->do_fork()->copy_process(),内核有意选择子进程先运行,防止写时复制
5. vfork不拷贝父进程的页表项。子进程作为父进程的一个单独的线程在他的地址空间运行。父进程被堵塞,直到子进程退出或者调用exec().
-----------------------------------------------------------------------------
1. Linux的线程在内核看来,是一个进程。与某些进程共享地址空间的进程
2. 线程的创建和进程相似,仅仅是传递一些不同的flags
clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0)
3. 内核线程,独立运行于内核空间的标准进程,没有独立的地址空间,仅仅在内核空间运行,能够被调度和抢占
4. 内核线程仅仅能由其它的内核线程创建
kernel_thread(init (*fn)(void *),void *arg,unsigned long flags)
5. 一般要求一直运行下去.....
--------------------------------------------------------------------------
1.进程的终结:exit,从main返回,遇到异常或者不能处理也不能忽略的信号。abort.
2.do_exit():kernel/exit.c
设置标志PF_EXITING,del_timer_sync, acct_process, _exit_mm,exit_sem,_exit_files,_exit_fs,exit_namespace,exit_sighand,exit_code,exit_notify(),最后调用schedule()
3.wait 组函数,调用wait4()系统的调用,-〉release_task.
4.do_exit的notify_parent来通过forget_original_parent来寻找父进程:
LKD3的更多相关文章
- CVE-2015-8660分析
0x00测试环境 使用环境 备注 操作系统 Ubuntu15.04 虚拟机 内核版本 3.19.0-15-generic 漏洞来源 /fs/overlayfs/inode.c Before 201 ...
- Linux 内核学习经验总结
Linux 内核学习经验总结 学习内核,每个人都有自己的学习方法,仁者见仁智者见智.以下是我在学习过程中总结出来的东西,对自身来说,我认为比较有效率,拿出来跟大家交流一下. 内核学习,一偏之见:疏漏难 ...
- TRAFFIC ANALYSIS EXERCISE - Ransomer
catalogue . SCENARIO . QUESTIONS . Analysis:10.3.14.134 . Analysis:10.3.14.131 1. SCENARIO The pcap ...
- Linux内核学习之中断 中断本质【转】
转自:http://www.linuxidc.com/Linux/2011-11/47657.htm [中断概述] 中断本质上是一种特殊的电信号,由硬件设备发向处理器.异常和中断的不同是异常在产生时必 ...
- 路飞学城Python-Day43
前端 ...
- linux 内核 tasklets 原理以及工作队列
如果某种应用并不需要在多个CPU上并行执行,那么软中断其实是没有必要的.因此诞生了弥补以上两个要求的tasklet.它具有以下特性: a)一种特定类型的tasklet只能运行在一个CPU上,不能并行, ...
随机推荐
- nginx+php的配置
作了N多次php环境的搭建,网上的方法还真是多,但是实际操作起来总有一些大大小小的出入,很多错误经常让我纠结不已.久病成医,渐渐地我自己就总结出了一些经验.自我感觉良好. 这种方法并非以前所流行的ap ...
- 我的Fedora22美化日记
首先我说一下,我命令是乱打的[不要打我],用之前先google 配置RPMFusion仓库 $ sudo dnf install --nogpgcheck http://download1.rpmfu ...
- 转载:js 创建对象、属性、方法
1,自定义对象. 根据JS的对象扩展机制,用户可以自定义JS对象,这与Java语言有类似的地方. 与自定义对象相对应的是JS标准对象,例如Date.Array.Math等等. 2,原型(prototy ...
- spoj 1557 GSS3 - Can you answer these queries III 线段树
题目链接 给出n个数, 2种操作, 一种是将第x个数改为y, 第二种是询问区间[x,y]内的最大连续子区间. 开4个数组, 一个是区间和, 一个是区间最大值, 一个是后缀的最大值, 一个是前缀的最大值 ...
- codeforces 547B. Mike and Feet 单调栈
题目链接 用单调栈计算出一个数字, 左边第一个比他小的数字的位置, 右边比第一个他小的数字的位置, 然后len = r[i] - l[i] +1. ans[len] = max(ans[len], a ...
- 成为 Linux 内核高手的四个方法
(之前我在 CUSEC 网站发表了关于内核并不可怕的一篇文章,本文是后续.) 我曾经问别人如何开始内核编程的学习,他们基本上都说:1. 如果你不需要了解内核是如何为你工作的,你为何要尝试呢?2. 你应 ...
- file_get_contents post数据
//默认模拟的header头 private function _defaultHeader() { $header = "User-Agent:Mozilla/5.0 (Windows; ...
- aliyun 镜像
[epel]name=Extra Packages for Enterprise Linux 6 - $basearchbaseurl=http://mirrors.aliyun.com/epel/6 ...
- CodeIgniter框架开发的统计程序源代码开放
文章来源: PHP开发学习门户 自己初学php时,用CodeIgniter框架开发的后台统计程序源代码 程序部分页面如图: 具体配置及下载源代码:http://bbs.phpthinking.com/ ...
- java面试核心基础(1)
1.以下代码的执行结果 String s1 = "helloworld"; String s2 = "hello" + new Stirng("wor ...