当前位置: 首页 > news >正文

网站没内容可以备案吗描述个人网站的建站过程

网站没内容可以备案吗,描述个人网站的建站过程,网站没有被收录原因,广东手机网站建设公司在操作系统中#xff0c;进程是程序执行的基本单位#xff0c;操作系统负责管理进程的生命周期。为了高效地管理进程#xff0c;操作系统通过定义不同的进程状态来表示进程在不同时间点的行为。本文将详细介绍常见的进程状态及其相互之间的转换过程。 进程状态概述 在kerne… 在操作系统中进程是程序执行的基本单位操作系统负责管理进程的生命周期。为了高效地管理进程操作系统通过定义不同的进程状态来表示进程在不同时间点的行为。本文将详细介绍常见的进程状态及其相互之间的转换过程。 进程状态概述 在kernel进程有时候也叫事件。进程在执行过程中可能会处于不同的状态。每个进程状态代表了进程在生命周期中的一种阶段操作系统根据进程的当前状态采取不同的调度策略。 进程状态在font stylecolor:rgb(100,106,115);kernel/font源代码里的进程状态定义如下 /* *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 */ };以下是常见的进程状态 运行状态R并不意味着进程一定在实际运行中。它表明进程要么正在运行要么处于运行队列中Ready等待操作系统调度器将其调度到CPU上执行。换句话说处于运行状态的进程已经具备了运行的条件只是可能还在等待CPU资源的分配。睡眠状态S意味着进程正在等待某个事件的完成。这种状态有时也被称为可中断睡眠Interruptible Sleep。在可中断睡眠状态下进程可以被外部信号唤醒。例如当进程等待某个I/O操作完成时它会进入睡眠状态但如果在此期间接收到一个信号进程可以被唤醒并继续执行。磁盘休眠状态D也称为不可中断睡眠状态Uninterruptible Sleep。处于这个状态的进程通常在等待I/O操作的完成如磁盘读写操作。与可中断睡眠状态不同不可中断睡眠状态的进程不能被外部信号唤醒。这是因为I/O操作的完成是进程继续执行的必要条件任何外部信号都不能中断这一过程。例如当进程正在从磁盘读取数据时它会进入不可中断睡眠状态直到数据读取完成。停止状态T表示进程被暂停执行。可以通过发送SIGSTOP信号给进程来将其置于停止状态。被暂停的进程可以通过发送SIGCONT信号让其继续运行。例如在调试过程中开发者可能会发送SIGSTOP信号来暂停进程以便检查其状态和变量然后通过SIGCONT信号恢复进程的执行。死亡状态X是一个特殊的返回状态表示进程已经完成其任务并退出。你不会在任务列表中看到处于死亡状态的进程。当进程完成执行后操作系统会回收其资源并将其从进程表中删除。这个状态主要用于表示进程的生命周期已经结束。 进程状态转换 进程状态之间的转换并非是线性的实际上进程的生命周期充满了状态的切换。系统中的进程调度策略和资源分配机制都会影响这些转换的频率和时机。 运行 运行和就绪可以看做一种方式。 一个CPU对应一个调度队列(runqueue)队列。 进程创建进程创建时会创建一个 font stylecolor:rgb(100,106,115);task_struct/font 数据结构其中包含进程的所有信息。每个进程在创建时都会被放入一个 就绪队列(runqueue)该队列是一个先进先出FIFO队列。进程就绪当进程处于就绪状态时它会被加入到 CPU 的就绪队列runqueue中等待 CPU 调度器的分配。这个状态是由操作系统管理的表示进程已经可以运行但还没有分配到 CPU。进程运行CPU 调度器从就绪队列中选择一个进程并开始执行它。此时进程进入 运行状态并且会根据时间片来轮流使用 CPU。 阻塞 添加和移除等待队列的示意图 从运行队列变成阻塞的本质就是把PCB链入不同的状态队列之中。当调度当前进程的时候硬件设备未响应该进程被链入等待队列。当硬件响应后该进程被重新链回运行调度队列当调度的时候再将响应的硬件信息读取。 进程等待如果进程在运行过程中需要等待某些事件例如等待硬件设备操作完成程序有font stylecolor:rgb(100,106,115);scanf/font时需要等待键盘输入它会被移到 等待队列(wait queue) 中。在等待队列中进程会处于阻塞状态直到所需事件发生。事件包括键盘显示器网卡磁盘摄像头话筒… OS管理系统中的各种硬件资源同样遵循先描述在组织 进程阻塞例如当进程等待硬件设备时设备会进入 font stylecolor:rgb(100,106,115);device/font 阻塞队列这个队列是一个结构体 font stylecolor:rgb(100,106,115);device/font 组织的链表存储着等待的进程。硬件设备在准备好后会唤醒相关的进程。 挂起就是把内存资源换到磁盘上挂起后的资源在恢复时进行换出。 阻塞挂起(极端条件) 操作系统内存资源紧张时将没有被调度的进程相关的内存块代码、数据等交换到到磁盘的swap交换分区上只在原先队列保留PCB。 当操作系统感知到恢复操作系统就会把交换到磁盘的内存块重新加载回内存重新构建指针映射等然后将内存块代码等信息重新加载进内存。 就绪挂起(更极端条件) 当内存空间及其短缺时就会把就绪状态的进程也挂起。 进程结束后task_struct被销毁 再次理解内核中连接管理进程的数据结构是双向链表 通过进程状态是如何转换得知每个状态都有一对应的队列当进程进入对应状态时就会将该进程连接到对应的队列中去。但我们又在前文所提kernel中管理进程的数据结构是双向链表。那么进程是如何保证即不违背内核管理制度又可以进行不同状态的转换呢 在了解整体结构之前可以先了解管理进程的双向链表是怎么形成的。 普通的双向链表是由prev和next进行管理连接但是进程是由task_struct和数据组成的那应该怎么将双向链表的管理方式引入呢 实际上在task_struct中维护了结构体list_head该结构体组成如下 struct list_head {struct list_head *next, *prev; }task_struct(伪) struct task_struct {int x;int y;list_head links;...... }有了list_head每个进程之间就可以通过task_struct中的list_head进行双向连接。前节点的next指向下一个进程的list_head下一个进程的prev指向前一个进程的list_head。 既然是通过嵌套的双向链表来管理那么又引入了新问题通过list_head连接管理的双向链表在遍历的时候我们只能遍历到每一个list_head的地址那么我们要如何通过一个进程task_struct中的list_head得到task_struct的地址从而对进程进行访问、修改或者删除 在C语言结构体的知识中结构体中关于变量和各种类型的存储是依赖偏移量的所以我们只要得到在当前task_struct中list_head的偏移量那么就可以通过以下计算公式得到task_struct (struct task_struct *)((char *)ptr - (char *)(((struct task_struct *)0)-links))这个公式的关键在于理解为什么可以通过假设 task_struct 起始地址为 0 来计算出 links 的偏移量以及这种假设背后的原理。 假设 ptr 是指向list_head节点 links 的实际地址我们通过以下计算反推出 task_struct 的起始地址。 (((struct task_struct *)0)-links) 编译期计算 links 在 task_struct 中的偏移量例如8 字节。这段代码的确会得到 links 在 struct task_struct 类型的结构体中的偏移量这是编译器通过结构体的定义和内存布局规则计算出来的而不是通过访问实际内存得到的。 (char *)(((struct task_struct *)0)-links) 将 links 的偏移量转换为字节地址方便后续指针运算。 (char *)ptr - 偏移量 从 ptrlinks 的实际地址减去偏移量回退到结构体的起始地址。 (struct task_struct *) 将起始地址转换为 struct task_struct * 类型。 以上就是如何通过一个进程task_struct中的list_head得到task_struct的地址的方法理解。 在解决了内核中全局管理PCB的双链表构成和使用后又回到了之前的问题如何在保证PCB既在全局双链表中又可以在多个状态转换在对应的状态队列连接和断开 实际上在Linux中许多数据结构都是网状的。task_struct中list_head links并不是只存在一个而是每一种状态都对应一个links(包括全局双向链表)。 只不过各个状态的links遵循FIFO原则与队列的管理方法保持一致所以我们叫这些状态管理的双链表数据结构叫做队列。 一个PCB在内核中只存在一个不是拷贝在许多个队列中进行管理而是通过上述方法可以隶属于多个数据结构。即使这个PCB在不同的状态中来回转换也会始终保持在全局双链表中连接。 这就是为什么PCB即使在各种状态队列中但我们认为PCB是通过双链表管理的。 ----------------- ----------------- ----------------- ----------------- | task_struct | | task_struct | | task_struct | | task_struct | ----------------- ----------------- ----------------- ----------------- | next | | next | | next | | next | | prev | | prev | | prev | | prev | ----------------- ----------------- ----------------- ----------------- | next | | next | | next | | next | | prev | | prev | | prev | | prev | ----------------- ----------------- ----------------- ----------------- | next | | next | | next | | next | | prev | | prev | | prev | | prev | ----------------- ----------------- ----------------- ----------------- | next | | next | | next | | next | | prev | | prev | | prev | | prev | ----------------- ----------------- ----------------- -----------------如何查看进程的状态 font stylecolor:rgb(44, 44, 54);ps/font命令 font stylecolor:rgb(44, 44, 54);ps/font 显示当前快照中的进程信息。它不会动态更新因此适合用来获取某一时刻的进程状态。 ps aux / ps axj 命令 ps ajx | head -1; ps ajx | grep myprocess // head -1 用来显示第一行的列信息展示方便辨认信息// ; 用来分割使一次执行多个命令// grep myprocess 只看myprocess这个程序的进程信息a显⽰⼀个终端所有的进程包括其他⽤⼾的进程。 x显⽰没有控制终端的进程例如后台运⾏的守护进程。 j显⽰进程归属的进程组ID、会话ID、⽗进程ID以及与作业控制相关的信息 u以⽤⼾为中⼼的格式显⽰进程信息提供进程的详细信息如⽤⼾、CPU和内存使⽤情况等 font stylecolor:rgb(44, 44, 54);top/font 命令 font stylecolor:rgb(44, 44, 54);top/font 提供了实时的、动态更新的进程视图默认情况下每三秒钟刷新一次。它非常适合监控系统的性能和进程活动。 常见交互式命令在font stylecolor:rgb(44, 44, 54);top/font运行时按下 font stylecolor:rgb(44, 44, 54);h/font帮助页面显示可用的交互命令。font stylecolor:rgb(44, 44, 54);k/font杀死一个或多个进程需要输入PID。font stylecolor:rgb(44, 44, 54);r/font调整进程的优先级nice值同样需要输入PID。font stylecolor:rgb(44, 44, 54);f/font 或 font stylecolor:rgb(44, 44, 54);F/font进入字段管理器选择要显示的列。font stylecolor:rgb(44, 44, 54);o/font 或 font stylecolor:rgb(44, 44, 54);O/font设置显示的排序方式。font stylecolor:rgb(44, 44, 54);M/font按照内存使用排序。font stylecolor:rgb(44, 44, 54);P/font按照CPU使用排序。font stylecolor:rgb(44, 44, 54);T/font按照运行时间排序。font stylecolor:rgb(44, 44, 54);q/font退出font stylecolor:rgb(44, 44, 54);top/font。 常见管道搭配 虽然font stylecolor:rgb(44, 44, 54);top/font本身是一个交互式的工具不常与管道直接搭配使用但可以通过一些技巧来结合使用 font stylecolor:rgb(44, 44, 54);top -b -n 1 | grep process_name/font使用批处理模式font stylecolor:rgb(44, 44, 54);-b/font运行font stylecolor:rgb(44, 44, 54);top/font一次font stylecolor:rgb(44, 44, 54);-n 1/font然后通过font stylecolor:rgb(44, 44, 54);grep/font筛选出特定的进程。font stylecolor:rgb(44, 44, 54);top -b -n 1 | head -n 8/font获取font stylecolor:rgb(44, 44, 54);top/font输出的前几行通常包含系统负载和资源使用概览。 状态的详细讲解 在 Linux 操作系统中每个进程都有一个状态用于反映进程在特定时刻的执行情况。常见的进程状态包括运行、睡眠、磁盘睡眠、停止、追踪停止、死亡和僵尸状态。下面将逐一解释这些状态。 运行/就绪状态R (running) 表示进程正在 CPU 上运行或准备运行。进程被调度程序选中并获得 CPU 时间片。 解释 处于“运行”状态的进程正在执行程序代码或者正在等待 CPU 执行。因为一个CPU对应一个运行队列所以单核CPU中只有一个进程可以处于运行状态多核 CPU 可以并行运行多个进程。 模拟代码 #include unistd.h #include stdio.hint main() {printf(Process is running...\n);sleep(10); // 模拟进程正在运行等待10秒return 0; }查看进程状态 ps -eo pid,state,cmd | grep your_pid如果进程处于运行状态font stylecolor:rgb(100,106,115);state/font 列会显示为 R。 S (sleeping) – 睡眠状态浅睡眠 表示进程处于可中断睡眠状态通常是进程正在等待某些事件如 I/O 操作完成或信号。 解释 进程被挂起并等待某些外部事件例如文件 I/O 操作或等待信号中断。这种睡眠是可中断的意味着如果有外部事件如信号发生进程可以被唤醒。 模拟代码 #include unistd.h #include stdio.hint main() {printf(Process is sleeping...\n);sleep(10); // 进程进入睡眠状态等待10秒return 0; }查看进程状态 ps -eo pid,state,cmd | grep your_pid如果进程处于睡眠状态font stylecolor:rgb(100,106,115);state/font 列会显示为 S。 D (disk sleep) – 磁盘睡眠状态深度睡眠 表示进程处于不可中断睡眠状态通常是由于等待某些硬件操作完成凡是涉及到对磁盘这种关键存储设备进行访问进程进行高IO的时候不设置为S设置为D防止数据丢失。操作系统无权font stylecolor:rgb(100,106,115);kill/font进程区别于S的可中断进程只能等待自己结束进程。也就是说磁盘 I/O 操作时进程无法被中断必须等到 I/O 操作完成。 解释 进程正在等待某些硬件资源如磁盘读写完成且无法被外部信号打断。这种状态可能会导致系统响应较慢。 模拟代码 #include stdio.h #include fcntl.h #include unistd.hint main() {int fd open(/path/to/large/file, O_RDONLY); // 触发磁盘 I/O 操作if (fd 0) {perror(Failed to open file);return 1;}sleep(10); // 进程会因等待磁盘 I/O 完成而进入不可中断睡眠状态close(fd);return 0; }查看进程状态 ps -eo pid,state,cmd | grep your_pid如果进程处于磁盘睡眠状态font stylecolor:rgb(100,106,115);state/font 列会显示为 D。 T (stopped) – 停止状态 表示进程已被暂停通常是由于接收到 font stylecolor:rgb(100,106,115);SIGSTOP/font 信号或在调试过程中被暂停。 解释 进程不再运行但仍保留其资源和状态直到恢复。调试程序时进程也会进入停止状态。 模拟代码 sleep 10 # 启动一个进程 kill -STOP pid # 发送 SIGSTOP 信号暂停进程查看进程状态 ps -eo pid,state,cmd | grep your_pid如果进程处于停止状态font stylecolor:rgb(100,106,115);state/font 列会显示为 T。 t (tracing stop) – 追踪停止状态 表示进程因调试而被暂停通常发生在进程被调试器如 font stylecolor:rgb(100,106,115);gdb/font附加时。 解释 进程处于调试过程中打断点后进行font stylecolor:rgb(100,106,115);run/font遇到断点时执行被暂停以允许调试器检查进程状态。 模拟代码 sleep 10 # 启动一个进程 gdb -p pid # 附加调试器查看进程状态 ps -eo pid,state,cmd | grep your_pid如果进程处于追踪停止状态font stylecolor:rgb(100,106,115);state/font 列会显示为 t。 X (dead) – 死亡状态 表示进程已终止或死亡通常是进程已完全退出但其进程控制块PCB仍未被操作系统回收。 解释 进程已终止并退出但操作系统尚未完全清理与该进程相关的资源。 查看进程状态 ps -eo pid,state,cmd | grep your_pid如果进程处于死亡状态font stylecolor:rgb(100,106,115);state/font 列会显示为 X但是一般死亡状态会将PCB数据进行删除所以一般情况下无法查看到。 僵尸进程进行单独讲解。 僵尸进程 (zombie) 什么是僵尸进程 僵尸进程Zombie Process是指一个已经终止的进程但其父进程尚未调用 wait() 或 waitpid() 来读取该进程的退出状态从而使得操作系统无法回收该进程的资源。简单来说原因是⽗进程还在运⾏但⽗进程没有读取⼦进程状态虽然子进程已经结束了但是父进程没有宣告子进程的死亡父进程需要调用函数来获取子进程的退出状态所以⼦进程进⼊Z状态。结果是僵尸进程的进程号PID仍然被占用但其内存空间和其他资源已被释放。 子进程的结果相关信息存放在task_struct中。 用代码进行模拟僵尸进程出现的情况 #include stdio.h #include stdlib.h #include unistd.h #include sys/types.h #include errno.hint main() {printf(我是fork前的进程我的pid是%d\n, getpid());pid_t id fork();if (id 0){perror(fork);return 1;}else if (id 0){// child processint i 5;while (i--){sleep(1);}printf(子进程即将结束我将变成僵尸进程。\n);// 子进程在这里结束但父进程不会等待它所以它会变成僵尸进程。}else{// father process// 父进程进入无限循环不调用wait或waitpidwhile (1){sleep(1);printf(我是父进程我的pid%d我的父进程id%d\n, getpid(), getppid());}}return 0; }僵尸进程的生成过程 子进程结束 当一个进程结束时操作系统会保留它的退出状态信息直到父进程能够读取该状态信息通过调用 wait() 或 waitpid()。进程结束后操作系统会将其状态标记为“僵尸”这时它会占用一个 PID但没有实际的运行资源。 父进程未读取退出状态 如果父进程在子进程终止后没有读取它的退出状态操作系统就无法回收这个子进程的 PID 和一些控制信息因此该子进程仍然存在成为僵尸进程。 僵尸进程的危害 占用系统资源 每个进程都占用一个进程号PID。即使僵尸进程不再运行但由于它仍然存在于进程表中它占用了系统资源特别是有限的 PID 资源。如果僵尸进程没有被清除系统最终会耗尽 PID导致无法启动新的进程。 导致系统性能下降 如果有大量的僵尸进程存在它们仍然占用一些系统内存和资源这可能导致系统性能下降尤其是当系统负载较高时。 父进程可能变得不稳定 如果父进程不能正确地回收子进程调用 wait() 或 waitpid()可能会导致父进程的逻辑出现问题甚至可能会在某些情况下导致父进程的崩溃。 系统管理上的难题 系统管理员通常需要手动查找并清理僵尸进程。过多的僵尸进程可能增加系统管理的复杂度尤其是在长时间运行的系统上。 如何避免或清理僵尸进程 父进程调用 wait() 或 waitpid() 父进程在子进程结束后应该及时调用 wait() 或 waitpid() 来回收子进程的退出状态防止僵尸进程的产生。 采用 signal 机制 父进程可以捕捉到子进程结束的信号如 SIGCHLD并在接收到信号时及时清理子进程。 通过 init 进程回收 如果父进程在子进程结束后还没有回收它init 进程PID 1会自动回收这些孤儿进程防止它们变成僵尸进程。 使用 nohup 或 disown 对于后台运行的任务使用 nohup 或 disown 可以确保进程结束后不会留下僵尸进程。 程序结束后程序运行时的所有进程都会全部删除不会永久保留僵尸进程只是在程序运行时的不规范编码造成的进程问题。但是像常驻内存进程那些被设计为在系统启动时自动启动并且在整个系统运行期间持续存在于内存中的进程造成的内存泄漏会十分严重 slab机制 在 Linux 中为了提高内存的分配和回收效率特别是针对内核使用的频繁的数据结构采用了 Slab 分配器Slab Allocator来进行内存管理。这种机制有助于提高性能并减少内存碎片。 Slab 机制的基本概念 Slab 分配器是一种用于内核内存管理的高效机制它通过预分配内存块称为 slab来管理频繁使用的数据结构对象。这样做可以有效减少频繁的内存分配和释放操作带来的性能开销。 Slab 的工作原理 Slab 缓存 Slab 分配器为内核中常用的数据结构如 task_struct 等预分配内存称为 slab 缓存。每个缓存分配了一定数量的内存块内存块大小与数据结构大小匹配内存块是可重用的。 Slab 分配与复用 当内核需要某个数据结构时Slab 分配器会从已有的 slab 缓存中分配内存块如果没有空闲的内存块则会分配新的 slab。内存块分配完毕后不再需要时会返回给 Slab 分配器进行复用。这减少了对内存的频繁分配和释放操作。 内存块状态 每个 slab 的内存块有 3 种状态 空闲内存块没有被分配可以用来存储数据。已分配内存块被使用存储了有效数据。被释放内存块被释放处于空闲状态准备重新使用。 Slab 分配器的优点 提高性能通过缓存机制Slab 分配器避免了频繁的内存分配和释放提高了性能。减少内存碎片由于内存块大小与数据结构大小一致Slab 分配器减少了内存碎片的产生。优化内存使用内存块的复用保证了相同数据结构在整个内核中的一致性减少了内存浪费。 如何复用内存块 task_struct** 的示例** 假设内核有一个 task_struct 数据结构它在进程管理中非常常见。Slab 分配器为 task_struct 创建了一个缓存并分配了一些内存块来存储多个 task_struct 对象。 分配内存块 当创建新进程时Slab 分配器会从 task_struct 缓存中分配一个内存块填充进程信息。 释放内存块 当进程结束时task_struct 对象会被释放。此时Slab 分配器会将该内存块标记为“空闲”以便在需要时重新使用。 避免重复分配 通过复用已分配的内存块Slab 分配器避免了内存的碎片化也减少了分配和释放内存的开销。 总结 Slab 分配器是一种用于优化内存分配和回收的机制它通过缓存和复用内存块来提高内存管理的效率。内核通过为常用数据结构如 task_struct创建 Slab 缓存来减少内存碎片和提升性能。这使得 Linux 内核在内存使用上更加高效同时减少了内存分配和释放的复杂度。
http://www.dnsts.com.cn/news/109974.html

