目录
- 什么是在计算机运行的程序
- 这么多运行的程序计算机是如何管理的
- 先描述
- 再组织
什么是在计算机运行的程序
对于一个在磁盘可执行的二进制文件,也可叫做可执行程序。对于一个可执行的程序,程序有自己的代码和数据。一旦运行起来,就会在计算机内部运作起来。
根据冯诺依曼体系,一个程序要被运行起来,先是要加载到内存当中,然后再到CPU调度。当代计算机中,能运行一个程序,就能运行多个程序,然后每个二进制的可执行文件程序都像在自己干自己的事情,互不干扰。这就是在计算机运行的程序。
这么多运行的程序计算机是如何管理的
先描述
当程序加载到内存的时候,计算机的操纵系统(OS)必然会对这个程序进行管理,操作系统是通过对程序对象的先描述,抽象成一个对象,这个概念就是进程(process),所以程序运行起来就是操作系统的一个进程(操作系统创建一个进程来运行这个程序)。操作系统对程序的管理转而变为对进程的管理,进程有程序的代码和数据。实际上在磁盘的程序在运行之前,是把代码和数据拷贝到内存当中,而程序依据再磁盘保存着,所以说运行的程序其实是操作系统中运行的进程。然后这些进程在合适的时机会被CPU调度。
再组织
对程序拷贝到内存的代码和数据进行描述完成后,操作系统要对这些进程管理,再linux系统当中,会以一个叫task_struct的结构体对象对进程进行管理,task_struct包含着进程的属性,task_struct就是操作系统管理进程的控制块(process contorl block),然后task_struct以某种数据结构类型相互联系起来。再以一个struct runqueue的运行队列结构体管理。
进程包含(代码 + 数据 + 进程控制数据结构)
如果一个在磁盘可执行的文件已经加载到内存有进程一直在运行,如果进程还没结束,把磁盘的可执行文件删除,该进程还能运行,因为该进程是拷贝可执行文件的数据和代码,虽然已经删除可执行文件,但依旧运行。如果终止想重新执行就不可以。
struct task_struct {
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
prio_array_t *array;//有该进程被cpu调度的优先级
pid_t pid;//有进程的id编号
pid_t tgid;
struct mm_struct *mm, *active_mm;//进程的内存地址空间
int exit_code, exit_signal;//进程的退出码和退出信息
struct task_struct *next_task, *prev_task;
//
//...........................................
//该进程的一系列属性。包括形成该进程的文件路径和其他文件信息
}
//操作系统也是软件,上述结构体就是操作系统管理进程的task_struct
struct task_struct *next_task, *prev_task;
操作系统通过这种双链表的形式组织管理这些进程控制块。
当新的程序执行的时候,操作系统再次创建进程,把进程通过链表的链入规则连接到运行队列,如果进程结束,则task_struct在链表上删除,然后重新连接。