linux 进程

进程:运行中的程序(打开的文件,挂起的信号,内存,执行线程等等)
线程(pc,寄存器(线程需记录cpu寄存器的值,以挂起后恢复执行),栈),调度对象,在liux里是特殊进程
虚拟处理器/内存:让进程觉得自己独占处理器或内存。
fork:通过复制来创建(除pid,ppid,某些资源统计量如挂起的信号外其他都复制),内核返回两次(父进程恢复执行,子进程开始执行)
写时拷贝:fork时父子进程指向同样物理内存,任一方想要修改(写入),实际分配内存,指向不同物理内存
A,B(子)有各自的内存描述符(页表),只不过页表指向相同物理内存,B想修改某页x,为x分配物理内存并拷贝内容,在新物理内存上修改
一般让子进程先执行,子进程一般会exec,根本不会发生拷贝,子进程不exec(难道子进程想和父进程运行同一程序,且在父进程当前的运行进度上)
拷贝和共享:线程一般共享(如指向同一内存描述符),进程一般拷贝(各自拥有自己的,只是开始是一样的)
fork(sys_fork)创建进程,最终do_fork,进程终止给父进程发SIGCHLD信号
clone(sys_clone)创建线程,最终do_fork, 共享地址空间(指向同一内存描述符),文件系统信息,文件描述符(打开的文件),信号处理函数
vfork(sys_vfork)类似线程,最终do_fork, 共享地址空间,发SIGCHLD,父进程等待子进程将其唤醒(子进程调用exec或调用exit退出)
内核线程:只能由内核线程创建,运行在内核空间,内存描述符为null,借其它进程的内存描述符,可被调度
exec:创建新地址空间,载入新程序,代码(程序)在文件(磁盘)上,载入内存,地址空间映射到这部分内存上,可能出现多对一映射(多个进程运行同一程序,内存放一份代码,各进程都映射到它)
exit:显式调用exit,或编译器自动帮你在main返回点加exit,某些信号或异常
内存描述符/文件描述符/文件系统信息 引用计数减1,为0则释放(存在共享的情况,如线程)
给父进程发SIGCHLD信号,给子进程找养父(进程组其他进程或init),僵死状态,schedule

僵死状态: 只有内核栈,thread_info,task_struct,父进程获取信息或通知内核它不关注后,完成最后清除
实现:父进程wait或waitpid,可以阻塞也可以轮询,当然有些父进程调用的少(导致子进程长期处于僵死状态),可以考虑SIGCHLD信号处理函数内调用wait(平常我不调用,你给我发信号我给你收尸,你是我儿子嘛)

任务队列:进程的双向循环链表
task_struct(进程描述符):通过slab分配(对象复用和缓存着色,存在多个slab,每个slab有多个已分配内存的结构),含数据如下
pid
state
运行:可运行的,在用户或内核空间
可中断:睡眠/被阻塞,可被信号唤醒(类似java里的中断)
不可中断:不可被信号唤醒(类似java里的synchronized,不响应中断)
跟踪:被其他进程跟踪,如ptrace调试
停止:收到某些信号如SIGSTOP,SIGCONT可使进程重新激活
parent和children链表:维护进程继承关系,所有进程都为pid为1的init进程后代,进程必有父进程(父exit,父exit的时候会帮你找养父,否则你exit后就一直僵死状态了,还好init会经常wait)
struct list_head tasks: 维护双向循环链表
所以,遍历进程可parent/children式,也可链表式

内核栈一般8k,栈底thread_info(指向task_struct),当然也有的完全相反(栈指针由下向上)
假设8k至16k为内核栈,8k处为thread_info, thread_info至栈指针为空,栈指针到16k为栈空间,栈指针不断向thread_info靠近
current宏: 查找当前cpu上正在运行进程task_struct,实现
有的硬件体系寄存器很多:寄存器指向
不多:栈指针按8k取整(屏蔽后13位)找到thread_info再找到task_struct

进程在用户空间运行,使用用户栈,运行自己的代码,
进程在内核空间运行(系统调用,异常),使用内核栈,运行操作系统的代码,内核代表进程执行,仍处于进程上下文,current宏有效,返回用户空间可能发生用户抢占(被高优先级进程)
用户/内核空间是进程地址空间的两部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值