程序如何变成进程
进程基础
程序和进程
什么是程序?什么是进程?程序和进程之间的关系?相信在任何介绍进程基础的地方都会解释一下程序和进程之间的关系,这是一个常识性的知识。
单独来看程序和进程,它们的概念都非常的简单。粗略去看,程序是一个或多个文件,进程是操作系统上能做某些事情的东西。
更标准一点,程序是由编程人员编码好的一个或多个文件,换句话说,程序是由源代码组成的静态的文件,里面定义了这个程序要做什么事,实现什么功能。但是它仅仅只是定义了这些要做的事情以及要实现的功能,并没有去做这些事情。只有当程序在操作系统上运行起来之后产生了进程,才会由进程去做这些事情。所以,进程是程序在操作系统上运行之后产生的,是程序动起来之后的一个实例,因此也可以将进程看作是“运行中的程序”。
所以,程序自身只是包含了一些指令和一些静态数据,静止地躺在磁盘里的某个位置,它是无生命无灵魂的。当开始执行程序后,操作系统负责将程序源代码装载到内存中,使其动起来,赋予了它的灵魂和生命,它将因此变得有意义。
程序如何变成进程
静止的程序到底是怎么转换成运行的进程的?OS是如何让程序运行起来的?进程是如何创建并工作的?这是几个让人疑惑又想窥得究竟的问题。
OS要让磁盘上一个可执行格式(不是可执行权限)程序运行起来,第一件事就是(load)程序的相关代码以及静态数据(例如以初始化的变量)到内存中(具体的是到自己的虚拟内存地址空间)
早期一些操作系统,会一次性将程序所有相关代码和数据装载到内存,而现代的操作系统是lazy模式装载,只在程序的执行过程中需要某段代码时,临时去装载。
当代码和静态数据已经装载到内存后,OS还需要为将要运行的程序做一些额外的操作,比如为该进程分配一些内存;创建一些数据结构;初始化与IO相关的一些任务(比如Unix系统中,设置好每个进程都关联的3个文件描述符:stdout、stdin、stderr),等等。
当完成了这些操作后,程序开始执行。因为程序的执行要从main()函数(程序的入口,即使是非C程序,也一定有一个入口函数)开始,所以需要先跳转到main()函数,然后OS将CPU控制权交给新创建的进程,进程获取到CPU后就可以执行了。