源自CSDN
CSDN-专业IT技术社区-登录blog.csdn.net一、基础知识
1.1、进程的概念
一个程序文件, 只是一堆待执行的代码和部分待处理的数据,它们只有被加载到内存中,然后让CPU逐条执行其代码,根据代码做出相应的动作,才形成一个真正“活的”、动态的进程(Process)
因此, 进程是一个动态变化的过程,是一出有始有终的戏,而程序文件只是这一系列动作的原始蓝本,是一个静态的剧本
- 进程就是程序在内存中动态执行的过程
- 进程是系统资源管理的最小的单位
- 进程是动态的概念,创建—运行--消亡
- 每个进程有4G独立的进程空间,其中0-3G是用户空间,3G-4G是内核空间。每个进程也有4G地址空间的,仅仅是地址空间,不是实际的内存,需要使用时,向系统申请
- 进程是独立可调度的任务,绝大多数的操作系统都支持多进程
1.2、多进程(任务)并行的实现
进程我们了解了,其实就可以说是一个后台运行的任务, 而多进程(多任务)并行就好比如我们的电脑可以上谷歌浏览器、微信、网易云音乐 ,它们都是一个个任务,在执行各自的功能, 看上去它们“同时”一起运行
但是实际上,对于一个单核CPU来讲,从宏观上是并行的,而从微观上是串行的,它使用时间片划分周期调用来实现,每个任务在一段时间内会分到一段时间片(占cpu的时间),在这段时间内该任务只能运行时间片长度,每个任务执行一点每个任务执行一点,从而达到“同时”的效果
而每个任务是如何调度和切换的? 这是由系统调度器来实现 , 所以使得任务有多种状态,如下
就绪状态: 未占到CPU, 进程准备好了,等待系统调度器调度。
运行状态: 占到CPU , 已经开始运行。
暂停状态: 没占,收到外部暂停信号,暂停运行 (不在参与任务调度)
挂起(睡眠)状态: IO资源不满足, 导致进程睡眠。 (不在参与任务调度)(例如键盘输入)
僵尸状态: 进程已经结束, 但是资源(内存、硬件接口)没有回收。
就这样, 任务被切来切去, 我一点你一点(指的是cpu抢占时间),最后达到宏观上的并行运行
1.3、重要指令
(1) ps ——— 查看进程信息
ps aux ——— 显示系统所有的进程
ps -elf ——— 显示系统所有的进程(通用)
(2)top ———— 动态查看进程信息
(3)pstree ———— 查看父子关系结构的进程
(4)kill -9 进程号 ——— 杀死进程。(通过信号)
1.4、父子进程和进程ID
Linux中的进程都是由其它进程启动。如果进程a启动了进程b, 所以称a是b的父进程, b是a的子进程
Linux启动时,0进程启动1号进程(init )和2号进程(内核线程), 0号进程退出, 其它进程是由1、2直接或间接产生1号进程(init ) 是所有用户进程的祖先2号进程(内核线程) 是内核进程的祖先
进程号 PID (process ID)(类型pid_t , 什么什么_t 都是正整数) :
每个任务拥有唯一ID, 由操作系统管理和分配
每个进程创建会分配一个ID , 结束会取消一个ID
取消的那个ID会延时重复使用 , 但不会同时出现同一个ID
相关函数:
函数getpid() 获取本进程的ID
函数getppid() 获取父进程的ID (get perent pid)
(小彩蛋) 想让程序在后台运行执行指令