搜索热词

本文为宋宝华《Linux的进程、线程以及调度》学习笔记。

1 进程概念

1.1 进程与线程的定义

操作系统中的经典定义:

进程:资源分配单位。

线程:调度单位。

操作系统中用PCB(Process Control Block,进程控制块)来描述进程。Linux中的PCB是task_struct结构体。

1.2 进程生命周期

1.2.1 进程状态

R,TASK_RUNNING:就绪态或者运行态,进程就绪可以运行,但是不一定正在占有cpu

S,TASK_INTERRUPTIBLE:浅度睡眠,等待资源,可以响应信号,一般是进程主动sleep进入的状态

D,TASK_UNINTERRUPTIBLE:深度睡眠,等待资源,不响应信号,典型场景是进程获取信号量阻塞

Z,TASK_ZOMBIE:僵尸态,进程已退出或者结束,但是父进程还不知道,没有回收时的状态

T,TASK_STOPED:停止,调试状态,收到SIGSTOP信号进程挂起

1.2.2 进程创建与消亡相关API

1)system()

通过调用shell启动一个新进程

2)exec()

以替换当前进程映像的方式启动一个新进程

3)fork()

以复制当前进程映像的方式启动一个新进程,子进程中fork()返回0,父进程fork()返回为子进程ID。

4)wait()

父进程挂起,等待子进程结束。

5)孤儿进程与僵尸进程

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程不会浪费资源。

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。僵尸进程浪费系统资源(进程描述符task_struct存在,进程占用的资源被回收,不存在内存泄漏,实际上基本不浪费系统资源,参宋宝华的课程)。

避免僵尸进程:

僵尸进程产生原因:

1、子进程结束后向父进程发出SIGCHLD信号,父进程默认忽略了它;

2、父进程没有调用wait()或waitpid()函数来等待子进程的结束。

避免僵尸进程方法:

1、父进程调用wait()或者waitpid()等待子进程结束,这样处理父进程一般会阻塞在wait处而不能处理其他事情。

2、捕捉SIGCHLD信号,并在信号处理函数里面调用wait函数,这样处理可避免1中描述的问题。

3、fork两次,父进程创建儿子进程,儿子进程再创建一个孙子进程,然后儿子进程自杀,孙子进程成为孤儿进程被init进程收养。

1.3 进程间通信

1)信号

信号这里指的是事件。比如按CTRL-C组合键会发送SIGINT信号,进程里可以捕捉到这个信号进行相应处理。

2)管道PIPE

一切皆文件,管道的操作也是类似文件的操作。

popen()函数类似于fopen()函数,返回的是对象指针。

pipe()函数类似于open()函数,返回的是对象描述符。

管道是在亲属进程(同一父进程创建出的相关进程)之间进行数据传输的。

3)命名管道FIFO

命名管道可用于无亲属关系的进程间通信。

mkfifo()/mknod()将在文件系统中创建一个有路径和名称的文件。把这个管道文件当作普通文件用就行了,就可以实现进程间通信。

4)信号量

信号量、消息队列、共享内存是System V IPC机制。

临界区:任何时刻只能有一个进程进行独占式访问的代码区。

信号量:大部分进程间通信只需要二进制信号量,因此这里只讨论二进制信号量。进入临界区前,执行P操作(若信号量大于1则减1并进入临界区,否则挂起本进程);退出临界区时,执行V操作(若有进程在等待挂起则唤醒之,否则信号量加1)。

互斥量:互斥信号量是二进制信号量的一个子集。

5)消息队列

与命名管道类似,但不必考虑打开/关闭管道的复杂操作。消息队列独立于进程而存在。

6)共享内存

需要通信的进程间共享一块内存进行数据交换。

2 进程线程的实现本质

Linux调度器实际是识别task_struct进行调度。

无论进程线程,底层都对应一个task_struct,进程和线程的区别是共享资源的多少,两个进程间完全不共享资源,两个线程间共享所有资源。

2.1 fork()

执行fork后,父进程的task_struck对拷给子进程,父子进程最初资源完全一样,但是是两份不同的拷贝,因此任何改动都造成二者的分裂。

父子进程对内存资源(mm)的管理使用了COW(Copy-On-Write,写时拷贝)技术:

在fork之前,一片内存区对应一份物理地址和一份虚拟地址,内存区的权限为RW;

在fork之后,父子进程看到的内存区虚拟地址相同,物理地址也相同,父子进程使用的其实是同一片物理内存,未发生内存拷贝,操作系统会将此内存区权限改为RO;

