操作系统主要目的是能够运行用户程序,进程管理是操作系统的核心。
(1)进程概念
通常所指进程就是执行期的程序,但进程并不仅仅局限于一段可执行代码,通常还要包含其他资源:打开的文件、进程通信IPC、内核内部数据、处理器状态、内存地址空间及执行线程、数据段、堆栈等。实际上,进程就是正在执行的程序代码的实时结果。
执行线程,是进程中活动的对象,每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调度的对象是线程而不是进程。linux系统中线程和进程不特别区分,对linux而言,线程是一种特殊的进程。
linux系统通常调用fork函数来创建一个新的进程,该系统调用通过复制一个现有进程来创建一个全新的进程,fork调用从内核返回两次:一次回到父进程,另一次回到新产生的子进程。通常,创建新的进程都是为了立即执行新的、不同的程序,而接着调用exec一组函数可以创建新的地址空间,并把新的程序载入其中,现代内核中,fork实际是由clone系统调用实现的。
最后,程序通过exit系统调用退出进程。这个函数会终结进程并将其占用的资源释放掉。进程退出执行后被设置为僵死状态,直到它的父进程调用wait或waitpid为止。
(2)进程描述符及任务结构
内核把进程的列表存放在task_list的双向循环链表中,链表中每一项都是类型为task_struct、被称为进程描述符的结构。task_struct包含了内核管理一个进程所需的所有信息:打开的文件、进程地址空间、挂起的信号、进程的状态等;
分配进程描述符:
linux通过slab分配器分配task_struct,只需要在栈底或栈顶创建一个新的结构体struct thread_info。