【中文配音】Linux创建进程的奇怪方式
合集 · 直观理解计算机技术【CoreDumped】 (68)
-
代码中指定变量类型为何如此重要?
11:03
-
栈为何如此之快?
13:46
-
堆为何如此之慢?
17:53
-
动态数组的内部机制(ArrayList VS LinkedList)
19:56
-
探索计算机并发与多任务处理的历史
15:37
-
晶体管是如何运行代码的?
12:54
-
晶体管是如何记忆数据的?
16:12
-
制作一个CPU来运行程序
18:47
-
计算机如何将字符串转换为数字
11:23
-
动态随机存取存储器(DRAM)的工作原理
17:18
-
计算机处理器是如何运行条件和循环的?
16:05
-
一个程序不是一个进程
6:51
-
深入理解进程,如何进行上下文切换?计算机科学中最深刻和最成功的想法之一。
14:52
-
处理器内部的单个位如何保护操作系统的完整性?
20:20
-
计算的心跳:时钟如何推动 CPU 前进?
13:14
-
英语原声版-计算的心跳:时钟如何推动 CPU 前进?
14:22
-
(英语原声)进程间通信:共享内存或发送消息
14:15
-
(中文配音)进程间通信:共享内存或发送消息
12:29
-
(中文配音)为什么单核处理器需要线程?
14:59
-
(英语原声)为什么单核处理器需要线程?
16:07
-
(中文配音)多核系统上的线程
9:26
-
(英语原声)多核系统上的线程
11:27
-
(中文配音)为什么应用程序是特定于操作系统的?
11:52
-
(英语原声)为什么应用程序是特定于操作系统的?
13:09
-
(英语原声)硬件如何在多任务处理中协助软件?
13:15
-
(中文配音)硬件如何在多任务处理中协助软件?
11:29
-
链表的一个实际应用
20:34
-
让你的电脑运行更流畅的奇妙算法
45:02
-
(流畅中文配音)让你的电脑运行更流畅的奇妙算法
43:38
-
(原声双语字幕)当程序调用 sleep() 时会发生什么?
19:41
-
(流畅中文配音)当程序调用 sleep() 时会发生什么?
17:57
-
这个简单算法驱动了真正的解释器:Pratt Parsing
20:40
-
(双语字幕)编程中最难以捉摸的Bug:竞态条件
18:19
-
(流畅中文配音)编程中最难以捉摸的Bug:竞态条件
19:23
-
(中文配音)阻止内存攻击的底层电路
16:02
-
(英语原声)阻止内存攻击的底层电路
14:51
-
为什么有些项目会使用多种编程语言?
18:04
-
为什么有些项目会使用多种编程语言?
19:32
-
别再杀进程了!让 Ctrl+C 变成“喵”……(用信号实现)
17:15
-
别再杀进程了!让 Ctrl+C 变成“喵”...(用信号实现)
19:23
-
80 年代避免竞态条件的算法(以及它为何失败)
19:05
-
80 年代避免竞态条件的算法(以及它为何失败)
19:43
-
CPU如何与众多不同设备交互?
22:10
-
(中文配音)CPU如何与众多不同设备交互?
23:52
-
(中文配音)你每天都在用的奇特CPU操作
14:04
-
你每天都在用的奇特CPU操作
13:04
-
(中文配音)历史如何塑造了我们今天仍在使用的编程术语?
18:04
-
(英语原声)历史如何塑造了我们今天仍在使用的编程术语?
17:42
-
为什么有些底层项目里会充满这种奇怪的代码?
16:41
-
(中文配音)为什么有些底层项目里会充满这种奇怪的代码?
16:39
-
编译与解释代码如何共处同一程序中?
21:35
-
(英语原声)编译与解释代码如何共处同一程序中?
21:30
-
【双语字幕】Core Dumped 常见问题的集中回答
17:09
-
【双语字幕】90年代的设计决策阻碍了Python并行化
13:36
-
【中文配音】90年代的设计决策阻碍了Python并行化
12:01
-
Linux创建进程的奇怪方式
17:51
-
【中文配音】Linux创建进程的奇怪方式
18:14
-
CPU如何运行函数?
19:49
-
【中文配音】CPU如何运行函数?
19:38
-
没有人解释的问题:内核的边界在哪里?
17:15
-
【英语原声】没有人解释的问题:内核的边界在哪里?
19:36
-
硬件如何让线程问题不再那么棘手?
35:49
-
为什么在macOS、Windows和Linux上安装应用程序如此不同?
19:47
-
游戏公司真的能破坏你的电脑吗?
24:00
-
一个视频说透“架构”:为什么你的程序换个CPU就可能跑不了?
10:43
-
CPU如何执行有符号和无符号运算?
14:45
-
简单指令, 奇妙算法
19:11
-
当CPU遇到它不认识的指令,会发生什么?😱【底层原理】
9:26
Description
https://www.youtube.com/watch?v=SwIPOf2YAgI 本期视频深入解析了不同操作系统环境下进程创建的底层机制。以Discord等Elector应用为例,探讨其多进程架构如何在不依赖用户手动干预的前提下自动完成初始化与协同工作。 核心内容涵盖: 系统调用的关键作用:作为用户进程与操作系统内核间的桥梁,执行进程管理等特权操作; Windows系统进程创建机制:通过CreateProcess系统调用直接加载可执行文件并创建新进程; Unix/Linux系统的独特设计:采用fork()与exec()相结合的两阶段模型,通过克隆与替换实现进程创建; 进程树的形成与溯源:解析所有用户进程间的派生关系,并揭示系统初始化进程中第一个用户进程的来源。 通过对比分析两大操作系统家族在进程生成逻辑上的根本差异,帮助观众理解现代应用程序多进程架构背后的支撑原理,以及操作系统在进程管理与资源调度中所扮演的核心角色。
Comments
终于碰到有人吐槽了。。。当年在学校里学到就感觉很扭曲,怎么想出来的
♥ 71 ↩ 52
用fork只是因为它简单,包装了一系列操作,自己手动创建进程虽然灵活需要设置的东西也多,是以虽然吐槽fork已是老生常谈但很多新程序还是乐意用它。 fork虽然看起来奇怪,但这只是因为场景不同导致的,觉得fork反直觉的一般就是创建进程出来只为执行某一个函数,复制当前进程再立即修改掉后续代码就多此一举(实际现在如果紧跟execv则会优化掉一部分不必要的开销,在创建新进程仍然比较繁琐的情况下沿用fork就不奇怪了),但fork设计之初本来就是想要完整服用原进程fork以下的代码,比如说一个进程监听某个端口,收到一个传入连接就把自己复制一份去和对端通信,原来的进程继续监听原来的端口,它上面的代码执行完了就等着fork呢,后面的部分当然也可以包装成一个函数,反过来说也能只写一行fork,这有点像面向过程,模型本身却是浅显易懂的。
♥ 55 ↩ 19
在还没有windows的时候就有这个fork了。这个是posix标准。进程创建分两步,一是创建运行环境包括虚拟内存,二是运行。Windows这个单用户起家的东西肯定是理解不能的
♥ 21 ↩ 6
以前java就有这么一个问题,启动一个子进程,占用的内存跟当前进程一样,这时候,一个内存占用超大的服务器进程要调用一个小小的脚本就尴尬了😅
♥ 20 ↩ 15
fork啊,我熟[doge] :() { :|:& };: 一键引爆系统[doge][doge][doge]
♥ 11 ↩ 1
后悔没选修linux,导致后面学安卓的时候看得云里雾里的。看完这个视频对安卓开机流程理解更深了
♥ 5
gdb调试多进程程序更是让人头大
♥ 5 ↩ 1
如果打算写posix兼容的代码,fork+execve的场合下可以考虑使用posix_spawn。像cygwin这种fork开销很大的平台(通过CreateProcess模拟实现),用posix_spawn会更有效率。
♥ 4 ↩ 1
次事在csapp亦有记载
♥ 4
看入迷了
♥ 3
zygote
♥ 2 ↩ 2
代入到操作系统的视角来看的话,其实很好理解。进程到底长啥样的?大概也就是用于区分进程的控制块PCB,只读代码段,以及数据块,这三大块了。 只要PCB保持唯一性,其它的,都是可以复用的,那么这些可复用的也就不存在说谁一定归属于谁这个说法了。 当创建新进程时,因为COW机制,其实并不会出现内存空间复制行为,而是当某个进程尝试修改该内存空间时,才会去单独复制一片分页出来。
♥ 2
我的py服务也是这样的方式来进行优雅后台运行[doge]
♥ 2
我在想,什么情况下fork会单独使用?
♥ 1
讲得挺清晰的喵,fork+execv这种分裂再夺舍的操作确实很逆天 [笑哭] 不过Windows那个CreateProcess居然要传命令行字符串也太怪了吧 [doge]
♥ 1 ↩ 1
太喜欢这样的翻译,中文语音的视频了 ,很多视频加了字幕说实话看起来太累了
♥ 1
我在思考,Linux用fork创建进程是不是因为Linux的创始人也是Git的创始人呢
♥ 1 ↩ 5
不要搞一堆僵尸进程出来啊
♥ 1
up为什么不做成选集的方式 中文配音和英文双语放在同一个视频的两个p里?[tv_疑问]
♥ 1 ↩ 1