冯诺依曼体系结构
我们常见的计算机,如笔记本电脑,以及不常见的计算机,如服务器,大部分都遵循冯诺依曼体系结构。
截至目前,我们所认识的计算机,都是由一个个的硬件组件组成的。
输入单元:包括键盘、鼠标、扫描仪、写板等。
中央处理器(CPU):包含运算器和控制器等。
输出单元:显示器、打印机等。
关于冯诺依曼体系结构,必须强调几点:
操作系统(Operator System)概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统地理解,操作系统包括:
设计OS的目的是与硬件交互,管理所有的软硬件资源,为用户程序(应用程序)提供一个良好的执行环境。操作系统在整个计算机软硬件架构中的定位是一款纯正的“搞管理”的软件。
如何理解“管理”?
管理的例子描述被管理对象,组织被管理对象。

进程基本概念
课本概念:程序的一个执行实例,正在执行的程序等。
内核观点:担当分配系统资源(CPU时间、内存)的实体。
描述进程-PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是:task_struct。
task_struct-PCB的一种
在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_struct内容分类
组织进程可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。
查看进程
进程的信息可以通过/proc系统文件夹查看。

通过系统调用获取进程标示符
进程ID(PID)和父进程ID(PPID)。
#include <stdio.h>
#include <sys>
#include <unistd.h>
int main(){
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}通过系统调用创建进程-fork
初识运行man fork,认识fork。fork有两个返回值,父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)。
#include <stdio.h>
#include <sys>
#include <unistd.h>
int main(){
int ret = fork();
printf("hello proc : %d!, ret: %d\n", getpid(), ret);
sleep(1);
return 0;
}fork之后通常要用if进行分流。
#include <stdio.h>
#include <sys>
#include <unistd.h>
int main(){
int ret = fork();
if(ret == 0){
//子进程
}else if(ret > 0){
//父进程
}else{
//错误处理
}
return 0;
}进程状态
/** The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};进程状态查看
ps aux / ps axj 命令

Z(zombie)-僵尸进程
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程。僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
来一个创建维持30秒的僵死进程例子:
#include <stdio.h>
#include <stdlib.h>
int main(){
pid_t id = fork();
if(id > 0){
//父进程
printf("parent[%d] is sleeping...\n", getpid());
sleep(30);
}else{
printf("child[%d] is begin Z...\n", getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
return 0;
}僵尸进程危害
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!内存泄漏---
进程状态总结
孤儿进程
父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?父进程先退出,子进程就称之为“孤儿进程”。孤儿进程被1号init进程领养,当然要有init进程回收喽。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
pid_t id = fork();
if(id > 0){
//父进程
printf("parent[%d] is exiting...\n", getpid());
exit(EXIT_SUCCESS);
}else{
//子进程
printf("child[%d] is sleeping...\n", getpid());
sleep(30);
exit(EXIT_SUCCESS);
}
return 0;
}
学习编程就得循序渐进,扎实基础,勿在浮沙筑高台。
以上就是【玩转Linux】如何快速理解进程概念的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号