linux 内核研究<一> 1.2

进程状态

进程描述符中的state域描述了进程的当前五种状态,并且系统中每个进程都必然处于这几种状态的一种:

TASK_RUNNING:进程可执行,或正在运行,或在就绪队列run-queue中准备运行的进程,实际参与进程调度。
TASK_INTERRUPTIBLE:处于等待队列中的进程,待资源有效时唤醒,也可由其它进程通过信号(signal)或 定时中断唤醒后进入就绪队列run-queue。
TASK_UNINTERRUPTIBLE:处于等待队列中的进程,待资源有效时唤醒,不可由其它进程通过信号(signal)或定时中断唤醒。
TASK_ZOMBIE:表示进程结束但尚未消亡的一种状态(僵死状态)。此时,进程已经结束运行且释放大部分资源,但尚未释放进程控制块。
TASK_STOPPED:进程被暂停,通过其它进程的信号才能唤醒。导致这种状态的原因有二,或者是对收到SIGSTOP、SIGSTP、SIGTTIN或SIGTTOU信号的反应,或者是受其它进程的ptrace系统调用的控制而暂时将CPU交给控制进程。
TASK_SWAPPING: 进程页面被交换出内存的进程。

进程的生命周期

每个进程都有自己的生命周期,创建、执行、终止、删除等等,只要系统启动和运行,这些阶段就不断地被重复。
传统的fork()系统调用直接把所有的资源复制给新创建的进程。但linux的fork()使用写时拷贝页实现,内核此时不复制整个进程地址空间,而是让父进程和子进程共享父进程的地址空间,只要在需要写入的时候,才执行exec(),将新的数据程序复制写入到子进程的地址空间中,子程序自己享用自己的的地址空间。
当一个新进程被创建的时候,其父进程发出一个fork()系统调用,然后父进程得到一个新创建进程的进程描述符,并设置一个新进程ID,它复制父进程的进程描述符的值给新建子进程,不会复制父进程的地址空间,但父进程和子进程共享父进程的地址空间。当进程执行完成后或异常退出,内核终止时调用exit(),调用一个do_exit()函数,设置task_struct结构中的参数,释放所有资源,切换到父进程。
当子进程完成后,其进程描述符和有进程的地址空间就全部被释放。

用户线程(线程)

线程是现代编程技术中常用的一种抽象,该机制提供了在同一程序内共享内存地址空间。这些线程可以共享打开的文件和其他资源,当然从内核的角度来说是没有线程这个概念和对应的表示方式,在内核中这些都是一并当做当前进程来执行,不管此进程中有多少个线程的存在。
linux创建线程和创建进程处理过程类似,只不过通过特定参数指定这几个进程共享某段地址空间,这样就产生了线程。所以 线程的生命周期很进程的生命周期类似。

内核线程

内核经常需要在后台执行一些操作,这些任务可以通过内核线程完成,内核线程是一种独立运行在内核空间的标准进程,区别于普通线程的地方就在于内核线程没有独立的地址空间,他们之中内核中运行,不会被分配用户空间。

上述我们简要介绍了进程,关于涉及到的task_struct结构,dpica将会在下一讲带你深入到进程描述符的代码中,做测试和演示,dpica在期待中。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值