正在学习Linux,记录一下学习历程。
定义
进程:一个正在执行或准备执行的程序。
更精确地讲,进程就是一个加载到内存中正在执行或准备执行的程序,再加上程序所需的数据,以及跟踪管理程序状态所需的各种信息。
内核管理进程
所有的进程都由内核管理,内核是操作系统的核心部分。
当进程创建时,内核赋予其一个唯一的标识号,这个标识号称为进程ID或PID。为了跟踪管理系统中的所有进程,内核维护了一个进程表。按照PID索引,每个进程再进程表中有一个条目。进程表中的条目除了PID,还包含有描述及管理进程所需的信息。
系统中有许多进程,有一些进程是由用户运行的程序,但是,大多数进程是自动启动的,再后台执行任务。
这些进程需要共享系统的资源:处理器,内存,I/O设备,网络连接等。
为了管理这样一个复杂的工作负荷,内核提供了一个复杂的调度服务,称为调度器。
调度器一直维护着一个所有正在等待执行的进程的列表。通过使用特定的算法,调度器每次选择一个进程,给予这个进程再一个短暂的时间间隔(称为时间片)中运行的机会。(在多处理系统中,调度器可以一次选择多个进程)
每次进程结束时间片时,内核需要中断进程。内核保存每个被中断进程的数据(如程序中下一条指令的位置,环境的副本等)。当该进程再次启动时,它能够在中断处继续执行。
内核为进程提供服务
内核为进程提供基本的服务:
1. 内存管理(虚拟内存管理,包括分页)
2. 进程管理(进程创建,终止,调度)
3. 进程间通信(本地,网络)
4. 输入/输出(通过设备驱动程序,即与物理设备时间通信的程序)
5. 文件管理
6. 安全和访问控制
7. 网络访问(如TCP/IP)
当进程需要内核提供服务时,它就通过系统调用发送请求。
如:
进程使用系统调用初始化I/O操作。
当编写程序时,系统调用的使用方法取决于所使用的编程语言。如在C程序中,使用的是标准库中的函数。
创建&使用进程
fork | 创建当前进程的一个副本 |
wait | 等待另一个进程结束执行 |
exec | 在当前进程中执行一个新进程 |
exit | 终止当前进程 |
kill | 向另一个进程发送一个信号 |
以shell为例:
shell是一个充当用户界面和脚本解释器的程序。正是shell才允许你输入命令,以及间接访问内核服务。
一旦shell开始运行,它也是一个进程,是众多系统进程中的一个。
和所有的进程一样,shell也拥有自己的PID(可以通过一个特殊的shell变量$显示),并且在进程表中拥有自己的条目。
内部命令直接由shell解释,不需要创建新的进程。
外部命令需要shell运行一个单独的程序,因此每当运行外部命令时,shell必须创建一个新进程。
shell先使用fork系统调用创建一个新进程,原始进程称为父进程,新进程成为子进程。一旦进程分叉(fork)成功