linux进程

进程

进程诞生
  • 原因
为了充分利用系统资源
  • 进程0
init_idle
ldr r13, =__mmap_switched
__mmap_switched:
	adr r3, __mmap_switched_data 
.type   __mmap_switched_data, %object

__mmap_switched_data:
	.long   init_thread_union + THREAD_START_SP @ sp
	.size   __mmap_switched_data, . - __mmap_switched_data
  • 进程1
kernel_thread(kernel_init, NULL, CLONE_FS);
do_fork

  • 进程2
kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
延后内核的创建工作, 将内核线程的创建工作交给一个内核线程来做, 即kthreadd 2号进程
  • do_fork
fork, vfork和clone的系统调用的入口地址分别是sys_fork, sys_vfork和sys_clone, 而他们的定义是依赖于体系结构的, 而他们最终都调用了do_fork(linux-4.2之前的内核中是do_fork),在do_fork中通过copy_process复制进程的信息,调用wake_up_new_task将子进程加入调度器中
1. dup_task_struct中为其分配了新的堆栈
2. 调用了sched_fork,将其置为TASK_RUNNING
3. copy_thread(_tls)中将父进程的寄存器上下文复制给子进程,保证了父子进程的堆栈信息是一致的, 
4. 将ret_from_fork的地址设置为eip寄存器的值
5. 为新进程分配并设置新的pid
6. 最终子进程从ret_from_fork开始执行

  • 主要进程
idle 内核线程
init 内核线程
init 用户线程
kthreadd 内核线程
  • 进程控制块
0.进程属性相关
	state : 进程状态
	pid   : 进程位移的进程标识符 .int类型
	flag  : 进程属性标志位,标识内核线程和用户进程
	exit_code exit_signal : 进程退出值和终止信号,用于被父进程获取死亡原因
	pthread_signal : 父进程消亡时发出的信号
	comm  : 存放可执行程序的名称
	read_cred cred : 存放进程的认证信息
1.调度先关
	prio : 进程动态优先级
	static_prio : 静态优先级
	normal_prio : 基于 static_prio 和调度策略计算出来的优先级
	rt_priority : 实时进程的优先级//如果是个实时进程的话,该项才有意义
	sched_class : 调度类
	se 			: 普通进程调度实体
	rt 			: 实时进程调度实体
	dl 			: deadline 进程调度实体
	policy      : 进程的类型,比如普通进程还是实时进程
	cpus_allowed: 进程可以在哪几个cpu 上运行
2. 内存相关
	mm 			: 指向进程管理的内存的一个总的抽象的数据结构 mm_struct
3. 文件系统相关
	fs 			: 指向文件系统信息
	files 		: 指向进程的文件描述符表
4. 进程间通信
	signal 		: 
5. 网络相关       :
	端口?
6. 进程关系相关
	real_parent : 指向当前进程的父进程的 task_struct 
	children    : 指向当前进程的子进程的链表
	sibling     : 指向当前进程的兄弟进程的链表
	group_leader: 进程组的组长
	
  • 进程的生命周期
运行 停止 死亡
创建 就绪 运行 阻塞 停止 死亡
linux_4.0/include/linux/sched.h +203
  #define TASK_RUNNING        0                                                    
  #define TASK_INTERRUPTIBLE  1                                                    
  #define TASK_UNINTERRUPTIBLE    2                                                
  #define __TASK_STOPPED      4                                                    
  #define __TASK_TRACED       8                                                    
  /* in tsk->exit_state */                                                         
  #define EXIT_DEAD       16                                                       
  #define EXIT_ZOMBIE     32
  • 进程调度
1. 内核线程的初始化,及内核线程到用户进程的转换
schedule_preempt_disabled(); //开启任务调度调度的运行,整个调度系统开始运行了.
  • 多核调度


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值