首页
学习
活动
专区
圈层
工具
发布

深入理解计算机系统:进程

[ system structure ] 进程(Process) 经典定义是一个执行中的程序的实例,操作系统对一个正在运行的程序的一种抽象。并发运行,指的是一个进程的指令和另一个进程的指令交错执行。...操作系统实现这种交错执行的机制称为上下文切换。 线程(Thread) 一个进程可以由多个线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。...PC对应于程序的可执行目标文件中的指令,或者是包含在运行时动态链接到程序的共享对象中的指令。...三种原因导致终止: 1)收到一个默认行为时终止进程的信号; 2)从主程序返回; 3)调用exit。...当目的进程正在执行信号k的处理程序时是阻塞的,当发送两个信号k,仅第一个信号k会变成待处理,第二个则直接被丢弃,不会排队等待。 系统调用可以被中断。

1.4K91

Python守护进程daemon实现

1 守护进程 1.1 守护进程 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行。...它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。此外,守护进程必须与其运行前的环境隔离开来。...2、调用fork,然后使父进程exit。这样做,使得当我们以./的shell命令启动守护进程时,父进程终止会让shell认为此命令已经执行完毕,而且,这也使子进程获得了一个新的进程ID。...,可以执行自己的程序入口了 time.sleep(10) #daemon化自己的程序之后,sleep 10秒,模拟阻塞 if __name__ == '__main__': main...python程序 4.1 执行shell root@develop:~# cat start.sh #!