父或子进程对内存区执行写操作将触发PageFault,操作系统此时会将内存区拷贝一份,父子进程看到的虚拟地址仍然一样,但是物理地址已经不同。各进程虚拟地址到物理地址的映射由MMU(Memory Management Unit,内存管理单元)管理。

fork运行在有MMU的cpu上。

2.2 vfork()

对于无MMU的cpu,无法应用COW,无法支持fork。

无MMU的cpu使用vfork创建进程,父进程将一直阻塞直到子进程exit或exec。

vfork和fork的本质区别是,vfork中的父子进程共用同一片内存区。

2.3 pthread_create()

Linux线程本质上就是进程,只是与进程间资源共享方式不同,线程间共享所有资源,如上图所示。

每个线程都有自己的task_struct,因此每个线程都可被cpu调度。多线程间又共享同一进程资源。这两点刚好满足线程的定义。

Linux就是这样用进程实现了线程,所以线程又称为轻量级进程。

2.4 PID和TGID

POSIX要求,同一进程的多个线程获取进程ID是得到的是唯一ID值。

Linux同一进程的多线程,在内核视角实际上每个线程都有一个PID,但在用户空间需要getpid返回唯一值,Linux使用了一个小技巧,引入了TGID的概念,getpid()返回的的TGID值。

进程视角的top命令:

不带参数的top命令(默认情况),显示的是进程对单核cpu的利用率,例如,一个进程内有三个线程,主线程创建了线程1和线程2,线程1和线程2都调用一个while(1),则对双核cpu而言,线程1和线程2各用一个核,占用率都是100%,则top命令看到的进程cpu利用率是200%,进程ID是主线程的PID(也就是TGID)。

线程视角的top命令:

top –H命令从线程视角显示cpu占用率,上例中,将会显示,线程1占用率100%,线程2占用率100%。

说线程的PID,是指用户空间的进程ID,值就是TGID;当特别指出,线程在内核空间的PID,则指线程在内核中task_struct里特有的PID。

3 进程调度

3.1 实时进程调度

SCHED_FIFO:不同优先级按照优先级高的先跑到睡眠,优先级低的再跑;同等优先级先进先出。

SCHED_RR:不同优先级按照优先级高的先跑到睡眠,优先级低的再跑;同等优先级轮转。

内核RT补丁:

如下两个参数

/proc/sys/kernel/sched_rt_period_us

/proc/sys/kernel/sched_rt_runtime_us

表示在period的时间里RT最多只能跑runtime的时间

3.2 普通进程调度

SCHED_OTHER:

3.2.1 动态优先级(早期2.6)

进程有IO消耗性和cpu消耗型两种衡量参数。

优先级高的意味着:1) 得到更多的时间片,2) 醒时能抢占优先级低的。时间片轮转。

内核存储静态优先级,用户可通过nice来修改静态优先级。

进程的动态优先级则是根据静态优先级实时计算出来的,调度算法奖励IO消耗性(调高优先级增加实时性)、处罚cpu消耗型(调低优先级减小实时性)

3.2.2 CFS:完全公平调度(新内核)

红黑树,左边节点小于右边节点的值

运行到目前为止vruntime最小的进程

同时考虑了cpu/IO和nice

总是找vruntime最小的线程调度。

vruntime = pruntime/weight × 1024;

vruntime是虚拟运行时间,pruntime是物理运行时间,weight权重由nice值决定(nice越低权重越高),则运行时间少、nice值低的的线程vruntime小,将得到优先调度。这是一个随运行而动态变化的过程。

工具chrt和renice:

设置SCHED_FIFO和50 RT优先级

# chrt -f -a -p 50 10576

设置nice

# renice -n -5 -g 9394

# nice -n 5 ./a.out

4 多核负载均衡

5 参考资料

总结

以上是编程之家为你收集整理的Linux的进程线程及调度全部内容,希望文章能够帮你解决Linux的进程线程及调度所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

