[Linux 高并发服务器] 进程概述
程序和进程
程序
程序是包含一系列信息的文件,这些信息描述了如何在运行时创建一个进程
- 二进制格式表示,用于描述可执行文件格式的元信息,内核利用此信息解释文件中的其他信息
- 机器语言指令
- 程序入口地址:标识程序开始执行时的起始指令位置
- 数据:程序文件包含的变量初始值和程序使用的字面量值(字符串)
- 符号表和重定位表,描述程序中函数和变量的位置以及名称。用来调试和运行时的符号解析(动态链接)
- 共享库和动态链接信息
- 其他信息也都是描述如何创建进程的
进程
- 进程是正在运行的程序的实例。是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是操作系统动态执行的基本单元,在传统操作系统中也是基本的分配单元
- 一个程序可以来创建多个进程,进程是有内核定义的抽象实体,并为该实体分配用以执行程序的各项系统资源。内核角度看,进程是由用户内存空间和一系列内核数据结构组成的
简单的说,程序就是文件是死的,进程就是程序执行时用来分配资源和执行程序的
单道多道程序设计
- 单道程序设计,计算机内存中只允许一个程序的运行
- 多道程序设计,在计算机中同时存放几道独立程序,在管理程序控制下相互穿插执行,共享计算机系统资源,提高了CPU的利用率
- 对于一个单CPU系统来说,程序同时处于运行状态只是宏观上的概念,实际上任意时刻CPU上运行的程序只有一个
- 多道程序设计模型中,多个进程轮流使用CPU。常见CPU为纳秒级别,1s执行约10亿条指令,几乎是同时运行。
时间片
又称:量子,处理器片
是操作系统分配给每个正在运行的进程微观上的一段CPU时间,时间片通常很短用户不会感觉到。时间片不能很长也不能很短,在Linux系统中为5ms~800ms。如果时间太短,频繁切换,中间的消耗的时间就太多了,浪费性能;如果时间太长,就能被感觉出来没有在“同时执行”。
时间片是有操作系统内核的调度程序分配给每个进程。内核先给每个进程分配相等的初始的时间片,每个进程轮流执行相应的时间,当所有进程都处于时间片耗尽的状态时,内核会重新为每个进程计算并分配时间片
并行和并发
并行:同一时刻,有多条指令在多个处理器上同时执行
并发:同一时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,宏观上同时执行,微观上并不是同时执行,只是把时间片分成若干段,使多个进程快速交替的执行
进程控制块PCB
又称进程描述符表
为了管理进程,内核必须对每个进程所作的事情进行清楚的描述。Linux的进程控制块是task_struct
结构体
可以在下面这个路径里看task_struct
的定义,不过太多了就不贴了
/user/src/linux-headers-xxx/include/linux/sched.h
里面主要有这些内容
- 进程id:系统每个进程有唯一id,用pid_t类型表示,就是一个非负整数
- 进程的状态:就绪,运行,挂起,停止(后面会讲)
- 进程切换是需要保存和回复的一些CPU寄存器
- 描述虚拟地址空间的信息
- 描述控制终端的信息
- 当前工作目录(Current Working Directory)
- umask 掩码
- 文件描述符表,包含很多指向 file 结构体的指针
- 和信号相关的信息
- 用户 id 和组 id
- 会话(Session)和进程组
- 进程可以使用的资源上限(Resource Limit),
ulimit -a
可以查看资源上限
如果要修改的话可以使用ulimit -s 具体数值
,这样的格式来修改,其中-s
是以stack size
举例,如果改别的,那就使用对应的字母