Linux:进程(一)
文章目录
- 前言
- 一、进程是什么
- 二、描述进程--PCB
- 三、查看进程
- 四、通过系统调用获取进程标示符
- 五、通过系统调用创建进程-fork初识
- 六、进程状态
- 七、进程状态查看
- 八、僵尸进程(Z:zombie)
- 1.是什么
- 2.为什么
- 3.怎么避免
- 九、孤儿进程
- 十、进程优先级
- 十一、其他概念
- 总结
前言
前面我们学习了gdb的一些基础命令,今天来看看进程这个概念。
一、进程是什么
进程 = 对应的代码和数据 + 进程对应的 PCB 结构体
那么问题来了,PCB是什么?
难道是高中生物?错辣!那是PCR
PCB全称Process Control Block,即 进程管理块
二、描述进程–PCB
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
Linux操作系统下的PCB是: task_struct
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
三、查看进程
进程的信息可以通过 /proc 系统文件夹查看
[wkj@VM-4-13-centos lesson8]$ ls /proc/1
ls: cannot read symbolic link /proc/1/cwd: Permission denied
ls: cannot read symbolic link /proc/1/root: Permission denied
ls: cannot read symbolic link /proc/1/exe: Permission denied
attr cgroup comm cwd fd io map_files mountinfo net oom_adj pagemap projid_map schedstat smaps statm task wchan
autogroup clear_refs coredump_filter environ fdinfo limits maps mounts ns oom_score patch_state root sessionid stack status timers
auxv cmdline cpuset exe gid_map loginuid mem mountstats numa_maps oom_score_adj personality sched setgroups stat syscall uid_map
[wkj@VM-4-13-centos lesson8]$ ls /proc
1 1199 14040 20 24 259 27737 294 414 6411 7 925 cmdline execdomains kallsyms locks pagetypeinfo stat uptime
10 12 147 203 24085 26 27884 36 47 646 7301 990 consoles fb kcore mdstat partitions swaps version
10753 1217 16 21 25 260 28 37 49 65 8 991 cpuinfo filesystems keys meminfo sched_debug sys vmallocinfo
10968 13 1621 22 25007 26695 28826 38 50 650 8234 993 crypto fs key-users misc schedstat sysrq-trigger vmstat
11 13814 18 22268 25089 27 28850 389 51 654 8236 acpi devices interrupts kmsg modules scsi sysvipc xpmem
1162 1389 19 22269 251 27052 289 39 52 657 8349 buddyinfo diskstats iomem kpagecount mounts self timer_list zoneinfo
1166 1390 19897 22270 257 271 29 4 557 658 8350 bus dma ioports kpageflags mtrr slabinfo timer_stats
1175 14 2 23 258 277 293 410 6 659 9 cgroups driver irq loadavg net softirqs tty
四、通过系统调用获取进程标示符
- 进程id :pid
- 父进程id : ppid
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}
五、通过系统调用创建进程-fork初识
- fork有俩个返回值
- 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{int ret = fork();if(ret < 0){perror("fork");return 1;
}
else if(ret == 0){ //childprintf("I am child : %d!, ret: %d\n", getpid(), ret);
}
else{ //fatherprintf("I am father : %d!, ret: %d\n", getpid(), ret);
}sleep(1);return 0;
}
六、进程状态
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 */
};
- R运行状态(running) : 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
- S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠。
- D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
- T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
- X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
当服务器压力过大的时候,操作系统(OS)会通过一定的手段,杀掉一些进程,以求节省空间的作用。
七、进程状态查看
ps aux / ps axj 命令
八、僵尸进程(Z:zombie)
1.是什么
一个进程已经退出,但是还不允许被操作系统(OS)释放,处于一个被检测的状态,这个状态就是僵尸状态。
2.为什么
维持该状态,为了让父进程和OS来进行回收。
我是一个进程,如果我退出了,没有人来读我的数据,我就是僵尸!
3.怎么避免
- 让僵尸进程的父进程来回收,父进程每隔一段时间来查询子进程是否结束并回收,调用wait()或者waitpid(),通知内核释放僵尸进程 。
- 采用信号SIGCHLD通知处理,并在信号处理程序中调用wait函数 。
- 让僵尸进程变成孤儿进程,就是让他的父亲先死。
- 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。
九、孤儿进程
父进程退出,子进程还在,子进程就叫做孤儿进程。孤儿进程会被领养,被1号进程领养(init,系统本身),这样就可以进行回收。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{pid_t id = fork();if(id < 0){perror("fork");return 1;
}
else if(id == 0){//childprintf("I am child, pid : %d\n", getpid());sleep(10);
}else{//parentprintf("I am parent, pid: %d\n", getpid());sleep(3);exit(0);
}return 0;
}
十、进程优先级
- cpu资源分配的先后顺序,就是指进程的优先权(priority)。
- 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
- 可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。
十一、其他概念
- 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
- 并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行
- 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
总结
以上就是今天要讲的内容啦
Linux:进程(一)相关推荐
- Linux 进程及进程之间的通信机制——管道
参考: LInux C编程从初学到精通 电子工业出版社 Linux 进程 Linux 进程简介 Linux是一个多用户多任务的操作系统,多用户是指多个用户可以在同一时间使用同一台计算机系统:多用户是指 ...
- Linux进程与线程的区别 详细总结(面试经验总结)
首先,简要了解一下进程和线程.对于操作系统而言,进程是核心之核心,整个现代操作系统的根本,就是以进程为单位在执行任务.系统的管理架构也是基于进程层面的.在按下电源键之后,计算机就开始了复杂的启动过程, ...
- Linux进程编程基础介绍
Linux系统是一个多进程的系统,它的进程之间具有并行性.互不干扰等特点.也就是说,每个进程都是一个独立的运行单位,拥有各自的权利和责任.其中,各个进程都运行在独立的虚拟地址空间,因此,即使一个进程发 ...
- Linux进程ID号--Linux进程的管理与调度(三)
进程ID概述 进程ID类型 要想了解内核如何来组织和管理进程ID,先要知道进程ID的类型: 内核中进程ID的类型用pid_type来描述,它被定义在include/linux/pid.h中 enum ...
- Linux 进程必知必会
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 只是简单的描述了一下 Linux 基本概念,通过几个例子来 ...
- Linux进程管理 (7)实时调度
关键词:RT.preempt_count.RT patch. 除了CFS调度器之外,还包括重要的实时调度器,有两种RR和FIFO调度策略.本章只是一个简单的介绍. 更详细的介绍参考<Linux进 ...
- Linux进程及进程管理命令
Linux进程基础 1进程概念 1.1程序与进程 1.2进程的状态 1.3线程 1.4进程生命周期 1.5虚拟内存 2进程管理工具 2.1pstree 2.2ps 2.3pgrep 2.4kill.p ...
- Linux进程查看与管理
Linux进程查看与管理(2) htop: 交互式命令: u: 过滤 s:跟踪选用的进程所发起系统调用 l:显示选定进程所打开的文件 t:显示进程的层次数 a:设定进程的cpu亲缘性:(将选定的进程绑 ...
- Linux进程的Uninterruptible sleep(D)状态
Linux系统进程状态: PROCESS STATE CODES Here are the different values that the s, stat and state output spe ...
- linux进程及作业管理实验,Linux 进程及作业管理(示例代码)
Linux 进程及作业管理 概述: 一.进程的相关概念: 1.相关定义:内核的功用: 进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能等: 通俗的来说进程是运行起来的程序.唯一标识进程的 ...
最新文章
- Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)
- PostMessage()和SendMessage()
- js plugin--headroom
- 采用MiniProfiler监控EF与.NET MVC项目
- Java JSON对象怎么遍历_Java遍历JsonObject对象
- goland远程调试Docker
- NBA Top Shot巨鲸17.5万美元购买的球星卡目前已值2000万美元
- python切片读取数据_在Python中读取、切片和重组数据文件blockbyblock
- mysql必知必会心得_SQL必知必会知识总结
- 判断网络问题不只ping还有tracert,以及tracert原理
- 微信群管理机器人免费、破解版
- matlab命令窗口作用是什么,matlab的命令窗口的作用是什么
- 达梦数据库报网络通讯异常排查步骤
- 微信大会有哪些看点?
- ACM顶会CIKM 2022放榜!度小满AI Lab三篇入选
- 渐变折射率(GRIN)多模光纤的建模
- Laravel Sail 使用 PhpStorm 与 Xdebug 进行调试
- 《python深度学习》学习笔记与代码实现(第六章,6.3 循环神经网络的高级用法)
- 进程process和线程thread应用和区别——Python学习笔记12
- 入门kpi的后台工具类