linux 编程 调度,Linux的进程线程及调度相关推荐

  1. 【操作系统/OS笔记10】进程/线程的调度原则、调度算法、实时调度、多处理器调度、优先级反转

    本次笔记内容: 8.1 背景 8.2 调度原则 8.3 调度算法1 8.4 调度算法2 8.5 实时调度 8.6 多处理调度与优先级反转 文章目录 CPU调度背景 上下文切换 CPU调度 在进程/线程 ...

  2. 【Linux | 系统编程】Linux系统编程(文件、进程线程、进程间通信)

    文章目录 Linux系统编程 文件IO open/close函数 read/write函数 文件描述符 阻塞.非阻塞 fcntl函数 lseek函数 传入传出参数 文件系统 文件存储 文件操作 sta ...

  3. 第一次作业:Linux 2.6.32的进程模型与调度器分析

    1.前言 本文分析的是Linux 2.6.32版的进程模型以及调度器分析.在线查看  源码下载 本文主要讨论以下几个问题: 什么是进程?进程是如何产生的?进程都有那些? 在操作系统中,进程是如何被管理 ...

  4. 《趣谈Linux》总结三:进程/线程

    8 进程管理 有了系统调用,就可以开始创建进程了 8.1 通过写代码使用系统调用创建一个进程 在 Linux 上写程序和编译程序,也需要一系列的开发套件,就像 IDEA 一样: 运行下面的命令,就可以 ...

  5. linux指定cpu运行程序,进程/线程绑定到特定CPU核的linux实现(有代码有实例)

    前言 现在计算机上的CPU大多都是多核的,有4核甚至是8核的.但是一个计算机启动之后其进程数是远远多于CPU核数的,因为操作系统会给自动调度这些进程在CPU核上轮流运行.但是对于应用程序或者进程,其性 ...

  6. 进程线程的调度阻塞唤醒

    1Cpu线程调度 1一个CPU最多可以运行一个进程或者一个线程,如果是双核的CPU最多可运行 两个进程或两个线程, 操作系统是多任务操作系统,他不止同时运行两个任务,可能有很多个,如word文档,QQ ...

  7. mysql的多master调度_innodb中master线程的调度的算法改进(mysql 5.6.26)

    innodb中master线程的调度的算法改进(mysql 5.6.26) 作者:周琳 QQ:715169549源码交流群:196380905 1.master线程的调度:/************* ...

  8. linux c进程线程的面试问题,linux 多线程面试题_linux进程线程_linux 线程 pthread_create...

    你写了一个简单的mandelbrot set程序,也就是说用ps命令行是可以看见多个线程,win32里同一个进程里各个线程之间是共享数据段的,win32的进程管理方式与unix上有着很大区别.adob ...

  9. Linux编程 7 (实时监测进程 top, 结束进程kill,killall)

    一. 实时监测进程 top 在一篇里讲到ps命令在收集进程信息时非常有用,但它只能显示某个特定时间点的信息.想要观察那些频繁换进换出的内存进程趋势,用top命令是合适的.使用top命令如下图所示: 在 ...

最新文章

  1. LNMP架构详解(1)——了解架构的基本信息
  2. 瞭望|事关未来10~15年工业操作系统主导权之争,工业互联网下一步怎么走?...
  3. DNF安装MySQL_CentOS7使用dnf安装mysql
  4. java读取系统中指定的文件_java读取jar中指定的文件
  5. 大牛书单 | 大数据存储方向好书分享
  6. java实现网页保存_详解Java两种方式简单实现:爬取网页并且保存
  7. iphone怎么检测屏幕是否被点亮 (用UIApplication的Delegate)
  8. Codeforces 1178
  9. C语言有好多7,[c语言]有1到100个数,现在从中提取7、和个位或十位上有7的数、以及7的倍数,然后输出。...
  10. 1023 组个最小数 (20 分)—PAT (Basic Level) Practice (中文)
  11. python 解析模块脚本_Python HTMLParser模块解析html获取url实例
  12. HFSS - GSM 900 和 DCS 1800 双频PIFA天线的设计与仿真
  13. mysql源代码多少行_数据库是一个庞大的工程,本来想读读mysql的开源代码,可看到代码行数.doc...
  14. 热敏打印机ESCPOS指令封装类,票据打印从此轻松,佳博系列实测通过
  15. SpringMVC框架原理图
  16. 百度地图获取经纬度的方式
  17. 从0到1的电商架构应该怎么做?有哪些坑?
  18. linux编译openssl报错,cargo编译musl报错openssl
  19. 第二章第十六题(几何:六边形面积)(Geometry: area of a hexagon)
  20. WIN7任务栏里面无用的图标如何清除

热门文章

  1. cmd cd命令_Windows系统CMD命令提示符的常用命令汇总
  2. linux dd命令 配额,第四章 Centos7.5下LVM操作与磁盘配额
  3. sci translate好用吗_收藏!SCI论文Introduction 和Conclusion的写作建议
  4. python画散点图-python学习之matplotlib绘制散点图实例
  5. python有哪些用途-python是什么?python的用途
  6. python是什么类型的语言-python到底是什么类型的语言
  7. python语言的读法-Python语言的优势有哪些?
  8. python基础知识-python基础知识整理(值得收藏)
  9. python在线朗读-Python带你朗读网页
  10. python语言入门-分分钟入门python语言