进程管理

  进程和文件是Linux操作系统的两个最基本的抽象。

  进程是处于执行期的程序,进程不仅仅局限于一段可执行程序代码,通常还包含其他资源,如打开的文件、挂起的信号、内核内部数据、处理器状态、进程地址空间及一个或者多个执行线程(thread of execution)、当然还包括用来存放全局变量的数据段等。

  线程(thread)是内核调度的对象,每个线程都拥有一个独立的程序计数器(PC指针)、函数调用栈和一组寄存器值。在Linux内核中,线程只不过是一种特殊的进程,线程仅仅被视为一个与其他进程共享某些资源的进程。而不管是线程还是进程,在Linux内核看来,都是一个任务(task),由一个task_struct结构体描述,即任务描述符,任务描述符通常位于进程内核栈的栈底,32位系统中其大小为1.7KB左右。

  进程是资源管理的最小单位,线程是程序执行的最小单位。

  进程提供了两种虚拟机制:虚拟处理器和虚拟内存。他们给进程一种假象,独占CPU且独享内存。

1.1 task_struct

  Linux内核把进程存放在叫做任务队列(task list)的双向循环链表中,链表中的每一项都是task_struct结构体变量,描述一个具体进程的所有信息。

  Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色(cache coloring)的目的。其机制是Linux内核预先分配一组大小都为task_struct结构体大小的内存(结构体数组),当创建一个进程时,快速分配一个task_struct结构体项(数组成员)。

  在2.6以前的内核中,各个进程的task_struct存放在他们内核栈的尾端。

  Linux内核通过PID来唯一标识每个进程,PID的最大值默认为32768,即一个short int短整型数据。可以通过设置/proc/sys/kernel/pid_max提高上限。

  在Linux内核中,访问任务通常需要获得指向其task_struct结构体的指针,通过current宏可以实现。

1.2 进程状态

  task_struct->state记录进程状态:

  TASK_RUNNING(运行状态)——正在执行,或者在运行队列中等待执行

  TASK_INTERRUPTIBLE(可中断状态)——进程正在睡眠(或者阻塞),等待某些条件达成之后,内核就会把进程状态设置为运行

  TASK_UNINTERUPTIBLE(不可中断状态)——与可中断状态相比,不可中断状态对信号不作响应

  TASK_ZOMBIE(僵死状态)——该进程已经结束,但是其父进程还没有调用wait4()系统调用,即为了让父进程能够获知它的消息,子进程的task_struct仍然被保留着

  TASK_STOPPED(停止状态)——进程停止执行,通常发生在进程接收到SIGSTOP/SIGTSTP/SIGTTIN/SIGTTOU等信号时

  Linux系统中,用户态所有进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程。

  Linux中每个进程都必须有一个父进程,每个进程可以拥有0~N个子进程。如果父进程在子进程之前退出,必须有机制来保证子进程可以找到继父,否则这些成为孤儿的进程就会在退出时永远处于僵死状态(保留task_struct结构体而空耗资源),白白浪费内存。解决的方法是给子进程在当前线程组找一个线程作为继父,如果不行,就让init进程做它们的继父。

1.3 内核线程(kernel thread)

  内核经常需要在后台执行一些操作,这种任务可以通过内核线程完成——独立运行在内核空间的标准进程。内核线程和普通进程的区别在于内核线程没有独立的地址空间(实际上它的mm指针被设置为NULL)。它只在内核空间运行,从来不切换到用户空间。内核线程和普通进程一样,可以被调度,也可以被抢占。

进程调度

  Linux内核为多任务可抢占式内核。进程调度就是负责CPU资源的分配,满足所有进程对CPU资源的需求。

  调度程序中最基本的数据结构是可执行队列(run queue),现代CPU一般都是多核架构,Linux内核为每一个核维护一个唯一的可执行队列。

最新文章

  1. BZOJ 1105: [POI2007]石头花园SKA
  2. 深入理解Sqlserver索引
  3. java中String类学习
  4. java比.net优美的一个小地方
  5. sysctl
  6. HTML5 文件域+FileReader 分段读取文件并上传(七)-WebSocket
  7. PHP 将Base64图片保存到 Sae storage
  8. MongoDB学习笔记01
  9. 清除float常用方法(:after和clear:both)
  10. 群星云集 BOSS上海时装秀—情沪魅影- 在线观看 - 乐视网
  11. http状态码200,300,404等是什么意思
  12. SQL练习题完整(做完你就是高手)
  13. Mysql 备份恢复与xtrabackup备份
  14. This is probably because there is no OLE editor registered against the type of file you were trying to open.
  15. Web前端性能分析
  16. odoo 配置文件参数大全
  17. IE7下使用兼容Icon-Font CSS类
  18. canvas贪吃蛇游戏
  19. 文件上传之Servlet
  20. 电商类web原型制作分享——美丽说【附源文件】

热门文章

  1. 关于sqlmap的两个小坑
  2. Session的生命周期和工作原理
  3. python django网站编程视频教程学习资料下载
  4. php后门简单检测脚本
  5. 17、RAID和LVM
  6. vs2017的主题颜色的配置
  7. Java模板引擎性能对比
  8. 关于cli打包至服务器出现的BUG(样式错乱,路径出错)解决方案
  9. POJ - 2774 Long Long Message (后缀数组/后缀自动机模板题)
  10. 我说CMMI之四:CMMI的表示方法--转载