8.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux 进程控制】—— 进程亦生生不息:起于鸿蒙,守若空谷,归于太虚

    如下图所示: 当父进程执行到fork创建出子进程时,已经执行了上面的before代码,而创建出子进程后,子进程不会去执行父进程已经执行过的代码,而是和父进程一同执行fork之后的代码。...options: 默认为0,表示阻塞等待 WNOHANG:非阻塞模式,无子进程终止时立即返回 0。 WUNTRACED:报告已停止的子进程(如被信号暂停)。 返回值: 成功:返回子进程PID。...举个例子 代码运行完毕,结果正确 程序完整执行了所有逻辑,未触发任何错误或异常。 输出结果与预期完全一致,符合功能需求或算法目标。...通常是你程序中mian函数的返回值,其基本思想是,程序返回退出代码 0 时表示执行成功,没有问题。 0 以外的任何代码都被视为不成功。...int main() { return 42; // 等价于 exit(42); } return的执行流程 当在main函数中执行return时,程序会做以下几件事: 返回值传递:将返回值传递给运行时环境

    38900

    【Linux系统】探索进程等待与程序替换的奥秘

    前言 在 Linux 操作系统的世界里,进程是程序运行的动态实体,它们如同一个个忙碌的工作者,承载着系统中各种任务的执行。无论是系统服务的稳定运行,还是用户程序的交互响应,都离不开进程的支持。...main 函数里常写的 return 0 的作用,就是每个进程终止时都会返回的一个退出码(Exit Code),用于标识运行结果: 0:表示成功(Success)。...它非常适合程序员在调试和错误处理时,将数字形式的错误码(如 errno)转化为更直观的文本信息,方便理解和输出。...程序替换行为: 当前进程的代码段、数据段等被新程序(ls)替换。 当前进程的 PID 保持不变,但其执行的内容变为 /bin/ls。...注意点: 如果 execl 成功执行,新程序的代码替换当前程序,后续代码(如 printf)不会执行。

    28410

    Linux操作系统之进程(六):进程的控制(上)

    而且他们都运行到了相同的地方(复制了指令指针寄存器EIP/RIP,相当于程序执行的书签)。但每个进程都将可以开始他们自己的旅程。...当运行成功时,对于子进程,会返回0;对于父进程,会返回子进程的pid 1.3 写时拷贝 通常,父子进程的代码是共享的。当父子进程都不再写入数据时,他们的数据也是共享的。...其基本思想就是,我们规定程序返回代码0时才表示执行成功,返回其他任意代码都被视为不成功。 大家在学习C语言或者C++语言时,曾经天天都在写main函数。main函数也是一个函数,自然有自己的返回值。...这个程序的运行结果是: 而我们使用_exit(): int main() { printf("你好,这是一个打印"); _exit(0); } 什么也都不会打印,这是因为exit()...函数运行成功后会返回终止的子进程的PID,如果失败了就返回-1,并且设置errno。

    6510

    【Linux探索学习】第十七弹——进程终止:深入解析操作系统中的进程终止机制

    二、进程终止的主要原因 进程可能因多种原因终止: 终止原因 描述 正常终止 进程完成所有任务后自然结束,例如程序执行到return语句或调用exit函数。...代码运行完毕,结果正常 2. 代码运行完毕,结果不正常 3....: 我们发现返回值是exit中的返回值,并不是return的返回值,而且打印也只执行了四行,所以我们可以知道带有exit的进程,在执行到它时会直接返回,并不会再继续执行后面的内容,返回值也返回exit的返回值...(); if (pid == 0) { // 子进程 while (1) { printf("子进程正在运行: PID = %d\n",...); // 注册信号处理函数 while (1) { printf("程序正在运行...

    89310

    进程详解(1)——可能是最深入浅出的进程学习笔记

    子进程中返回值为0,父进程中返回值为子进程的PID。程序员可以根据返回值的不同让父进程和子进程执行不同的代码。 一个形象的过程: ?...一个父进程希望子进程同时执行不同的代码段,这在网络服务器中常见——父进程等待客户端的服务请求,当请求到达时,父进程调用fork,使子进程处理此请求。...进程调用exec时,该进程执行的程序完全被替换,新的程序从main函数开始执行。因为调用exec并不创建新进程,只是替换了当前进程的代码区、数据区、堆和栈。 六种不同的exec函数: ?...运行这样一段演示程序: 1 #include errno.h> 2 #include 3 #include 4 5 char command[256...其中S表示状态: O:进程正在处理器运行 S:休眠状态 R:等待运行 I:空闲状态 Z:僵尸状态 T:跟踪状态 B:进程正在等待更多的内存分页 C:cpu利用率的估算值 收集僵尸进程的信息,并终结这些僵尸进程

    56330

    【Linux】多线程——线程概念|Linux下进程与线程|线程控制

    、代码和数据,花费CPU的IO资源从外设IO到内存,所以承担分配系统资源的基本实体就是进程。...换而言之,当我们创建进程时OS申请一大堆的内核数据结构占用资源,对应的代码和数据加载到内存里也要占用一部分资源,以及其他占用资源称为进程 我们之前的进程都只有一个PCB,也就是该进程内部只有一个执行流,...5.线程的用途 合理的使用多线程,能提高CPU密集型程序的执行效率 合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现) -...而是将错误代码通过返回值返回 pthreads同样也提供了线程内的errno变量,以支持其它使用errno的代码。...线程也一定要有自己私有的资源 线程被调度就要有独立的PCB属性私有 线程切换时正在运行,需要进行上下文保存,要有私有的上下文结构 每个进程都要独立的运行,每个线程都要有自己独立的栈结构 主线程创建一批新线程

    1.4K30

    【Linux篇】进程运行行云流水的秘密---进程控制

    如果父进程的某些数据是只读的,那子进程就没必要在拷贝一份,只需要拷贝自己需要的数据就行,减少了内存的浪费 进程终止 进程退出场景 代码运行完毕,结果正确 代码运行完毕,结果异常...替换原理 fork创建子进程后,父子进程执行的是一样的程序,有时可能会执行不同的代码分支。若要让子进程执行一个新的程序,就要使用一种exec函数。调用这种函数时,会将全新的代码和数据覆盖原代码和数据。...printf("我的程序运行完毕了\n"); return 0; } //当原代码被新代码替换后,原代码就不存在了,所以execl函数后的代码就不存在了,就不会被执行 exec系列的函数的返回值...("我的程序要运行了!...*arg, …:怎么执行这个程序。

    18310

    网络编程『简易TCP网络程序』

    4.5.持久化存储 5.守护进程 5.1.会话、进程组、进程 5.2.守护进程化 6.完整代码 ️总结 ️前言 随着数字时代的来临,TCP网络程序已成为程序员不可或缺的技术领域。...TCP 协议断开连接时的特性导致的(正在处于 TIME_WAIT 状态),详细原因将会在后续博客中讲解 2.多进程版服务器 2.1.核心功能 对于之前编写的 字符串回响程序 来说,如果只有一个客户端进行连接并通信...errno) << std::endl; close(sock); // 关闭文件描述符 } } 至于后者就比较麻烦了,需要结合 高级IO 相关知识,这里不再阐述...等工具登录 Linux 服务器时,会在服务器中创建一个 会话(bash),可以在该会话内创建 进程,当 进程 间有关系时,构成一个 进程组,组长 进程的 PID 就是该 进程组 的 PGID Linux...这使得网络程序更为成熟,为后续网络和高级IO的学习提供了有力支持。同时,对套接字编程的重要性也得到了充分体现。希望本文能为读者在网络编程领域的深入学习提供实质性帮助。

    62710

    进程程序替换

    exec成功后不会继续执行后续代码 深入原理:进程替换的底层机制 替换过程示意图 核心原理: 地址空间替换:新程序完全替换当前进程的代码段、数据段、堆栈。...保留上下文: 进程ID(PID)保持不变 文件描述符表继承 信号处理设置保留 进程优先级维持不变 执行流程: 新程序从main函数开始执行 原程序exec之后的代码永远不会执行 替换失败返回...用C语言写的程序都有main函数,可以接受argv和env,所以当使用**exec*e**系列的函数传入自定义的env时实际上就是给要执行的进程main传入env。...:Python/Bash等脚本的加载执行 这类脚本语言程序执行的是需要解释器 程序这样的形式来执行 // 典型的使用模式 pid_t pid = fork(); if (pid == 0) {...waitpid(pid, &status, 0); } 总结 掌握进程程序替换需要理解: 不同的exec函数适用于不同场景 参数传递和环境控制是关键区别 正确进行错误处理至关重要 结合fork使用是常见模式

    23600

    eBPF 概述:第 3 部分:软件开发生态

    xxx_user.c 文件是用户空间应用程序的代码,它用于加载和运行内核中的 BPF 示例。它负责与内核进行通信,并通过用户空间工具和系统调用执行相关操作,以启动和管理 BPF 示例。...在用户空间中运行 BPF 示例:使用 xxx_user.c 文件中的代码,执行用户空间的逻辑和操作,来与内核中的 BPF 代码进行通信。...层级 3:Python 太低级了:BPFftrace 在某些用例中,BCC 仍然过于底层,例如在事件响应中检查系统时,时间至关重要,需要快速做出决定,而编写 python/“限制性 C” 会花费太多时间...bpftrace -e 'tracepoint:raw_syscalls:sys_enter {@[pid, comm] = count();}' BPFtrace 在某些方面仍然是一个正在进行的工作。...内核 eBPF 虚拟机成为 “IO Visor 运行时引擎” 编译器后端成为 “IO Visor 编译器后端” 一般的 eBPF 程序被重新命名为 “IO 模块” 实现包过滤器的特定 eBPF 程序成为

    40510

    python中的daemon守护进程实现方法

    它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。 守护进程的特性 1.在后台运行 2.与其运行前的环境隔离开来。...3.启动方式特殊,它可以在系统启动时从启动脚本/etc/rc.d中启动,可以由inetd守护进程启动,可以由crond启动,还可以由用户终端(通常是shell)执行。...使用方便 #             需要改造为守护进程的程序只需要重写基类的run函数就可以了 #date: 2015-10-29 #usage: 启动: python daemon_class.py...sys.stderr.write('fork #1 failed: %d (%s)\n' % (e.errno, e.strerror))             sys.exit(1)        ...sys.stderr.write('fork #2 failed: %d (%s)\n' % (e.errno, e.strerror))             sys.exit(1)

    1.2K20

    csapp 第八章 异常控制流 读书笔记

    当异常处理程序完成处理后,根据引起异常的时间的类型,会发生以下三种情况: 处理程序将控制返回给当前指令 I_{curr} ,即当事件发生时正在执行的指令; 处理程序将控制返还给 I_{next} ,如果没有发生异常将会执行的下一条指令...在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占了的进程。这种决策就叫调度(scheduling),是由内核中被称为调度器(scheduler)的代码处理的。...中断也可能发生上下文切换 进程切换示例:8-14 8.3 系统调用错误处理 当Unix系统级函数遇到错误时,它们通常会返回-1,并设置全局整数变量errno来表示什么出错了。...返回的PID为导致返回的已终止或者被停止子进程的PID,默认的行为是只返回已终止的子进程。当你想要检查已终止和被停止的子进程时,这个会比较管用。...(信号处理程序产生输出唯一安全的方法是使用write函数,使用printf或者sprintf是不安全的) 保存和恢复errno:进入处理程序时把出错返回时设置的errno保存在一个局部变量中 阻塞所有的信号

    53760

    Linux:进程地址空间、进程控制(一.进程创建、进程终止、进程等待)

    进程包含了程序的代码、数据、堆栈等信息,以及操作系统为其分配的资源。每个进程都有自己独立的地址空间和执行流,可以独立运行、调度和管理。进程是操作系统中的基本执行单位,是程序在执行过程中的动态体现。...可以说进程是运行和执行的主体,程序只是进程执行的指令集合。程序需要被加载到内存中,由进程来执行,进程才是真正执行代码、管理资源、与其他进程交互的实体。...例如,可以将某些页面设置为只读或只执行,防止程序对其进行写操作或执行恶意代码,从而提高了系统的安全性和稳定性。...当函数或系统调用发生错误时,errno会被设置为相应的错误码,以便程序可以根据错误码进行适当的错误处理。...,也就是程序的退出码用于表示程序的执行状态,并帮助调用程序理解程序结束的原因 在进程代码中,任意地方调用exit()函数都表示进程退出(不一定非要在main()函数里) #include<stdio.h

    78500
    领券