Linux进程
Linux是一个多进程多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机;多任务是指Linux可以同时执行几个任务,Linux系统的一个重要特点就是可以同时启动多个进程。根据操作系统的定义:进程简单地讲就是操作系统资源管理的最小单位。
进程的概念 进程是操作系统资源分配的基本单位。要了解进程就需要将其与程序的概念区分开,下面详细介绍: **程序:二进制文件,在磁盘上,不占用系统资源(cpu,内存等支持操作系统运行的资源) **进程:抽象概念,占用系统资源,是系统资源分配的最小单位 进程将程序从磁盘上加载到系统资源后cpu才开始执行 总之:程序在磁盘上,但不占用系统资源;进程占用系统资源,但不在磁盘上;进程是动态的,程序是静态的;进程是运行中的程序,程序是一些保存在磁盘上的可执行代码。 举例: 类比于剧本来看,一个剧本可以被导演成多种版本,那么一个程序也可以被加载为多个进程。
进程标识 Linux操作系统中,每一个进程都是通过唯一的进程ID标识的。进程ID是一个非负数,每一个进程除了ID外还有其他的标识信息,他们可以通过相关的函数来获得。这些函数的在unistd.h头文件中。 获取进程各标识符的函数: pid_t getpid(id) 获得进程ID pid_t getppid(id) 获得进程父进程的ID pid_t getuid() 获得进程的实际用户ID pid_t geteuid() 获得进程的有效用户ID pid_t getgid() 获得进程的实际组ID pid_t getegid(id) 获得进程的有效组ID **实际用户ID(uid): 标识运行该进程的用户。 **有效用户ID(euid): 标识以什么身份来运行进程。比如:某个普通用户A,运行了一个程序,而这个程序是以root的身份来运行的,这程序运行时就具有root权限。则实际用户ID就是A用户的ID,而有效用户ID是root用户ID。 **实际组ID(gid): 实际用户所属的组的ID。 **有效组ID(egid): 有效用户所属的组的ID。
Linux进程的结构 Linux进程中一个进程由3个部分组成:代码段、数据段和堆栈段。 如下图所示: 代码段存放的是程序的可执行代码。数据段存放程序的全局变量、常量、静态变量。堆栈段中的堆用于存放动态分配的内存变量;堆栈段中的堆用于存放动态分配的内存变量;栈用于函数调用,它存放函数的参数、函数内部定义的局部变量。
Linux进程状态 运行状态:进程正在运行或在运行队列中等待运行的状态 可中断等待状态: 进程正在等待某个事件完成,等待过程中可以被信号或者定时器唤醒 不可中断等待状态: 进程也在等待某个事件完成,在等待过程中不可被中断 僵死状态: 进程已经终止,但进程描述符依然存在,直到父进程调用wait()函数后释放。通俗来说就是子进程结束了但是父进程还没结束,父进程无法回收子进程的空间及信息。 孤儿进程: 父进程已经结束,子进程再继续。此时的子进程被init(1)进程托管。
进程的并发 宏观并行 微观串行 (单处理机) 优点: 对于用户:可以同时做多个事情 对于电脑: 可以提高cpu的使用率
进程控制 fork()函数 可以创建一个子进程 它的返回值为pid_t型 可以看做无符号整型 没有参数传入 调用fork()函数后创建的子进程会先将父进程的代码拷贝一份,然后从fork()函数的下一句代码开始执行,fork()函数将0返回给子进程,大于0的数返回给父进程,而-1表示失败。下面补充一些琐碎的知识点: 1. Shell命令的本质是在特定目录下的可执行文件。 2. Linux的终端也叫命令解析器 3. Shell命令的执行流程: a. 输入命令名 b. 根据命令名在/usr/bin、/sbin、/bin、/usr/sbin这四个目录里查找同名的可执行文件 c. 开始执行可执行文件 这个流程是未指定路径的情况,如果指定了路径上述过程的第二步将会在指定目录下查找。 4. ps aux 显示所有进程 ps ajx 显示进程组id 5. Linux的返回值一般情况下有两种功能: 1.判断是否失败 2.返回一个需要的值 6. sleep()函数 sleep(0): 作用之一是 该进程让出cpu; 其二才是 等待、 7. wait()函数 主要处理孤儿进程(缺点是只会回收第一个死亡的孤儿进程) 返回值是pid_t wait(int *status) 作用: a.. 阻塞等待子进程退出 b.. 回收残留资源 c.. 获取子进程退出状态