linux下进程管理机制的工作原理 linux按下ctrl c为什么会结束当前进程?
linux按下ctrl c为什么会结束当前进程?
因为在Linux系统下按ctrl c相当于当前终端向进程发送SIGINT信号。
linux为什么一个进程可以杀死另一个进程?
因为系统提供了kill命令,所以您可以通过进程号来终止另一个进程。
linux线程同步和进程同步的区别?
线程同步:解决多线程编程享资源的问题;进程同步:解决多进程编程享资源的问题,但有些学生还没有 t对线程同步和进程同步的研究不够深入。比如互斥和条件变量是否可以同时用于线程同步和进程同步,本质上是不同的。首先,我们知道linux下的每个进程都有自己独立的进程空间。假设进程A和进程B各有一个互斥体,并且这个锁放在进程的全局静态区域,那么AB进程就不能感知彼此 s互斥。
互斥锁和条件变量来自Posix.1线程标准,它们总是可以用来同步进程中的线程。
如果互斥体或条件变量存储在多个进程共享的内存区域中,Posix还允许它用于这些进程之间的同步。看到这里,你有什么发现吗?线程同步和进程同步的本质区别在于锁放在哪里,私有进程空间还是多个进程共享的空间,锁是否具有进程共享的属性。
Linux是如何记录进程资源的?你能从C语言源代码层面分析下吗?
谢谢邀请我。
其实简单来说,一个进程无非就是正在运行的程序及其相关资源的总和。读者应该注意单词 "相关资源 "给你。Linux如何在内核中记录进程的资源?
Linux内核如何记录一个进程的资源?首先我们要明白,Linux内核大部分都是用C语言编写的,所以要搞清楚内核是如何记录进程资源的,我们只需要看看相关的C语言代码就可以了。事实上,Linux内核使用task_struct结构来描述进程的资源。它的C语言代码如下。请看:
Task_struct结构很长,占了我手里Linux内核的C语言源代码280行。当然还有很多有条件的编译部分。在32位的机器上,task_struct大约占用1.7kB的内存空间,但考虑到它可以管理一个完整的进程,1.7 KB并不算大。
鉴于task_struct的结构比较长,这里不可能把它的成员介绍清楚。如果读者和我一样好奇,粗略浏览一下task_struct结构,应该能找到一些熟悉的成员,比如:
通过C语言中的注释和成员的变量名,我们可以看到task_struct结构中包含了文件系统、线程结构、进程打开的文件等信息,和上一节类似。这一章的内容是一致的。其他成员会在我后面的文章中涉及,所以我赢了 这里暂时不细说。
Linux在创建进程时,通过slab分配器分配task_struct结构,可以避免动态分配和释放带来的开销,提高内存使用效率。
那么在task_struct结构创建之后,内核是如何访问它的呢?根据我手里的内核C语言源代码,Linux中还有一个结构thread_info,它的一个成员任务指针正好适合索引task_struct结构。在X86_64平台上,thread_info的相关C语言代码如下。请看:Linux通常把thread_info结构放在内核栈的底部或顶部,内核栈的大小通常是已知的,所以每个进程都可以很容易地从自己的栈中找到thread_info结构,然后找到task_struct结构。
要找到当前进程的thread_info结构,可以调用current_thread_info()函数。它的C语言代码如下。请看:
可以看出,current_thread_info()函数实际上是通过进程栈来计算的,所以它的实现与平台架构有关。上面的C语言代码其实只是arm平台的实现方法,读者可以自己查看其他平台的实现方法。
此时,要获取当前进程的资源,可以使用current_thread_info()-gttask索引。
欢迎在评论区一起讨论提问。这些文章都是手工原创的。每天都有最简单的C语言、linux等嵌入式开发介绍。如果你喜欢我的文章,请关注一波。你可以看到最新的更新和以前的文章。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。