Linux 进程,线程 -- (未完)
系统调用
Linux 将系内核的功能接口制作成系统调用,
Linux 有 200 多个系统调用, 系统调用是操作系统的最小功能单元。 一个操作系统,以及基于操作系统的应用,都不能实现超越系统调用的功能。
$ man 2 syscall # 查看所有的系统调用。
系统调用提供的功能非常基础 ,所以使用起来非常麻烦。
库函数
Linux 定义了一些库函数, 来将系统调用组合成某些常用的功能。
使用库函数对于机器来说没有效率上的优势, 但可以吧程序员从细节中解救出来。
实际上, 一个操作系统要称得上 UNIX 系统, 必须要拥有一些库函数, 如 ISO C 标准库,POSIX 标准等。
shell
shell 是一个特殊的程序,是一个命令解释程序。
shell 通过系统调用, 指挥内核工作 : shell 下通系统调用, 上通各种应用。
应用程序
应用程序使用如下的方式来与内核沟通 :
1. 直接调用系统函数
2. 调用库函数
3. 运行 shell 脚本。
Linux进程
进程是程序的具体实现,进程是执行程序的过程。 同一个程序可以执行多次,每次都可以在内存中开辟出独立的空间来装载, 从而产生多个进程。 不同的进程还可以拥有各自独立的IO接口。
操作系统的一个重要功能就是为进程提供方便, 比如 为进程分配内存空间,管理进程的相关信息等。
如何创建一个进程:
当计算器开机的时候,内核(kernal)只建立了一个 init 进程,Linux 内核并不提供直接建立新进程的系统调用。剩下的所有进程都是 init 进程通过 fork 机制建立的。
新的进程要通过老的进程复制自身得到, 这就是 fork。 fork 是一个系统调用, 进程存活于内存当中, 每个进程都在内存中分配有属于自己的一片空间。 当进程 fork 的时候,Linux 在内存中开辟出一片心的内存空间给新的进程, 并将老的进程中的内容复制到新的空间中,此后两个进程同时运行。老进程称为新进程的父进程, 新进程称为老进程的子进程。 一个进程除了有一个 PID 之外,还有一个 PPID,用来存储副进程的 PID,如果我们循着PPID 不断向上追溯,会发现其源头就是 init 进程。所以, 所有的进程也构成一个以 init 为根的树状结构。
fork 通常作为一个函数被调用。这个函数有两次返回,将子进程的PID 返回给父进程, 0 返回给子进程。实际上, 子进程可以查询自己的 PPID 知道自己的父进程是谁。
通常在调用 fork 函数之后,程序会设计一个 if 选择结构。 当 PID 等于 0时, 说明该程序为子进程, 那么让他执行某些指令, 比如使用 exec 库函数,读取另一个程序文件, 并在当前的进程空间执行(实际上我们使用 fork 的一大目的就是为某一个程序创建进程); 而当PID 为一个正整数时, 说明为父进程,则执行另外一些指令。由此, 就可以在子进程建立之后, 让他执行与父进程不同的功能。
子进程的终结:
当子进程终结时,他会通知父进程, 并清理自己所占据的内存, 并在内核里留下自己的退出信息(exit code, 如果为 0 ,则为正常退出;如果有错误或一场情况, 为 >0 的整数),在这个信息会解释该进程为什么退出。父进程在得知子进程终结时, 有责任对该子进程调用 wait 函数,wait函数可以从内核中取出子进程的退出信息,并清空该信息在内核中所占据的空间。 但是,如果父进程早于子进程终结,子进程就会成为一个孤儿进程, 孤儿进程会过继给 init 进程, init进程就成为该进程的父进程。 init 进程负责该子进程终结时,调用 wait 函数。
当出现 子进程的退出信息, 滞留内核中的状况(父进程不对子进程调用 wait函数), 这种情况下,子进程会成为僵尸进程。当大量僵尸进程堆积时, 内存空间会被挤占。
进程与线程;
在 UNIX 中, 进程与线程时有联系但不同的两个东西。
在 Linux 中,线程只是一种特殊的 进程, 多个线程之间可以共享内存空间和IO接口。 所以, 进程是 Linux 程序的唯一实现方式。
Linux 信号
进程间通信方式
① 管道 :
管道是由内核管理的一个缓冲区(buffer),管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。
② 信号
③ 共享内存
④ 消息队列
信号是一种向进程传递信息的方式,信号所能传输的信息比较粗糙,只是一个整数,但是,正是由于传递的信息量少,信号也便于管理和使用。信号常用于系统管理相关的任务。
信号是由内核管理的。
信号的产生方式:
1. 内核自己产生;
2. 其它进程产生,发送给内核,再由内核传递给目标进程。
信号的工作机制:
内核中针对每一个进程都有一个表存储相关信息,当内核需要将信号传递给某一个进程时, 就会在该进程相对应的表中的适当位置下入信号, 这样就**生成信号**;
当该进程执行系统调用时,在系统调用完成后退出内核时,会顺便查看信号内容, 如果有信号,则执行信号中的操作,此时叫做 **执行信号**;
从信号的生成到信号的传递的时间, 信号处于等待状态;
我们可以设计,让其生成的进程阻塞某些信号,也就是让这些信号处于等待的状态,直到进程取消阻塞或者无视信号。
常见信号
$ man 7 signal # 查阅更多信号
SIGINT : 终端该进程, interrupt
SIGQUIT : 退出该进程, quit
SIGTSOP : 暂停该进程,stop
SIGCONT : 通知暂停的进程,继续执行,
SIGALRM : 起定时器作用,通常是程序在一定的时间之后,才生成该信号。
在 shell 中使用信号
$ kill -SIG_NAME PID
信号处理(signal disposition)
一般情况下,进程对信号采取对应信号的默认操作, 但这并不绝队, 到那个进程决定执行信号的时候,有以下几种可能:
1. 无视信号 ignore :信号被清除, 进程本身
2. 默认操作 default : 每个信号对应一个默认的操作,
3. 自定义操纵 catch : 执行进程中预设的对应于该信号的操作.
*进程会采取那种操作,取决于该进程的设计.*
*信号常常被用于系统管理,所以它的内容相当庞杂。深入了解信号,需要一定的Linux环境编程知识。*
Linux 进程关系
父进程与子进程
进程组, PGID
每个进程都会属于一个进程组(process group), 每个进程组可以包含多个进程. 进程组会有一个 进程组领导进程(process group leader), 领导进程的 PID 成为进程组的 ID, 即 PGID, 以识别进程组.
$ ps -o pid,pgid,ppid,comm
领导进程可以先终结, 此时进程依然存在, 并持有相同的 PGID, 知道进程组中最后一个进程终结.
将进程归为进程组的一个重要原因是, 可以将信号发送给一个进程组, 进程组中的所有进程都会收到该信号.
Linux 多线程与同步
Linux 进程间通信
Linux 文件系统的实现
Linux 进程,线程 -- (未完)的更多相关文章
- Linux进程线程学习笔记:运行新程序
Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...
- Linux 进程,线程,线程池
在linux内核,线程与进程的区别很小,或者说内核并没有真正所谓单独的线程的概念,进程的创建函数是fork,而线程的创建是通过clone实现的. 而clone与fork都是调用do_fork(),差异 ...
- linux 进程线程
linux下进程的最大线程数.进程最大数.进程打开的文件数 ===========最大线程数============== linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_TH ...
- linux学习笔记---未完待续,缓慢更新
做为linux菜鸟,由于work的需要,慢慢的开始接触学习linux. <鸟哥的linux私房菜>学习笔记. 一.基础命令操作 1.显示日期的命令 date 执行date命令后,显示结果为 ...
- linux 进程线程拓展
依次参考: 多线程和多进程的区别(小结) Linux内核源代码分析——fork()原理&多进程网络模型 Linux写时拷贝技术(copy-on-write) linux内核 do_fork 函 ...
- linux: cmake(未完,待更新)
参考: http://blog.csdn.net/netnote/article/details/4051620 http://blog.csdn.net/fan_hai_ping/article/d ...
- Linux:cut命令...未完待续
一.定义 正如其名,cut的工作就是"剪",具体的说就是在文件中负责剪切数据用的.cut是以每一行为一个处理对象的,这种机制和sed是一样的. 2.剪切依据 cut命令主要是接受三 ...
- inux进程/线程调度策略与 进程优先级
目的: 系统性的认识linux的调度策略(SCHED_OTHER.SCHED_FIFO.SCHED_RR): 实时调度?分时调度? 混搭系统(实时任务+分时任务),怎样调度. linux的调度策略 l ...
- Linux进程与线程的区别
进程与线程的区别,早已经成为了经典问题.自线程概念诞生起,关于这个问题的讨论就没有停止过.无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.一般程序员而言,搞清楚二者的概念, ...
随机推荐
- 图零直播新闻发布会—TOLINK2.0全面上线
在网络直播时代和现代信息技术条件下,教务管理正在由传统管理方式向数字化管理模式转变.教务管理创新需要现代信息技术来实现,使得教务管理的质量和效率得到了质的飞跃.图零直播,中国IT在线直播教育引领者,在 ...
- ES6之"let"能替代"var"吗?
译者按: 使用let的确会比var安全很多. 原文: Why You Shouldn't Use 'var' Anymore 译者: Fundebug 为了保证可读性,本文采用意译而非直译. 我已经使 ...
- 属于自己的MES(一)概念
什么叫MES(生产制造执行系统)? 从几个方面来简单说下: 1.定位 没有MES前的工厂生产模式,公司MRP系统与生产现场之间透过人为方式沟通,使生产现场如同黑箱作业,无法掌握实时正确信息. MES的 ...
- hdu2594 Simpsons’ Hidden Talents
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594 思路: 其实就是求相同的最长前缀与最长后缀 KMP算法的简单应用: 假设输入的两个字符串分别是s ...
- 电商的噩梦?实体商家的福音——VR全景智慧城市
我们不知道未来网络购物的样子,但对当前电商平台的问题是清楚的.从消费者角度来看,网购的顾虑主要在于商品的质量难以保证.物流效率不够高,以及网络购物的"眼见不为实". 正因为可以很好 ...
- MySQL · 引擎特性 · InnoDB Buffer Pool
前言 用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入 ...
- jQuery选择器的的优点
jQuery选择器的的优点 选择器想必大家都不陌生,今天呢,我就给大家介绍一下jQuery选择器的优点: jQuery选择器更简洁的写法: jQuery完善的处理机制: jQuery选择器判断dom节 ...
- 在 iOS 10.0 之后, App 要调用手机相机与相簿应注意的事项
iOS 的 SDK 每一年至少都会有一次大改版,从 2009 到 2016 年,版号已经到了第 10 版了,很轻易的就追上了 Mac OSX. 每一次的大改版都会有不少新的功能或新的规范,在 iOS ...
- 【JAVAWEB学习笔记】21_多条件查询、attr和prop的区别和分页的实现
今天主要学习了数据库的多条件查询.attr和prop的区别和分页的实现 一.实现多条件查询 public List<Product> findProductListByCondition( ...
- 基本DOS命令之 netstat 命令详解
netstat 命令(查看端口) netstat 命令用于显示与 IP .TCP .UDP 和 ICMP 协议相关的统计数据,一般用于检验本机各端口的网络连接情况,可以使用 netstat 命令查看 ...