Linux内核用于创建进程的系统调用有3个,它们的实现分别为:fork、vfork、clone。它们的作用如下表所示:
在liunx系统中 没有进程和线程的区别 统称 “task” 进程标志(task_struct) 进行统一描述
| 导语 企鹅FM近几个版本的外网Crash出现很多OutOfMemory(以下简称OOM)问题,Crash的堆栈都在Thread::start方法上。该文详细分析了发生原因。 ---- 有两种栈: 出现次数最多的一种,称之为 堆栈A。 java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory java.lang.Thread.nativeCreate(Native Method)
原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/
Unix标准的复制进程的系统调用时fork(即分叉),但是Linux,BSD等操作系统并不止实现这一个,确切的说linux实现了三个,fork,vfork,clone(确切说vfork创造出来的是轻量级进程,也叫线程,是共享资源的进程)
fork,vfork,clone Unix标准的复制进程的系统调用时fork(即分叉),但是Linux,BSD等操作系统并不止实现这一个,确切的说linux实现了三个,fork,vfork,clone(确切说vfork创造出来的是轻量级进程,也叫线程,是共享资源的进程) 系统调用 描述 fork fork创造的子进程是父进程的完整副本,复制了父亲进程的资源,包括内存的内容task_struct内容 vfork vfork创建的子进程与父进程共享数据段,而且由vfork()创建的子进程将先于父进程运
Linux 操作系统的内核裁剪不仅是为了提升系统的安全性,而且是为了进一步提升应用系统的性能。如《Linux 内核裁剪框架初探》所述,Linux 的内核裁剪技术并没有得到广泛的应用,对于安全性、应用的性能以及开发效率而言,业界普遍采用的是虚拟化技术——虚拟机和容器。无论哪一种虚拟化技术,本质上都可以看作是操作系统能力的抽象、分拆和组合。
关于dlinject dlinject是一款针对Linux进程安全的注入测试工具,在该工具的帮助下,广大研究人员可以在不使用ptrace的情况下,轻松向正在运行的Linux进程中注入一个共享代码库(比如说任意代码)。之所以开发该工具,是因为目前社区有非常多的反ptrace技术,而dlinject的功能并不基于ptrace实现,因此渗透测试的效果会更好。 工具运行机制 1、该工具首先会向目标进程发送终止运行的信号,并定位_dl_open()方法。接下来,该工具将会通过/proc/[pid]/sysca
在 Linux 5.2 发布一周后,第一个修订版本 5.2.1 也已经发布了,用来处理各种错误/回归。需要注意的是5.2并非长期支持(LTS)分支,推荐注重稳定的用户还是使用当前的LTS内核。
一个 C++ 程序,如果 throw 了 exception ,但是又没有 catch,那么一般会产生 coredump, 问题是,在 gcc 4.x 版本产生的 coredump 文件中,没有 throw 时候的堆栈信息,导致不知道是哪里 throw 的,没法查问题。
虽然我们在区分Linux进程类别, 但是我还是想说Linux下只有一种类型的进程,那就是task_struct,当然我也想说linux其实也没有线程的概念, 只是将那些与其他进程共享资源的进程称之为线程。
客户给了一些 C语言 写的 SDK 库,这些库打包成 .so 文件,然后我们使用 C# 调用这些库,其中有一个函数是回调函数,参数是结构体,结构体的成员是函数,将 C# 的函数赋值给委托,然后存储到这个委托中。
进程在内核态运行时需要自己的堆栈信息,linux内核为每个进程都提供了一个内核栈。对每个进程,Linux内核都把两个不同的数据结构紧凑的存放在一个单独为进程分配的内存区域中:
xref: /linux-3.18.6/include/linux/sched.h
主要是IDA,IDA的安装就不用多说了。这里说明的是辅助插件MIPSROP这些插件的安装,书里面给的插件的链接已经无法支持IDA 6.7以后的版本,主要是由于版本以后的API有更新,具体原因IDA的官方博客也给出了说明,查看了issue以后,发现有大佬已经写了能够支持IDA7.0的插件,安装的命令照着readme做即可顺利的装上。
所以会以Docker和Kubernetes项目为核心,为你详细介绍容器技术的各项实践与其中的原理。
注:本文的代码仅用于功能验证,不能用于生产。本文对clone的标志的描述顺序有变,主要考虑到连贯性。
容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去,这不就是 PaaS 最理想的状态嘛。
数据竞争(data race)是指在非线程安全的情况下,多线程对同一个地址空间进行写操作。一般来说,我们都会通过线程同步方法来保证数据的安全,比如采用互斥量或者读写锁。但是由于某些笔误或者设计的缺陷,还是存在data race的可能性的。(转载请指明出于breaksoftware的csdn博客)
为了支持这些特性,Linux namespace 实现了 6 项资源隔离,基本上涵盖了一个小型操作系统的运行要素,包括主机名、用户权限、文件系统、网络、进程号、进程间通信。
关于ninja_shell ninja_shell是一款使用了端口碰撞和AES256-GCM加密的安全Shell,该工具还支持使用指定的TCP标记、FIN、URG和PSH。 该工具使用的是原始套接字,原始模式可以绕过计算机处理TCP/IP的某些方式。与内核上的TCP/IP堆栈所做的典型封装/解封装层不同,因为我们需要手动将数据包传递给需要的应用程序。由于没有TCP/IP处理,因此它不是一个已处理的数据包。这是一个原始数据包。使用数据包的应用程序现在负责解析Header、分析数据包以及内核中TCP/IP堆
一条包含函数的SQL语句,在MySQL中会经过: 客户端发送,服务器连接,语法解析,语句执行的过程。
在Linux世界中,clone()系统调用通过复制调用进程创建一个新进程。新进程称为子进程,原始进程称为父进程。clone()系统调用有几个选项,允许我们控制父进程和子进程之间资源的共享。其中一个重要的选项是Cloneflags。
GDB(GNU Debugger)是Linux上的调试程序,可用于C/C++、Go、Rust等多种语言。GDB可以让你在被调试程序执行时看到它的”内部“情况,观察程序在特定断点上的状态,并逐行运行代码。
Oh, My God! 是死锁问题。尽管报错不多,对性能目前看来也无太大影响,但还是需要解决,保不齐哪天成为性能瓶颈。
SystemTap 是对 Linux 内核监控和跟踪的工具,详细的介绍及说明见官网。
通俗的来说容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。不过,这两个能力说起来简单,但要用技术手段去实现它们,确并不是很容易。所以,本篇文章就来剖析一下容器的实现方式
事情起因于公司一位同事在内部邮件组中post了一个问题,一个使用了go1.8.3写的业务程序跑了一段时间后出现部分goroutine卡在等待一个锁ForkLock的现象,同事认为这是go1.8.3的bug,升级到 go1.10 后没有再重现。为了搞清楚这个事情,同事在 github 上发了 issue :
使学生理解Linux中进程控制块的数据结构,Linux进程的创建、执行、终止、等待以及监控方法。并重点掌握fork函数的使用以及exec系列函数。
用了这么久的docker,对docker的实现原理挺感兴趣的,在对Linux下docker的实现原理了解之后,我没有用过Windows下的docker,更加好奇Windows下的docker是如何实现的(它并不开源),问了问owefsad师傅,说是可能用到了hyperV,那么可能类似Vmware吗?不知道啊。
日常的工作中,会收到一堆CPU使用率过高的告警邮件,遇到某台服务的CPU被占满了,这时候我们就要去查看是什么进程将服务器的CPU资源占用满了。通常我们会通过top或者htop来快速的查看占据CPU最高的那个进程,如下图:
什么是容器?容器其实是一种特殊的进程而已,只是这个进程运行在自己的 “运行环境” 中,比如有自己的文件系统而不是使用主机的文件系统(文件系统这个对我来说印象是最深刻的,也是让人对容器很更好理解的一个切入点)。
mXtract是一款开源的Linux安全工具,该工具可从目标系统的内存中提取并分析数据。从本质上来说,mXtract是一款防御端渗透测试工具,它的主要功能是扫描目标系统内存并尝试通过正则表达式来从中提取出私钥、IP和用户密码等敏感数据。请记住,扫描结果跟正则表达式的质量息息相关…
上次我们说到PaaS的发展历史,从Cloud Foundry黯然退场,到Docker加冕,正是Docker“一点点”的改进,掀起了一场蝴蝶效应,煽动了整个PaaS开源项目市场风起云涌。
LinuxThreads 项目最初将多线程的概念引入了 Linux?,但是 LinuxThreads 并不遵守 POSIX 线程标准。尽管更新的 Native POSIX Thread Library(NPTL)库填补了一些空白,但是这仍然存在一些问题。本文为那些需要将自己的应用程序从 LinuxThreads 移植到 NPTL 上或者只是希望理解有何区别的开发人员介绍这两种 Linux 线程模型之间的区别。
使用基于Espressif ESP8266EX的硬件来设置用于开发应用程序的软件环境。通过一个简单的示例,我们想说明如何使用ESP8266_RTOS_SDK(ESP-IDF风格),包括基于菜单的配置,编译ESP8266_RTOS_SDK以及将固件下载到ESP8266EX板上。
目前,AMD 的深度学习加速解决方案已经官方支持 TensorFlow 和 Caffe 两种框架。
内核维护着各种统计信息,被称为Counters,用于对事件进行计数。例如,接收的网络数据包数量,发出的磁盘I/O请求,执行的系统调用次数。常见的这类工具有:
定向灰盒模糊测试(DGF)类似AFLGo,旨在对预先选择的潜在易受攻击的目标位置执行压力测试,应用于不同的安全场景:(1)漏洞复现;(2)补丁测试;(3)静态分析报告验证;近期,研究人员也做了很多工作,有效地提高了定向模糊测试的有效性和效率。
容器本身没有太大价值,有价值的是“容器编排” (相当于是说,技术本身没有价值,价值在于解决实际问题)
学习一下linux kernel namespace的代码还是很有必要的,让你对docker容器的namespace隔离有更深的认识。我的源码分析,是基于Linux Kernel 4.4.19 (https://www.kernel.org/pub/linux/kernel/v4.x/patch-4.4.19.gz)版本的,由于namespace模块更新很少,因此其他相近版本之间雷同。User namespace由于与其他namespaces耦合在一起,比较难分析,我将在后续再作分析。 Kernel,Nam
首先,栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。根据栈的特点,很容易的想到可以利用数组,来实现这种数据结构。但是本文要讨论的并不是软件层面的栈,而是硬件层面的栈。
本系列文章将重点学习分析进程的相关内容,包括进程的基本概念,进程的创建,fork,vfork,clone等系统调用是如何创建进程的,linux内核是如何描述一个进程的,以及进程的调度算法学习,比如CFS调度算法等相关内容。
在 Linux 中,进程是我们非常熟悉的东东了,哪怕是只写过一天代码的人也都用过它。但是你确定它不是你最熟悉的陌生人?我们今天通过深度剖析进程的创建过程,帮助你提高对进程的理解深度。
一、前情回顾 最近把公司的一个视频处理程序更新了一个版本,准备提交测试的发现了崩溃的情况。这个程序采用Qt和ffmpeg技术栈开发,主要用于对视频进行渲染拼接处理,在Windows和mac两个平台同时进行发布。在windows上测试完一切正常,然而就在我以为一切大功告成的时候,测试的同事直接给我来了个当头棒喝,程序崩溃了!没有道理啊,同一套代码在Windows上安然无恙,在Mac上为何直接崩溃?好消息是程序在崩溃的时候保存了dump文件。 这得感谢前段时间集成的Google Breakpa
领取专属 10元无门槛券
手把手带您无忧上云