进程
进程是一个程序执行的过程,会去分配内存资源,cpu的调度
进程不仅仅是一个正在运行的程序,它包含了程序执行所需的所有资源和状态信息
-
资源分配:操作系统会为每个进程分配必要的资源,如内存空间、文件句柄等。这些资源保证进程能够正常执行。
-
CPU调度:操作系统通过调度程序(scheduler)决定哪个进程在某一时刻占用CPU。因为CPU资源是有限的,多个进程需要轮流使用CPU,因此操作系统会频繁地切换进程。
-
程序执行状态:进程不仅仅是代码,它还包含了程序的执行状态,如程序计数器、寄存器内容等。这些信息能够帮助操作系统在暂停进程后继续其执行。
-
进程控制块(PCB):进程控制块是操作系统用来描述和管理进程的一个数据结构。它包含了与进程相关的所有信息,包括进程ID、进程状态、程序计数器、内存管理信息、文件描述符等。PCB是操作系统管理进程的核心部分。pcb 是一个结构体,process control block print circuit board
-
task_struct
结构体:在Linux操作系统中,每个进程都通过一个task_struct
结构体来描述。task_struct
中包含了与进程相关的各种信息,包括进程状态、优先级、CPU时间、内存管理信息等。它是Linux内核中用来管理进程的关键数据结构。
-
PID (Process Identifier):
- PID 是进程标识符,每个进程都有一个唯一的 PID,操作系统通过 PID 来区分和管理不同的进程。PID 在操作系统中是唯一的,即在同一时刻不会有两个进程拥有相同的 PID。
-
CWD (Current Working Directory):
- CWD 是当前工作目录,即进程当前操作的目录路径。每个进程都有一个与之关联的当前工作目录。通过调用
chdir
函数来更改当前工作目录。例如,如果一个进程的 CWD 是/home/user/
, 那么这个进程在打开一个相对路径文件file.txt
时,会默认在/home/user/file.txt
这个路径下寻找文件。
- CWD 是当前工作目录,即进程当前操作的目录路径。每个进程都有一个与之关联的当前工作目录。通过调用
-
umask:
umask
是一个控制新建文件和目录权限的掩码。当一个文件或目录被创建时,系统会根据默认的权限(通常是 666 对文件,777 对目录)减去 umask 的值来设置实际的权限。例如,umask 0002
意味着新创建的目录的权限为775
(即777 - 2
)。
-
进程打开的文件列表:
- 每个进程都有一个文件描述符表,其中记录了该进程当前打开的所有文件。文件描述符用于标识和操作文件。通过
/proc/[PID]/fd
可以查看某个进程打开的文件列表。
- 每个进程都有一个文件描述符表,其中记录了该进程当前打开的所有文件。文件描述符用于标识和操作文件。通过
-
信号相关设置:
- 信号是进程间通信的一种机制,用于向进程发送通知或控制指令。Linux 系统中有 64 种标准信号,每种信号有不同的含义,例如
SIGINT
(中断)、SIGTERM
(终止)、SIGKILL
(强制终止)等。信号处理函数可以用来定义进程在接收到某个信号时应该如何响应。
- 信号是进程间通信的一种机制,用于向进程发送通知或控制指令。Linux 系统中有 64 种标准信号,每种信号有不同的含义,例如
-
用户 ID 和组 ID:
- 每个进程都关联着一个用户 ID(UID)和组 ID(GID),用于控制进程的权限。UID 表示该进程所属的用户,而 GID 表示该进程所属的用户组。通过这些 ID,操作系统可以控制进程的文件访问权限和其他操作权限。
-
进程资源的上限:
- 操作系统可以对进程使用的资源设置上限,以防止某个进程占用过多的系统资源。
ulimit
命令可以用来查看和设置这些资源的上限。例如,ulimit -a
命令可以显示当前进程的各种资源限制,如最大文件大小、最大内存使用量、最大进程数等。
- 操作系统可以对进程使用的资源设置上限,以防止某个进程占用过多的系统资源。
-
Open Files:
- 进程能够同时打开的文件数量是有限的,这个限制通常由操作系统设定。对于大多数系统来说,这个上限值默认是 1024。这意味着一个进程在同一时间最多可以打开 1024 个文件。这一限制包括标准输入、输出和错误流,以及通过系统调用打开的文件或设备。
- 如果需要打开更多的文件,可以通过修改系统设置或使用
ulimit -n
命令来调整这个值。不过,需要注意的是,过多的打开文件可能会导致资源枯竭或影响系统性能。
-
Stack Size (栈大小):
- 栈是每个进程在内存中分配的一块区域,用于存储函数的局部变量、参数、返回地址等。每个函数调用都会将数据推入栈中,而函数返回时,数据会从栈中弹出。
- 栈的大小也是有限的,默认值通常是 8MB,但这取决于具体的操作系统和配置。栈大小限制意味着在递归深度过大或使用大量局部变量时,可能会遇到栈溢出(stack overflow)的问题。
- 可以通过
ulimit -s
命令来查看或设置进程的栈大小限制。如果程序需要更大的栈空间(例如在深度递归或大量局部数据的情况下),可以增大这个限制,但要小心,过大的栈可能会导致系统内存不足。