怎样网站设计,南昌seo新手,水果网络营销方案,遂昌建设局网站目录
强烈建议全文阅读#xff01;#xff01;#xff01;
强烈建议全文阅读#xff01;#xff01;#xff01;
强烈建议全文阅读#xff01;#xff01;#xff01;
一、进程状态
二、僵尸和孤儿进程
1、僵尸进程 Z#xff08;zombie#xff09;
2、孤儿进…目录
强烈建议全文阅读
强烈建议全文阅读
强烈建议全文阅读
一、进程状态
二、僵尸和孤儿进程
1、僵尸进程 Zzombie
2、孤儿进程
三、进程的阻塞和挂起、运行、切换
1、阻塞态
2、挂起状态
3、进程的运行
4、进程切换
四、进程相关命令
五、进程的创建
五、队列优先级
1、什么是优先级
2、为什么要优先级
3、如何实现优先级
4、如何修改优先级
1、nice值调整
2、rrenice 命令常用
3、setpriority 系统调用 一、进程状态
Linux进程状态进程状态指的是的是进程在cpu中执行的状态
具体长什么样子
//展示第一个进程带头列表
ps axj | head -2 Rrunning进程运行的状态Ssleeping休眠状态等待“资源”就绪 / 可中断睡眠Tstopped让进程暂停等待进一步被唤醒ttrcing stop进程遇到追踪进程暂停例如代码调试Xdead死亡状态Ddisk sleepLinux下特有的一个进程状态不可被杀、深度睡眠、不可中断睡眠如何消除D状态进程自己醒来 / 重启 -- 断电Zzombie僵尸进程
号表示前台运行没有表示后台运行
调式代码的过程就是通过进程暂停来实现的
杀死进程命令 kill -number process 查看所有的进程控制命令
kill -l
一个数字对应一种控制
例如 9 杀掉进程、18继续命令、19暂停命令
信号名称信号编号含义SIGHUP1Hangup终端连接断开SIGINT2Interrupt终端中断信号SIGQUIT3Quit终端退出信号SIGILL4Illegal instruction非法指令SIGTRAP5Trace/Breakpoint trap追踪/断点陷阱SIGABRT6Abort异常终止SIGBUS7Bus error总线错误SIGFPE8Floating point exception浮点异常SIGKILL9Kill强制终止SIGUSR110User-defined signal 1用户自定义信号1SIGSEGV11Segmentation fault段错误SIGUSR212User-defined signal 2用户自定义信号2SIGPIPE13Broken pipe管道破裂SIGALRM14Alarm clock闹钟信号SIGTERM15Termination终止信号SIGSTKFLT16Stack fault协处理器栈错误SIGCHLD17Child status has changed子进程状态改变SIGCONT18Continue继续执行暂停的进程SIGSTOP19Stop停止进程的执行SIGTSTP20Terminal stop终端停止信号SIGTTIN21Background read from tty后台进程尝试读取控制终端SIGTTOU22Background write to tty后台进程尝试写控制终端SIGURG23Urgent condition on socket套接字上的紧急情况SIGXCPU24CPU time limit exceeded超出CPU时间限制SIGXFSZ25File size limit exceeded超出文件大小限制SIGVTALRM26Virtual alarm clock虚拟闹钟信号SIGPROF27Profiling alarm clock分析器闹钟信号SIGWINCH28Window size change窗口大小改变SIGIO29I/O now possible异步I/O事件SIGPWR30Power failure电源故障SIGSYS31Bad system call系统调用错误 二、僵尸和孤儿进程
1、僵尸进程 Zzombie
进程已经运行完毕但是需要维持自己的退出信息在自己的进程PCB中会记录自己的退出信息未来让父进程来读取 如果没有读取就会一直维持僵尸进程状态 进程 内核数据结构task_struct 进程代码和数据 当运行完毕时进程代码和数据会被释放凡是内核数据结构不会被释放依然存在等待被读取 就会存在占用内存空间也就是内存泄漏 僵尸进程不能被kill 因为僵尸进程也相当于死掉了不能死两次 Xdead死亡状态例如用waitpid等待队列访问僵尸进程后就会显示X状态
2、孤儿进程
当父进程先退出子进程就变成了孤儿进程因为爹死了没有爹了 孤儿进进程一般都会被1号进程OS领养以保证子进程被正常回收 命令行中启动的子进程的父进程是bashbash会自动回收子进程
三、进程的阻塞和挂起、运行、切换
1、阻塞态
相当于Ssleep状态Ddead也算 进程本身就是一个软件
操作系统对外部设备的管理其原理也是类似于硬件的方式先描述在组织 那么每一个设备都对应一个设备结构体对象 在这个设备结构体内部有一个等待队列 例如当进程A需要用到键盘这个设备时 就把进程A这个PCB放到键盘的等待队列中进行排队 其他进程对应需要对应资源也是这个道理 因此不是只有CPU才有运行队列 各个设备也有各自的等待队列 那么当把进程从CPU的运行队列拿到设备的等待队列时 此时该进程就不在运行队列就不会被调度 这个状态就叫做进程的阻塞状态
有了这个理解对于进程的状态变化还包括PCB被放到不同的队列中 同时进入等待队列/运行队列的是进程的PCB而不是代码和数据
2、挂起状态
当一个进程处于阻塞状态时他的PCB是在等待某个设备的资源也就是在等待某个设备的等待队列中 此时该进程不在CPU的运行队列中那么也就不会被调度不会被调度那么进程的代码和数据也就没有用 所以为了让操作系统的内存有更多的空间就暂时的把该进程的代码和数据唤出到磁盘的swap区 当该进程被CPU调度执行时又把对应的代码和数据唤入到内存中 这是操作系统的一种运行策略相当于在已有硬件的条件下实现了2倍的内存空间 但是频繁换入唤出会导致效率问题时间换空间策略
3、进程的运行
每个CPU都有一个运行队列 struct runqueue { task_struct *head; ... }; 进程在运行队列中进程状态就处于Rrunning状态
时间片 一个进程进入CPU运行不会一直运行到结束才停止而是基于时间片进行调度 在task_struct的一个属性中有一个与调度相关的信息叫做时间片 这个时间片用来分配进程使用CPU的时间当运行时间片结束后CPU就会把该进程移除再放到运行队列尾部 同时让多个进程以切换的方式进行调度使得在一个时间段内同时得以推进代码这就叫做并发
但是Linux实际上不是这样调度的而是一个叫做O1调度的算法 多个CPU对应多个运行队列 此时任何时刻都会有多个进程在真正意义上的同时运行即并行
4、进程切换
CPU寄存器保存进程的所有临时数据 例如当A进程执行到一半时或由于优先级 / 时间片等因素进程切换时 CPU需要切换调度进程执行新的进程B 此时寄存器中原来保存的进程A的临时数据会被保存在A进程的PCB中 这个数据叫做上下文信息 当A进程再次被调度时进程A要从上次被执行的位置开始 此时寄存器需要恢复原来A进程的即什么时候结束什么时候开始
所以进程切换最最重要的事情是上下文数据的保护和恢复CPU内部的所有寄存器的临时数据叫做进程的上下文
四、进程相关命令
父进程是bash命令解释器函数用man查找
查看所有进程
ps axj
行过滤:
| grep
显示进程属性和进程信息
ps axj | head -1 ps axj grep XXX
获取进程id :这是一个函数
gitpid()
获取父进程id:
ditppid()
创建子进程
fork() 启动进程:
./XXX
结束进程:
Ctrl c
杀掉进程:
kill -9 pid
更该cwd当前工作目录
chdir
cwdcurrent work dir
获取环境变量
getenv(
查看进程优先级 a所有进程
ps -al
查看进程在根目录/proc文件实时保存内存中运行的进程process
cd ~cd /proc
五、进程的创建
为什么要创建子进程 想让子进程执行和父进程不一样的任务
#include stdio.h
#include unistd.h
#include sys/types.hint main() {pid_t pid;// 创建子进程pid fork();if (pid 0) {// 错误处理fprintf(stderr, 进程创建失败\n);return 1;} else if (pid 0) {// 子进程执行代码printf(这是子进程PID为%d\n, getpid());// 在这里可以执行子进程的任务} else {// 父进程执行代码printf(这是父进程PID为%d子进程PID为%d\n, getpid(), pid);// 在这里可以执行父进程的任务}return 0;
}fork的返回值会有两个返回值返回两次 0子进程 -1创建进程失败 0子进程的pid执行父进程 为什么返回两次 为什么这个知识有关地址空间可以看博主相关文章
进程特点具有独立性 五、队列优先级
1、什么是优先级
本质是指定一个进程获取某种资源的先后顺序 优先级如何控制是PCB的内部字段int prio 在Linux中优先级数字越小优先级越高
2、为什么要优先级
因为CPU的资源是有限的而进程很多
3、如何实现优先级
用进程优先级值和一个nice值分别是PRI PRIProcess Priority进程优先级,值越小优先级越高 NInice进程优先级的修正数据当时一个进程执行完毕时如果需要修改优先级就会用nice值来调整优先级新的优先级 优先级(80) nice值达到对应进程优先级动态修正的过程 nice值是有范围的一般是[-20 19]40个数字即40个级别目的是确保资源分配的公平每次调整优先级都是从80开始
4、如何修改优先级
一般不推荐调整进程的优先级
在Linux系统中进行Nice 值调整
1、nice值调整
使用 nice 命令或系统调用 setpriority 来调整进程的优先级。 nice 命令可以通过设置不同的优先级来启动命令或进程。较小的值表示较高的优先级。 示例
nice -n -10 ./my_process # 启动一个优先级较高的进程2、rrenice 命令常用
可以使用 renice / r命令来更改正在运行的进程的优先级。 示例
renice -n 10 -p 12345 # 将进程PID为12345的优先级调整为更低3、setpriority 系统调用
可以通过编程方式使用 setpriority 系统调用来调整进程优先级。 示例C语言
#include sys/time.h
#include sys/resource.h
#include unistd.h
#include stdio.hint main() {int which PRIO_PROCESS;id_t pid getpid();int priority -10; // 设置较高的优先级if (setpriority(which, pid, priority) ! 0) {perror(设置优先级失败);return 1;}printf(优先级已设置为 %d\n, getpriority(which, pid));return 0;
}应用卡住的本质是进程没有被执行调度