相关文章:

  • 素材天下网站直播软件开发一个多少钱
  • 上饶做网站公司seo兼职论坛
  • 淘宝类网站开发广州番禺区酒店
  • 浙江网站建设情况凡科建站相关链接
  • 网站底部加备案号网站备案 公司注销
  • 深圳开发网站建设手机网站打不开
  • 沙漠网站建设成都设计咨询集团官网
  • 网站开发技术可行性分析怎么写商城式网站具备哪些功能吗
  • 直播网站建设费用网站商务通js代码
  • 网站大部分都是jsp做的wordpress循环
  • 济南高端网站设计策划深圳市公司有哪些公司
  • 在线做托福的网站化妆品应如何网站建设定位
  • 用废旧盒子做家用物品网站网站域名改版
  • 搭建网站是什么工作sae wordpress 插件
  • 基于dw的网站设计论文看颜色应该搜索哪些词汇
  • 什么语言做网站网站图片标题背景怎样做的
  • 彩票网站搭建 做网站网站开发主流程序
  • 做信息网站要办icp证吗网站模块数据同步
  • 台州网站制作套餐电话销售做网站打官司
  • 东莞网站建设服务网页设计制作网站代码html
  • 如何查看一家网站是否有备案wordpress站长主题
  • 经典的响应式布局网站重庆建网站哪家售后服务比较好
  • 小米路由hd 做网站最新电视剧在线观看免费
  • 广州网站建设app开发虚拟主机wordpress如何更换域名
  • 网站建设教程菜鸟物流企业管理培训免费视频课程
  • 上海龙腾vs山东鲁能网站免费优化工具
  • 金昌大型网站建设费用莱芜四大金刚是谁啊
  • 宁波网站建设seo网站内容布局
  • wordpress 源码剖析网站关键词排名优化
  • 6731官方网站下载自己网上做超市小程序